summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2014-10-27 10:18:37 -0700
committerJasper St. Pierre <jstpierre@mecheye.net>2014-10-27 10:20:43 -0700
commit5f40f58c36478fda78d9718c66981ef6c35ba3bd (patch)
tree25ec6383185743f393ba005dcf13c80b900edcb1
parentac9ac555551be0a607ad7b76531c2f80ea76d349 (diff)
downloadgtk+-5f40f58c36478fda78d9718c66981ef6c35ba3bd.tar.gz
cairoblur: Fix the blur again once more
The differences between the mutter and GTK+ code are subtle, but it turns out that _gtk_cairo_blur_compute_pixels actually returns the shadow *spread*. Since we use a triple box blur, the constant was multiplied by 1.5 to approximate three chained box blurs. Split this out and use the correct value for the lobe width.
-rw-r--r--gtk/gtkcairoblur.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/gtk/gtkcairoblur.c b/gtk/gtkcairoblur.c
index 4e03a7f2eb..29bc168146 100644
--- a/gtk/gtkcairoblur.c
+++ b/gtk/gtkcairoblur.c
@@ -140,6 +140,23 @@ flip_buffer (guchar *dst_buffer,
#undef BLOCK_SIZE
}
+/*
+ * Gets the size for a single box blur.
+ *
+ * Much of this, the 3 * sqrt(2 * pi) / 4, is the known value for
+ * approximating a Gaussian using box blurs. This yields quite a good
+ * approximation for a Gaussian. For more details, see:
+ * http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=590039#c19
+ */
+#define GAUSSIAN_SCALE_FACTOR ((3.0 * sqrt(2 * G_PI) / 4))
+
+static int
+get_box_filter_size (double radius)
+{
+ return GAUSSIAN_SCALE_FACTOR * radius;
+}
+
static void
_boxblur (guchar *buffer,
int width,
@@ -147,7 +164,7 @@ _boxblur (guchar *buffer,
int radius)
{
guchar *flipped_buffer;
- int d = _gtk_cairo_blur_compute_pixels (radius);
+ int d = get_box_filter_size (radius);
flipped_buffer = g_malloc (width * height);
@@ -210,7 +227,7 @@ _gtk_cairo_blur_surface (cairo_surface_t* surface,
*
* This is just the number of pixels added by the blur radius, shadow
* offset and spread are not included.
- *
+ *
* Much of this, the 3 * sqrt(2 * pi) / 4, is the known value for
* approximating a Gaussian using box blurs. This yields quite a good
* approximation for a Gaussian. Then we multiply this by 1.5 since our
@@ -219,10 +236,8 @@ _gtk_cairo_blur_surface (cairo_surface_t* surface,
* http://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement
* https://bugzilla.mozilla.org/show_bug.cgi?id=590039#c19
*/
-#define GAUSSIAN_SCALE_FACTOR ((3.0 * sqrt(2 * G_PI) / 4) * 1.5)
-
int
_gtk_cairo_blur_compute_pixels (double radius)
{
- return floor (radius * GAUSSIAN_SCALE_FACTOR + 0.5);
+ return floor (radius * GAUSSIAN_SCALE_FACTOR * 1.5 + 0.5);
}