[gegl/soc-2012-editor] buffer: Make a buffer's abyss track its extent by default.



commit 1206816b4dc5d736ecfb2c182a34c4d4e998cc28
Author: Michael Henning <mikehenning eclipse net>
Date:   Sat May 19 12:35:23 2012 -0400

    buffer: Make a buffer's abyss track its extent by default.
    
    This does not happen if the buffer's abyss was modified by the user
    or if the user modified its parent's abyss.
    
    Fixes: Bug 675337 - gegl_buffer_set_extent does not increase active buffer area

 gegl/buffer/gegl-buffer-private.h |    3 +++
 gegl/buffer/gegl-buffer.c         |   28 ++++++++++++++++++++++++----
 2 files changed, 27 insertions(+), 4 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-private.h b/gegl/buffer/gegl-buffer-private.h
index 3f786c7..3f6d7fb1 100644
--- a/gegl/buffer/gegl-buffer-private.h
+++ b/gegl/buffer/gegl-buffer-private.h
@@ -50,6 +50,9 @@ struct _GeglBuffer
                              /* construction relative to immediate source  */
 
   GeglRectangle     abyss;
+  gboolean          abyss_tracks_extent; /* specifies whether the abyss rectangle
+                                            should track any modifications to the
+                                            extent rectangle */
 
 
   GeglSampler      *sampler; /* cached sampler for speeding up random
diff --git a/gegl/buffer/gegl-buffer.c b/gegl/buffer/gegl-buffer.c
index 358d114..c3e1c6b 100644
--- a/gegl/buffer/gegl-buffer.c
+++ b/gegl/buffer/gegl-buffer.c
@@ -352,6 +352,11 @@ gegl_buffer_set_extent (GeglBuffer          *buffer,
       header->height = buffer->extent.height;
     }
 
+  if (buffer->abyss_tracks_extent)
+    {
+      buffer->abyss = *extent;
+    }
+
   return TRUE;
 }
 
@@ -676,16 +681,19 @@ gegl_buffer_constructor (GType                  type,
         }
     }
 
+  buffer->abyss_tracks_extent = FALSE;
+
   if (buffer->abyss.width == 0 &&
       buffer->abyss.height == 0 &&
       buffer->abyss.x == 0 &&
       buffer->abyss.y == 0)      /* 0 sized extent == inherit buffer extent
                                   */
     {
-      buffer->abyss.x      = buffer->extent.x;
-      buffer->abyss.y      = buffer->extent.y;
-      buffer->abyss.width  = buffer->extent.width;
-      buffer->abyss.height = buffer->extent.height;
+      buffer->abyss.x             = buffer->extent.x;
+      buffer->abyss.y             = buffer->extent.y;
+      buffer->abyss.width         = buffer->extent.width;
+      buffer->abyss.height        = buffer->extent.height;
+      buffer->abyss_tracks_extent = TRUE;
     }
   else if (buffer->abyss.width == 0 &&
            buffer->abyss.height == 0)
@@ -725,6 +733,18 @@ gegl_buffer_constructor (GType                  type,
 
       gegl_rectangle_intersect (&self, &parent, &request);
 
+      /* Don't have the abyss track the extent if the intersection is
+       * not the entire extent. Otherwise, setting the extent identical
+       * to itself could suddenly make the abyss bigger. */
+      if (buffer->abyss_tracks_extent && 
+          (buffer->extent.x      != self.x ||
+           buffer->extent.y      != self.y ||
+           buffer->extent.width  != self.width ||
+           buffer->extent.height != self.height) )
+        {
+          buffer->abyss_tracks_extent = FALSE;
+        }
+
       buffer->abyss.x      = self.x;
       buffer->abyss.y      = self.y;
       buffer->abyss.width  = self.width;



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