From a69a6eca41f633bad80cbaf6488788fda9ec5c82 Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Mon, 31 Aug 2009 02:52:03 +0200 Subject: Calculate glyph slant width correctly 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 | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/libass/ass_render.c b/libass/ass_render.c index b595881..f67cba6 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -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 -- cgit v1.2.3