Optimize window blur calculation.

dev
Kristian Høgsberg 16 years ago
parent 2f2cfae227
commit 10bdd298b8
  1. 10
      cairo-util.c
  2. 2
      cairo-util.h
  3. 2
      pointer.c
  4. 3
      window.c

@ -101,13 +101,13 @@ buffer_create_from_cairo_surface(int fd, cairo_surface_t *surface)
} }
void void
blur_surface(cairo_surface_t *surface) blur_surface(cairo_surface_t *surface, int margin)
{ {
cairo_surface_t *tmp; cairo_surface_t *tmp;
int32_t width, height, stride, x, y, z, w; int32_t width, height, stride, x, y, z, w;
uint8_t *src, *dst; uint8_t *src, *dst;
uint32_t *s, *d, a, p; uint32_t *s, *d, a, p;
int i, j, k, size = 23, half; int i, j, k, size = 17, half;
uint8_t kernel[100]; uint8_t kernel[100];
double f; double f;
@ -131,6 +131,9 @@ blur_surface(cairo_surface_t *surface)
s = (uint32_t *) (src + i * stride); s = (uint32_t *) (src + i * stride);
d = (uint32_t *) (dst + i * stride); d = (uint32_t *) (dst + i * stride);
for (j = 0; j < width; j++) { for (j = 0; j < width; j++) {
if (margin < j && j < width - margin &&
margin < i && i < height - margin)
continue;
x = 0; x = 0;
y = 0; y = 0;
z = 0; z = 0;
@ -153,6 +156,9 @@ blur_surface(cairo_surface_t *surface)
s = (uint32_t *) (dst + i * stride); s = (uint32_t *) (dst + i * stride);
d = (uint32_t *) (src + i * stride); d = (uint32_t *) (src + i * stride);
for (j = 0; j < width; j++) { for (j = 0; j < width; j++) {
if (margin <= j && j < width - margin &&
margin <= i && i < height - margin)
continue;
x = 0; x = 0;
y = 0; y = 0;
z = 0; z = 0;

@ -19,6 +19,6 @@ struct buffer *
buffer_create_from_cairo_surface(int fd, cairo_surface_t *surface); buffer_create_from_cairo_surface(int fd, cairo_surface_t *surface);
void void
blur_surface(cairo_surface_t *surface); blur_surface(cairo_surface_t *surface, int margin);
#endif #endif

@ -48,7 +48,7 @@ draw_pointer(int width, int height)
cairo_set_source_rgb(cr, 0, 0, 0); cairo_set_source_rgb(cr, 0, 0, 0);
cairo_stroke_preserve(cr); cairo_stroke_preserve(cr);
cairo_fill(cr); cairo_fill(cr);
blur_surface(surface); blur_surface(surface, INT_MAX);
pointer_path(cr, hotspot_x, hotspot_y); pointer_path(cr, hotspot_x, hotspot_y);
cairo_stroke_preserve(cr); cairo_stroke_preserve(cr);

@ -89,7 +89,7 @@ draw_window(void *data)
rounded_rect(cr, 1, 1, window->width - 1, window->height - 1, radius); rounded_rect(cr, 1, 1, window->width - 1, window->height - 1, radius);
cairo_stroke_preserve(cr); cairo_stroke_preserve(cr);
cairo_fill(cr); cairo_fill(cr);
blur_surface(surface); blur_surface(surface, 16 + radius);
cairo_translate(cr, -5, -3); cairo_translate(cr, -5, -3);
cairo_set_line_width (cr, border); cairo_set_line_width (cr, border);
@ -148,7 +148,6 @@ draw_window(void *data)
cairo_stroke_preserve(cr); cairo_stroke_preserve(cr);
cairo_set_source_rgb(cr, 1, 1, 1); cairo_set_source_rgb(cr, 1, 1, 1);
cairo_fill(cr); cairo_fill(cr);
cairo_destroy(cr); cairo_destroy(cr);
if (window->buffer != NULL) if (window->buffer != NULL)

Loading…
Cancel
Save