[gimp/gimp-2-10] app: add "chunked" parameter to gimp_tile_handler_validate_validate()



commit 422452b5da6a5e6a17860f8b8395e9d5c4a3ab94
Author: Ell <ell_se yahoo com>
Date:   Sat Mar 14 13:52:01 2020 +0200

    app: add "chunked" parameter to gimp_tile_handler_validate_validate()
    
    ... which allows validating the area in chunks, instead of in a
    single step.
    
    (cherry picked from commit faf6acfb67bec8ae261532430e00120a1bc53ea0)

 app/core/gimpprojection.c                          |  2 +-
 app/gegl/gimptilehandlervalidate.c                 | 57 ++++++++++++++++------
 app/gegl/gimptilehandlervalidate.h                 |  3 +-
 app/operations/gimpoperationbuffersourcevalidate.c |  2 +-
 4 files changed, 47 insertions(+), 17 deletions(-)
---
diff --git a/app/core/gimpprojection.c b/app/core/gimpprojection.c
index 61cef8f07f..c249b55864 100644
--- a/app/core/gimpprojection.c
+++ b/app/core/gimpprojection.c
@@ -900,7 +900,7 @@ gimp_projection_paint_area (GimpProjection *proj,
             proj->priv->validate_handler,
             proj->priv->buffer,
             &rect,
-            FALSE);
+            FALSE, FALSE);
         }
       else
         {
diff --git a/app/gegl/gimptilehandlervalidate.c b/app/gegl/gimptilehandlervalidate.c
index fd3e74feda..01915d5ac7 100644
--- a/app/gegl/gimptilehandlervalidate.c
+++ b/app/gegl/gimptilehandlervalidate.c
@@ -22,6 +22,7 @@
 
 #include "gimp-gegl-types.h"
 
+#include "core/gimpchunkiterator.h"
 #include "core/gimpmarshal.h"
 
 #include "gimp-gegl-loops.h"
@@ -529,9 +530,11 @@ void
 gimp_tile_handler_validate_validate (GimpTileHandlerValidate *validate,
                                      GeglBuffer              *buffer,
                                      const GeglRectangle     *rect,
-                                     gboolean                 intersect)
+                                     gboolean                 intersect,
+                                     gboolean                 chunked)
 {
   GimpTileHandlerValidateClass *klass;
+  cairo_region_t               *region = NULL;
 
   g_return_if_fail (GIMP_IS_TILE_HANDLER_VALIDATE (validate));
   g_return_if_fail (gimp_tile_handler_validate_get_assigned (buffer) ==
@@ -544,30 +547,56 @@ gimp_tile_handler_validate_validate (GimpTileHandlerValidate *validate,
 
   if (intersect)
     {
-      cairo_region_t *region = cairo_region_copy (validate->dirty_region);
+      region = cairo_region_copy (validate->dirty_region);
 
       cairo_region_intersect_rectangle (region,
                                         (const cairo_rectangle_int_t *) rect);
+    }
+  else if (chunked)
+    {
+      region = cairo_region_create_rectangle (
+        (const cairo_rectangle_int_t *) rect);
+    }
 
+  if (region)
+    {
       if (! cairo_region_is_empty (region))
         {
-          gint n_rects;
-          gint i;
-
           gimp_tile_handler_validate_begin_validate (validate);
 
-          n_rects = cairo_region_num_rectangles (region);
-
-          for (i = 0; i < n_rects; i++)
+          if (chunked)
             {
-              cairo_rectangle_int_t blit_rect;
+              GimpChunkIterator *iter;
+
+              iter   = gimp_chunk_iterator_new (region);
+              region = NULL;
 
-              cairo_region_get_rectangle (region, i, &blit_rect);
+              while (gimp_chunk_iterator_next (iter))
+                {
+                  GeglRectangle blit_rect;
 
-              klass->validate_buffer (validate,
-                                      (const GeglRectangle *) &blit_rect,
-                                      buffer);
+                  while (gimp_chunk_iterator_get_rect (iter, &blit_rect))
+                    klass->validate_buffer (validate, &blit_rect, buffer);
+                }
             }
+          else
+            {
+              gint n_rects;
+              gint i;
+
+              n_rects = cairo_region_num_rectangles (region);
+
+              for (i = 0; i < n_rects; i++)
+                {
+                  cairo_rectangle_int_t blit_rect;
+
+                  cairo_region_get_rectangle (region, i, &blit_rect);
+
+                  klass->validate_buffer (validate,
+                                          (const GeglRectangle *) &blit_rect,
+                                          buffer);
+                }
+              }
 
           gimp_tile_handler_validate_end_validate (validate);
 
@@ -576,7 +605,7 @@ gimp_tile_handler_validate_validate (GimpTileHandlerValidate *validate,
             (const cairo_rectangle_int_t *) rect);
         }
 
-      cairo_region_destroy (region);
+      g_clear_pointer (&region, cairo_region_destroy);
     }
   else
     {
diff --git a/app/gegl/gimptilehandlervalidate.h b/app/gegl/gimptilehandlervalidate.h
index 86973be33b..998430fd8d 100644
--- a/app/gegl/gimptilehandlervalidate.h
+++ b/app/gegl/gimptilehandlervalidate.h
@@ -95,7 +95,8 @@ void                      gimp_tile_handler_validate_end_validate      (GimpTile
 void                      gimp_tile_handler_validate_validate          (GimpTileHandlerValidate *validate,
                                                                         GeglBuffer              *buffer,
                                                                         const GeglRectangle     *rect,
-                                                                        gboolean                 intersect);
+                                                                        gboolean                 intersect,
+                                                                        gboolean                 chunked);
 
 gboolean                  gimp_tile_handler_validate_buffer_set_extent (GeglBuffer              *buffer,
                                                                         const GeglRectangle     *extent);
diff --git a/app/operations/gimpoperationbuffersourcevalidate.c 
b/app/operations/gimpoperationbuffersourcevalidate.c
index ce8745882a..d27765385d 100644
--- a/app/operations/gimpoperationbuffersourcevalidate.c
+++ b/app/operations/gimpoperationbuffersourcevalidate.c
@@ -286,7 +286,7 @@ gimp_operation_buffer_source_validate_process (GeglOperation        *operation,
           gimp_tile_handler_validate_validate (validate_handler,
                                                buffer_source_validate->buffer,
                                                &rect,
-                                               TRUE);
+                                               TRUE, FALSE);
         }
 
       gegl_operation_context_set_object (context, "output", G_OBJECT (buffer));


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]