diff options
author | Grigori Goronzy <greg@chown.ath.cx> | 2015-09-15 03:00:05 +0200 |
---|---|---|
committer | Grigori Goronzy <greg@chown.ath.cx> | 2015-09-16 11:28:12 +0200 |
commit | 45ae478d2dd4576a09b0680e0b8b220a9c30330e (patch) | |
tree | 7e7f34cd7addd0ae95df42448506420018d969a5 /libass | |
parent | b4c3e218f52a041340631e2d3e686ea8d9cc4da3 (diff) | |
download | libass-45ae478d2dd4576a09b0680e0b8b220a9c30330e.tar.bz2 libass-45ae478d2dd4576a09b0680e0b8b220a9c30330e.tar.xz |
font: ignore bearing for strikes
This is more robust and simpler. The bearing calculations initially
were bugged, but getting rid of them completely seems better. It is
consistent with other text renderers as well. To simplify things, also
move striking before the additional scale is applied and get rid of the
half-pixel overlapping thing; it is not needed with additive blending.
Fixes #193.
Diffstat (limited to 'libass')
-rw-r--r-- | libass/ass_font.c | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/libass/ass_font.c b/libass/ass_font.c index 67f8eec..b97567f 100644 --- a/libass/ass_font.c +++ b/libass/ass_font.c @@ -375,7 +375,7 @@ static int ass_strike_outline_glyph(FT_Face face, ASS_Font *font, TT_OS2 *os2 = FT_Get_Sfnt_Table(face, ft_sfnt_os2); TT_Postscript *ps = FT_Get_Sfnt_Table(face, ft_sfnt_post); FT_Outline *ol = &((FT_OutlineGlyph) glyph)->outline; - int bear, advance, y_scale, i, dir; + int advance, y_scale, i, dir; if (!under && !through) return 0; @@ -394,11 +394,7 @@ static int ass_strike_outline_glyph(FT_Face face, ASS_Font *font, if (!ASS_REALLOC_ARRAY(ol->contours, ol->n_contours + i)) return 0; - // If the bearing is negative, the glyph starts left of the current - // pen position - bear = FFMIN(face->glyph->metrics.horiBearingX, 0); - // We're adding half a pixel to avoid small gaps - advance = d16_to_d6(glyph->advance.x) + 32; + advance = d16_to_d6(glyph->advance.x); y_scale = face->size->metrics.y_scale; // Reverse drawing direction for non-truetype fonts @@ -406,24 +402,23 @@ static int ass_strike_outline_glyph(FT_Face face, ASS_Font *font, // Add points to the outline if (under && ps) { - int pos = FT_MulFix(ps->underlinePosition, y_scale * font->scale_y); - int size = FT_MulFix(ps->underlineThickness, - y_scale * font->scale_y / 2); + int pos = FT_MulFix(ps->underlinePosition, y_scale); + int size = FT_MulFix(ps->underlineThickness, y_scale / 2); if (pos > 0 || size <= 0) return 1; - add_line(ol, bear, advance, dir, pos, size); + add_line(ol, 0, advance, dir, pos, size); } if (through && os2) { - int pos = FT_MulFix(os2->yStrikeoutPosition, y_scale * font->scale_y); - int size = FT_MulFix(os2->yStrikeoutSize, y_scale * font->scale_y / 2); + int pos = FT_MulFix(os2->yStrikeoutPosition, y_scale); + int size = FT_MulFix(os2->yStrikeoutSize, y_scale / 2); if (pos < 0 || size <= 0) return 1; - add_line(ol, bear, advance, dir, pos, size); + add_line(ol, 0, advance, dir, pos, size); } return 0; @@ -658,6 +653,9 @@ FT_Glyph ass_font_get_glyph(ASS_Font *font, uint32_t ch, int face_index, glyph->advance.x = face->glyph->linearVertAdvance; } + ass_strike_outline_glyph(face, font, glyph, deco & DECO_UNDERLINE, + deco & DECO_STRIKETHROUGH); + // Apply scaling and shift FT_Matrix scale = { double_to_d16(font->scale_x), 0, 0, double_to_d16(font->scale_y) }; @@ -666,9 +664,6 @@ FT_Glyph ass_font_get_glyph(ASS_Font *font, uint32_t ch, int face_index, FT_Outline_Translate(outl, font->v.x, font->v.y); glyph->advance.x *= font->scale_x; - ass_strike_outline_glyph(face, font, glyph, deco & DECO_UNDERLINE, - deco & DECO_STRIKETHROUGH); - return glyph; } |