summaryrefslogtreecommitdiffstats
path: root/libass/ass_render.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-09-24 22:28:35 +0200
committerwm4 <wm4@nowhere>2013-09-24 22:28:35 +0200
commit05eb520f431e73c2ad19a8e0261f35d396545cf9 (patch)
treef3a2bff8aecde35d967105f15680753183e9f4db /libass/ass_render.c
parent7a2596b0e3a644f927046774dd748d5ff8e1b0c6 (diff)
downloadlibass-05eb520f431e73c2ad19a8e0261f35d396545cf9.tar.bz2
libass-05eb520f431e73c2ad19a8e0261f35d396545cf9.tar.xz
Restore hinting
This was broken since commit f780146. For reasons why, read the commit message of that commit. To make it short, we set the font size to something large and constant (256), and scale the font outlines returned by freetype to the size we need in order to get smooth animation and accurate positioning. Of course, this obviously breaks hinting. Fix hinting by not using the hack mentioned above if hinting enabled. To mitigate the issues caused by freetype grid fitting and extremely bad ASS scripts (such as setting font size to very small values and scaling them up with \fscx/y), we still adjust the font size such that the font is never scaled in Y direction (only in X direction, because the \fscx/y tags can change aspect ratio). Also see google code issue #46.
Diffstat (limited to 'libass/ass_render.c')
-rw-r--r--libass/ass_render.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index e592548..45d88bb 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -1097,9 +1097,16 @@ get_outline_glyph(ASS_Renderer *priv, GlyphInfo *info)
v.desc = drawing->desc;
key.u.drawing.text = strdup(drawing->text);
} else {
- // arbitrary, not too small to prevent grid fitting rounding effects
- // XXX: this is a rather crude hack
- const double ft_size = 256.0;
+ double ft_size;
+ if (priv->settings.hinting == ASS_HINTING_NONE) {
+ // arbitrary, not too small to prevent grid fitting rounding effects
+ // XXX: this is a rather crude hack
+ ft_size = 256.0;
+ } else {
+ // If hinting is enabled, we want to pass the real font size
+ // to freetype. Normalize scale_y to 1.0.
+ ft_size = info->scale_y * info->font_size;
+ }
ass_face_set_size(info->font->faces[info->face_index], ft_size);
ass_font_set_transform(info->font,
info->scale_x * info->font_size / ft_size,