]> granicus.if.org Git - libass/commitdiff
Support fractional font sizes.
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Mon, 14 May 2007 20:41:14 +0000 (20:41 +0000)
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Mon, 14 May 2007 20:41:14 +0000 (20:41 +0000)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@23318 b3059339-0415-0410-9bf9-f77b7e298cf2

libass/ass.c
libass/ass_cache.h
libass/ass_font.c
libass/ass_font.h
libass/ass_render.c
libass/ass_types.h

index f5e032c694919d039f7f1559cd0ea623740a1534..e030a6c2b43d39dbf1927ea6766fcb0c61905995 100644 (file)
@@ -347,7 +347,7 @@ void process_force_style(ass_track_t* track) {
                                        COLORVAL(SecondaryColour)
                                        COLORVAL(OutlineColour)
                                        COLORVAL(BackColour)
-                                       INTVAL(FontSize)
+                                       FPVAL(FontSize)
                                        INTVAL(Bold)
                                        INTVAL(Italic)
                                        INTVAL(Underline)
@@ -435,7 +435,7 @@ static int process_style(ass_track_t* track, char *str)
                                // this will destroy SSA's TertiaryColour, but i'm not going to use it anyway
                                if (track->track_type == TRACK_TYPE_SSA)
                                        target->OutlineColour = target->BackColour;
-                       INTVAL(FontSize)
+                       FPVAL(FontSize)
                        INTVAL(Bold)
                        INTVAL(Italic)
                        INTVAL(Underline)
index 2983664a23e579e57a43f1c130a74fd2a0104ce5..caa750a54f5ab96c295ef2c2a56e3632f5727d7b 100644 (file)
@@ -31,7 +31,7 @@ void ass_font_cache_done(void);
 typedef struct bitmap_hash_key_s {
        char bitmap; // bool : true = bitmap, false = outline
        ass_font_t* font;
-       int size; // font size
+       double size; // font size
        uint32_t ch; // character code
        unsigned outline; // border width, 16.16 fixed point value
        int bold, italic;
@@ -61,7 +61,7 @@ void ass_bitmap_cache_done(void);
 // describes an outline glyph
 typedef struct glyph_hash_key_s {
        ass_font_t* font;
-       int size; // font size
+       double size; // font size
        uint32_t ch; // character code
        int bold, italic;
        unsigned scale_x, scale_y; // 16.16
index 34a15ed4e1176050bbe4d7e5c1d532aecc10cdb3..40060876e60f0f821f8cf14ded261b20ed8cf4ff 100644 (file)
@@ -67,8 +67,9 @@ static void update_transform(ass_font_t* font)
 {
        int i;
        FT_Matrix m;
-       m.xx = double_to_d16(font->scale_x);
-       m.yy = double_to_d16(font->scale_y);
+       double size_scale = font->size / (int)font->size;
+       m.xx = double_to_d16(font->scale_x * size_scale);
+       m.yy = double_to_d16(font->scale_y * size_scale);
        m.xy = m.yx = 0;
        for (i = 0; i < font->n_faces; ++i)
                FT_Set_Transform(font->faces[i], &m, &font->v);
@@ -132,7 +133,7 @@ ass_font_t* ass_font_new(ass_library_t* library, FT_Library ftlibrary, void* fc_
 
        font.scale_x = font.scale_y = 1.;
        font.v.x = font.v.y = 0;
-       font.size = 0;
+       font.size = 0.;
 
 #ifdef HAVE_FONTCONFIG
        font.charset = FcCharSetCreate();
@@ -156,13 +157,14 @@ void ass_font_set_transform(ass_font_t* font, double scale_x, double scale_y, FT
 /**
  * \brief Set font size
  **/
-void ass_font_set_size(ass_font_t* font, int size)
+void ass_font_set_size(ass_font_t* font, double size)
 {
        int i;
        if (font->size != size) {
                font->size = size;
                for (i = 0; i < font->n_faces; ++i)
-                       FT_Set_Pixel_Sizes(font->faces[i], 0, size);
+                       FT_Set_Pixel_Sizes(font->faces[i], 0, (int)size);
+               update_transform(font);
        }
 }
 
@@ -199,7 +201,7 @@ static void ass_font_reselect(void* fontconfig_priv, ass_font_t* font, uint32_t
 
        font->faces[font->n_faces++] = face;
        update_transform(font);
-       FT_Set_Pixel_Sizes(face, 0, font->size);
+       FT_Set_Pixel_Sizes(face, 0, (int)font->size);
 }
 #endif
 
index 331db55d9d4f6bab90bae6ffb4c49f104416cae2..85c0218bd895da1c578eaa37a362baad69b9ecd2 100644 (file)
@@ -40,7 +40,7 @@ typedef struct ass_font_s {
        int n_faces;
        double scale_x, scale_y; // current transform
        FT_Vector v; // current shift
-       int size;
+       double size;
 #ifdef HAVE_FONTCONFIG
        FcCharSet* charset;
 #endif
@@ -48,7 +48,7 @@ typedef struct ass_font_s {
 
 ass_font_t* ass_font_new(ass_library_t* library, FT_Library ftlibrary, void* fc_priv, ass_font_desc_t* desc);
 void ass_font_set_transform(ass_font_t* font, double scale_x, double scale_y, FT_Vector* v);
-void ass_font_set_size(ass_font_t* font, int size);
+void ass_font_set_size(ass_font_t* font, double size);
 void ass_font_get_asc_desc(ass_font_t* font, uint32_t ch, int* asc, int* desc);
 FT_Glyph ass_font_get_glyph(void* fontconfig_priv, ass_font_t* font, uint32_t ch, ass_hinting_t hinting);
 FT_Vector ass_font_get_kerning(ass_font_t* font, uint32_t c1, uint32_t c2);
index 1b7938105f22b4102d079d6a96f4fb8b4e8962d2..8bbc7be931ed596acc92b00517d3d9f26d4c3800 100644 (file)
@@ -137,7 +137,7 @@ typedef struct render_context_s {
        
        ass_font_t* font;
        char* font_path;
-       int font_size;
+       double font_size;
        
        FT_Stroker stroker;
        int alignment; // alignment overrides go here; if zero, style value will be used
@@ -508,7 +508,7 @@ static inline int mystrcmp(char** p, const char* sample) {
 
 double ass_internal_font_size_coeff = 0.8;
 
-static void change_font_size(int sz)
+static void change_font_size(double sz)
 {
        double size = sz * frame_context.font_scale;
 
@@ -696,8 +696,8 @@ static char* parse_tag(char* p, double pwr) {
                else
                        render_context.hspacing = render_context.style->Spacing;
        } else if (mystrcmp(&p, "fs")) {
-               int val;
-               if (mystrtoi(&p, 10, &val))
+               double val;
+               if (mystrtod(&p, &val))
                        val = render_context.font_size * ( 1 - pwr ) + val * pwr;
                else
                        val = render_context.style->FontSize;
index e39a2455315b383c1fc8b70af6301c375507f90e..0795d5637160e434e166d2811d752da133dc17af 100644 (file)
@@ -32,7 +32,7 @@
 typedef struct ass_style_s {
        char* Name;
        char* FontName;
-       int FontSize;
+       double FontSize;
        uint32_t PrimaryColour;
        uint32_t SecondaryColour;
        uint32_t OutlineColour;