diff --git a/srcpkgs/gimp/patches/fix-gegl.patch b/srcpkgs/gimp/patches/fix-gegl.patch
new file mode 100644
index 00000000000..aba210c5ded
--- /dev/null
+++ b/srcpkgs/gimp/patches/fix-gegl.patch
@@ -0,0 +1,2151 @@
+diff --git a/app/core/gimpdrawable-transform.c b/app/core/gimpdrawable-transform.c
+index 350b1b8f4d..f26bbe3a58 100644
+--- app/core/gimpdrawable-transform.c
++++ app/core/gimpdrawable-transform.c
+@@ -15,6 +15,8 @@
+ * along with this program. If not, see .
+ */
+
++#define GEGL_ITERATOR2_API
++
+ #include "config.h"
+
+ #include
+@@ -271,33 +273,33 @@ gimp_drawable_transform_buffer_flip (GimpDrawable *drawable,
+ dest_rect.height = new_height;
+
+ iter = gegl_buffer_iterator_new (new_buffer, &dest_rect, 0, NULL,
+- GEGL_BUFFER_WRITE, GEGL_ABYSS_NONE);
++ GEGL_BUFFER_WRITE, GEGL_ABYSS_NONE, 1);
+
+ switch (flip_type)
+ {
+ case GIMP_ORIENTATION_HORIZONTAL:
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gint stride = iter->roi[0].width * bpp;
++ gint stride = iter->items[0].roi.width * bpp;
+
+- src_rect = iter->roi[0];
++ src_rect = iter->items[0].roi;
+
+ src_rect.x = (orig_x + orig_width) -
+- (iter->roi[0].x - dest_rect.x) -
+- iter->roi[0].width;
++ (iter->items[0].roi.x - dest_rect.x) -
++ iter->items[0].roi.width;
+
+- gegl_buffer_get (orig_buffer, &src_rect, 1.0, NULL, iter->data[0],
++ gegl_buffer_get (orig_buffer, &src_rect, 1.0, NULL, iter->items[0].data,
+ stride, GEGL_ABYSS_NONE);
+
+- for (y = 0; y < iter->roi[0].height; y++)
++ for (y = 0; y < iter->items[0].roi.height; y++)
+ {
+- guint8 *left = iter->data[0];
+- guint8 *right = iter->data[0];
++ guint8 *left = iter->items[0].data;
++ guint8 *right = iter->items[0].data;
+
+ left += y * stride;
+- right += y * stride + (iter->roi[0].width - 1) * bpp;
++ right += y * stride + (iter->items[0].roi.width - 1) * bpp;
+
+- for (x = 0; x < iter->roi[0].width / 2; x++)
++ for (x = 0; x < iter->items[0].roi.width / 2; x++)
+ {
+ guint8 temp[bpp];
+
+@@ -315,26 +317,26 @@ gimp_drawable_transform_buffer_flip (GimpDrawable *drawable,
+ case GIMP_ORIENTATION_VERTICAL:
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gint stride = iter->roi[0].width * bpp;
++ gint stride = iter->items[0].roi.width * bpp;
+
+- src_rect = iter->roi[0];
++ src_rect = iter->items[0].roi;
+
+ src_rect.y = (orig_y + orig_height) -
+- (iter->roi[0].y - dest_rect.y) -
+- iter->roi[0].height;
++ (iter->items[0].roi.y - dest_rect.y) -
++ iter->items[0].roi.height;
+
+- gegl_buffer_get (orig_buffer, &src_rect, 1.0, NULL, iter->data[0],
++ gegl_buffer_get (orig_buffer, &src_rect, 1.0, NULL, iter->items[0].data,
+ stride, GEGL_ABYSS_NONE);
+
+- for (x = 0; x < iter->roi[0].width; x++)
++ for (x = 0; x < iter->items[0].roi.width; x++)
+ {
+- guint8 *top = iter->data[0];
+- guint8 *bottom = iter->data[0];
++ guint8 *top = iter->items[0].data;
++ guint8 *bottom = iter->items[0].data;
+
+ top += x * bpp;
+- bottom += x * bpp + (iter->roi[0].height - 1) * stride;
++ bottom += x * bpp + (iter->items[0].roi.height - 1) * stride;
+
+- for (y = 0; y < iter->roi[0].height / 2; y++)
++ for (y = 0; y < iter->items[0].roi.height / 2; y++)
+ {
+ guint8 temp[bpp];
+
+diff --git a/app/core/gimphistogram.c b/app/core/gimphistogram.c
+index 109dffa201..4188e5ce05 100644
+--- app/core/gimphistogram.c
++++ app/core/gimphistogram.c
+@@ -17,6 +17,8 @@
+ * along with this program. If not, see .
+ */
+
++#define GEGL_ITERATOR2_API
++
+ #include "config.h"
+
+ #include
+@@ -984,7 +986,7 @@ gimp_histogram_calculate_area (const GeglRectangle *area,
+
+ iter = gegl_buffer_iterator_new (context->buffer, area, 0,
+ data->format,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
+
+ if (context->mask)
+ {
+@@ -1020,7 +1022,7 @@ gimp_histogram_calculate_area (const GeglRectangle *area,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const gfloat *data = iter->data[0];
++ const gfloat *data = iter->items[0].data;
+ gint length = iter->length;
+ gfloat max;
+ gfloat luminance;
+@@ -1029,7 +1031,7 @@ gimp_histogram_calculate_area (const GeglRectangle *area,
+
+ if (context->mask)
+ {
+- const gfloat *mask_data = iter->data[1];
++ const gfloat *mask_data = iter->items[1].data;
+
+ switch (n_components)
+ {
+diff --git a/app/core/gimpimage-convert-indexed.c b/app/core/gimpimage-convert-indexed.c
+index d41d20c150..476a35fa3e 100644
+--- app/core/gimpimage-convert-indexed.c
++++ app/core/gimpimage-convert-indexed.c
+@@ -136,6 +136,7 @@
+
+ #include
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+
+ #include "libgimpcolor/gimpcolor.h"
+@@ -699,11 +700,11 @@ remap_indexed_layer (GimpLayer *layer,
+
+ iter = gegl_buffer_iterator_new (gimp_drawable_get_buffer (GIMP_DRAWABLE (layer)),
+ NULL, 0, NULL,
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- guchar *data = iter->data[0];
++ guchar *data = iter->items[0].data;
+ gint length = iter->length;
+
+ if (has_alpha)
+@@ -1125,11 +1126,11 @@ generate_histogram_gray (CFHistogram histogram,
+
+ iter = gegl_buffer_iterator_new (gimp_drawable_get_buffer (GIMP_DRAWABLE (layer)),
+ NULL, 0, format,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *data = iter->data[0];
++ const guchar *data = iter->items[0].data;
+ gint length = iter->length;
+
+ if (has_alpha)
+@@ -1192,15 +1193,15 @@ generate_histogram_rgb (CFHistogram histogram,
+
+ iter = gegl_buffer_iterator_new (gimp_drawable_get_buffer (GIMP_DRAWABLE (layer)),
+ NULL, 0, format,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+- roi = &iter->roi[0];
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 1);
++ roi = &iter->items[0].roi;
+
+ if (progress)
+ gimp_progress_set_value (progress, 0.0);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *data = iter->data[0];
++ const guchar *data = iter->items[0].data;
+ gint length = iter->length;
+
+ total_size += length;
+@@ -2846,8 +2847,8 @@ median_cut_pass2_no_dither_gray (QuantizeObj *quantobj,
+
+ iter = gegl_buffer_iterator_new (gimp_drawable_get_buffer (GIMP_DRAWABLE (layer)),
+ NULL, 0, NULL,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+- src_roi = &iter->roi[0];
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
++ src_roi = &iter->items[0].roi;
+
+ gegl_buffer_iterator_add (iter, new_buffer,
+ NULL, 0, NULL,
+@@ -2855,8 +2856,8 @@ median_cut_pass2_no_dither_gray (QuantizeObj *quantobj,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *src = iter->data[0];
+- guchar *dest = iter->data[1];
++ const guchar *src = iter->items[0].data;
++ guchar *dest = iter->items[1].data;
+ gint row;
+
+ for (row = 0; row < src_roi->height; row++)
+@@ -2952,8 +2953,8 @@ median_cut_pass2_fixed_dither_gray (QuantizeObj *quantobj,
+
+ iter = gegl_buffer_iterator_new (gimp_drawable_get_buffer (GIMP_DRAWABLE (layer)),
+ NULL, 0, NULL,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+- src_roi = &iter->roi[0];
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
++ src_roi = &iter->items[0].roi;
+
+ gegl_buffer_iterator_add (iter, new_buffer,
+ NULL, 0, NULL,
+@@ -2961,8 +2962,8 @@ median_cut_pass2_fixed_dither_gray (QuantizeObj *quantobj,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *src = iter->data[0];
+- guchar *dest = iter->data[1];
++ const guchar *src = iter->items[0].data;
++ guchar *dest = iter->items[1].data;
+ gint row;
+
+ for (row = 0; row < src_roi->height; row++)
+@@ -3131,8 +3132,8 @@ median_cut_pass2_no_dither_rgb (QuantizeObj *quantobj,
+
+ iter = gegl_buffer_iterator_new (gimp_drawable_get_buffer (GIMP_DRAWABLE (layer)),
+ NULL, 0, NULL,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+- src_roi = &iter->roi[0];
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
++ src_roi = &iter->items[0].roi;
+
+ gegl_buffer_iterator_add (iter, new_buffer,
+ NULL, 0, NULL,
+@@ -3143,8 +3144,8 @@ median_cut_pass2_no_dither_rgb (QuantizeObj *quantobj,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *src = iter->data[0];
+- guchar *dest = iter->data[1];
++ const guchar *src = iter->items[0].data;
++ guchar *dest = iter->items[1].data;
+ gint row;
+
+ total_size += src_roi->height * src_roi->width;
+@@ -3264,8 +3265,8 @@ median_cut_pass2_fixed_dither_rgb (QuantizeObj *quantobj,
+
+ iter = gegl_buffer_iterator_new (gimp_drawable_get_buffer (GIMP_DRAWABLE (layer)),
+ NULL, 0, NULL,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+- src_roi = &iter->roi[0];
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
++ src_roi = &iter->items[0].roi;
+
+ gegl_buffer_iterator_add (iter, new_buffer,
+ NULL, 0, NULL,
+@@ -3276,8 +3277,8 @@ median_cut_pass2_fixed_dither_rgb (QuantizeObj *quantobj,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *src = iter->data[0];
+- guchar *dest = iter->data[1];
++ const guchar *src = iter->items[0].data;
++ guchar *dest = iter->items[1].data;
+ gint row;
+
+ total_size += src_roi->height * src_roi->width;
+@@ -3478,8 +3479,8 @@ median_cut_pass2_nodestruct_dither_rgb (QuantizeObj *quantobj,
+
+ iter = gegl_buffer_iterator_new (gimp_drawable_get_buffer (GIMP_DRAWABLE (layer)),
+ NULL, 0, NULL,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+- src_roi = &iter->roi[0];
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
++ src_roi = &iter->items[0].roi;
+
+ gegl_buffer_iterator_add (iter, new_buffer,
+ NULL, 0, NULL,
+@@ -3487,8 +3488,8 @@ median_cut_pass2_nodestruct_dither_rgb (QuantizeObj *quantobj,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *src = iter->data[0];
+- guchar *dest = iter->data[1];
++ const guchar *src = iter->items[0].data;
++ guchar *dest = iter->items[1].data;
+ gint row;
+
+ for (row = 0; row < src_roi->height; row++)
+diff --git a/app/core/gimppalette-import.c b/app/core/gimppalette-import.c
+index 6cee2ccc33..23c107f3f8 100644
+--- app/core/gimppalette-import.c
++++ app/core/gimppalette-import.c
+@@ -18,6 +18,7 @@
+ #include "config.h"
+
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+ #include
+
+@@ -291,7 +292,7 @@ gimp_palette_import_extract (GimpImage *image,
+ format = babl_format ("R'G'B'A u8");
+
+ iter = gegl_buffer_iterator_new (buffer, &rect, 0, format,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
+ bpp = babl_format_get_bytes_per_pixel (format);
+
+ if (selection_only &&
+@@ -307,18 +308,18 @@ gimp_palette_import_extract (GimpImage *image,
+
+ gegl_buffer_iterator_add (iter, buffer, &rect, 0, format,
+ GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+- mask_roi = &iter->roi[1];
++ mask_roi = &iter->items[1].roi;
+ mask_bpp = babl_format_get_bytes_per_pixel (format);
+ }
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *data = iter->data[0];
++ const guchar *data = iter->items[0].data;
+ const guchar *mask_data = NULL;
+ gint length = iter->length;
+
+ if (mask_roi)
+- mask_data = iter->data[1];
++ mask_data = iter->items[1].data;
+
+ while (length--)
+ {
+diff --git a/app/core/gimppickable-contiguous-region.c b/app/core/gimppickable-contiguous-region.c
+index 3d625b53db..27f071820c 100644
+--- app/core/gimppickable-contiguous-region.c
++++ app/core/gimppickable-contiguous-region.c
+@@ -20,6 +20,7 @@
+ #include
+
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+ #include
+
+@@ -218,7 +219,7 @@ gimp_pickable_contiguous_region_by_color (GimpPickable *pickable,
+
+ iter = gegl_buffer_iterator_new (src_buffer,
+ NULL, 0, format,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
+
+ gegl_buffer_iterator_add (iter, mask_buffer,
+ NULL, 0, babl_format ("Y float"),
+@@ -226,8 +227,8 @@ gimp_pickable_contiguous_region_by_color (GimpPickable *pickable,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const gfloat *src = iter->data[0];
+- gfloat *dest = iter->data[1];
++ const gfloat *src = iter->items[0].data;
++ gfloat *dest = iter->items[1].data;
+ gint count = iter->length;
+
+ while (count--)
+diff --git a/app/core/gimpscanconvert.c b/app/core/gimpscanconvert.c
+index 742bb0e27b..108c0e1a47 100644
+--- app/core/gimpscanconvert.c
++++ app/core/gimpscanconvert.c
+@@ -20,6 +20,7 @@
+ #include
+
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+
+ #include
+@@ -528,12 +529,12 @@ gimp_scan_convert_render_full (GimpScanConvert *sc,
+ bpp = babl_format_get_bytes_per_pixel (format);
+
+ iter = gegl_buffer_iterator_new (buffer, NULL, 0, format,
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
+- roi = &iter->roi[0];
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
++ roi = &iter->items[0].roi;
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- guchar *data = iter->data[0];
++ guchar *data = iter->items[0].data;
+ guchar *tmp_buf = NULL;
+ const gint stride = cairo_format_stride_for_width (CAIRO_FORMAT_A8,
+ roi->width);
+diff --git a/app/gegl/gimp-gegl-loops.cc b/app/gegl/gimp-gegl-loops.cc
+index f123edc7a0..cdb8c5785a 100644
+--- app/gegl/gimp-gegl-loops.cc
++++ app/gegl/gimp-gegl-loops.cc
+@@ -24,6 +24,7 @@
+
+ #include
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+
+ extern "C"
+@@ -174,22 +175,22 @@ gimp_gegl_convolve (GeglBuffer *src_buffer,
+
+ /* Set up dest iterator */
+ dest_iter = gegl_buffer_iterator_new (dest_buffer, dest_area, 0, dest_format,
+- GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (dest_iter))
+ {
+ /* Convolve the src image using the convolution kernel, writing
+ * to dest Convolve is not tile-enabled--use accordingly
+ */
+- gfloat *dest = (gfloat *) dest_iter->data[0];
++ gfloat *dest = (gfloat *) dest_iter->items[0].data;
+ const gint x1 = 0;
+ const gint y1 = 0;
+ const gint x2 = src_rect->width - 1;
+ const gint y2 = src_rect->height - 1;
+- const gint dest_x1 = dest_iter->roi[0].x;
+- const gint dest_y1 = dest_iter->roi[0].y;
+- const gint dest_x2 = dest_iter->roi[0].x + dest_iter->roi[0].width;
+- const gint dest_y2 = dest_iter->roi[0].y + dest_iter->roi[0].height;
++ const gint dest_x1 = dest_iter->items[0].roi.x;
++ const gint dest_y1 = dest_iter->items[0].roi.y;
++ const gint dest_x2 = dest_iter->items[0].roi.x + dest_iter->items[0].roi.width;
++ const gint dest_y2 = dest_iter->items[0].roi.y + dest_iter->items[0].roi.height;
+ gint x, y;
+
+ for (y = dest_y1; y < dest_y2; y++)
+@@ -280,7 +281,7 @@ gimp_gegl_convolve (GeglBuffer *src_buffer,
+ }
+ }
+
+- dest += dest_iter->roi[0].width * dest_components;
++ dest += dest_iter->items[0].roi.width * dest_components;
+ }
+ }
+ });
+@@ -325,7 +326,7 @@ gimp_gegl_dodgeburn (GeglBuffer *src_buffer,
+
+ iter = gegl_buffer_iterator_new (src_buffer, src_area, 0,
+ babl_format ("R'G'B'A float"),
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
+
+ gegl_buffer_iterator_add (iter, dest_buffer, dest_area, 0,
+ babl_format ("R'G'B'A float"),
+@@ -340,8 +341,8 @@ gimp_gegl_dodgeburn (GeglBuffer *src_buffer,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *src = (gfloat *) iter->data[0];
+- gfloat *dest = (gfloat *) iter->data[1];
++ gfloat *src = (gfloat *) iter->items[0].data;
++ gfloat *dest = (gfloat *) iter->items[1].data;
+ gint count = iter->length;
+
+ while (count--)
+@@ -363,8 +364,8 @@ gimp_gegl_dodgeburn (GeglBuffer *src_buffer,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *src = (gfloat *) iter->data[0];
+- gfloat *dest = (gfloat *) iter->data[1];
++ gfloat *src = (gfloat *) iter->items[0].data;
++ gfloat *dest = (gfloat *) iter->items[1].data;
+ gint count = iter->length;
+
+ while (count--)
+@@ -386,8 +387,8 @@ gimp_gegl_dodgeburn (GeglBuffer *src_buffer,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *src = (gfloat *) iter->data[0];
+- gfloat *dest = (gfloat *) iter->data[1];
++ gfloat *src = (gfloat *) iter->items[0].data;
++ gfloat *dest = (gfloat *) iter->items[1].data;
+ gint count = iter->length;
+
+ while (count--)
+@@ -560,7 +561,7 @@ gimp_gegl_smudge_with_paint (GeglBuffer *accum_buffer,
+
+ iter = gegl_buffer_iterator_new (accum_buffer, accum_area, 0,
+ babl_format ("RGBA float"),
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 3);
+
+ gegl_buffer_iterator_add (iter, canvas_buffer, canvas_area, 0,
+ babl_format ("RGBA float"),
+@@ -576,9 +577,9 @@ gimp_gegl_smudge_with_paint (GeglBuffer *accum_buffer,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *accum = (gfloat *) iter->data[0];
+- const gfloat *canvas = (const gfloat *) iter->data[1];
+- gfloat *paint = (gfloat *) iter->data[2];
++ gfloat *accum = (gfloat *) iter->items[0].data;
++ const gfloat *canvas = (const gfloat *) iter->items[1].data;
++ gfloat *paint = (gfloat *) iter->items[2].data;
+ gint count = iter->length;
+
+ #if COMPILE_SSE2_INTRINISICS
+@@ -628,7 +629,7 @@ gimp_gegl_apply_mask (GeglBuffer *mask_buffer,
+
+ iter = gegl_buffer_iterator_new (mask_buffer, mask_area, 0,
+ babl_format ("Y float"),
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
+
+ gegl_buffer_iterator_add (iter, dest_buffer, dest_area, 0,
+ babl_format ("RGBA float"),
+@@ -636,8 +637,8 @@ gimp_gegl_apply_mask (GeglBuffer *mask_buffer,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const gfloat *mask = (const gfloat *) iter->data[0];
+- gfloat *dest = (gfloat *) iter->data[1];
++ const gfloat *mask = (const gfloat *) iter->items[0].data;
++ gfloat *dest = (gfloat *) iter->items[1].data;
+ gint count = iter->length;
+
+ while (count--)
+@@ -673,7 +674,7 @@ gimp_gegl_combine_mask (GeglBuffer *mask_buffer,
+
+ iter = gegl_buffer_iterator_new (mask_buffer, mask_area, 0,
+ babl_format ("Y float"),
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
+
+ gegl_buffer_iterator_add (iter, dest_buffer, dest_area, 0,
+ babl_format ("Y float"),
+@@ -681,8 +682,8 @@ gimp_gegl_combine_mask (GeglBuffer *mask_buffer,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const gfloat *mask = (const gfloat *) iter->data[0];
+- gfloat *dest = (gfloat *) iter->data[1];
++ const gfloat *mask = (const gfloat *) iter->items[0].data;
++ gfloat *dest = (gfloat *) iter->items[1].data;
+ gint count = iter->length;
+
+ while (count--)
+@@ -719,7 +720,7 @@ gimp_gegl_combine_mask_weird (GeglBuffer *mask_buffer,
+
+ iter = gegl_buffer_iterator_new (mask_buffer, mask_area, 0,
+ babl_format ("Y float"),
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
+
+ gegl_buffer_iterator_add (iter, dest_buffer, dest_area, 0,
+ babl_format ("Y float"),
+@@ -727,8 +728,8 @@ gimp_gegl_combine_mask_weird (GeglBuffer *mask_buffer,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const gfloat *mask = (const gfloat *) iter->data[0];
+- gfloat *dest = (gfloat *) iter->data[1];
++ const gfloat *mask = (const gfloat *) iter->items[0].data;
++ gfloat *dest = (gfloat *) iter->items[1].data;
+ gint count = iter->length;
+
+ if (stipple)
+@@ -791,7 +792,7 @@ gimp_gegl_replace (GeglBuffer *top_buffer,
+
+ iter = gegl_buffer_iterator_new (top_buffer, top_area, 0,
+ babl_format ("RGBA float"),
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 4);
+
+ gegl_buffer_iterator_add (iter, bottom_buffer, bottom_area, 0,
+ babl_format ("RGBA float"),
+@@ -807,10 +808,10 @@ gimp_gegl_replace (GeglBuffer *top_buffer,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const gfloat *top = (const gfloat *) iter->data[0];
+- const gfloat *bottom = (const gfloat *) iter->data[1];
+- const gfloat *mask = (const gfloat *) iter->data[2];
+- gfloat *dest = (gfloat *) iter->data[3];
++ const gfloat *top = (const gfloat *) iter->items[0].data;
++ const gfloat *bottom = (const gfloat *) iter->items[1].data;
++ const gfloat *mask = (const gfloat *) iter->items[2].data;
++ gfloat *dest = (gfloat *) iter->items[3].data;
+ gint count = iter->length;
+
+ while (count--)
+@@ -905,7 +906,7 @@ gimp_gegl_index_to_mask (GeglBuffer *indexed_buffer,
+
+ iter = gegl_buffer_iterator_new (indexed_buffer, indexed_area, 0,
+ indexed_format,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
+
+ gegl_buffer_iterator_add (iter, mask_buffer, mask_area, 0,
+ babl_format ("Y float"),
+@@ -913,8 +914,8 @@ gimp_gegl_index_to_mask (GeglBuffer *indexed_buffer,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *indexed = (const guchar *) iter->data[0];
+- gfloat *mask = (gfloat *) iter->data[1];
++ const guchar *indexed = (const guchar *) iter->items[0].data;
++ gfloat *mask = (gfloat *) iter->items[1].data;
+ gint count = iter->length;
+
+ while (count--)
+@@ -1063,11 +1064,11 @@ gimp_gegl_average_color (GeglBuffer *buffer,
+ gint n = 0;
+
+ iter = gegl_buffer_iterator_new (buffer, area, 0, average_format,
+- GEGL_BUFFER_READ, abyss_policy);
++ GEGL_BUFFER_READ, abyss_policy, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const gfloat *p = (const gfloat *) iter->data[0];
++ const gfloat *p = (const gfloat *) iter->items[0].data;
+ gint i;
+
+ for (i = 0; i < iter->length; i++)
+diff --git a/app/gegl/gimp-gegl-mask-combine.c b/app/gegl/gimp-gegl-mask-combine.c
+index abedf61de9..9ab093fe8c 100644
+--- app/gegl/gimp-gegl-mask-combine.c
++++ app/gegl/gimp-gegl-mask-combine.c
+@@ -20,6 +20,7 @@
+ #include
+
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+
+ #include "libgimpbase/gimpbase.h"
+@@ -205,12 +206,12 @@ gimp_gegl_mask_combine_ellipse_rect (GeglBuffer *mask,
+ iter = gegl_buffer_iterator_new (mask,
+ GEGL_RECTANGLE (x0, y0, width, height), 0,
+ babl_format ("Y float"),
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
+- roi = &iter->roi[0];
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
++ roi = &iter->items[0].roi;
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *data = iter->data[0];
++ gfloat *data = iter->items[0].data;
+ gint py;
+
+ for (py = roi->y;
+@@ -411,7 +412,7 @@ gimp_gegl_mask_combine_buffer (GeglBuffer *mask,
+
+ iter = gegl_buffer_iterator_new (mask, &rect, 0,
+ mask_format,
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 2);
+
+ rect.x -= off_x;
+ rect.y -= off_y;
+@@ -443,8 +444,8 @@ gimp_gegl_mask_combine_buffer (GeglBuffer *mask,
+ case GIMP_CHANNEL_OP_REPLACE:
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *mask_data = iter->data[0];
+- const gfloat *add_on_data = iter->data[1];
++ gfloat *mask_data = iter->items[0].data;
++ const gfloat *add_on_data = iter->items[1].data;
+ gint count = iter->length;
+
+ while (count--)
+@@ -462,8 +463,8 @@ gimp_gegl_mask_combine_buffer (GeglBuffer *mask,
+ case GIMP_CHANNEL_OP_SUBTRACT:
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *mask_data = iter->data[0];
+- const gfloat *add_on_data = iter->data[1];
++ gfloat *mask_data = iter->items[0].data;
++ const gfloat *add_on_data = iter->items[1].data;
+ gint count = iter->length;
+
+ while (count--)
+@@ -482,8 +483,8 @@ gimp_gegl_mask_combine_buffer (GeglBuffer *mask,
+ case GIMP_CHANNEL_OP_INTERSECT:
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *mask_data = iter->data[0];
+- const gfloat *add_on_data = iter->data[1];
++ gfloat *mask_data = iter->items[0].data;
++ const gfloat *add_on_data = iter->items[1].data;
+ gint count = iter->length;
+
+ while (count--)
+diff --git a/app/gegl/gimp-gegl-mask.c b/app/gegl/gimp-gegl-mask.c
+index f14638b264..4dad33315c 100644
+--- app/gegl/gimp-gegl-mask.c
++++ app/gegl/gimp-gegl-mask.c
+@@ -17,6 +17,7 @@
+
+ #include "config.h"
+
++#define GEGL_ITERATOR2_API
+ #include
+
+ #include "gimp-gegl-types.h"
+@@ -48,12 +49,12 @@ gimp_gegl_mask_bounds (GeglBuffer *buffer,
+ ty2 = 0;
+
+ iter = gegl_buffer_iterator_new (buffer, NULL, 0, babl_format ("Y float"),
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+- roi = &iter->roi[0];
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 1);
++ roi = &iter->items[0].roi;
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *data = iter->data[0];
++ gfloat *data = iter->items[0].data;
+ gfloat *data1 = data;
+ gint ex = roi->x + roi->width;
+ gint ey = roi->y + roi->height;
+@@ -138,11 +139,11 @@ gimp_gegl_mask_is_empty (GeglBuffer *buffer)
+ g_return_val_if_fail (GEGL_IS_BUFFER (buffer), FALSE);
+
+ iter = gegl_buffer_iterator_new (buffer, NULL, 0, babl_format ("Y float"),
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *data = iter->data[0];
++ gfloat *data = iter->items[0].data;
+ gint i;
+
+ for (i = 0; i < iter->length; i++)
+diff --git a/app/operations/gimpoperationbuffersourcevalidate.c b/app/operations/gimpoperationbuffersourcevalidate.c
+index 85a87ecd8b..40b16871e4 100644
+--- app/operations/gimpoperationbuffersourcevalidate.c
++++ app/operations/gimpoperationbuffersourcevalidate.c
+@@ -18,6 +18,7 @@
+ * along with this program. If not, see .
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -317,7 +318,7 @@ gimp_operation_buffer_source_validate_process (GeglOperation *operation,
+ rect.height),
+ level, NULL,
+ GEGL_BUFFER_READ,
+- GEGL_ABYSS_NONE);
++ GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter));
+ }
+diff --git a/app/operations/gimpoperationcagecoefcalc.c b/app/operations/gimpoperationcagecoefcalc.c
+index 30e7f49681..66e7527341 100644
+--- app/operations/gimpoperationcagecoefcalc.c
++++ app/operations/gimpoperationcagecoefcalc.c
+@@ -20,6 +20,7 @@
+ #include "config.h"
+
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+
+ #include "libgimpmath/gimpmath.h"
+@@ -212,17 +213,17 @@ gimp_operation_cage_coef_calc_process (GeglOperation *operation,
+ n_cage_vertices = gimp_cage_config_get_n_points (config);
+
+ it = gegl_buffer_iterator_new (output, roi, 0, format,
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (it))
+ {
+ /* iterate inside the roi */
+ gint n_pixels = it->length;
+- gint x = it->roi->x; /* initial x */
+- gint y = it->roi->y; /* and y coordinates */
++ gint x = it->items[0].roi.x; /* initial x */
++ gint y = it->items[0].roi.y; /* and y coordinates */
+ gint j;
+
+- gfloat *coef = it->data[0];
++ gfloat *coef = it->items[0].data;
+
+ while(n_pixels--)
+ {
+@@ -282,9 +283,9 @@ gimp_operation_cage_coef_calc_process (GeglOperation *operation,
+
+ /* update x and y coordinates */
+ x++;
+- if (x >= (it->roi->x + it->roi->width))
++ if (x >= (it->items[0].roi.x + it->items[0].roi.width))
+ {
+- x = it->roi->x;
++ x = it->items[0].roi.x;
+ y++;
+ }
+ }
+diff --git a/app/operations/gimpoperationcagetransform.c b/app/operations/gimpoperationcagetransform.c
+index f0467d5088..d2267c8bfa 100644
+--- app/operations/gimpoperationcagetransform.c
++++ app/operations/gimpoperationcagetransform.c
+@@ -20,6 +20,7 @@
+ #include "config.h"
+
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+ #include
+
+@@ -234,7 +235,7 @@ gimp_operation_cage_transform_process (GeglOperation *operation,
+
+ /* pre-fill the out buffer with no-displacement coordinate */
+ it = gegl_buffer_iterator_new (out_buf, roi, 0, NULL,
+- GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 1);
+ cage_bb = gimp_cage_config_get_bounding_box (config);
+
+ point = &(g_array_index (config->cage_points, GimpCagePoint, 0));
+@@ -247,10 +248,10 @@ gimp_operation_cage_transform_process (GeglOperation *operation,
+ {
+ /* iterate inside the roi */
+ gint n_pixels = it->length;
+- gfloat *output = it->data[0];
++ gfloat *output = it->items[0].data;
+
+- x = it->roi->x; /* initial x */
+- y = it->roi->y; /* and y coordinates */
++ x = it->items[0].roi.x; /* initial x */
++ y = it->items[0].roi.y; /* and y coordinates */
+
+ while (n_pixels--)
+ {
+@@ -280,9 +281,9 @@ gimp_operation_cage_transform_process (GeglOperation *operation,
+
+ /* update x and y coordinates */
+ x++;
+- if (x >= (it->roi->x + it->roi->width))
++ if (x >= (it->items[0].roi.x + it->items[0].roi.width))
+ {
+- x = it->roi->x;
++ x = it->items[0].roi.x;
+ y++;
+ }
+ }
+diff --git a/app/operations/gimpoperationgradient.c b/app/operations/gimpoperationgradient.c
+index 889d8f8656..ec3a0164c7 100644
+--- app/operations/gimpoperationgradient.c
++++ app/operations/gimpoperationgradient.c
+@@ -23,6 +23,7 @@
+ #include "config.h"
+
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+ #include
+
+@@ -1130,15 +1131,15 @@ gimp_operation_gradient_process (GeglOperation *operation,
+
+ iter = gegl_buffer_iterator_new (output, result, 0,
+ babl_format ("R'G'B'A float"),
+- GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
+- roi = &iter->roi[0];
++ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 1);
++ roi = &iter->items[0].roi;
+
+ if (self->dither)
+ seed = g_rand_new ();
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *dest = iter->data[0];
++ gfloat *dest = iter->items[0].data;
+ gint endx = roi->x + roi->width;
+ gint endy = roi->y + roi->height;
+ gint x, y;
+diff --git a/app/operations/gimpoperationmaskcomponents.c b/app/operations/gimpoperationmaskcomponents.c
+index 1c9425c410..8a8756cb7a 100644
+--- app/operations/gimpoperationmaskcomponents.c
++++ app/operations/gimpoperationmaskcomponents.c
+@@ -81,7 +81,7 @@ gimp_operation_mask_components_class_init (GimpOperationMaskComponentsClass *kla
+ NULL);
+
+ operation_class->prepare = gimp_operation_mask_components_prepare;
+- operation_class->process = gimp_operation_mask_components_parent_process;
++ //operation_class->process = gimp_operation_mask_components_parent_process;
+
+ point_class->process = gimp_operation_mask_components_process;
+
+@@ -172,7 +172,7 @@ gimp_operation_mask_components_parent_process (GeglOperation *operation,
+ gint level)
+ {
+ GimpOperationMaskComponents *self = GIMP_OPERATION_MASK_COMPONENTS (operation);
+-
++#if 0
+ if (self->mask == 0)
+ {
+ GObject *input = gegl_operation_context_get_object (context, "input");
+@@ -189,7 +189,7 @@ gimp_operation_mask_components_parent_process (GeglOperation *operation,
+
+ return TRUE;
+ }
+-
++#endif
+ return GEGL_OPERATION_CLASS (parent_class)->process (operation, context,
+ output_prop, result,
+ level);
+@@ -211,10 +211,24 @@ gimp_operation_mask_components_process (GeglOperation *operation,
+ GimpComponentMask mask = self->mask;
+ static const gfloat nothing[] = { 0.0, 0.0, 0.0, 1.0 };
+
+- if (! aux)
+- aux = (gfloat *) nothing;
++#if 0
++ if (self->mask == 0)
++ {
++ if (in_buf != out_buf)
++ memcpy (out_buf, in_buf, sizeof (float) * 4 * samples);
++ }
++ else if (self->mask == GIMP_COMPONENT_MASK_ALL && aux_buf)
++ {
++ if (aux_buf != out_buf)
++ memcpy (out_buf, aux_buf, sizeof (float) * 4 * samples);
++ }
++ else
++#endif
++ {
++ if (! aux)
++ aux = (gfloat *) nothing;
+
+- while (samples--)
++ while (samples--)
+ {
+ dest[RED] = (mask & GIMP_COMPONENT_MASK_RED) ? aux[RED] : src[RED];
+ dest[GREEN] = (mask & GIMP_COMPONENT_MASK_GREEN) ? aux[GREEN] : src[GREEN];
+@@ -228,6 +242,7 @@ gimp_operation_mask_components_process (GeglOperation *operation,
+
+ dest += 4;
+ }
++ }
+
+ return TRUE;
+ }
+diff --git a/app/paint/gimpbrushcore.c b/app/paint/gimpbrushcore.c
+index e5076f723a..d46ecba72a 100644
+--- app/paint/gimpbrushcore.c
++++ app/paint/gimpbrushcore.c
+@@ -20,6 +20,7 @@
+ #include
+
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+
+ #include "libgimpmath/gimpmath.h"
+@@ -1283,7 +1284,7 @@ gimp_brush_core_color_area_with_pixmap (GimpBrushCore *core,
+ pixmap_format = gimp_temp_buf_get_format (pixmap_mask);
+
+ iter = gegl_buffer_iterator_new (area, NULL, 0, area_format,
+- GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 1);
+
+ if (mode == GIMP_BRUSH_SOFT && brush_mask)
+ {
+@@ -1306,11 +1307,11 @@ gimp_brush_core_color_area_with_pixmap (GimpBrushCore *core,
+ brush_mask = NULL;
+ }
+
+- roi = &iter->roi[0];
++ roi = &iter->items[0].roi;
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *d = iter->data[0];
++ gfloat *d = iter->items[0].data;
+ gint y;
+
+ for (y = 0; y < roi->height; y++)
+diff --git a/app/paint/gimpheal.c b/app/paint/gimpheal.c
+index 0c2a0f3c0a..140baf0504 100644
+--- app/paint/gimpheal.c
++++ app/paint/gimpheal.c
+@@ -25,6 +25,7 @@
+ #include
+
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+
+ #include "libgimpbase/gimpbase.h"
+@@ -205,7 +206,7 @@ gimp_heal_sub (GeglBuffer *top_buffer,
+ g_return_if_reached ();
+
+ iter = gegl_buffer_iterator_new (top_buffer, top_rect, 0, format,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 3);
+
+ gegl_buffer_iterator_add (iter, bottom_buffer, bottom_rect, 0, format,
+ GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+@@ -216,9 +217,9 @@ gimp_heal_sub (GeglBuffer *top_buffer,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *t = iter->data[0];
+- gfloat *b = iter->data[1];
+- gfloat *r = iter->data[2];
++ gfloat *t = iter->items[0].data;
++ gfloat *b = iter->items[1].data;
++ gfloat *r = iter->items[2].data;
+ gint length = iter->length * n_components;
+
+ while (length--)
+@@ -250,7 +251,7 @@ gimp_heal_add (GeglBuffer *first_buffer,
+ iter = gegl_buffer_iterator_new (first_buffer, first_rect, 0,
+ babl_format_n (babl_type ("float"),
+ n_components),
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 3);
+
+ gegl_buffer_iterator_add (iter, second_buffer, second_rect, 0, format,
+ GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+@@ -260,9 +261,9 @@ gimp_heal_add (GeglBuffer *first_buffer,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *f = iter->data[0];
+- gfloat *s = iter->data[1];
+- gfloat *r = iter->data[2];
++ gfloat *f = iter->items[0].data;
++ gfloat *s = iter->items[1].data;
++ gfloat *r = iter->items[2].data;
+ gint length = iter->length * n_components;
+
+ while (length--)
+diff --git a/app/paint/gimpink.c b/app/paint/gimpink.c
+index ce4e018b21..7531ece643 100644
+--- app/paint/gimpink.c
++++ app/paint/gimpink.c
+@@ -20,6 +20,7 @@
+ #include
+
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+
+ #include "libgimpmath/gimpmath.h"
+@@ -748,12 +749,12 @@ render_blob (GeglBuffer *buffer,
+ GeglRectangle *roi;
+
+ iter = gegl_buffer_iterator_new (buffer, rect, 0, babl_format ("Y float"),
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
+- roi = &iter->roi[0];
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
++ roi = &iter->items[0].roi;
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *d = iter->data[0];
++ gfloat *d = iter->items[0].data;
+ gint h = roi->height;
+ gint y;
+
+diff --git a/app/paint/gimpmybrushsurface.c b/app/paint/gimpmybrushsurface.c
+index b9970d4c6c..dece18ae1d 100644
+--- app/paint/gimpmybrushsurface.c
++++ app/paint/gimpmybrushsurface.c
+@@ -16,7 +16,7 @@
+ */
+
+ #include "config.h"
+-
++#define GEGL_ITERATOR2_API
+ #include
+
+ #include
+@@ -266,7 +266,7 @@ gimp_mypaint_surface_get_color (MyPaintSurface *base_surface,
+ GeglBufferIterator *iter = gegl_buffer_iterator_new (surface->buffer, &dabRect, 0,
+ babl_format ("R'aG'aB'aA float"),
+ GEGL_BUFFER_READ,
+- GEGL_ABYSS_CLAMP);
++ GEGL_ABYSS_CLAMP, 2);
+ if (surface->paint_mask)
+ {
+ GeglRectangle mask_roi = dabRect;
+@@ -279,19 +279,19 @@ gimp_mypaint_surface_get_color (MyPaintSurface *base_surface,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- float *pixel = (float *)iter->data[0];
++ float *pixel = (float *)iter->items[0].data;
+ float *mask;
+ int iy, ix;
+
+ if (surface->paint_mask)
+- mask = iter->data[1];
++ mask = iter->items[1].data;
+ else
+ mask = NULL;
+
+- for (iy = iter->roi[0].y; iy < iter->roi[0].y + iter->roi[0].height; iy++)
++ for (iy = iter->items[0].roi.y; iy < iter->items[0].roi.y + iter->items[0].roi.height; iy++)
+ {
+ float yy = (iy + 0.5f - y);
+- for (ix = iter->roi[0].x; ix < iter->roi[0].x + iter->roi[0].width; ix++)
++ for (ix = iter->items[0].roi.x; ix < iter->items[0].roi.x + iter->items[0].roi.width; ix++)
+ {
+ /* pixel_weight == a standard dab with hardness = 0.5, aspect_ratio = 1.0, and angle = 0.0 */
+ float xx = (ix + 0.5f - x);
+@@ -390,7 +390,7 @@ gimp_mypaint_surface_draw_dab (MyPaintSurface *base_surface,
+ iter = gegl_buffer_iterator_new (surface->buffer, &dabRect, 0,
+ babl_format ("R'G'B'A float"),
+ GEGL_BUFFER_READWRITE,
+- GEGL_ABYSS_NONE);
++ GEGL_ABYSS_NONE, 2);
+ if (surface->paint_mask)
+ {
+ GeglRectangle mask_roi = dabRect;
+@@ -403,18 +403,18 @@ gimp_mypaint_surface_draw_dab (MyPaintSurface *base_surface,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- float *pixel = (float *)iter->data[0];
++ float *pixel = (float *)iter->items[0].data;
+ float *mask;
+ int iy, ix;
+
+ if (surface->paint_mask)
+- mask = iter->data[1];
++ mask = iter->items[1].data;
+ else
+ mask = NULL;
+
+- for (iy = iter->roi[0].y; iy < iter->roi[0].y + iter->roi[0].height; iy++)
++ for (iy = iter->items[0].roi.y; iy < iter->items[0].roi.y + iter->items[0].roi.height; iy++)
+ {
+- for (ix = iter->roi[0].x; ix < iter->roi[0].x + iter->roi[0].width; ix++)
++ for (ix = iter->items[0].roi.x; ix < iter->items[0].roi.x + iter->items[0].roi.width; ix++)
+ {
+ float rr, base_alpha, alpha, dst_alpha, r, g, b, a;
+ if (radius < 3.0f)
+diff --git a/app/paint/gimppaintcore-loops.cc b/app/paint/gimppaintcore-loops.cc
+index f7fdee0a4f..383a7e2ad8 100644
+--- app/paint/gimppaintcore-loops.cc
++++ app/paint/gimppaintcore-loops.cc
+@@ -16,7 +16,7 @@
+ */
+
+ #include "config.h"
+-
++#define GEGL_ITERATOR2_API
+ #include
+ #include
+
+@@ -641,7 +641,7 @@ struct CombinePaintMaskToCanvasMaskToPaintBufAlpha :
+ base_type::init_step (params, state, iter, roi, area);
+
+ state->canvas_pixel =
+- (gfloat *) iter->data[base_type::canvas_buffer_iterator];
++ (gfloat *) iter->items[base_type::canvas_buffer_iterator].data;
+ }
+
+ template
+@@ -656,14 +656,14 @@ struct CombinePaintMaskToCanvasMaskToPaintBufAlpha :
+ base_type::process_row (params, state, iter, roi, area, y);
+
+ gint mask_offset = (y - roi->y) * this->mask_stride +
+- (iter->roi[0].x - roi->x);
++ (iter->items[0].roi.x - roi->x);
+ const mask_type *mask_pixel = &this->mask_data[mask_offset];
+ gint paint_offset = (y - roi->y) * this->paint_stride +
+- (iter->roi[0].x - roi->x) * 4;
++ (iter->items[0].roi.x - roi->x) * 4;
+ gfloat *paint_pixel = &this->paint_data[paint_offset];
+ gint x;
+
+- for (x = 0; x < iter->roi[0].width; x++)
++ for (x = 0; x < iter->items[0].roi.width; x++)
+ {
+ if (base_type::stipple)
+ {
+@@ -738,7 +738,7 @@ struct CombinePaintMaskToCanvasMask :
+ base_type::init_step (params, state, iter, roi, area);
+
+ state->canvas_pixel =
+- (gfloat *) iter->data[base_type::canvas_buffer_iterator];
++ (gfloat *) iter->items[base_type::canvas_buffer_iterator].data;
+ }
+
+ template
+@@ -753,11 +753,11 @@ struct CombinePaintMaskToCanvasMask :
+ base_type::process_row (params, state, iter, roi, area, y);
+
+ gint mask_offset = (y - roi->y) * this->mask_stride +
+- (iter->roi[0].x - roi->x);
++ (iter->items[0].roi.x - roi->x);
+ const mask_type *mask_pixel = &this->mask_data[mask_offset];
+ gint x;
+
+- for (x = 0; x < iter->roi[0].width; x++)
++ for (x = 0; x < iter->items[0].roi.width; x++)
+ {
+ if (base_type::stipple)
+ {
+@@ -826,7 +826,7 @@ struct CanvasBufferToPaintBufAlpha : CanvasBufferIteratorcanvas_pixel =
+- (const gfloat *) iter->data[base_type::canvas_buffer_iterator];
++ (const gfloat *) iter->items[base_type::canvas_buffer_iterator].data;
+ }
+
+ template
+@@ -842,12 +842,12 @@ struct CanvasBufferToPaintBufAlpha : CanvasBufferIteratory) * this->paint_stride +
+- (iter->roi[0].x - roi->x) * 4;
++ gint paint_offset = (y - roi->y) * this->paint_stride +
++ (iter->items[0].roi.x - roi->x) * 4;
+ gfloat *paint_pixel = &this->paint_data[paint_offset];
+ gint x;
+
+- for (x = 0; x < iter->roi[0].width; x++)
++ for (x = 0; x < iter->items[0].roi.width; x++)
+ {
+ paint_pixel[3] *= *state->canvas_pixel;
+
+@@ -906,15 +906,15 @@ struct PaintMaskToPaintBuffer : Base
+ {
+ Base::process_row (params, state, iter, roi, area, y);
+
+- gint paint_offset = (y - roi->y) * this->paint_stride +
+- (iter->roi[0].x - roi->x) * 4;
++ gint paint_offset = (y - roi->y) * this->paint_stride +
++ (iter->items[0].roi.x - roi->x) * 4;
+ gfloat *paint_pixel = &this->paint_data[paint_offset];
+- gint mask_offset = (y - roi->y) * this->mask_stride +
+- (iter->roi[0].x - roi->x);
++ gint mask_offset = (y - roi->y) * this->mask_stride +
++ (iter->items[0].roi.x - roi->x);
+ const mask_type *mask_pixel = &this->mask_data[mask_offset];
+ gint x;
+
+- for (x = 0; x < iter->roi[0].width; x++)
++ for (x = 0; x < iter->items[0].roi.width; x++)
+ {
+ paint_pixel[3] *= value_to_float (*mask_pixel) * params->paint_opacity;
+
+@@ -1024,19 +1024,19 @@ struct DoLayerBlend : Base
+ {
+ Base::init_step (params, state, iter, roi, area);
+
+- state->out_pixel = (gfloat *) iter->data[iterator_base + 0];
+- state->in_pixel = (gfloat *) iter->data[iterator_base + 1];
++ state->out_pixel = (gfloat *) iter->items[iterator_base + 0].data;
++ state->in_pixel = (gfloat *) iter->items[iterator_base + 1].data;
+ state->mask_pixel = NULL;
+
+ state->paint_pixel = this->paint_data +
+- (iter->roi[0].y - roi->y) * this->paint_stride +
+- (iter->roi[0].x - roi->x) * 4;
++ (iter->items[0].roi.y - roi->y) * this->paint_stride +
++ (iter->items[0].roi.x - roi->x) * 4;
+
+ if (params->mask_buffer)
+- state->mask_pixel = (gfloat *) iter->data[iterator_base + 2];
++ state->mask_pixel = (gfloat *) iter->items[iterator_base + 2].data;
+
+- state->process_roi.x = iter->roi[0].x;
+- state->process_roi.width = iter->roi[0].width;
++ state->process_roi.x = iter->items[0].roi.x;
++ state->process_roi.width = iter->items[0].roi.width;
+ state->process_roi.height = 1;
+ }
+
+@@ -1058,14 +1058,14 @@ struct DoLayerBlend : Base
+ state->paint_pixel,
+ state->mask_pixel,
+ state->out_pixel,
+- iter->roi[0].width,
++ iter->items[0].roi.width,
+ &state->process_roi,
+ 0);
+
+- state->in_pixel += iter->roi[0].width * 4;
+- state->out_pixel += iter->roi[0].width * 4;
++ state->in_pixel += iter->items[0].roi.width * 4;
++ state->out_pixel += iter->items[0].roi.width * 4;
+ if (params->mask_buffer)
+- state->mask_pixel += iter->roi[0].width;
++ state->mask_pixel += iter->items[0].roi.width;
+ state->paint_pixel += this->paint_stride;
+ }
+ };
+@@ -1130,7 +1130,7 @@ gimp_paint_core_loops_process (const GimpPaintCoreLoopsParams *params,
+ {
+ GeglBufferIterator *iter;
+
+- iter = gegl_buffer_iterator_empty_new ();
++ iter = gegl_buffer_iterator_empty_new (4);
+
+ algorithm.init (params, &state, iter, &roi, area);
+
+@@ -1138,28 +1138,28 @@ gimp_paint_core_loops_process (const GimpPaintCoreLoopsParams *params,
+ {
+ algorithm.init_step (params, &state, iter, &roi, area);
+
+- for (y = 0; y < iter->roi[0].height; y++)
++ for (y = 0; y < iter->items[0].roi.height; y++)
+ {
+ algorithm.process_row (params, &state,
+ iter, &roi, area,
+- iter->roi[0].y + y);
++ iter->items[0].roi.y + y);
+ }
+ }
+ }
+ else
+ {
+- GeglBufferIterator iter;
++ GeglBufferIterator iter[2];
+
+- iter.roi[0] = *area;
++ iter[0].items[0].roi = *area;
+
+- algorithm.init (params, &state, &iter, &roi, area);
+- algorithm.init_step (params, &state, &iter, &roi, area);
++ algorithm.init (params, &state, &iter[0], &roi, area);
++ algorithm.init_step (params, &state, &iter[0], &roi, area);
+
+- for (y = 0; y < iter.roi[0].height; y++)
++ for (y = 0; y < iter[0].items[0].roi.height; y++)
+ {
+ algorithm.process_row (params, &state,
+- &iter, &roi, area,
+- iter.roi[0].y + y);
++ &iter[0], &roi, area,
++ iter[0].items[0].roi.y + y);
+ }
+ }
+ });
+@@ -1346,7 +1346,7 @@ mask_components_onto (GeglBuffer *src_buffer,
+
+ iter = gegl_buffer_iterator_new (dst_buffer, area, 0,
+ iterator_format,
+- GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 3);
+
+ gegl_buffer_iterator_add (iter, src_buffer, area, 0,
+ iterator_format,
+@@ -1358,9 +1358,9 @@ mask_components_onto (GeglBuffer *src_buffer,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *dest = (gfloat *)iter->data[0];
+- gfloat *src = (gfloat *)iter->data[1];
+- gfloat *aux = (gfloat *)iter->data[2];
++ gfloat *dest = (gfloat *)iter->items[0].data;
++ gfloat *src = (gfloat *)iter->items[1].data;
++ gfloat *aux = (gfloat *)iter->items[2].data;
+ glong samples = iter->length;
+
+ while (samples--)
+diff --git a/app/tools/gimpiscissorstool.c b/app/tools/gimpiscissorstool.c
+index abfec2aaf6..67fb62f7ee 100644
+--- app/tools/gimpiscissorstool.c
++++ app/tools/gimpiscissorstool.c
+@@ -46,6 +46,7 @@
+
+ #include
+
++#define GEGL_ITERATOR2_API
+ #include
+ #include
+ #include
+@@ -1914,12 +1915,12 @@ find_max_gradient (GimpIscissorsTool *iscissors,
+ iter = gegl_buffer_iterator_new (iscissors->gradient_map,
+ GEGL_RECTANGLE (x1, y1, x2 - x1, y2 - y1),
+ 0, NULL,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+- roi = &iter->roi[0];
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 1);
++ roi = &iter->items[0].roi;
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- guint8 *data = iter->data[0];
++ guint8 *data = iter->items[0].data;
+ gint endx = roi->x + roi->width;
+ gint endy = roi->y + roi->height;
+ gint i, j;
+diff --git a/libgimpcolor/gimpcolortransform.c b/libgimpcolor/gimpcolortransform.c
+index 2ddc0f6563..b99c1f6e52 100644
+--- libgimpcolor/gimpcolortransform.c
++++ libgimpcolor/gimpcolortransform.c
+@@ -28,6 +28,7 @@
+ #include
+
+ #include
++#define GEGL_ITERATOR2_API
+ #include
+
+ #include "libgimpbase/gimpbase.h"
+@@ -555,7 +556,7 @@ gimp_color_transform_process_buffer (GimpColorTransform *transform,
+ iter = gegl_buffer_iterator_new (src_buffer, src_rect, 0,
+ src_format,
+ GEGL_ACCESS_READ,
+- GEGL_ABYSS_NONE);
++ GEGL_ABYSS_NONE, 2);
+
+ gegl_buffer_iterator_add (iter, dest_buffer, dest_rect, 0,
+ dest_format,
+@@ -567,15 +568,15 @@ gimp_color_transform_process_buffer (GimpColorTransform *transform,
+ if (priv->transform)
+ {
+ cmsDoTransform (priv->transform,
+- iter->data[0], iter->data[1], iter->length);
++ iter->items[0].data, iter->items[1].data, iter->length);
+ }
+ else
+ {
+ babl_process (priv->fish,
+- iter->data[0], iter->data[1], iter->length);
++ iter->items[0].data, iter->items[1].data, iter->length);
+ }
+
+- done_pixels += iter->roi[0].width * iter->roi[0].height;
++ done_pixels += iter->items[0].roi.width * iter->items[0].roi.height;
+
+ g_signal_emit (transform, gimp_color_transform_signals[PROGRESS], 0,
+ (gdouble) done_pixels /
+@@ -587,22 +588,22 @@ gimp_color_transform_process_buffer (GimpColorTransform *transform,
+ iter = gegl_buffer_iterator_new (src_buffer, src_rect, 0,
+ src_format,
+ GEGL_ACCESS_READWRITE,
+- GEGL_ABYSS_NONE);
++ GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+ if (priv->transform)
+ {
+ cmsDoTransform (priv->transform,
+- iter->data[0], iter->data[0], iter->length);
++ iter->items[0].data, iter->items[0].data, iter->length);
+ }
+ else
+ {
+ babl_process (priv->fish,
+- iter->data[0], iter->data[0], iter->length);
++ iter->items[0].data, iter->items[0].data, iter->length);
+ }
+
+- done_pixels += iter->roi[0].width * iter->roi[0].height;
++ done_pixels += iter->items[0].roi.width * iter->items[0].roi.height;
+
+ g_signal_emit (transform, gimp_color_transform_signals[PROGRESS], 0,
+ (gdouble) done_pixels /
+diff --git a/modules/display-filter-clip-warning.c b/modules/display-filter-clip-warning.c
+index 0e140df15c..71e92736c2 100644
+--- modules/display-filter-clip-warning.c
++++ modules/display-filter-clip-warning.c
+@@ -20,6 +20,7 @@
+
+ #include
+
++#define GEGL_ITERATOR2_API
+ #include
+ #include
+
+@@ -353,14 +354,14 @@ cdisplay_clip_warning_convert_buffer (GimpColorDisplay *display,
+
+ iter = gegl_buffer_iterator_new (buffer, area, 0,
+ babl_format ("R'G'B'A float"),
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *data = iter->data[0];
++ gfloat *data = iter->items[0].data;
+ gint count = iter->length;
+- gint x = iter->roi[0].x;
+- gint y = iter->roi[0].y;
++ gint x = iter->items[0].roi.x;
++ gint y = iter->items[0].roi.y;
+
+ while (count--)
+ {
+@@ -406,9 +407,9 @@ cdisplay_clip_warning_convert_buffer (GimpColorDisplay *display,
+
+ data += 4;
+
+- if (++x == iter->roi[0].x + iter->roi[0].width)
++ if (++x == iter->items[0].roi.x + iter->items[0].roi.width)
+ {
+- x = iter->roi[0].x;
++ x = iter->items[0].roi.x;
+ y++;
+ }
+ }
+diff --git a/modules/display-filter-color-blind.c b/modules/display-filter-color-blind.c
+index aee9df704c..604f3f0d10 100644
+--- modules/display-filter-color-blind.c
++++ modules/display-filter-color-blind.c
+@@ -29,6 +29,7 @@
+
+ #include
+
++#define GEGL_ITERATOR2_API
+ #include
+ #include
+
+@@ -330,11 +331,11 @@ cdisplay_colorblind_convert_buffer (GimpColorDisplay *display,
+
+ iter = gegl_buffer_iterator_new (buffer, area, 0,
+ babl_format ("RGBA float") /* linear! */,
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *data = iter->data[0];
++ gfloat *data = iter->items[0].data;
+ gint count = iter->length;
+
+ while (count--)
+diff --git a/modules/display-filter-gamma.c b/modules/display-filter-gamma.c
+index d49e12f933..0813e47912 100644
+--- modules/display-filter-gamma.c
++++ modules/display-filter-gamma.c
+@@ -17,6 +17,7 @@
+
+ #include "config.h"
+
++#define GEGL_ITERATOR2_API
+ #include
+ #include
+
+@@ -193,11 +194,11 @@ cdisplay_gamma_convert_buffer (GimpColorDisplay *display,
+
+ iter = gegl_buffer_iterator_new (buffer, area, 0,
+ babl_format ("R'G'B'A float"),
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *data = iter->data[0];
++ gfloat *data = iter->items[0].data;
+ gint count = iter->length;
+
+ while (count--)
+diff --git a/modules/display-filter-high-contrast.c b/modules/display-filter-high-contrast.c
+index e45c28955f..7c7c512738 100644
+--- modules/display-filter-high-contrast.c
++++ modules/display-filter-high-contrast.c
+@@ -17,6 +17,7 @@
+
+ #include "config.h"
+
++#define GEGL_ITERATOR2_API
+ #include
+ #include
+
+@@ -193,11 +194,11 @@ cdisplay_contrast_convert_buffer (GimpColorDisplay *display,
+
+ iter = gegl_buffer_iterator_new (buffer, area, 0,
+ babl_format ("R'G'B'A float"),
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *data = iter->data[0];
++ gfloat *data = iter->items[0].data;
+ gint count = iter->length;
+
+ while (count--)
+diff --git a/plug-ins/common/border-average.c b/plug-ins/common/border-average.c
+index 55ff62c9f2..d8c157b964 100644
+--- plug-ins/common/border-average.c
++++ plug-ins/common/border-average.c
+@@ -17,6 +17,7 @@
+ * along with this program. If not, see .
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -271,14 +272,14 @@ borderaverage (GeglBuffer *buffer,
+ GeglBufferIterator *gi;
+
+ gi = gegl_buffer_iterator_new (buffer, &border[i], 0, babl_format ("R'G'B' u8"),
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (gi))
+ {
+ guint k;
+ guchar *data;
+
+- data = (guchar*) gi->data[0];
++ data = (guchar*) gi->items[0].data;
+
+ for (k = 0; k < gi->length; k++)
+ {
+diff --git a/plug-ins/common/colormap-remap.c b/plug-ins/common/colormap-remap.c
+index 168fb50bff..493bbeda22 100644
+--- plug-ins/common/colormap-remap.c
++++ plug-ins/common/colormap-remap.c
+@@ -27,6 +27,7 @@
+ *
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -363,19 +364,19 @@ remap (gint32 image_ID,
+ iter = gegl_buffer_iterator_new (buffer,
+ GEGL_RECTANGLE (0, 0, width, height), 0,
+ format,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+- src_roi = &iter->roi[0];
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
++ src_roi = &iter->items[0].roi;
+
+ gegl_buffer_iterator_add (iter, shadow,
+ GEGL_RECTANGLE (0, 0, width, height), 0,
+ format,
+ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
+- dest_roi = &iter->roi[1];
++ dest_roi = &iter->items[1].roi;
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *src_row = iter->data[0];
+- guchar *dest_row = iter->data[1];
++ const guchar *src_row = iter->items[0].data;
++ guchar *dest_row = iter->items[1].data;
+ gint y;
+
+ for (y = 0; y < src_roi->height; y++)
+diff --git a/plug-ins/common/compose.c b/plug-ins/common/compose.c
+index 59d2e971f4..705f4c24c1 100644
+--- plug-ins/common/compose.c
++++ plug-ins/common/compose.c
+@@ -34,6 +34,7 @@
+ * They can be dropped for GIMP 3.0
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -658,11 +659,11 @@ cpn_affine_transform (GeglBuffer *buffer,
+ gegl_buffer_set_format (buffer, babl_format ("Y double"));
+
+ gi = gegl_buffer_iterator_new (buffer, NULL, 0, NULL,
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (gi))
+ {
+- gdouble *data = gi->data[0];
++ gdouble *data = gi->items[0].data;
+ guint k;
+
+ for (k = 0; k < gi->length; k++)
+@@ -683,7 +684,7 @@ fill_buffer_from_components (GeglBuffer *temp[MAX_COMPOSE_IMAGES],
+ gint j;
+
+ gi = gegl_buffer_iterator_new (dst, NULL, 0, NULL,
+- GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 10);
+
+ for (j = 0; j < num_cpn; j++)
+ {
+@@ -695,13 +696,13 @@ fill_buffer_from_components (GeglBuffer *temp[MAX_COMPOSE_IMAGES],
+ while (gegl_buffer_iterator_next (gi))
+ {
+ gdouble *src_data[MAX_COMPOSE_IMAGES];
+- gdouble *dst_data = (gdouble*) gi->data[0];
++ gdouble *dst_data = (gdouble*) gi->items[0].data;
+ gulong k, count;
+
+ count = 1;
+ for (j = 0; j < num_cpn; j++)
+ if (inputs[j].is_ID)
+- src_data[j] = (gdouble*) gi->data[count++];
++ src_data[j] = (gdouble*) gi->items[count++].data;
+
+ for (k = 0; k < gi->length; k++)
+ {
+diff --git a/plug-ins/common/decompose.c b/plug-ins/common/decompose.c
+index 2ad0441431..24c8f0ea57 100644
+--- plug-ins/common/decompose.c
++++ plug-ins/common/decompose.c
+@@ -25,7 +25,7 @@
+ * merged into the officical plug-in by Sven Neumann.
+ */
+
+-
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -641,7 +641,7 @@ transfer_registration_color (GeglBuffer *src,
+ dst_bpp = babl_format_get_bytes_per_pixel (dst_format);
+
+ gi = gegl_buffer_iterator_new (src, NULL, 0, NULL,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 10);
+
+ for (i = 0; i < count; i++)
+ {
+@@ -655,9 +655,9 @@ transfer_registration_color (GeglBuffer *src,
+ gpointer dst_data[MAX_EXTRACT_IMAGES];
+ gint j, k;
+
+- src_data = gi->data[0];
++ src_data = gi->items[0].data;
+ for (j = 0; j < count; j++)
+- dst_data[j] = gi->data[j + 1];
++ dst_data[j] = gi->items[j + 1].data;
+
+ for (k = 0; k < gi->length; k++)
+ {
+@@ -693,14 +693,14 @@ cpn_affine_transform_clamp (GeglBuffer *buffer,
+ gegl_buffer_set_format (buffer, babl_format ("Y double"));
+
+ gi = gegl_buffer_iterator_new (buffer, NULL, 0, NULL,
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (gi))
+ {
+ guint k;
+ double *data;
+
+- data = (double*) gi->data[0];
++ data = (double*) gi->items[0].data;
+
+ if (clamp)
+ {
+diff --git a/plug-ins/common/file-png.c b/plug-ins/common/file-png.c
+index 4fdaefb045..6ac721b803 100644
+--- plug-ins/common/file-png.c
++++ plug-ins/common/file-png.c
+@@ -38,6 +38,7 @@
+ * see ChangeLog
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -1360,13 +1361,13 @@ load_image (const gchar *filename,
+ file_format = gegl_buffer_get_format (buffer);
+
+ iter = gegl_buffer_iterator_new (buffer, NULL, 0, file_format,
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
+ n_components = babl_format_get_n_components (file_format);
+ g_warn_if_fail (n_components == 2);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- guchar *data = iter->data[0];
++ guchar *data = iter->items[0].data;
+ gint length = iter->length;
+
+ while (length--)
+@@ -2118,13 +2119,13 @@ ia_has_transparent_pixels (GeglBuffer *buffer)
+
+ format = gegl_buffer_get_format (buffer);
+ iter = gegl_buffer_iterator_new (buffer, NULL, 0, format,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 1);
+ n_components = babl_format_get_n_components (format);
+ g_return_val_if_fail (n_components == 2, FALSE);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *data = iter->data[0];
++ const guchar *data = iter->items[0].data;
+ gint length = iter->length;
+
+ while (length--)
+@@ -2161,13 +2162,13 @@ find_unused_ia_color (GeglBuffer *buffer,
+
+ format = gegl_buffer_get_format (buffer);
+ iter = gegl_buffer_iterator_new (buffer, NULL, 0, format,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 1);
+ n_components = babl_format_get_n_components (format);
+ g_return_val_if_fail (n_components == 2, FALSE);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *data = iter->data[0];
++ const guchar *data = iter->items[0].data;
+ gint length = iter->length;
+
+ while (length--)
+diff --git a/plug-ins/common/gradient-map.c b/plug-ins/common/gradient-map.c
+index c5ad659d5b..a3afdc7250 100644
+--- plug-ins/common/gradient-map.c
++++ plug-ins/common/gradient-map.c
+@@ -18,6 +18,7 @@
+ * along with this program. If not, see .
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+ #include
+
+@@ -265,7 +266,7 @@ map (GeglBuffer *buffer,
+ }
+
+ gi = gegl_buffer_iterator_new (shadow_buffer, NULL, 0, format_shadow,
+- GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 2);
+
+ index_iter = gegl_buffer_iterator_add (gi, buffer, NULL,
+ 0, format_buffer,
+@@ -277,8 +278,8 @@ map (GeglBuffer *buffer,
+ gfloat *data;
+ gfloat *data2;
+
+- data = (gfloat*) gi->data[0];
+- data2 = (gfloat*) gi->data[index_iter];
++ data = (gfloat*) gi->items[0].data;
++ data2 = (gfloat*) gi->items[index_iter].data;
+
+ if (interpolate)
+ {
+diff --git a/plug-ins/common/qbist.c b/plug-ins/common/qbist.c
+index b8fa2621c5..2cf6a34b40 100644
+--- plug-ins/common/qbist.c
++++ plug-ins/common/qbist.c
+@@ -26,6 +26,7 @@
+ *
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -501,7 +502,7 @@ run (const gchar *name,
+ img_width, img_height),
+ 0, babl_format ("R'G'B'A float"),
+ GEGL_ACCESS_READWRITE,
+- GEGL_ABYSS_NONE);
++ GEGL_ABYSS_NONE, 1);
+
+ optimize (&qbist_info.info);
+
+@@ -509,8 +510,8 @@ run (const gchar *name,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *data = iter->data[0];
+- GeglRectangle roi = iter->roi[0];
++ gfloat *data = iter->items[0].data;
++ GeglRectangle roi = iter->items[0].roi;
+ gint row;
+
+ for (row = 0; row < roi.height; row++)
+diff --git a/plug-ins/file-psd/psd-load.c b/plug-ins/file-psd/psd-load.c
+index bab190a975..690321a145 100644
+--- plug-ins/file-psd/psd-load.c
++++ plug-ins/file-psd/psd-load.c
+@@ -18,6 +18,7 @@
+ * along with this program. If not, see .
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -1872,11 +1873,11 @@ add_merged_image (gint32 image_id,
+ iter = gegl_buffer_iterator_new (buffer, NULL, 0,
+ babl_format ("R'G'B'A float"),
+ GEGL_ACCESS_READWRITE,
+- GEGL_ABYSS_NONE);
++ GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- gfloat *data = iter->data[0];
++ gfloat *data = iter->items[0].data;
+
+ for (i = 0; i < iter->length; i++)
+ {
+diff --git a/plug-ins/file-psd/psd-save.c b/plug-ins/file-psd/psd-save.c
+index 1952d6cd5f..dc643ef96e 100644
+--- plug-ins/file-psd/psd-save.c
++++ plug-ins/file-psd/psd-save.c
+@@ -63,6 +63,7 @@
+ * BUGS:
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -1467,11 +1468,11 @@ create_merged_image (gint32 image_id)
+ GeglBufferIterator *iter;
+
+ iter = gegl_buffer_iterator_new (buffer, NULL, 0, format,
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- guchar *d = iter->data[0];
++ guchar *d = iter->items[0].data;
+ gint i;
+
+ for (i = 0; i < iter->length; i++)
+diff --git a/plug-ins/file-tiff/file-tiff-load.c b/plug-ins/file-tiff/file-tiff-load.c
+index 6d68495385..1097c31342 100644
+--- plug-ins/file-tiff/file-tiff-load.c
++++ plug-ins/file-tiff/file-tiff-load.c
+@@ -42,6 +42,7 @@
+ * other special, indirect and consequential damages.
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -1469,7 +1470,7 @@ load_contiguous (TIFF *tif,
+ GEGL_RECTANGLE (0, 0, cols, rows),
+ 0, NULL,
+ GEGL_ACCESS_READ,
+- GEGL_ABYSS_NONE);
++ GEGL_ABYSS_NONE, 2);
+ gegl_buffer_iterator_add (iter, channel[i].buffer,
+ GEGL_RECTANGLE (x, y, cols, rows),
+ 0, channel[i].format,
+@@ -1477,8 +1478,8 @@ load_contiguous (TIFF *tif,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- guchar *s = iter->data[0];
+- guchar *d = iter->data[1];
++ guchar *s = iter->items[0].data;
++ guchar *d = iter->items[1].data;
+ gint length = iter->length;
+
+ s += offset;
+@@ -1619,7 +1620,7 @@ load_separate (TIFF *tif,
+ GEGL_RECTANGLE (0, 0, cols, rows),
+ 0, NULL,
+ GEGL_ACCESS_READ,
+- GEGL_ABYSS_NONE);
++ GEGL_ABYSS_NONE, 2);
+ gegl_buffer_iterator_add (iter, channel[i].buffer,
+ GEGL_RECTANGLE (x, y, cols, rows),
+ 0, channel[i].format,
+@@ -1628,8 +1629,8 @@ load_separate (TIFF *tif,
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- guchar *s = iter->data[0];
+- guchar *d = iter->data[1];
++ guchar *s = iter->items[0].data;
++ guchar *d = iter->items[1].data;
+ gint length = iter->length;
+
+ d += offset;
+diff --git a/plug-ins/ifs-compose/ifs-compose.c b/plug-ins/ifs-compose/ifs-compose.c
+index df3df2ed4c..372ef46f87 100644
+--- plug-ins/ifs-compose/ifs-compose.c
++++ plug-ins/ifs-compose/ifs-compose.c
+@@ -27,6 +27,7 @@
+ * 2. Figure out if we need multiple phases for supersampled brushes.
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -1313,12 +1314,12 @@ ifs_compose (gint32 drawable_id)
+ GEGL_RECTANGLE (0, band_y,
+ width, band_height), 0,
+ format,
+- GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
+- roi = &iter->roi[0];
++ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 1);
++ roi = &iter->items[0].roi;
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- guchar *destrow = iter->data[0];
++ guchar *destrow = iter->items[0].data;
+
+ for (j = roi->y; j < (roi->y + roi->height); j++)
+ {
+diff --git a/plug-ins/pagecurl/pagecurl.c b/plug-ins/pagecurl/pagecurl.c
+index 1f6655c695..40442565c0 100644
+--- plug-ins/pagecurl/pagecurl.c
++++ plug-ins/pagecurl/pagecurl.c
+@@ -39,7 +39,7 @@
+ * 1.0: (July '04)
+ * - Code cleanup, added reverse gradient option.
+ */
+-
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -738,7 +738,7 @@ do_curl_effect (gint32 drawable_id)
+ iter = gegl_buffer_iterator_new (curl_buffer,
+ GEGL_RECTANGLE (0, 0, width, height), 0,
+ format,
+- GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 1);
+
+ /* Init shade_under */
+ gimp_vector2_set (&dl, -sel_width, -sel_height);
+@@ -770,8 +770,8 @@ do_curl_effect (gint32 drawable_id)
+ {
+ gfloat *dest;
+
+- roi = &iter->roi[0];
+- dest = (gfloat *) iter->data[0];
++ roi = &iter->items[0].roi;
++ dest = (gfloat *) iter->items[0].data;
+
+ for (y1 = roi->y; y1 < roi->y + roi->height; y1++)
+ {
+@@ -905,16 +905,16 @@ clear_curled_region (gint32 drawable_id)
+ iter = gegl_buffer_iterator_new (shadow_buf,
+ GEGL_RECTANGLE (0, 0, width, height), 0,
+ format,
+- GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 2);
+ buf_index = gegl_buffer_iterator_add (iter, buf, NULL, 0,
+ format,
+ GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- roi = &iter->roi[0];
+- dest = iter->data[0];
+- src = iter->data[buf_index];
++ roi = &iter->items[0].roi;
++ dest = iter->items[0].data;
++ src = iter->items[buf_index].data;
+
+ memcpy (dest, src, roi->width * roi->height * bpp);
+
+diff --git a/plug-ins/print/print-draw-page.c b/plug-ins/print/print-draw-page.c
+index 250114f508..26a2ac96a8 100644
+--- plug-ins/print/print-draw-page.c
++++ plug-ins/print/print-draw-page.c
+@@ -15,6 +15,7 @@
+ * along with this program. If not, see .
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -140,23 +141,23 @@ print_surface_from_drawable (gint32 drawable_ID,
+ iter = gegl_buffer_iterator_new (buffer,
+ GEGL_RECTANGLE (0, 0, width, height), 0,
+ format,
+- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
++ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+- const guchar *src = iter->data[0];
+- guchar *dest = pixels + iter->roi->y * stride + iter->roi->x * 4;
++ const guchar *src = iter->items[0].data;
++ guchar *dest = pixels + iter->items[0].roi.y * stride + iter->items[0].roi.x * 4;
+ gint y;
+
+- for (y = 0; y < iter->roi->height; y++)
++ for (y = 0; y < iter->items[0].roi.height; y++)
+ {
+- memcpy (dest, src, iter->roi->width * 4);
++ memcpy (dest, src, iter->items[0].roi.width * 4);
+
+- src += iter->roi->width * 4;
++ src += iter->items[0].roi.width * 4;
+ dest += stride;
+ }
+
+- done += iter->roi->height * iter->roi->width;
++ done += iter->items[0].roi.height * iter->items[0].roi.width;
+
+ if (count++ % 16 == 0)
+ gimp_progress_update ((gdouble) done / (width * height));
+diff --git a/plug-ins/screenshot/screenshot-x11.c b/plug-ins/screenshot/screenshot-x11.c
+index ac8dfd2740..61c9e535c2 100644
+--- plug-ins/screenshot/screenshot-x11.c
++++ plug-ins/screenshot/screenshot-x11.c
+@@ -20,6 +20,7 @@
+ * along with this program. If not, see .
+ */
+
++#define GEGL_ITERATOR2_API
+ #include "config.h"
+
+ #include
+@@ -478,13 +479,13 @@ add_cursor_image (gint32 image,
+ gimp_drawable_width (layer),
+ gimp_drawable_height (layer)),
+ 0, babl_format ("R'G'B'A u8"),
+- GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
+- roi = &iter->roi[0];
++ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE, 1);
++ roi = &iter->items[0].roi;
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+ const gulong *src = cursor->pixels + roi->y * cursor->width + roi->x;
+- guchar *dest = iter->data[0];
++ guchar *dest = iter->items[0].data;
+ gint x, y;
+
+ for (y = 0; y < roi->height; y++)
+