[gimp] app: pass a GimpGradient to gimp_drawable_blend(), not a GimpBlendMode



commit b60e1779cd41eb742cd020f509f8959cd3606398
Author: Michael Natterer <mitch gimp org>
Date:   Wed Apr 30 09:17:42 2014 +0200

    app: pass a GimpGradient to gimp_drawable_blend(), not a GimpBlendMode
    
    The blend mode is now only a PDB compat enum, translate between
    GimpBlendMode and the built-in gradients in the gimp-edit-blend PDB
    wrapper.

 app/core/gimpdrawable-blend.c |   78 +++++-----------------------------------
 app/core/gimpdrawable-blend.h |    2 +-
 app/pdb/edit-cmds.c           |   25 ++++++++++++-
 app/tools/gimpblendtool.c     |    2 +-
 tools/pdbgen/pdb/edit.pdb     |   26 ++++++++++++-
 5 files changed, 60 insertions(+), 73 deletions(-)
---
diff --git a/app/core/gimpdrawable-blend.c b/app/core/gimpdrawable-blend.c
index f3cdecc..7d3b91f 100644
--- a/app/core/gimpdrawable-blend.c
+++ b/app/core/gimpdrawable-blend.c
@@ -59,9 +59,7 @@ typedef struct
 #endif
   gdouble           offset;
   gdouble           sx, sy;
-  GimpBlendMode     blend_mode;
   GimpGradientType  gradient_type;
-  GimpRGB           fg, bg;
   gdouble           dist;
   gdouble           vec[2];
   GimpRepeatMode    repeat;
@@ -145,7 +143,7 @@ static void     gradient_fill_region        (GimpImage           *image,
                                              GimpContext         *context,
                                              GeglBuffer          *buffer,
                                              const GeglRectangle *buffer_region,
-                                             GimpBlendMode        blend_mode,
+                                             GimpGradient        *gradient,
                                              GimpGradientType     gradient_type,
                                              gdouble              offset,
                                              GimpRepeatMode       repeat,
@@ -166,7 +164,7 @@ static void     gradient_fill_region        (GimpImage           *image,
 void
 gimp_drawable_blend (GimpDrawable         *drawable,
                      GimpContext          *context,
-                     GimpBlendMode         blend_mode,
+                     GimpGradient         *gradient,
                      GimpLayerModeEffects  paint_mode,
                      GimpGradientType      gradient_type,
                      gdouble               opacity,
@@ -183,13 +181,14 @@ gimp_drawable_blend (GimpDrawable         *drawable,
                      gdouble               endy,
                      GimpProgress         *progress)
 {
-  GimpImage   *image;
-  GeglBuffer  *buffer;
-  gint         x, y, width, height;
+  GimpImage  *image;
+  GeglBuffer *buffer;
+  gint        x, y, width, height;
 
   g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
   g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable)));
   g_return_if_fail (GIMP_IS_CONTEXT (context));
+  g_return_if_fail (GIMP_IS_GRADIENT (gradient));
   g_return_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress));
 
   image = gimp_item_get_image (GIMP_ITEM (drawable));
@@ -205,7 +204,7 @@ gimp_drawable_blend (GimpDrawable         *drawable,
 
   gradient_fill_region (image, drawable, context,
                         buffer, GEGL_RECTANGLE (0, 0, width, height),
-                        blend_mode, gradient_type, offset, repeat, reverse,
+                        gradient, gradient_type, offset, repeat, reverse,
                         supersample, max_depth, threshold, dither,
                         (startx - x), (starty - y),
                         (endx - x), (endy - y),
@@ -757,7 +756,7 @@ gradient_render_pixel (gdouble   x,
       color->r = color->g = color->b = 0;
       color->a = GIMP_OPACITY_TRANSPARENT;
     }
-  else if (rbd->blend_mode == GIMP_BLEND_CUSTOM)
+  else
     {
 #ifdef USE_GRADIENT_CACHE
       *color = rbd->gradient_cache[(gint) (factor * (rbd->gradient_cache_size - 1))];
@@ -766,25 +765,6 @@ gradient_render_pixel (gdouble   x,
                                   factor, rbd->reverse, color);
 #endif
     }
-  else
-    {
-      /* Blend values */
-
-      if (rbd->reverse)
-        factor = 1.0 - factor;
-
-      color->r = rbd->fg.r + (rbd->bg.r - rbd->fg.r) * factor;
-      color->g = rbd->fg.g + (rbd->bg.g - rbd->fg.g) * factor;
-      color->b = rbd->fg.b + (rbd->bg.b - rbd->fg.b) * factor;
-      color->a = rbd->fg.a + (rbd->bg.a - rbd->fg.a) * factor;
-
-      if (rbd->blend_mode == GIMP_BLEND_FG_BG_HSV)
-        {
-          GimpHSV hsv = *((GimpHSV *) color);
-
-          gimp_hsv_to_rgb (&hsv, color);
-        }
-    }
 }
 
 static void
@@ -827,7 +807,7 @@ gradient_fill_region (GimpImage           *image,
                       GimpContext         *context,
                       GeglBuffer          *buffer,
                       const GeglRectangle *buffer_region,
-                      GimpBlendMode        blend_mode,
+                      GimpGradient        *gradient,
                       GimpGradientType     gradient_type,
                       gdouble              offset,
                       GimpRepeatMode       repeat,
@@ -846,7 +826,7 @@ gradient_fill_region (GimpImage           *image,
 
   GIMP_TIMER_START();
 
-  rbd.gradient = gimp_context_get_gradient (context);
+  rbd.gradient = gradient;
   rbd.context  = context;
   rbd.reverse  = reverse;
 
@@ -873,43 +853,6 @@ gradient_fill_region (GimpImage           *image,
   else
     rbd.gradient = g_object_ref (rbd.gradient);
 
-  gimp_context_get_foreground (context, &rbd.fg);
-  gimp_context_get_background (context, &rbd.bg);
-
-  switch (blend_mode)
-    {
-    case GIMP_BLEND_FG_BG_RGB:
-      break;
-
-    case GIMP_BLEND_FG_BG_HSV:
-      /* Convert to HSV */
-      {
-        GimpHSV fg_hsv;
-        GimpHSV bg_hsv;
-
-        gimp_rgb_to_hsv (&rbd.fg, &fg_hsv);
-        gimp_rgb_to_hsv (&rbd.bg, &bg_hsv);
-
-        memcpy (&rbd.fg, &fg_hsv, sizeof (GimpRGB));
-        memcpy (&rbd.bg, &bg_hsv, sizeof (GimpRGB));
-      }
-      break;
-
-    case GIMP_BLEND_FG_TRANSPARENT:
-      /* Color does not change, just the opacity */
-
-      rbd.bg   = rbd.fg;
-      rbd.bg.a = GIMP_OPACITY_TRANSPARENT;
-      break;
-
-    case GIMP_BLEND_CUSTOM:
-      break;
-
-    default:
-      g_assert_not_reached ();
-      break;
-    }
-
   /* Calculate type-specific parameters */
 
   switch (gradient_type)
@@ -958,7 +901,6 @@ gradient_fill_region (GimpImage           *image,
   rbd.offset        = offset;
   rbd.sx            = sx;
   rbd.sy            = sy;
-  rbd.blend_mode    = blend_mode;
   rbd.gradient_type = gradient_type;
   rbd.repeat        = repeat;
 
diff --git a/app/core/gimpdrawable-blend.h b/app/core/gimpdrawable-blend.h
index 6e333b3..f23de86 100644
--- a/app/core/gimpdrawable-blend.h
+++ b/app/core/gimpdrawable-blend.h
@@ -21,7 +21,7 @@
 
 void   gimp_drawable_blend (GimpDrawable         *drawable,
                             GimpContext          *context,
-                            GimpBlendMode         blend_mode,
+                            GimpGradient         *gradient,
                             GimpLayerModeEffects  paint_mode,
                             GimpGradientType      gradient_type,
                             gdouble               opacity,
diff --git a/app/pdb/edit-cmds.c b/app/pdb/edit-cmds.c
index 3f1ac61..1edf040 100644
--- a/app/pdb/edit-cmds.c
+++ b/app/pdb/edit-cmds.c
@@ -32,6 +32,7 @@
 #include "pdb-types.h"
 
 #include "core/gimp-edit.h"
+#include "core/gimp-gradients.h"
 #include "core/gimp.h"
 #include "core/gimpchannel.h"
 #include "core/gimpdrawable-blend.h"
@@ -782,12 +783,34 @@ edit_blend_invoker (GimpProcedure         *procedure,
 
       if (success)
         {
+          GimpGradient *gradient;
+
           if (progress)
             gimp_progress_start (progress, _("Blending"), FALSE);
 
+          switch (blend_mode)
+            {
+            case GIMP_BLEND_FG_BG_RGB:
+              gradient = gimp_gradients_get_fg_bg_rgb (context->gimp);
+              break;
+
+            case GIMP_BLEND_FG_BG_HSV:
+              gradient = gimp_gradients_get_fg_bg_hsv_cw (context->gimp);
+              break;
+
+            case GIMP_BLEND_FG_TRANSPARENT:
+              gradient = gimp_gradients_get_fg_transparent (context->gimp);
+              break;
+
+            case GIMP_BLEND_CUSTOM:
+            default:
+              gradient = gimp_context_get_gradient (context);
+              break;
+            }
+
           gimp_drawable_blend (drawable,
                                context,
-                               blend_mode,
+                               gradient,
                                paint_mode,
                                gradient_type,
                                opacity / 100.0,
diff --git a/app/tools/gimpblendtool.c b/app/tools/gimpblendtool.c
index ae4e2a1..9d86671 100644
--- a/app/tools/gimpblendtool.c
+++ b/app/tools/gimpblendtool.c
@@ -252,7 +252,7 @@ gimp_blend_tool_button_release (GimpTool              *tool,
 
       gimp_drawable_blend (drawable,
                            context,
-                           GIMP_BLEND_CUSTOM,
+                           gimp_context_get_gradient (context),
                            gimp_context_get_paint_mode (context),
                            options->gradient_type,
                            gimp_context_get_opacity (context),
diff --git a/tools/pdbgen/pdb/edit.pdb b/tools/pdbgen/pdb/edit.pdb
index a25f9c4..ad153a6 100644
--- a/tools/pdbgen/pdb/edit.pdb
+++ b/tools/pdbgen/pdb/edit.pdb
@@ -838,7 +838,7 @@ HELP
     );
 
     %invoke = (
-        headers => [ qw("core/gimpdrawable-blend.h") ],
+        headers => [ qw("core/gimp-gradients.h" "core/gimpdrawable-blend.h") ],
        code => <<'CODE'
 {
   success = (gimp_pdb_item_is_attached (GIMP_ITEM (drawable), NULL,
@@ -856,12 +856,34 @@ HELP
 
   if (success)
     {
+      GimpGradient *gradient;
+
       if (progress)
         gimp_progress_start (progress, _("Blending"), FALSE);
 
+      switch (blend_mode)
+        {
+        case GIMP_BLEND_FG_BG_RGB:
+          gradient = gimp_gradients_get_fg_bg_rgb (context->gimp);
+          break;
+
+        case GIMP_BLEND_FG_BG_HSV:
+          gradient = gimp_gradients_get_fg_bg_hsv_cw (context->gimp);
+          break;
+
+        case GIMP_BLEND_FG_TRANSPARENT:
+          gradient = gimp_gradients_get_fg_transparent (context->gimp);
+          break;
+
+        case GIMP_BLEND_CUSTOM:
+       default:
+          gradient = gimp_context_get_gradient (context);
+          break;
+        }
+
       gimp_drawable_blend (drawable,
                            context,
-                           blend_mode,
+                           gradient,
                            paint_mode,
                            gradient_type,
                            opacity / 100.0,


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