[gegl] process: clear out-of-bounds cached tiles when node bounding box changes
- From: Ell <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] process: clear out-of-bounds cached tiles when node bounding box changes
- Date: Mon, 29 Jul 2019 20:19:31 +0000 (UTC)
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]