Commit ecf9267a authored by Federico Mena Quintero's avatar Federico Mena Quintero
Browse files

bgo#783835 - Don't divide by zero in box_blur_line() for gaussian blurs

We were making the decision to use box blurs, instead of a true
Gaussian kernel, based on the size of *both* x and y dimensions.  Do
them individually instead.
parent 818ad223
...@@ -1417,6 +1417,8 @@ box_blur_line (gint box_width, gint even_offset, ...@@ -1417,6 +1417,8 @@ box_blur_line (gint box_width, gint even_offset,
kernel; it's the pixel to remove from the accumulator. */ kernel; it's the pixel to remove from the accumulator. */
gint *ac; /* Accumulator for each channel */ gint *ac; /* Accumulator for each channel */
g_assert (box_width > 0);
ac = g_new0 (gint, bpp); ac = g_new0 (gint, bpp);
/* The algorithm differs for even and odd-sized kernels. /* The algorithm differs for even and odd-sized kernels.
...@@ -1774,7 +1776,6 @@ gaussian_blur_surface (cairo_surface_t *in, ...@@ -1774,7 +1776,6 @@ gaussian_blur_surface (cairo_surface_t *in,
gdouble sx, gdouble sx,
gdouble sy) gdouble sy)
{ {
gboolean use_box_blur;
gint width, height; gint width, height;
cairo_format_t in_format, out_format; cairo_format_t in_format, out_format;
gint in_stride; gint in_stride;
...@@ -1818,14 +1819,6 @@ gaussian_blur_surface (cairo_surface_t *in, ...@@ -1818,14 +1819,6 @@ gaussian_blur_surface (cairo_surface_t *in,
if (sy < 0.0) if (sy < 0.0)
sy = 0.0; sy = 0.0;
/* For small radiuses, use a true gaussian kernel; otherwise use three box blurs with
* clever offsets.
*/
if (sx < 10.0 && sy < 10.0)
use_box_blur = FALSE;
else
use_box_blur = TRUE;
/* Bail out by just copying? */ /* Bail out by just copying? */
if ((sx == 0.0 && sy == 0.0) if ((sx == 0.0 && sy == 0.0)
|| sx > 1000 || sy > 1000) { || sx > 1000 || sy > 1000) {
...@@ -1845,6 +1838,15 @@ gaussian_blur_surface (cairo_surface_t *in, ...@@ -1845,6 +1838,15 @@ gaussian_blur_surface (cairo_surface_t *in,
int y; int y;
guchar *row_buffer = NULL; guchar *row_buffer = NULL;
guchar *row1, *row2; guchar *row1, *row2;
gboolean use_box_blur;
/* For small radiuses, use a true gaussian kernel; otherwise use three box blurs with
* clever offsets.
*/
if (sx < 10.0)
use_box_blur = FALSE;
else
use_box_blur = TRUE;
if (use_box_blur) { if (use_box_blur) {
box_width = compute_box_blur_width (sx); box_width = compute_box_blur_width (sx);
...@@ -1900,6 +1902,15 @@ gaussian_blur_surface (cairo_surface_t *in, ...@@ -1900,6 +1902,15 @@ gaussian_blur_surface (cairo_surface_t *in,
guchar *col_buffer; guchar *col_buffer;
guchar *col1, *col2; guchar *col1, *col2;
int x; int x;
gboolean use_box_blur;
/* For small radiuses, use a true gaussian kernel; otherwise use three box blurs with
* clever offsets.
*/
if (sy < 10.0)
use_box_blur = FALSE;
else
use_box_blur = TRUE;
/* twice the size so we can have the source pixels and the blurred pixels */ /* twice the size so we can have the source pixels and the blurred pixels */
col_buffer = g_new0 (guchar, height * bpp * 2); col_buffer = g_new0 (guchar, height * bpp * 2);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment