[gimp/gimp-2-10] app: use GeglBufferIterator rather than gegl_buffer_sample|set().
- From: Jehan <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/gimp-2-10] app: use GeglBufferIterator rather than gegl_buffer_sample|set().
- Date: Wed, 19 Dec 2018 15:42:03 +0000 (UTC)
commit 6dbd12a91549b600239f67f9e24324d5c921bae5
Author: Jehan <jehan girinstud io>
Date: Thu Oct 11 18:18:52 2018 +0200
app: use GeglBufferIterator rather than gegl_buffer_sample|set().
(cherry picked from commit 041a8f1eec67d63bf4df1acbae436c109bb91641)
app/core/gimplineart.c | 136 ++++++++++++++++++++++++++++---------------------
1 file changed, 78 insertions(+), 58 deletions(-)
---
diff --git a/app/core/gimplineart.c b/app/core/gimplineart.c
index 1b29abe7ee..18a711c804 100644
--- a/app/core/gimplineart.c
+++ b/app/core/gimplineart.c
@@ -510,27 +510,35 @@ gimp_lineart_get_labels (GeglBuffer *line_art,
/* For each neighbour-direction, label. */
for (unsigned int n = 0; n < (is_high_connectivity ? 4 : 2); ++n)
{
- const int _dx = dx[n];
- const int _dy = dy[n];
-
- const int x1 = width - _dx;
- const int y0 = (_dy < 0) ? -_dy : 0;
- const int y1 = (_dy < 0) ? height : height - _dy;
- const long offset = _dy * width + _dx;
-
- for (long y = y0, ny = y0 + _dy, py = y0 * width; y < y1; ++y, ++ny, py += width)
+ GeglBufferIterator *gi;
+ const gint _dx = dx[n];
+ const gint _dy = dy[n];
+
+ const gint y0 = (_dy < 0) ? -_dy : 0;
+ const gint it_width = width - _dx + 1;
+ const gint it_height = (_dy < 0) ? height - y0 + 1: height - _dy - y0 + 1;
+ const glong offset = _dy * width + _dx;
+
+ gi = gegl_buffer_iterator_new (line_art, GEGL_RECTANGLE (0, y0, it_width, it_height),
+ 0, babl_format ("Y u32"),
+ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
+ gegl_buffer_iterator_add (gi, line_art, GEGL_RECTANGLE (_dx, y0 + _dy, it_width, it_height),
+ 0, babl_format ("Y u32"),
+ GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
+ while (gegl_buffer_iterator_next (gi))
{
- for (long x = 0, nx = _dx, p = py; x < x1; ++x, ++nx, ++p)
+ GeglRectangle *roi = &gi->items[0].roi;
+ guint32 *pixel = (guint32*) gi->items[0].data;
+ guint32 *neighbour = (guint32*) gi->items[1].data;
+ gint k;
+ gint x = roi->x;
+ gint y = roi->y;
+
+ for (k = 0; k < gi->length; k++)
{
- guint32 pixel;
- guint32 neighbour_pixel;
-
- gegl_buffer_sample (line_art, x, y, NULL, &pixel,
- babl_format ("Y u32"), GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
- gegl_buffer_sample (line_art, nx, ny, NULL, &neighbour_pixel,
- babl_format ("Y u32"), GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
- if (pixel == neighbour_pixel)
+ if (pixel == neighbour)
{
+ const glong p = width * y;
const guint32 q = p + offset;
guint32 i, j;
@@ -562,13 +570,22 @@ gimp_lineart_get_labels (GeglBuffer *line_art,
_q = h;
}
}
+ pixel++;
+ neighbour++;
+
+ x++;
+ if (x - roi->x >= roi->width)
+ {
+ x = roi->x;
+ y++;
+ }
}
}
}
/* Resolve equivalences. */
p = 0;
- for (guint32 i = 0; i < width*height; i++)
+ for (guint32 i = 0; i < width * height; i++)
{
data[i] = data[i] == p ? counter++ : data[data[i]];
p++;
@@ -1698,21 +1715,25 @@ gimp_lineart_estimate_stroke_width (GeglBuffer* mask)
labels = gimp_lineart_get_labels (mask, TRUE);
- for (int y = 0; y < gegl_buffer_get_height (mask); ++y)
- for (int x = 0; x < gegl_buffer_get_width (mask); ++x)
- {
- guint8 val;
+ gi = gegl_buffer_iterator_new (mask, NULL, 0, NULL,
+ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
+ gegl_buffer_iterator_add (gi, labels, NULL, 0,
+ babl_format_n (babl_type ("u32"), 1),
+ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
+ while (gegl_buffer_iterator_next (gi))
+ {
+ guint8 *m = (guint8*) gi->items[0].data;
+ guint32 *l = (guint32*) gi->items[1].data;
+ gint k;
- gegl_buffer_sample (mask, x, y, NULL, &val,
- NULL, GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
- if (! val)
- {
- guint32 label = 0;
- gegl_buffer_set (labels, GEGL_RECTANGLE (x, y, 1, 1), 0,
- babl_format_n (babl_type ("u32"), 1),
- &label, GEGL_AUTO_ROWSTRIDE);
- }
- }
+ for (k = 0; k < gi->length; k++)
+ {
+ if (! *m)
+ *l = 0;
+ m++;
+ l++;
+ }
+ }
/* Check biggest label. */
gi = gegl_buffer_iterator_new (labels, NULL, 0, NULL,
@@ -1741,32 +1762,31 @@ gimp_lineart_estimate_stroke_width (GeglBuffer* mask)
g_array_set_size (dmax, label_max);
dmax_data = (gfloat *) dmax->data;
memset (dmax_data, 0, sizeof (gfloat) * label_max);
- for (int y = 0; y < gegl_buffer_get_height (distmap); ++y)
- for (int x = 0; x < gegl_buffer_get_width (distmap); ++x)
- {
- guint8 val;
- gegl_buffer_sample (mask, x, y, NULL, &val,
- NULL, GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
- if (val)
- {
- guint32 label;
- gfloat d;
- gfloat v;
-
- gegl_buffer_sample (labels, x, y, NULL, &label,
- NULL, GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
- gimp_assert (label);
- v = dmax_data[label - 1];
- gegl_buffer_sample (distmap, x, y, NULL, &d,
- babl_format ("Y float"),
- GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
- if (d > v)
- {
- dmax_data[label - 1] = d;
- }
- }
- }
+ gi = gegl_buffer_iterator_new (mask, NULL, 0, NULL,
+ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 3);
+ gegl_buffer_iterator_add (gi, labels, NULL, 0, NULL,
+ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
+ gegl_buffer_iterator_add (gi, distmap, NULL, 0, NULL,
+ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
+ while (gegl_buffer_iterator_next (gi))
+ {
+ guint8 *m = (guint8*) gi->items[0].data;
+ guint32 *l = (guint32*) gi->items[1].data;
+ gfloat *d = (gfloat*) gi->items[2].data;
+ gint k;
+
+ for (k = 0; k < gi->length; k++)
+ {
+ gimp_assert (*m == 0 || *l > 0);
+ if (*m && *d > dmax_data[*l - 1])
+ dmax_data[*l - 1] = *d;
+
+ m++;
+ l++;
+ d++;
+ }
+ }
/* Sort and crop labels with distance 0. */
g_array_sort (dmax, float_compare);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]