[gimp] app: with recent gegl:watershed-transform, no need for intermediate...
- From: Jehan <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: with recent gegl:watershed-transform, no need for intermediate...
- Date: Wed, 14 Nov 2018 12:42:04 +0000 (UTC)
commit e905ea7ba2c348515816c28747f1c8008cf6b143
Author: Jehan <jehan girinstud io>
Date: Fri Oct 26 13:15:50 2018 +0200
app: with recent gegl:watershed-transform, no need for intermediate...
... labels buffer.
We can watershed directly the mask buffer being correctly flagged.
This commit relies on merge request gegl!8 being accepted and merged.
app/core/gimppickable-contiguous-region.c | 73 ++++++++++++-------------------
1 file changed, 28 insertions(+), 45 deletions(-)
---
diff --git a/app/core/gimppickable-contiguous-region.c b/app/core/gimppickable-contiguous-region.c
index 5ab302fee9..890933d849 100644
--- a/app/core/gimppickable-contiguous-region.c
+++ b/app/core/gimppickable-contiguous-region.c
@@ -117,6 +117,7 @@ gimp_pickable_contiguous_region_by_seed (GimpPickable *pickable,
gboolean has_alpha;
gfloat start_col[MAX_CHANNELS];
gboolean smart_line_art = FALSE;
+ gfloat flag = 2.0;
g_return_val_if_fail (GIMP_IS_PICKABLE (pickable), NULL);
@@ -226,7 +227,6 @@ gimp_pickable_contiguous_region_by_seed (GimpPickable *pickable,
* unknown pixels be labelled by flooding through watershed.
*/
GeglBufferIterator *gi;
- GeglBuffer *labels;
GeglBuffer *distmap;
GeglBuffer *tmp;
GeglNode *graph;
@@ -236,47 +236,6 @@ gimp_pickable_contiguous_region_by_seed (GimpPickable *pickable,
GeglNode *sink;
GIMP_TIMER_START();
- labels = gegl_buffer_new (&extent, babl_format ("YA u32"));
-
- gi = gegl_buffer_iterator_new (src_buffer, NULL, 0, NULL,
- GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 3);
- gegl_buffer_iterator_add (gi, mask_buffer, NULL, 0,
- babl_format ("Y float"),
- GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
- gegl_buffer_iterator_add (gi, labels, NULL, 0,
- babl_format ("YA u32"),
- GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE);
-
- while (gegl_buffer_iterator_next (gi))
- {
- guchar *lineart = (guchar*) gi->items[0].data;
- gfloat *mask = (gfloat*) gi->items[1].data;
- guint32 *label = (guint32*) gi->items[2].data;
- gint k;
-
- for (k = 0; k < gi->length; k++)
- {
- if (*mask)
- {
- label[0] = G_MAXUINT32;
- label[1] = 1;
- }
- else if (*lineart)
- {
- label[0] = 0;
- label[1] = 0;
- }
- else
- {
- label[0] = 0;
- label[1] = 1;
- }
- lineart++;
- mask++;
- label += 2;
- }
- }
- g_object_unref (src_buffer);
/* Compute a distance map for the labels. */
graph = gegl_node_new ();
@@ -326,11 +285,34 @@ gimp_pickable_contiguous_region_by_seed (GimpPickable *pickable,
g_object_unref (distmap);
distmap = tmp;
- /* Watershed the labels. */
+ /* Flag the mask on the line art. */
+ gi = gegl_buffer_iterator_new (src_buffer, NULL, 0, NULL,
+ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 2);
+ gegl_buffer_iterator_add (gi, mask_buffer, NULL, 0,
+ babl_format ("Y float"),
+ GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
+
+ while (gegl_buffer_iterator_next (gi))
+ {
+ guchar *lineart = (guchar*) gi->items[0].data;
+ gfloat *mask = (gfloat*) gi->items[1].data;
+ gint k;
+
+ for (k = 0; k < gi->length; k++)
+ {
+ if (*lineart && ! *mask)
+ *mask = flag;
+ lineart++;
+ mask++;
+ }
+ }
+ g_object_unref (src_buffer);
+
+ /* Watershed the line art. */
graph = gegl_node_new ();
input = gegl_node_new_child (graph,
"operation", "gegl:buffer-source",
- "buffer", labels,
+ "buffer", mask_buffer,
NULL);
aux = gegl_node_new_child (graph,
"operation", "gegl:buffer-source",
@@ -338,6 +320,8 @@ gimp_pickable_contiguous_region_by_seed (GimpPickable *pickable,
NULL);
op = gegl_node_new_child (graph,
"operation", "gegl:watershed-transform",
+ "flag-component", 0,
+ "flag", &flag,
NULL);
sink = gegl_node_new_child (graph,
"operation", "gegl:buffer-sink",
@@ -355,7 +339,6 @@ gimp_pickable_contiguous_region_by_seed (GimpPickable *pickable,
gegl_buffer_copy (tmp, NULL, GEGL_ABYSS_NONE, mask_buffer, NULL);
g_object_unref (tmp);
- g_object_unref (labels);
GIMP_TIMER_END("watershed line art");
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]