From 49e868cb05c428c1b9b76779b8cb50b2a918ba05 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 15 Jun 2010 16:18:58 -0400 Subject: [PATCH] Fix a few bugs in blur implementation --- cairo-util.c | 10 ++++++---- cairo-util.h | 17 ----------------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/cairo-util.c b/cairo-util.c index 5e0a2d0..437098c 100644 --- a/cairo-util.c +++ b/cairo-util.c @@ -37,7 +37,7 @@ blur_surface(cairo_surface_t *surface, int margin) uint8_t *src, *dst; uint32_t *s, *d, a, p; int i, j, k, size, half; - uint8_t kernel[35]; + uint32_t kernel[49]; double f; size = ARRAY_LENGTH(kernel); @@ -49,11 +49,9 @@ blur_surface(cairo_surface_t *surface, int margin) dst = malloc(height * stride); half = size / 2; - a = 0; for (i = 0; i < size; i++) { f = (i - half); - kernel[i] = exp(- f * f / 30.0) * 80; - a += kernel[i]; + kernel[i] = exp(- f * f / ARRAY_LENGTH(kernel)) * 10000; } for (i = 0; i < height; i++) { @@ -69,6 +67,7 @@ blur_surface(cairo_surface_t *surface, int margin) y = 0; z = 0; w = 0; + a = 0; for (k = 0; k < size; k++) { if (j - half + k < 0 || j - half + k >= width) continue; @@ -78,6 +77,7 @@ blur_surface(cairo_surface_t *surface, int margin) y += ((p >> 16) & 0xff) * kernel[k]; z += ((p >> 8) & 0xff) * kernel[k]; w += (p & 0xff) * kernel[k]; + a += kernel[k]; } d[j] = (x / a << 24) | (y / a << 16) | (z / a << 8) | w / a; } @@ -96,6 +96,7 @@ blur_surface(cairo_surface_t *surface, int margin) y = 0; z = 0; w = 0; + a = 0; for (k = 0; k < size; k++) { if (i - half + k < 0 || i - half + k >= height) continue; @@ -106,6 +107,7 @@ blur_surface(cairo_surface_t *surface, int margin) y += ((p >> 16) & 0xff) * kernel[k]; z += ((p >> 8) & 0xff) * kernel[k]; w += (p & 0xff) * kernel[k]; + a += kernel[k]; } d[j] = (x / a << 24) | (y / a << 16) | (z / a << 8) | w / a; } diff --git a/cairo-util.h b/cairo-util.h index 6b0ca2d..d74b27d 100644 --- a/cairo-util.h +++ b/cairo-util.h @@ -23,23 +23,6 @@ #ifndef _CAIRO_UTIL_H #define _CAIRO_UTIL_H -struct buffer { - int width, height, stride; - uint32_t name, handle; -}; - -struct buffer * -buffer_create(int fd, int width, int height, int stride); - -int -buffer_destroy(struct buffer *buffer, int fd); - -int -buffer_data(struct buffer *buffer, int fd, void *data); - -struct buffer * -buffer_create_from_cairo_surface(int fd, cairo_surface_t *surface); - void blur_surface(cairo_surface_t *surface, int margin); -- 2.7.4