summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@blackbox>2009-08-23 16:33:38 +0200
committerGrigori Goronzy <greg@blackbox>2009-08-23 16:33:38 +0200
commit8156d2b83b92eeced64f588f8ee116f00c9f15e2 (patch)
tree6ad7b1765e067f57f13dd1cc69073c6fc85787d6
parent0db2bfa543b90cbabac621a4d2f3362b9d746c11 (diff)
downloadlibass-8156d2b83b92eeced64f588f8ee116f00c9f15e2.tar.bz2
libass-8156d2b83b92eeced64f588f8ee116f00c9f15e2.tar.xz
Fix opaque box sizing again
Another try to get it to work like in VSFilter. Hopefully it's behaving the same now (except in some cases, since VSFilter layouts word-based, but libass is glyph-based). Additionally, make sure horizontal letter spacing (\fsp) is scaled according to ScaleX.
-rw-r--r--libass/ass_render.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index 38459e0..b6ec7e4 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -1904,6 +1904,8 @@ static void draw_opaque_box(ASS_Renderer *render_priv, uint32_t ch,
int i;
int adv = d16_to_d6(glyph->advance.x);
double scale_y = render_priv->state.scale_y;
+ double scale_x = render_priv->state.scale_x
+ * render_priv->font_scale_x;
FT_OutlineGlyph og = (FT_OutlineGlyph) glyph;
FT_Outline *ol;
@@ -1911,14 +1913,24 @@ static void draw_opaque_box(ASS_Renderer *render_priv, uint32_t ch,
sx = FFMAX(64, sx);
sy = FFMAX(64, sy);
- ass_font_get_asc_desc(render_priv->state.font, ch, &asc, &desc);
- asc *= scale_y;
- desc *= scale_y;
+ if (ch == -1) {
+ asc = render_priv->state.drawing->asc;
+ desc = render_priv->state.drawing->desc;
+ } else {
+ ass_font_get_asc_desc(render_priv->state.font, ch, &asc, &desc);
+ asc *= scale_y;
+ desc *= scale_y;
+ }
// Emulate the WTFish behavior of VSFilter, i.e. double-scale
- // the widths of the opaque box.
- adv *= render_priv->state.scale_x * render_priv->font_scale_x;
- sx *= render_priv->state.scale_x * render_priv->font_scale_x;
+ // the sizes of the opaque box.
+ adv += double_to_d6(render_priv->state.hspacing * render_priv->font_scale
+ * scale_x);
+ adv *= scale_x;
+ sx *= scale_x;
+ sy *= scale_y;
+ desc *= scale_y;
+ desc += asc * (scale_y - 1.0);
FT_Vector points[4] = {
{ .x = -sx, .y = asc + sy },
@@ -2741,7 +2753,8 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
pen.x += text_info->glyphs[text_info->length].advance.x;
pen.x += double_to_d6(render_priv->state.hspacing *
- render_priv->font_scale);
+ render_priv->font_scale
+ * render_priv->state.scale_x);
pen.y += text_info->glyphs[text_info->length].advance.y;
pen.y += (render_priv->state.fay * render_priv->state.scale_y) *
text_info->glyphs[text_info->length].advance.x;