summaryrefslogtreecommitdiffstats
path: root/libass/ass_render.c
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@hein>2009-06-29 02:10:02 +0200
committerGrigori Goronzy <greg@hein>2009-06-29 02:10:02 +0200
commite8433c6ff67409c55ff005fa3d7a28e52d8ec21b (patch)
treeae5f9b0a4ea53bb2c2c87b935eccdee0f1b298ab /libass/ass_render.c
parenta75f6a8d3d3ed6410cc2a4efa866a99152d78af6 (diff)
downloadlibass-e8433c6ff67409c55ff005fa3d7a28e52d8ec21b.tar.bz2
libass-e8433c6ff67409c55ff005fa3d7a28e52d8ec21b.tar.xz
Subpixel accurate shadow rendering
Shadows are handled different from glyph and outline. A shadow is the sum of glyph and outline bitmap; therefore shifting to the correct subpixel amount before rasterization is out of the question. Instead, the bitmap is shifted by its subpixel amount after being built from shadow and glyph. The bitmap cache was extended for this.
Diffstat (limited to 'libass/ass_render.c')
-rw-r--r--libass/ass_render.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index 2abb9d7..c779f3b 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -41,7 +41,6 @@
#define MAX_LINES_INITIAL 64
#define BLUR_MAX_RADIUS 100.0
#define MAX_BE 100
-#define ROUND(x) ((int) ((x) + .5))
#define SUBPIXEL_MASK 63 // d6 bitmask for subpixel accuracy adjustment
static int last_render_id = 0;
@@ -574,10 +573,10 @@ static ass_image_t *render_text(ass_renderer_t *render_priv, int dst_x,
pen_x =
dst_x + (info->pos.x >> 6) +
- ROUND(info->shadow_x * render_priv->border_scale);
+ (int) (info->shadow_x * render_priv->border_scale);
pen_y =
dst_y + (info->pos.y >> 6) +
- ROUND(info->shadow_y * render_priv->border_scale);
+ (int) (info->shadow_y * render_priv->border_scale);
bm = info->bm_s;
here_tail = tail;
@@ -1874,7 +1873,8 @@ get_bitmap_glyph(ass_renderer_t *render_priv, glyph_info_t *info)
info->glyph, info->outline_glyph,
&info->bm, &info->bm_o,
&info->bm_s, info->be,
- info->blur * render_priv->border_scale);
+ info->blur * render_priv->border_scale,
+ info->hash_key.shadow_offset);
if (error)
info->symbol = 0;
@@ -2439,6 +2439,16 @@ ass_render_event(ass_renderer_t *render_priv, ass_event_t *event,
render_priv->state.be;
text_info->glyphs[text_info->length].hash_key.blur =
render_priv->state.blur;
+ text_info->glyphs[text_info->length].hash_key.shadow_offset.x =
+ double_to_d6(
+ render_priv->state.shadow_x * render_priv->border_scale -
+ (int) (render_priv->state.shadow_x *
+ render_priv->border_scale));
+ text_info->glyphs[text_info->length].hash_key.shadow_offset.y =
+ double_to_d6(
+ render_priv->state.shadow_y * render_priv->border_scale -
+ (int) (render_priv->state.shadow_y *
+ render_priv->border_scale));
text_info->length++;