From b60e1779cd41eb742cd020f509f8959cd3606398 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Wed, 30 Apr 2014 09:17:42 +0200 Subject: [PATCH] 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 f3cdecc3d5..7d3b91f431 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 6e333b3742..f23de860e9 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 3f1ac6144d..1edf0403d8 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 ae4e2a14f7..9d86671082 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 a25f9c4cdd..ad153a62da 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,