]> granicus.if.org Git - libass/commitdiff
shaper: add hack to workaround grid-fitting
authorGrigori Goronzy <greg@blackbox>
Tue, 16 Oct 2012 17:55:55 +0000 (19:55 +0200)
committerGrigori Goronzy <greg@blackbox>
Tue, 16 Oct 2012 17:55:55 +0000 (19:55 +0200)
This complements commit 7af780, which didn't correctly apply the hack
to the advance/position as calculated by the shaper.

libass/ass_render.c
libass/ass_shaper.c

index 980dac350efc6024454b53201442db863a149d0b..9e111c248e7c563077d65dc8a9304a736451c5e8 100644 (file)
@@ -1099,7 +1099,8 @@ get_outline_glyph(ASS_Renderer *priv, GlyphInfo *info)
             key.u.drawing.text = strdup(drawing->text);
         } else {
             // arbitrary, not too small to prevent grid fitting rounding effects
-            double ft_size = 256.0;
+            // XXX: this is a rather crude hack
+            const double ft_size = 256.0;
             ass_face_set_size(info->font->faces[info->face_index], ft_size);
             ass_font_set_transform(info->font,
                 info->scale_x * info->font_size / ft_size,
index 937cadcc20117fc89384d1e5bdfe19e4ce8cd088..9434f432088878035a26b95b020789844a86fd08 100644 (file)
@@ -391,7 +391,9 @@ static hb_font_t *get_hb_font(ASS_Shaper *shaper, GlyphInfo *info)
                 font->faces[info->face_index], NULL);
     }
 
-    ass_face_set_size(font->faces[info->face_index], info->font_size);
+    // XXX: this is a rather crude hack
+    const double ft_size = 256.0;
+    ass_face_set_size(font->faces[info->face_index], ft_size);
     update_hb_size(hb_fonts[info->face_index], font->faces[info->face_index]);
 
     // update hash key for cached metrics
@@ -421,7 +423,7 @@ static void shape_harfbuzz(ASS_Shaper *shaper, GlyphInfo *glyphs, size_t len)
         hb_buffer_t *buf;
         hb_font_t *font;
     } runs[MAX_RUNS];
-
+    const double ft_size = 256.0;
 
     for (i = 0; i < len && run < MAX_RUNS; i++, run++) {
         // get length and level of the current run
@@ -474,10 +476,10 @@ static void shape_harfbuzz(ASS_Shaper *shaper, GlyphInfo *glyphs, size_t len)
             // set position and advance
             info->skip = 0;
             info->glyph_index = glyph_info[j].codepoint;
-            info->offset.x    = pos[j].x_offset * info->scale_x;
-            info->offset.y    = -pos[j].y_offset * info->scale_y;
-            info->advance.x   = pos[j].x_advance * info->scale_x;
-            info->advance.y   = -pos[j].y_advance * info->scale_y;
+            info->offset.x    = pos[j].x_offset * info->scale_x * (info->font_size / ft_size);
+            info->offset.y    = -pos[j].y_offset * info->scale_y * (info->font_size / ft_size);
+            info->advance.x   = pos[j].x_advance * info->scale_x * (info->font_size / ft_size);
+            info->advance.y   = -pos[j].y_advance * info->scale_y * (info->font_size / ft_size);
 
             // accumulate advance in the root glyph
             root->cluster_advance.x += info->advance.x;