[gegl] buffer: gegl_buffer_set, behavior change to expect roi prescaled for level
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] buffer: gegl_buffer_set, behavior change to expect roi prescaled for level
- Date: Fri, 24 Feb 2017 17:27:08 +0000 (UTC)
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]