diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-07-28 22:04:05 +0200 |
---|---|---|
committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-07-29 10:49:39 +0200 |
commit | 45bdec84f56b32fcef165231502e373aebc7d5a4 (patch) | |
tree | d04c9738cfdfc4d27709d877bc6cf9dfc49d06c3 /gtk/gtkcairoblur.c | |
parent | 227b4a862085e233baa5de8ba143309954bae541 (diff) | |
download | gtk+-45bdec84f56b32fcef165231502e373aebc7d5a4.tar.gz |
gtkcairoblur: Blur a CAIRO_A8 surface instead of a full CAIRO_ARGB32
This is considerably faster to draw and paint.
Diffstat (limited to 'gtk/gtkcairoblur.c')
-rw-r--r-- | gtk/gtkcairoblur.c | 67 |
1 files changed, 9 insertions, 58 deletions
diff --git a/gtk/gtkcairoblur.c b/gtk/gtkcairoblur.c index b38a3e8980..7b1fa18408 100644 --- a/gtk/gtkcairoblur.c +++ b/gtk/gtkcairoblur.c @@ -31,33 +31,16 @@ */ static inline void _blurinner (guchar* pixel, - gint *zR, - gint *zG, - gint *zB, gint *zA, gint alpha, gint aprec, gint zprec) { - gint R; - gint G; - gint B; guchar A; - R = *pixel; - G = *(pixel + 1); - B = *(pixel + 2); - A = *(pixel + 3); - - *zR += (alpha * ((R << zprec) - *zR)) >> aprec; - *zG += (alpha * ((G << zprec) - *zG)) >> aprec; - *zB += (alpha * ((B << zprec) - *zB)) >> aprec; + A = *pixel; *zA += (alpha * ((A << zprec) - *zA)) >> aprec; - - *pixel = *zR >> zprec; - *(pixel + 1) = *zG >> zprec; - *(pixel + 2) = *zB >> zprec; - *(pixel + 3) = *zA >> zprec; + *pixel = *zA >> zprec; } static inline void @@ -65,41 +48,28 @@ _blurrow (guchar* pixels, gint width, gint height, gint rowstride, - gint channels, gint line, gint alpha, gint aprec, gint zprec) { - gint zR; - gint zG; - gint zB; gint zA; gint index; guchar* scanline; scanline = &pixels[line * rowstride]; - zR = *scanline << zprec; - zG = *(scanline + 1) << zprec; - zB = *(scanline + 2) << zprec; - zA = *(scanline + 3) << zprec; + zA = *scanline << zprec; for (index = 0; index < width; index ++) - _blurinner (&scanline[index * channels], - &zR, - &zG, - &zB, + _blurinner (&scanline[index], &zA, alpha, aprec, zprec); for (index = width - 2; index >= 0; index--) - _blurinner (&scanline[index * channels], - &zR, - &zG, - &zB, + _blurinner (&scanline[index], &zA, alpha, aprec, @@ -111,33 +81,23 @@ _blurcol (guchar* pixels, gint width, gint height, gint rowstride, - gint channels, gint x, gint alpha, gint aprec, gint zprec) { - gint zR; - gint zG; - gint zB; gint zA; gint index; guchar* ptr; ptr = pixels; - - ptr += x * channels; - zR = *((guchar*) ptr ) << zprec; - zG = *((guchar*) ptr + 1) << zprec; - zB = *((guchar*) ptr + 2) << zprec; - zA = *((guchar*) ptr + 3) << zprec; + ptr += x; + + zA = *ptr << zprec; for (index = 0; index < height; index++) _blurinner (&ptr[index * rowstride], - &zR, - &zG, - &zB, &zA, alpha, aprec, @@ -145,9 +105,6 @@ _blurcol (guchar* pixels, for (index = height - 2; index >= 0; index--) _blurinner (&ptr[index * rowstride], - &zR, - &zG, - &zB, &zA, alpha, aprec, @@ -160,7 +117,6 @@ _blurcol (guchar* pixels, * @width: image width * @height: image height * @rowstride: image rowstride - * @channels: image channels * @radius: kernel radius * @aprec: precision of alpha parameter in fixed-point format 0.aprec * @zprec: precision of state parameters zR,zG,zB and zA in fp format 8.zprec @@ -176,7 +132,6 @@ _expblur (guchar* pixels, gint width, gint height, gint rowstride, - gint channels, double radius, gint aprec, gint zprec) @@ -194,7 +149,6 @@ _expblur (guchar* pixels, width, height, rowstride, - channels, row, alpha, aprec, @@ -205,7 +159,6 @@ _expblur (guchar* pixels, width, height, rowstride, - channels, col, alpha, aprec, @@ -230,8 +183,7 @@ _gtk_cairo_blur_surface (cairo_surface_t* surface, g_return_if_fail (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_IMAGE); format = cairo_image_surface_get_format (surface); - g_return_if_fail (format == CAIRO_FORMAT_RGB24 || - format == CAIRO_FORMAT_ARGB32); + g_return_if_fail (format == CAIRO_FORMAT_A8); if (radius == 0) return; @@ -243,7 +195,6 @@ _gtk_cairo_blur_surface (cairo_surface_t* surface, cairo_image_surface_get_width (surface), cairo_image_surface_get_height (surface), cairo_image_surface_get_stride (surface), - 4, radius, 16, 7); |