[gegl] buffer-iterator: don't choke on an empty roi



commit 6fc2cbf71e045db0b937e3830c589496c8600a13
Author: Ell <ell_se yahoo com>
Date:   Wed Apr 12 16:31:14 2017 -0400

    buffer-iterator: don't choke on an empty roi
    
    Just return a nop iterator.

 gegl/buffer/gegl-buffer-iterator.c |   68 ++++++++++++++++++++---------------
 1 files changed, 39 insertions(+), 29 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-iterator.c b/gegl/buffer/gegl-buffer-iterator.c
index d9b8221..e1b7b6b 100644
--- a/gegl/buffer/gegl-buffer-iterator.c
+++ b/gegl/buffer/gegl-buffer-iterator.c
@@ -137,22 +137,28 @@ gegl_buffer_iterator_add (GeglBufferIterator  *iter,
   if (!roi)
     roi = &buf->extent;
 
-  sub->buffer       = buf;
-  sub->full_rect    = *roi;
-
-  sub->access_mode  = access_mode;
-  sub->abyss_policy = abyss_policy;
-  sub->current_tile = NULL;
-  sub->real_data    = NULL;
-  sub->linear_tile  = NULL;
-  sub->format       = format;
-  sub->format_bpp   = babl_format_get_bytes_per_pixel (format);
-  sub->level        = level;
-
-  if (index > 0)
+  if (index == 0 && (roi->width <= 0 || roi->height <= 0))
+    priv->state = GeglIteratorState_Invalid;
+
+  if (priv->state != GeglIteratorState_Invalid)
     {
-      priv->sub_iter[index].full_rect.width  = priv->sub_iter[0].full_rect.width;
-      priv->sub_iter[index].full_rect.height = priv->sub_iter[0].full_rect.height;
+      sub->buffer       = buf;
+      sub->full_rect    = *roi;
+
+      sub->access_mode  = access_mode;
+      sub->abyss_policy = abyss_policy;
+      sub->current_tile = NULL;
+      sub->real_data    = NULL;
+      sub->linear_tile  = NULL;
+      sub->format       = format;
+      sub->format_bpp   = babl_format_get_bytes_per_pixel (format);
+      sub->level        = level;
+
+      if (index > 0)
+        {
+          priv->sub_iter[index].full_rect.width  = priv->sub_iter[0].full_rect.width;
+          priv->sub_iter[index].full_rect.height = priv->sub_iter[0].full_rect.height;
+        }
     }
 
   return index;
@@ -505,26 +511,30 @@ gegl_buffer_iterator_stop (GeglBufferIterator *iter)
 {
   int index;
   GeglBufferIteratorPriv *priv = iter->priv;
-  priv->state = GeglIteratorState_Invalid;
 
-  for (index = 0; index < priv->num_buffers; index++)
+  if (priv->state != GeglIteratorState_Invalid)
     {
-      SubIterState *sub = &priv->sub_iter[index];
-
-      if (sub->current_tile_mode != GeglIteratorTileMode_Empty)
-        release_tile (iter, index);
+      priv->state = GeglIteratorState_Invalid;
 
-      if (sub->linear_tile)
+      for (index = 0; index < priv->num_buffers; index++)
         {
-          if (sub->access_mode & GEGL_ACCESS_WRITE)
-            gegl_tile_unlock (sub->linear_tile);
-          gegl_tile_unref (sub->linear_tile);
-        }
+          SubIterState *sub = &priv->sub_iter[index];
 
-      gegl_buffer_unlock (sub->buffer);
+          if (sub->current_tile_mode != GeglIteratorTileMode_Empty)
+            release_tile (iter, index);
 
-      if (sub->access_mode & GEGL_ACCESS_WRITE)
-        gegl_buffer_emit_changed_signal (sub->buffer, &sub->full_rect);
+          if (sub->linear_tile)
+            {
+              if (sub->access_mode & GEGL_ACCESS_WRITE)
+                gegl_tile_unlock (sub->linear_tile);
+              gegl_tile_unref (sub->linear_tile);
+            }
+
+          gegl_buffer_unlock (sub->buffer);
+
+          if (sub->access_mode & GEGL_ACCESS_WRITE)
+            gegl_buffer_emit_changed_signal (sub->buffer, &sub->full_rect);
+        }
     }
 
   g_slice_free (GeglBufferIteratorPriv, iter->priv);


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