From ea7cb5f75920a16c4101a23c47fb46122caf85d8 Mon Sep 17 00:00:00 2001 From: "Dr.Smile" Date: Thu, 8 Mar 2018 07:57:31 +0300 Subject: Eliminate advance.y from drawings and glyphs Drawings always have advance.y = 0 and FreeType guarantees that for horizontal writing. --- libass/ass_cache.h | 2 +- libass/ass_drawing.c | 2 +- libass/ass_drawing.h | 2 +- libass/ass_render.c | 20 ++++++++------------ 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/libass/ass_cache.h b/libass/ass_cache.h index 278eae4..6c07370 100644 --- a/libass/ass_cache.h +++ b/libass/ass_cache.h @@ -46,7 +46,7 @@ typedef struct { ASS_Outline outline; ASS_Outline border[2]; ASS_Rect bbox_scaled; // bbox after scaling, but before rotation - ASS_Vector advance; // 26.6, advance distance to the next outline in line + int advance; // 26.6, advance distance to the next outline in line int asc, desc; // ascender/descender } OutlineHashValue; diff --git a/libass/ass_drawing.c b/libass/ass_drawing.c index 01547d8..c0ea548 100644 --- a/libass/ass_drawing.c +++ b/libass/ass_drawing.c @@ -59,7 +59,7 @@ static void drawing_finish(ASS_Drawing *drawing, bool raw_mode) if (raw_mode) return; - drawing->advance.x = bbox.x_max - bbox.x_min; + drawing->advance = bbox.x_max - bbox.x_min; double pbo = drawing->pbo / (1 << (drawing->scale - 1)); drawing->desc = double_to_d6(pbo * drawing->scale_y); diff --git a/libass/ass_drawing.h b/libass/ass_drawing.h index 5fef7e0..2b08e77 100644 --- a/libass/ass_drawing.h +++ b/libass/ass_drawing.h @@ -50,7 +50,7 @@ typedef struct { int asc; // ascender int desc; // descender ASS_Outline outline; // target outline - ASS_Vector advance; // advance (from cbox) + int advance; // advance (from cbox) // private ASS_Library *library; diff --git a/libass/ass_render.c b/libass/ass_render.c index 1f9bc81..5648aff 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -914,9 +914,8 @@ static void free_render_context(ASS_Renderer *render_priv) */ static void draw_opaque_box(ASS_Renderer *render_priv, GlyphInfo *info, int asc, int desc, ASS_Outline *ol, - ASS_Vector advance, int sx, int sy) + int adv, int sx, int sy) { - int adv = advance.x; double scale_y = info->orig_scale_y; double scale_x = info->orig_scale_x; @@ -1037,8 +1036,7 @@ get_outline_glyph(ASS_Renderer *priv, GlyphInfo *info) ass_cache_dec_ref(val); return; } - val->advance.x = drawing->advance.x; - val->advance.y = drawing->advance.y; + val->advance = drawing->advance; val->asc = drawing->asc; val->desc = drawing->desc; } else { @@ -1056,10 +1054,8 @@ get_outline_glyph(ASS_Renderer *priv, GlyphInfo *info) ass_cache_dec_ref(val); return; } - if (priv->settings.shaper == ASS_SHAPING_SIMPLE) { - val->advance.x = d16_to_d6(glyph->advance.x); - val->advance.y = d16_to_d6(glyph->advance.y); - } + if (priv->settings.shaper == ASS_SHAPING_SIMPLE) + val->advance = d16_to_d6(glyph->advance.x); FT_Done_Glyph(glyph); ass_font_get_asc_desc(info->font, info->symbol, &val->asc, &val->desc); @@ -1072,11 +1068,11 @@ get_outline_glyph(ASS_Renderer *priv, GlyphInfo *info) outline_get_cbox(&val->outline, &val->bbox_scaled); if (info->border_style == 3) { - ASS_Vector advance; + int advance; if (priv->settings.shaper == ASS_SHAPING_SIMPLE || info->drawing) advance = val->advance; else - advance = info->advance; + advance = info->advance.x; draw_opaque_box(priv, info, val->asc, val->desc, &val->border[0], advance, double_to_d6(info->border_x * priv->border_scale), @@ -1112,8 +1108,8 @@ get_outline_glyph(ASS_Renderer *priv, GlyphInfo *info) info->border[1] = &val->border[1]; info->bbox = val->bbox_scaled; if (info->drawing || priv->settings.shaper == ASS_SHAPING_SIMPLE) { - info->cluster_advance.x = info->advance.x = val->advance.x; - info->cluster_advance.y = info->advance.y = val->advance.y; + info->cluster_advance.x = info->advance.x = val->advance; + info->cluster_advance.y = info->advance.y = 0; } info->asc = val->asc; info->desc = val->desc; -- cgit v1.2.3