summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@blackbox>2009-07-10 23:00:10 +0200
committerGrigori Goronzy <greg@blackbox>2009-07-10 23:01:16 +0200
commit9305f3815442f8c0bd735e96832b7f72628bfcad (patch)
tree12d4ca061cc4783f7e6a81a57b6517e1ea95394d
parentba770fa05426c04d5a1900b37fc7bcc700584720 (diff)
downloadlibass-9305f3815442f8c0bd735e96832b7f72628bfcad.tar.bz2
libass-9305f3815442f8c0bd735e96832b7f72628bfcad.tar.xz
Move gaussian blur into bitmap handling code
-rw-r--r--libass/ass_bitmap.c121
-rw-r--r--libass/ass_utils.c119
-rw-r--r--libass/ass_utils.h3
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);