diff options
author | Grigori Goronzy <greg@blackbox> | 2009-07-10 23:00:10 +0200 |
---|---|---|
committer | Grigori Goronzy <greg@blackbox> | 2009-07-10 23:01:16 +0200 |
commit | 9305f3815442f8c0bd735e96832b7f72628bfcad (patch) | |
tree | 12d4ca061cc4783f7e6a81a57b6517e1ea95394d /libass | |
parent | ba770fa05426c04d5a1900b37fc7bcc700584720 (diff) | |
download | libass-9305f3815442f8c0bd735e96832b7f72628bfcad.tar.bz2 libass-9305f3815442f8c0bd735e96832b7f72628bfcad.tar.xz |
Move gaussian blur into bitmap handling code
Diffstat (limited to 'libass')
-rw-r--r-- | libass/ass_bitmap.c | 121 | ||||
-rw-r--r-- | libass/ass_utils.c | 119 | ||||
-rw-r--r-- | libass/ass_utils.h | 3 |
3 files changed, 121 insertions, 122 deletions
diff --git a/libass/ass_bitmap.c b/libass/ass_bitmap.c index d28d47b..140cca2 100644 --- a/libass/ass_bitmap.c +++ b/libass/ass_bitmap.c @@ -322,6 +322,127 @@ static void shift_bitmap(unsigned char *buf, int w, int h, int shift_x, } } +/* + * Gaussian blur. An fast pure C implementation from MPlayer. + */ +static void ass_gauss_blur(unsigned char *buffer, unsigned short *tmp2, + int width, int height, int stride, int *m2, + int r, int mwidth) +{ + + int x, y; + + unsigned char *s = buffer; + unsigned short *t = tmp2 + 1; + for (y = 0; y < height; y++) { + memset(t - 1, 0, (width + 1) * sizeof(short)); + + for (x = 0; x < r; x++) { + const int src = s[x]; + if (src) { + register unsigned short *dstp = t + x - r; + int mx; + unsigned *m3 = (unsigned *) (m2 + src * mwidth); + for (mx = r - x; mx < mwidth; mx++) { + dstp[mx] += m3[mx]; + } + } + } + + for (; x < width - r; x++) { + const int src = s[x]; + if (src) { + register unsigned short *dstp = t + x - r; + int mx; + unsigned *m3 = (unsigned *) (m2 + src * mwidth); + for (mx = 0; mx < mwidth; mx++) { + dstp[mx] += m3[mx]; + } + } + } + + for (; x < width; x++) { + const int src = s[x]; + if (src) { + register unsigned short *dstp = t + x - r; + int mx; + const int x2 = r + width - x; + unsigned *m3 = (unsigned *) (m2 + src * mwidth); + for (mx = 0; mx < x2; mx++) { + dstp[mx] += m3[mx]; + } + } + } + + s += stride; + t += width + 1; + } + + t = tmp2; + for (x = 0; x < width; x++) { + for (y = 0; y < r; y++) { + unsigned short *srcp = t + y * (width + 1) + 1; + int src = *srcp; + if (src) { + register unsigned short *dstp = srcp - 1 + width + 1; + const int src2 = (src + 128) >> 8; + unsigned *m3 = (unsigned *) (m2 + src2 * mwidth); + + int mx; + *srcp = 128; + for (mx = r - 1; mx < mwidth; mx++) { + *dstp += m3[mx]; + dstp += width + 1; + } + } + } + for (; y < height - r; y++) { + unsigned short *srcp = t + y * (width + 1) + 1; + int src = *srcp; + if (src) { + register unsigned short *dstp = srcp - 1 - r * (width + 1); + const int src2 = (src + 128) >> 8; + unsigned *m3 = (unsigned *) (m2 + src2 * mwidth); + + int mx; + *srcp = 128; + for (mx = 0; mx < mwidth; mx++) { + *dstp += m3[mx]; + dstp += width + 1; + } + } + } + for (; y < height; y++) { + unsigned short *srcp = t + y * (width + 1) + 1; + int src = *srcp; + if (src) { + const int y2 = r + height - y; + register unsigned short *dstp = srcp - 1 - r * (width + 1); + const int src2 = (src + 128) >> 8; + unsigned *m3 = (unsigned *) (m2 + src2 * mwidth); + + int mx; + *srcp = 128; + for (mx = 0; mx < y2; mx++) { + *dstp += m3[mx]; + dstp += width + 1; + } + } + } + t++; + } + + t = tmp2; + s = buffer; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + s[x] = t[x] >> 8; + } + s += stride; + t += width + 1; + } +} + /** * \brief Blur with [[1,2,1]. [2,4,2], [1,2,1]] kernel * This blur is the same as the one employed by vsfilter. diff --git a/libass/ass_utils.c b/libass/ass_utils.c index 5f63268..66b508d 100644 --- a/libass/ass_utils.c +++ b/libass/ass_utils.c @@ -160,125 +160,6 @@ unsigned ass_utf8_get_char(char **str) return c; } -// gaussian blur -void ass_gauss_blur(unsigned char *buffer, - unsigned short *tmp2, - int width, int height, int stride, int *m2, int r, int mwidth) -{ - - int x, y; - - unsigned char *s = buffer; - unsigned short *t = tmp2 + 1; - for (y = 0; y < height; y++) { - memset(t - 1, 0, (width + 1) * sizeof(short)); - - for (x = 0; x < r; x++) { - const int src = s[x]; - if (src) { - register unsigned short *dstp = t + x - r; - int mx; - unsigned *m3 = (unsigned *) (m2 + src * mwidth); - for (mx = r - x; mx < mwidth; mx++) { - dstp[mx] += m3[mx]; - } - } - } - - for (; x < width - r; x++) { - const int src = s[x]; - if (src) { - register unsigned short *dstp = t + x - r; - int mx; - unsigned *m3 = (unsigned *) (m2 + src * mwidth); - for (mx = 0; mx < mwidth; mx++) { - dstp[mx] += m3[mx]; - } - } - } - - for (; x < width; x++) { - const int src = s[x]; - if (src) { - register unsigned short *dstp = t + x - r; - int mx; - const int x2 = r + width - x; - unsigned *m3 = (unsigned *) (m2 + src * mwidth); - for (mx = 0; mx < x2; mx++) { - dstp[mx] += m3[mx]; - } - } - } - - s += stride; - t += width + 1; - } - - t = tmp2; - for (x = 0; x < width; x++) { - for (y = 0; y < r; y++) { - unsigned short *srcp = t + y * (width + 1) + 1; - int src = *srcp; - if (src) { - register unsigned short *dstp = srcp - 1 + width + 1; - const int src2 = (src + 128) >> 8; - unsigned *m3 = (unsigned *) (m2 + src2 * mwidth); - - int mx; - *srcp = 128; - for (mx = r - 1; mx < mwidth; mx++) { - *dstp += m3[mx]; - dstp += width + 1; - } - } - } - for (; y < height - r; y++) { - unsigned short *srcp = t + y * (width + 1) + 1; - int src = *srcp; - if (src) { - register unsigned short *dstp = srcp - 1 - r * (width + 1); - const int src2 = (src + 128) >> 8; - unsigned *m3 = (unsigned *) (m2 + src2 * mwidth); - - int mx; - *srcp = 128; - for (mx = 0; mx < mwidth; mx++) { - *dstp += m3[mx]; - dstp += width + 1; - } - } - } - for (; y < height; y++) { - unsigned short *srcp = t + y * (width + 1) + 1; - int src = *srcp; - if (src) { - const int y2 = r + height - y; - register unsigned short *dstp = srcp - 1 - r * (width + 1); - const int src2 = (src + 128) >> 8; - unsigned *m3 = (unsigned *) (m2 + src2 * mwidth); - - int mx; - *srcp = 128; - for (mx = 0; mx < y2; mx++) { - *dstp += m3[mx]; - dstp += width + 1; - } - } - } - t++; - } - - t = tmp2; - s = buffer; - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - s[x] = t[x] >> 8; - } - s += stride; - t += width + 1; - } -} - #ifdef CONFIG_ENCA void *ass_guess_buffer_cp(unsigned char *buffer, int buflen, char *preferred_language, char *fallback) diff --git a/libass/ass_utils.h b/libass/ass_utils.h index cb1fae7..e1e06ad 100644 --- a/libass/ass_utils.h +++ b/libass/ass_utils.h @@ -52,9 +52,6 @@ int strtocolor(char **q, uint32_t *res); char parse_bool(char *str); unsigned ass_utf8_get_char(char **str); void ass_msg(int lvl, char *fmt, ...); -void ass_gauss_blur(unsigned char *buffer, unsigned short *tmp2, - int width, int height, int stride, int *m2, - int r, int mwidth); void *ass_guess_buffer_cp(unsigned char *buffer, int buflen, char *preferred_language, char *fallback); |