]> granicus.if.org Git - libass/commitdiff
Calculate glyph slant width correctly
authorGrigori Goronzy <greg@blackbox>
Mon, 31 Aug 2009 00:52:03 +0000 (02:52 +0200)
committerGrigori Goronzy <greg@blackbox>
Mon, 31 Aug 2009 03:25:24 +0000 (05:25 +0200)
If a glyph is wider than its advance width for italic to non-italic
style changes, assume it was obliqued by FreeType's FT_GlyphSlot_Oblique
function and offset the next glyph accordingly.

libass/ass_render.c

index b5958814288496a95979d5ede36d998fc25300cb..f67cba64efe426826915ee9613074cc793f51d76 100644 (file)
@@ -2737,9 +2737,6 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
         get_outline_glyph(render_priv, code,
                           text_info->glyphs + text_info->length, drawing);
 
-        text_info->glyphs[text_info->length].pos.x = pen.x;
-        text_info->glyphs[text_info->length].pos.y = pen.y;
-
         // Add additional space after italic to non-italic style changes
         if (text_info->length &&
             text_info->glyphs[text_info->length - 1].hash_key.italic &&
@@ -2748,9 +2745,15 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
             GlyphInfo *og = &text_info->glyphs[back];
             while (og->bbox.xMax - og->bbox.xMin == 0 && og->hash_key.italic)
                 og = &text_info->glyphs[--back];
-            pen.x += FFMAX(0, og->bbox.xMax - og->advance.x);
+            if (og->bbox.xMax > og->advance.x) {
+                // The FreeType oblique slants by 6/16
+                pen.x += og->bbox.yMax * 0.375;
+            }
         }
 
+        text_info->glyphs[text_info->length].pos.x = pen.x;
+        text_info->glyphs[text_info->length].pos.y = pen.y;
+
         pen.x += text_info->glyphs[text_info->length].advance.x;
         pen.x += double_to_d6(render_priv->state.hspacing *
                               render_priv->font_scale