From d9b4ffe09e055ee5109e104605c060ce09c77fa0 Mon Sep 17 00:00:00 2001 From: Ell Date: Sun, 30 Dec 2018 07:47:47 -0500 Subject: [PATCH] app: in gimp_gegl_apply_cached_operation(), intersect cached rects with dest rect In gimp_gegl_apply_cached_operation(), intersect the cached rects with the dest rect, so that we don't unnecessarily (if not erroneously) copy cached regions outside the dest rect to the dest buffer. This can happen when the op's applicator crop-rect changes dynamically. --- app/gegl/gimp-gegl-apply-operation.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/gegl/gimp-gegl-apply-operation.c b/app/gegl/gimp-gegl-apply-operation.c index 46e4a67996..df4f3dd96e 100644 --- a/app/gegl/gimp-gegl-apply-operation.c +++ b/app/gegl/gimp-gegl-apply-operation.c @@ -212,14 +212,22 @@ gimp_gegl_apply_cached_operation (GeglBuffer *src_buffer, for (i = 0; i < n_valid_rects; i++) { - gimp_gegl_buffer_copy (cache, valid_rects + i, GEGL_ABYSS_NONE, - dest_buffer, valid_rects + i); + GeglRectangle valid_rect; + + if (! gegl_rectangle_intersect (&valid_rect, + &valid_rects[i], &rect)) + { + continue; + } + + gimp_gegl_buffer_copy (cache, &valid_rect, GEGL_ABYSS_NONE, + dest_buffer, &valid_rect); cairo_region_subtract_rectangle (region, (cairo_rectangle_int_t *) - valid_rects + i); + &valid_rect); - done_pixels += valid_rects[i].width * valid_rects[i].height; + done_pixels += valid_rect.width * valid_rect.height; if (progress) gimp_progress_set_value (progress,