[gimp] Bug 796090 - (wrong) true-color preview of GEGL filter ops, ...



commit d6e0ca505440596e81593cf9ec0fac4f0d9e2ba8
Author: Michael Natterer <mitch gimp org>
Date:   Wed May 16 02:06:03 2018 +0200

    Bug 796090 - (wrong) true-color preview of GEGL filter ops, ...
    
    ...like gaussian blur in indexed mode
    
    In GimpDrawable's source node, after the filter stack, insert a node
    that converts the pixels back to the drawable's format if the drawable
    is indexed.

 app/core/gimpdrawable-private.h |    1 +
 app/core/gimpdrawable.c         |   45 +++++++++++++++++++++++++++++++++-----
 2 files changed, 40 insertions(+), 6 deletions(-)
---
diff --git a/app/core/gimpdrawable-private.h b/app/core/gimpdrawable-private.h
index c84c665..233ac21 100644
--- a/app/core/gimpdrawable-private.h
+++ b/app/core/gimpdrawable-private.h
@@ -26,6 +26,7 @@ struct _GimpDrawablePrivate
   GeglNode       *source_node;
   GeglNode       *buffer_source_node;
   GimpContainer  *filter_stack;
+  GeglNode       *convert_format;
 
   GimpLayer      *floating_selection;
   GimpFilter     *fs_filter;
diff --git a/app/core/gimpdrawable.c b/app/core/gimpdrawable.c
index cc41116..ac07d0a 100644
--- a/app/core/gimpdrawable.c
+++ b/app/core/gimpdrawable.c
@@ -809,6 +809,21 @@ gimp_drawable_real_set_buffer (GimpDrawable *drawable,
                    "buffer", gimp_drawable_get_buffer (drawable),
                    NULL);
 
+  if (drawable->private->convert_format)
+    {
+      const Babl *format = gimp_drawable_get_format (drawable);
+
+      if (babl_format_is_palette (format))
+        gegl_node_set (drawable->private->convert_format,
+                       "operation", "gegl:convert-format",
+                       "format",    gimp_drawable_get_format (drawable),
+                       NULL);
+      else
+        gegl_node_set (drawable->private->convert_format,
+                       "operation", "gegl:nop",
+                       NULL);
+    }
+
   gimp_item_set_offset (item, offset_x, offset_y);
   gimp_item_set_size (item,
                       gegl_buffer_get_width  (buffer),
@@ -1278,10 +1293,11 @@ gimp_drawable_steal_buffer (GimpDrawable *drawable,
 GeglNode *
 gimp_drawable_get_source_node (GimpDrawable *drawable)
 {
-  GeglNode *input;
-  GeglNode *source;
-  GeglNode *filter;
-  GeglNode *output;
+  const Babl *format;
+  GeglNode   *input;
+  GeglNode   *source;
+  GeglNode   *filter;
+  GeglNode   *output;
 
   g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), NULL);
 
@@ -1311,10 +1327,27 @@ gimp_drawable_get_source_node (GimpDrawable *drawable)
   gegl_node_connect_to (source, "output",
                         filter, "input");
 
+  format = gimp_drawable_get_format (drawable);
+
+  if (babl_format_is_palette (format))
+    drawable->private->convert_format =
+      gegl_node_new_child (drawable->private->source_node,
+                           "operation", "gegl:convert-format",
+                           "format",    gimp_drawable_get_format (drawable),
+                           NULL);
+  else
+    drawable->private->convert_format =
+      gegl_node_new_child (drawable->private->source_node,
+                           "operation", "gegl:nop",
+                           NULL);
+
+  gegl_node_connect_to (filter,                            "output",
+                        drawable->private->convert_format, "input");
+
   output = gegl_node_get_output_proxy (drawable->private->source_node, "output");
 
-  gegl_node_connect_to (filter, "output",
-                        output, "input");
+  gegl_node_connect_to (drawable->private->convert_format, "output",
+                        output,                            "input");
 
   if (gimp_drawable_get_floating_sel (drawable))
     _gimp_drawable_add_floating_sel_filter (drawable);


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