diff options
author | greg <greg@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2009-03-06 01:17:05 +0000 |
---|---|---|
committer | greg <greg@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2009-03-06 01:17:05 +0000 |
commit | cd12c943e846ec7ec4e6d65266f20670e2072927 (patch) | |
tree | 613366e4e01904241707a15b02cacf305436a469 /libass/ass_bitmap.c | |
parent | 34e8e99865ae9227ca9d522fa394112ba1dfd5ef (diff) | |
download | libass-cd12c943e846ec7ec4e6d65266f20670e2072927.tar.bz2 libass-cd12c943e846ec7ec4e6d65266f20670e2072927.tar.xz |
Use blur with kernel [[1,2,1], [2,4,2], [1,2,1]] for \be.
This is faster than gaussian blur and similar to vsfilter.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28834 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libass/ass_bitmap.c')
-rw-r--r-- | libass/ass_bitmap.c | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/libass/ass_bitmap.c b/libass/ass_bitmap.c index 9fb1eab6..dccdc542 100644 --- a/libass/ass_bitmap.c +++ b/libass/ass_bitmap.c @@ -255,11 +255,38 @@ static bitmap_t* fix_outline_and_shadow(bitmap_t* bm_g, bitmap_t* bm_o) return bm_s; } -int glyph_to_bitmap(ass_synth_priv_t* priv, ass_synth_priv_t* priv_blur, +/** + * \brief Blur with [[1,2,1]. [2,4,2], [1,2,1]] kernel + * This blur is the same as the one employed by vsfilter. + */ +static void be_blur(unsigned char *buf, int w, int h) { + unsigned int x, y; + unsigned int old_sum, new_sum; + + for (y=0; y<h; y++) { + old_sum = 2 * buf[0]; + for (x=0; x<w-1; x++) { + new_sum = buf[y*w+x] + buf[y*w+x+1]; + buf[y*w+x] = (old_sum + new_sum) >> 2; + old_sum = new_sum; + } + } + + for (x=0; x<w; x++) { + old_sum = 2 * buf[0]; + for (y=0; y<h-1; y++) { + new_sum = buf[y*w+x] + buf[(y+1)*w+x]; + buf[y*w+x] = (old_sum + new_sum) >> 2; + old_sum = new_sum; + } + } +} + +int glyph_to_bitmap(ass_synth_priv_t* priv_blur, FT_Glyph glyph, FT_Glyph outline_glyph, bitmap_t** bm_g, bitmap_t** bm_o, bitmap_t** bm_s, int be, double blur_radius) { - int bord = be ? (be+1) : 0; + int bord = be ? (be/4+1) : 0; blur_radius *= 2; bord = (blur_radius > 0.0) ? blur_radius : bord; @@ -279,19 +306,16 @@ int glyph_to_bitmap(ass_synth_priv_t* priv, ass_synth_priv_t* priv_blur, return 1; } } - if (*bm_o) { - resize_tmp(priv, (*bm_o)->w, (*bm_o)->h); + if (*bm_o) resize_tmp(priv_blur, (*bm_o)->w, (*bm_o)->h); - } - resize_tmp(priv, (*bm_g)->w, (*bm_g)->h); resize_tmp(priv_blur, (*bm_g)->w, (*bm_g)->h); if (be) { while (be--) { if (*bm_o) - blur((*bm_o)->buffer, priv->tmp, (*bm_o)->w, (*bm_o)->h, (*bm_o)->w, (int*)priv->gt2, priv->g_r, priv->g_w); + be_blur((*bm_o)->buffer, (*bm_o)->w, (*bm_o)->h); else - blur((*bm_g)->buffer, priv->tmp, (*bm_g)->w, (*bm_g)->h, (*bm_g)->w, (int*)priv->gt2, priv->g_r, priv->g_w); + be_blur((*bm_g)->buffer, (*bm_g)->w, (*bm_g)->h); } } else { if (blur_radius > 0.0) { |