[gegl] buffer: gegl_buffer_set, behavior change to expect roi prescaled for level



commit c73fdfae576ada69a79dddf86fa98c39172e0902
Author: Øyvind Kolås <pippin gimp org>
Date:   Fri Feb 24 15:57:47 2017 +0100

    buffer: gegl_buffer_set, behavior change to expect roi prescaled for level
    
    Uses of gegl_buffer_set with level == 0 does not change behavior and this is
    the majority of existing uses.  This makes implementation of operations using
    gegl_buffer_get and gegl_buffer_set more symmetric - permitting to use the same
    GeglRectangle for gegl_buffer_set and gegl_buffer_get, a temporary copy is
    avoided on almost every level aware call site for gegl_buffer_set. Since the
    mipmap API hasn't been fully working in prior releases - this change can go out
    as not an API change - but an improvement in expected results for the same
    arguments as before.

 gegl/buffer/gegl-buffer-access.c   |   15 ++++++++++++++-
 gegl/buffer/gegl-buffer-iterator.c |    9 ++-------
 gegl/process/gegl-processor.c      |    8 ++++++--
 3 files changed, 22 insertions(+), 10 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-access.c b/gegl/buffer/gegl-buffer-access.c
index e78f18c..8998ba0 100644
--- a/gegl/buffer/gegl-buffer-access.c
+++ b/gegl/buffer/gegl-buffer-access.c
@@ -13,7 +13,7 @@
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  *
- * Copyright 2006-2008 Øyvind Kolås <pippin gimp org>
+ * Copyright 2006-2012,2014-2017  Øyvind Kolås <pippin gimp org>
  *           2013 Daniel Sabo
  */
 
@@ -344,6 +344,16 @@ gegl_buffer_iterate_write (GeglBuffer          *buffer,
   gint abyss_y_total  = buffer_abyss_y + buffer->abyss.height;
   gint factor         = 1<<level;
   const Babl *fish;
+  GeglRectangle scaled_rect;
+  if (level && roi)
+  {
+    scaled_rect = *roi;
+    scaled_rect.x <<= level;
+    scaled_rect.y <<= level;
+    scaled_rect.width <<= level;
+    scaled_rect.height <<= level;
+    roi = &scaled_rect;
+  }
 
   /* roi specified, override buffers extent */
   if (roi)
@@ -354,6 +364,8 @@ gegl_buffer_iterate_write (GeglBuffer          *buffer,
       buffer_y = roi->y + buffer_shift_y;
     }
 
+  buffer_shift_x /= factor;
+  buffer_shift_y /= factor;
   buffer_abyss_x /= factor;
   buffer_abyss_y /= factor;
   abyss_x_total  /= factor;
@@ -363,6 +375,7 @@ gegl_buffer_iterate_write (GeglBuffer          *buffer,
   width          /= factor;
   height         /= factor;
 
+
   buf_stride = width * bpx_size;
   if (rowstride != GEGL_AUTO_ROWSTRIDE)
     buf_stride = rowstride;
diff --git a/gegl/buffer/gegl-buffer-iterator.c b/gegl/buffer/gegl-buffer-iterator.c
index 94151a3..d9b8221 100644
--- a/gegl/buffer/gegl-buffer-iterator.c
+++ b/gegl/buffer/gegl-buffer-iterator.c
@@ -13,7 +13,7 @@
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  *
- * Copyright 2008 Øyvind Kolås <pippin gimp org>
+ * Copyright 2008,2011,2012,2014,2017 Øyvind Kolås <pippin gimp org>
  *           2013 Daniel Sabo
  */
 
@@ -187,13 +187,8 @@ release_tile (GeglBufferIterator *iter,
     {
       if (sub->access_mode & GEGL_ACCESS_WRITE)
         {
-          GeglRectangle roi = {sub->real_roi.x << sub->level,
-                               sub->real_roi.y << sub->level,
-                               sub->real_roi.width << sub->level,
-                               sub->real_roi.height << sub->level};
-
           gegl_buffer_set_unlocked_no_notify (sub->buffer,
-                                              &roi,
+                                              &sub->real_roi,
                                               sub->level,
                                               sub->format,
                                               sub->real_data,
diff --git a/gegl/process/gegl-processor.c b/gegl/process/gegl-processor.c
index dee6d2c..ffe7788 100644
--- a/gegl/process/gegl-processor.c
+++ b/gegl/process/gegl-processor.c
@@ -13,7 +13,7 @@
  * You should have received a copy of the GNU Lesser General Public
  * License along with GEGL; if not, see <http://www.gnu.org/licenses/>.
  *
- * Copyright 2007 Øyvind Kolås
+ * Copyright 2007-2012,2014,2015,2017 Øyvind Kolås
  */
 
 #include "config.h"
@@ -535,7 +535,11 @@ render_rectangle (GeglProcessor *processor)
                               GEGL_AUTO_ROWSTRIDE, GEGL_BLIT_DEFAULT);
 
               /* copy the buffer data into the cache */
-              gegl_buffer_set (GEGL_BUFFER (cache), dr, processor->level, format, buf, GEGL_AUTO_ROWSTRIDE);
+              {
+                gint level = processor->level;
+                GeglRectangle sr = {dr->x >> level, dr->y >> level, dr->width >> level, dr->height >> level 
};
+                gegl_buffer_set (GEGL_BUFFER (cache), &sr, level, format, buf, GEGL_AUTO_ROWSTRIDE);
+              }
 
               /* tells the cache that the rectangle (dr) has been computed */
               gegl_cache_computed (cache, dr, processor->level);


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