diff options
author | Grigori Goronzy <greg@hein> | 2009-06-29 02:10:02 +0200 |
---|---|---|
committer | Grigori Goronzy <greg@hein> | 2009-06-29 02:10:02 +0200 |
commit | e8433c6ff67409c55ff005fa3d7a28e52d8ec21b (patch) | |
tree | ae5f9b0a4ea53bb2c2c87b935eccdee0f1b298ab /libass/ass_render.c | |
parent | a75f6a8d3d3ed6410cc2a4efa866a99152d78af6 (diff) | |
download | libass-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.c | 18 |
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++; |