Fix a few bugs in blur implementation
authorKristian Høgsberg <krh@bitplanet.net>
Tue, 15 Jun 2010 20:18:58 +0000 (16:18 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 15 Jun 2010 20:18:58 +0000 (16:18 -0400)
cairo-util.c
cairo-util.h

index 5e0a2d0..437098c 100644 (file)
@@ -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;
                }
index 6b0ca2d..d74b27d 100644 (file)
 #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);