[gegl] buffer: handle uninitialized buffers in gegl_buffer_clear()



commit 31649e05d6670c8bb8a69ce7b820c79889596cc6
Author: Ell <ell_se yahoo com>
Date:   Wed May 6 11:52:56 2020 +0300

    buffer: handle uninitialized buffers in gegl_buffer_clear()
    
    When calling gegl_buffer_clear() on an uninitialized buffer, fill
    tile-aligned regions with explicitly-created empty tiles, instead
    of voiding the region and relying on the tiles to be created on-
    demand, so that the region is zero-initialized, instead of
    uninitialized.

 gegl/buffer/gegl-buffer-access.c | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-access.c b/gegl/buffer/gegl-buffer-access.c
index 79cfc31cb..ad4b54c40 100644
--- a/gegl/buffer/gegl-buffer-access.c
+++ b/gegl/buffer/gegl-buffer-access.c
@@ -2793,11 +2793,26 @@ gegl_buffer_clear_tile (GeglBuffer *dst,
                         gint        tile_y,
                         gpointer    data)
 {
-  gegl_tile_handler_cache_remove (dst->tile_storage->cache,
-                                  tile_x, tile_y, 0);
+  if (dst->initialized)
+    {
+      gegl_tile_handler_cache_remove (dst->tile_storage->cache,
+                                      tile_x, tile_y, 0);
 
-  gegl_tile_handler_source_command (dst->tile_storage->cache, GEGL_TILE_VOID,
-                                    tile_x, tile_y, 0, NULL);
+      gegl_tile_handler_source_command (dst->tile_storage->cache,
+                                        GEGL_TILE_VOID,
+                                        tile_x, tile_y, 0, NULL);
+    }
+  else
+    {
+      GeglTile *tile;
+
+      tile = gegl_tile_handler_empty_new_tile (dst->tile_storage->tile_size);
+
+      gegl_tile_handler_cache_insert (dst->tile_storage->cache, tile,
+                                      tile_x, tile_y, 0);
+
+      gegl_tile_unref (tile);
+    }
 }
 
 static void


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