[gimp/gimp-2-10] app: add gimp_applicator_set_output_format()



commit ad6fff33b66e1aa8387bc629a066531177b73d6b
Author: Ell <ell_se yahoo com>
Date:   Fri Dec 28 02:09:11 2018 -0500

    app: add gimp_applicator_set_output_format()
    
    In GimpApplicator, add gimp_applicator_set_output_format(), which
    can be used to explicitly set the format of the result.  In
    particular, this allows controlling the output cache format, which
    can speed up the merging of cached filters.
    
    (cherry picked from commit b93df0311f716ec952110a406b6ec5f40177ab85)

 app/gegl/gimpapplicator.c | 33 +++++++++++++++++
 app/gegl/gimpapplicator.h | 92 +++++++++++++++++++++++++----------------------
 2 files changed, 82 insertions(+), 43 deletions(-)
---
diff --git a/app/gegl/gimpapplicator.c b/app/gegl/gimpapplicator.c
index 16041f20e2..b30947545c 100644
--- a/app/gegl/gimpapplicator.c
+++ b/app/gegl/gimpapplicator.c
@@ -197,6 +197,11 @@ gimp_applicator_new (GeglNode *parent,
                          "mask",      applicator->affect,
                          NULL);
 
+  applicator->output_convert_format_node =
+    gegl_node_new_child (applicator->node,
+                         "operation", "gegl:nop",
+                         NULL);
+
   if (use_result_cache)
     {
       applicator->output_cache_node =
@@ -206,6 +211,7 @@ gimp_applicator_new (GeglNode *parent,
 
       gegl_node_link_many (applicator->input_node,
                            applicator->affect_node,
+                           applicator->output_convert_format_node,
                            applicator->output_cache_node,
                            applicator->output_node,
                            NULL);
@@ -214,6 +220,7 @@ gimp_applicator_new (GeglNode *parent,
     {
       gegl_node_link_many (applicator->input_node,
                            applicator->affect_node,
+                           applicator->output_convert_format_node,
                            applicator->output_node,
                            NULL);
     }
@@ -481,6 +488,32 @@ gimp_applicator_set_affect (GimpApplicator    *applicator,
     }
 }
 
+void
+gimp_applicator_set_output_format (GimpApplicator *applicator,
+                                   const Babl     *format)
+{
+  g_return_if_fail (GIMP_IS_APPLICATOR (applicator));
+
+  if (applicator->output_format != format)
+    {
+      applicator->output_format = format;
+
+      if (format)
+        {
+          gegl_node_set (applicator->output_convert_format_node,
+                         "operation", "gegl:convert-format",
+                         "format",    format,
+                         NULL);
+        }
+      else
+        {
+          gegl_node_set (applicator->output_convert_format_node,
+                         "operation", "gegl:nop",
+                         NULL);
+        }
+    }
+}
+
 gboolean gegl_buffer_list_valid_rectangles (GeglBuffer     *buffer,
                                             GeglRectangle **rectangles,
                                             gint           *n_rectangles);
diff --git a/app/gegl/gimpapplicator.h b/app/gegl/gimpapplicator.h
index 4593859d63..f518c32eaf 100644
--- a/app/gegl/gimpapplicator.h
+++ b/app/gegl/gimpapplicator.h
@@ -63,6 +63,9 @@ struct _GimpApplicator
   GimpComponentMask       affect;
   GeglNode               *affect_node;
 
+  const Babl             *output_format;
+  GeglNode               *output_convert_format_node;
+
   GeglNode               *output_cache_node;
 
   GeglBuffer             *src_buffer;
@@ -85,49 +88,52 @@ struct _GimpApplicatorClass
 };
 
 
-GType        gimp_applicator_get_type         (void) G_GNUC_CONST;
-
-GimpApplicator * gimp_applicator_new          (GeglNode             *parent,
-                                               gboolean              use_split_preview,
-                                               gboolean              use_result_cache);
-
-void         gimp_applicator_set_src_buffer   (GimpApplicator       *applicator,
-                                               GeglBuffer           *dest_buffer);
-void         gimp_applicator_set_dest_buffer  (GimpApplicator       *applicator,
-                                               GeglBuffer           *dest_buffer);
-
-void         gimp_applicator_set_mask_buffer  (GimpApplicator       *applicator,
-                                               GeglBuffer           *mask_buffer);
-void         gimp_applicator_set_mask_offset  (GimpApplicator       *applicator,
-                                               gint                  mask_offset_x,
-                                               gint                  mask_offset_y);
-
-void         gimp_applicator_set_apply_buffer (GimpApplicator       *applicator,
-                                               GeglBuffer           *apply_buffer);
-void         gimp_applicator_set_apply_offset (GimpApplicator       *applicator,
-                                               gint                  apply_offset_x,
-                                               gint                  apply_offset_y);
-
-void         gimp_applicator_set_opacity      (GimpApplicator       *applicator,
-                                               gdouble               opacity);
-void         gimp_applicator_set_mode         (GimpApplicator       *applicator,
-                                               GimpLayerMode         paint_mode,
-                                               GimpLayerColorSpace   blend_space,
-                                               GimpLayerColorSpace   composite_space,
-                                               GimpLayerCompositeMode composite_mode);
-void         gimp_applicator_set_affect       (GimpApplicator       *applicator,
-                                               GimpComponentMask     affect);
-
-void         gimp_applicator_set_preview      (GimpApplicator       *applicator,
-                                               gboolean              enable,
-                                               const GeglRectangle  *rect);
-
-void         gimp_applicator_blit             (GimpApplicator       *applicator,
-                                               const GeglRectangle  *rect);
-
-GeglBuffer * gimp_applicator_get_cache_buffer (GimpApplicator       *applicator,
-                                               GeglRectangle       **rectangles,
-                                               gint                 *n_rectangles);
+GType        gimp_applicator_get_type          (void) G_GNUC_CONST;
+
+GimpApplicator * gimp_applicator_new           (GeglNode             *parent,
+                                                gboolean              use_split_preview,
+                                                gboolean              use_result_cache);
+
+void         gimp_applicator_set_src_buffer    (GimpApplicator       *applicator,
+                                                GeglBuffer           *dest_buffer);
+void         gimp_applicator_set_dest_buffer   (GimpApplicator       *applicator,
+                                                GeglBuffer           *dest_buffer);
+
+void         gimp_applicator_set_mask_buffer   (GimpApplicator       *applicator,
+                                                GeglBuffer           *mask_buffer);
+void         gimp_applicator_set_mask_offset   (GimpApplicator       *applicator,
+                                                gint                  mask_offset_x,
+                                                gint                  mask_offset_y);
+
+void         gimp_applicator_set_apply_buffer  (GimpApplicator       *applicator,
+                                                GeglBuffer           *apply_buffer);
+void         gimp_applicator_set_apply_offset  (GimpApplicator       *applicator,
+                                                gint                  apply_offset_x,
+                                                gint                  apply_offset_y);
+
+void         gimp_applicator_set_opacity       (GimpApplicator       *applicator,
+                                                gdouble               opacity);
+void         gimp_applicator_set_mode          (GimpApplicator       *applicator,
+                                                GimpLayerMode         paint_mode,
+                                                GimpLayerColorSpace   blend_space,
+                                                GimpLayerColorSpace   composite_space,
+                                                GimpLayerCompositeMode composite_mode);
+void         gimp_applicator_set_affect        (GimpApplicator       *applicator,
+                                                GimpComponentMask     affect);
+
+void         gimp_applicator_set_output_format (GimpApplicator       *applicator,
+                                                const Babl           *format);
+
+void         gimp_applicator_set_preview       (GimpApplicator       *applicator,
+                                                gboolean              enable,
+                                                const GeglRectangle  *rect);
+
+void         gimp_applicator_blit              (GimpApplicator       *applicator,
+                                                const GeglRectangle  *rect);
+
+GeglBuffer * gimp_applicator_get_cache_buffer  (GimpApplicator       *applicator,
+                                                GeglRectangle       **rectangles,
+                                                gint                 *n_rectangles);
 
 
 #endif  /*  __GIMP_APPLICATOR_H__  */


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