summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@blackbox>2011-07-16 03:00:41 +0200
committerGrigori Goronzy <greg@blackbox>2011-07-16 03:00:41 +0200
commitab9053174b7815d2c0b9cb7a5a726cb2e183ec4e (patch)
treedc0509badd5d20334f1529fc10f70a1501a22c03
parentfa7e99e3d8a78805e9acfb327786307d91c20104 (diff)
downloadlibass-ab9053174b7815d2c0b9cb7a5a726cb2e183ec4e.tar.bz2
libass-ab9053174b7815d2c0b9cb7a5a726cb2e183ec4e.tar.xz
shaper: fix run-specific font size
Make sure to set the font size for every run, as needed, to get metrics (advance/offset) for the right size.
-rw-r--r--libass/ass_font.c8
-rw-r--r--libass/ass_font.h1
-rw-r--r--libass/ass_render.c8
-rw-r--r--libass/ass_shaper.c3
4 files changed, 10 insertions, 10 deletions
diff --git a/libass/ass_font.c b/libass/ass_font.c
index 954040e..d65b976 100644
--- a/libass/ass_font.c
+++ b/libass/ass_font.c
@@ -90,8 +90,6 @@ static int find_font(ASS_Library *library, char *name)
return -1;
}
-static void face_set_size(FT_Face face, double size);
-
static void buggy_font_workaround(FT_Face face)
{
// Some fonts have zero Ascender/Descender fields in 'hhea' table.
@@ -160,7 +158,7 @@ static int add_face(void *fc_priv, ASS_Font *font, uint32_t ch)
buggy_font_workaround(face);
font->faces[font->n_faces++] = face;
- face_set_size(face, font->size);
+ ass_face_set_size(face, font->size);
free(path);
return font->n_faces - 1;
}
@@ -216,7 +214,7 @@ void ass_font_set_transform(ASS_Font *font, double scale_x,
}
}
-static void face_set_size(FT_Face face, double size)
+void ass_face_set_size(FT_Face face, double size)
{
TT_HoriHeader *hori = FT_Get_Sfnt_Table(face, ft_sfnt_hhea);
TT_OS2 *os2 = FT_Get_Sfnt_Table(face, ft_sfnt_os2);
@@ -251,7 +249,7 @@ void ass_font_set_size(ASS_Font *font, double size)
if (font->size != size) {
font->size = size;
for (i = 0; i < font->n_faces; ++i)
- face_set_size(font->faces[i], size);
+ ass_face_set_size(font->faces[i], size);
}
}
diff --git a/libass/ass_font.h b/libass/ass_font.h
index 06fda21..725a7c1 100644
--- a/libass/ass_font.h
+++ b/libass/ass_font.h
@@ -60,6 +60,7 @@ ASS_Font *ass_font_new(Cache *font_cache, ASS_Library *library,
ASS_FontDesc *desc);
void ass_font_set_transform(ASS_Font *font, double scale_x,
double scale_y, FT_Vector *v);
+void ass_face_set_size(FT_Face face, double size);
void ass_font_set_size(ASS_Font *font, double size);
void ass_font_get_asc_desc(ASS_Font *font, uint32_t ch, int *asc,
int *desc);
diff --git a/libass/ass_render.c b/libass/ass_render.c
index 3d23e29..0ac1ff9 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -1139,9 +1139,8 @@ get_outline_glyph(ASS_Renderer *render_priv, GlyphInfo *info)
info->desc = drawing->desc;
ass_drawing_free(drawing);
} else {
- double size_scaled = ensure_font_size(render_priv,
- info->font_size * render_priv->font_scale);
- ass_font_set_size(info->font, size_scaled);
+ ass_face_set_size(info->font->faces[info->face_index],
+ info->font_size);
ass_font_set_transform(info->font, info->scale_x,
info->scale_y, NULL);
// symbol might have been changed. re-get it.
@@ -1797,7 +1796,8 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
render_priv->state.effect_timing;
glyphs[text_info->length].effect_skip_timing =
render_priv->state.effect_skip_timing;
- glyphs[text_info->length].font_size = render_priv->state.font_size;
+ glyphs[text_info->length].font_size = ensure_font_size(render_priv,
+ render_priv->state.font_size * render_priv->font_scale);
glyphs[text_info->length].be = render_priv->state.be;
glyphs[text_info->length].blur = render_priv->state.blur;
glyphs[text_info->length].shadow_x = render_priv->state.shadow_x;
diff --git a/libass/ass_shaper.c b/libass/ass_shaper.c
index 55bcaae..9796dc5 100644
--- a/libass/ass_shaper.c
+++ b/libass/ass_shaper.c
@@ -158,6 +158,8 @@ static hb_font_t *get_hb_font(GlyphInfo *info)
hb_fonts[info->face_index] =
hb_ft_font_create(font->faces[info->face_index], NULL);
+ ass_face_set_size(font->faces[info->face_index], info->font_size);
+
return hb_fonts[info->face_index];
}
@@ -307,7 +309,6 @@ void ass_shaper_find_runs(ASS_Shaper *shaper, ASS_Renderer *render_priv,
// set size and get glyph index
double size_scaled = ensure_font_size(render_priv,
info->font_size * render_priv->font_scale);
- ass_font_set_size(info->font, size_scaled);
ass_font_get_index(render_priv->fontconfig_priv, info->font,
info->symbol, &info->face_index, &info->glyph_index);
// shape runs share the same font face and size