[gegl] process: clear out-of-bounds cached tiles when node bounding box changes



commit 4347255cd9d5031e6757c70fdde5c63539d5f508
Author: Ell <ell_se yahoo com>
Date:   Mon Jul 29 22:37:24 2019 +0300

    process: clear out-of-bounds cached tiles when node bounding box changes
    
    In gegl_graph_prepare(), when a cached node's bounding box changes,
    clear whole tiles that are now outside the new bounding box from
    the node's cache, to free unused memory.

 gegl/process/gegl-graph-traversal.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)
---
diff --git a/gegl/process/gegl-graph-traversal.c b/gegl/process/gegl-graph-traversal.c
index e095c9c66..2914ae3ff 100644
--- a/gegl/process/gegl-graph-traversal.c
+++ b/gegl/process/gegl-graph-traversal.c
@@ -193,8 +193,30 @@ gegl_graph_prepare (GeglGraphTraversal *path)
 
     if (node->cache)
       {
-        gegl_buffer_set_extent (GEGL_BUFFER (node->cache),
-                                &node->have_rect);
+        GeglBuffer          *cache        = GEGL_BUFFER (node->cache);
+        const GeglRectangle *cache_extent = gegl_buffer_get_extent (cache);
+
+        if (! gegl_rectangle_equal (cache_extent, &node->have_rect))
+          {
+            GeglRectangle old_rect;
+            GeglRectangle new_rect;
+            GeglRectangle diff_rects[4];
+            gint          n_diff_rects;
+            gint          i;
+
+            gegl_rectangle_align_to_buffer (&old_rect, cache_extent, cache,
+                                            GEGL_RECTANGLE_ALIGNMENT_SUPERSET);
+            gegl_rectangle_align_to_buffer (&new_rect, &node->have_rect, cache,
+                                            GEGL_RECTANGLE_ALIGNMENT_SUPERSET);
+
+            n_diff_rects = gegl_rectangle_subtract (diff_rects,
+                                                    &old_rect, &new_rect);
+
+            for (i = 0; i < n_diff_rects; i++)
+              gegl_buffer_clear (cache, &diff_rects[i]);
+
+            gegl_buffer_set_extent (cache, &node->have_rect);
+          }
       }
 
     g_mutex_unlock (&node->mutex);


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