From fc2a4cd589dcbb9767d508fcab9dbf7799bc780f Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Sun, 29 May 2016 18:25:14 +0200 Subject: [PATCH] app: add gimp_fill_options_create_buffer() Which creates a buffer from GimpFillOptions that can be applied to a drawable. Eliminates three slightly different copies of the same code. Also adds to the color history for each color fill, we missed two places before. --- app/core/gimp-edit.c | 54 +++----------------------- app/core/gimpdrawable-bucket-fill.c | 39 ++----------------- app/core/gimpdrawable-fill.c | 41 +++----------------- app/core/gimpfilloptions.c | 59 ++++++++++++++++++++++++++++- app/core/gimpfilloptions.h | 40 ++++++++++--------- 5 files changed, 95 insertions(+), 138 deletions(-) diff --git a/app/core/gimp-edit.c b/app/core/gimp-edit.c index 0cf1fde46e..14b4923c06 100644 --- a/app/core/gimp-edit.c +++ b/app/core/gimp-edit.c @@ -44,7 +44,6 @@ #include "gimplayer-floating-selection.h" #include "gimplayer-new.h" #include "gimplist.h" -#include "gimppattern.h" #include "gimppickable.h" #include "gimpselection.h" #include "gimptempbuf.h" @@ -427,10 +426,7 @@ gimp_edit_fill (GimpImage *image, GimpFillOptions *options, const gchar *undo_desc) { - GeglBuffer *dest_buffer; - GimpPattern *pattern = NULL; - GimpRGB color; - const Babl *format; + GeglBuffer *buffer; gint x, y, width, height; g_return_if_fail (GIMP_IS_IMAGE (image)); @@ -441,59 +437,21 @@ gimp_edit_fill (GimpImage *image, if (! gimp_item_mask_intersect (GIMP_ITEM (drawable), &x, &y, &width, &height)) return; /* nothing to do, but the fill succeeded */ - switch (gimp_fill_options_get_style (options)) - { - case GIMP_FILL_STYLE_SOLID: - gimp_context_get_foreground (GIMP_CONTEXT (options), &color); - gimp_pickable_srgb_to_image_color (GIMP_PICKABLE (drawable), - &color, &color); - break; - - case GIMP_FILL_STYLE_PATTERN: - pattern = gimp_context_get_pattern (GIMP_CONTEXT (options)); - break; - } - - if (pattern && - babl_format_has_alpha (gimp_temp_buf_get_format (pattern->mask)) && - ! gimp_drawable_has_alpha (drawable)) - { - format = gimp_drawable_get_format_with_alpha (drawable); - } - else - { - format = gimp_drawable_get_format (drawable); - } - - dest_buffer = gegl_buffer_new (GEGL_RECTANGLE (0, 0, width, height), - format); - - if (pattern) - { - GeglBuffer *src_buffer = gimp_pattern_create_buffer (pattern); - - gegl_buffer_set_pattern (dest_buffer, NULL, src_buffer, 0, 0); - g_object_unref (src_buffer); - } - else - { - GeglColor *gegl_color = gimp_gegl_color_new (&color); - - gegl_buffer_set_color (dest_buffer, NULL, gegl_color); - g_object_unref (gegl_color); - } + buffer = gimp_fill_options_create_buffer (options, drawable, + GEGL_RECTANGLE (0, 0, + width, height)); if (! undo_desc) undo_desc = gimp_fill_options_get_undo_desc (options); - gimp_drawable_apply_buffer (drawable, dest_buffer, + gimp_drawable_apply_buffer (drawable, buffer, GEGL_RECTANGLE (0, 0, width, height), TRUE, undo_desc, gimp_context_get_opacity (GIMP_CONTEXT (options)), gimp_context_get_paint_mode (GIMP_CONTEXT (options)), NULL, x, y); - g_object_unref (dest_buffer); + g_object_unref (buffer); gimp_drawable_update (drawable, x, y, width, height); } diff --git a/app/core/gimpdrawable-bucket-fill.c b/app/core/gimpdrawable-bucket-fill.c index 70a3926f59..b2b4a08044 100644 --- a/app/core/gimpdrawable-bucket-fill.c +++ b/app/core/gimpdrawable-bucket-fill.c @@ -31,12 +31,10 @@ #include "gegl/gimp-gegl-utils.h" #include "gimp.h" -#include "gimp-palettes.h" #include "gimpdrawable.h" #include "gimpdrawable-bucket-fill.h" #include "gimpfilloptions.h" #include "gimpimage.h" -#include "gimppattern.h" #include "gimppickable.h" #include "gimppickable-contiguous-region.h" @@ -60,8 +58,6 @@ gimp_drawable_bucket_fill (GimpDrawable *drawable, GimpPickable *pickable; GeglBuffer *buffer; GeglBuffer *mask_buffer; - GimpPattern *pattern = NULL; - GimpRGB color; gint x1, y1, x2, y2; gint mask_offset_x = 0; gint mask_offset_y = 0; @@ -146,38 +142,9 @@ gimp_drawable_bucket_fill (GimpDrawable *drawable, mask_offset_y = y1; } - buffer = gegl_buffer_new (GEGL_RECTANGLE (0, 0, x2 - x1, y2 - y1), - gimp_drawable_get_format_with_alpha (drawable)); - - switch (gimp_fill_options_get_style (options)) - { - case GIMP_FILL_STYLE_SOLID: - gimp_context_get_foreground (GIMP_CONTEXT (options), &color); - gimp_pickable_srgb_to_image_color (GIMP_PICKABLE (drawable), - &color, &color); - break; - - case GIMP_FILL_STYLE_PATTERN: - pattern = gimp_context_get_pattern (GIMP_CONTEXT (options)); - break; - } - - if (pattern) - { - GeglBuffer *pattern_buffer = gimp_pattern_create_buffer (pattern); - - gegl_buffer_set_pattern (buffer, NULL, pattern_buffer, -x1, -y1); - g_object_unref (pattern_buffer); - } - else - { - GeglColor *gegl_color = gimp_gegl_color_new (&color); - - gegl_buffer_set_color (buffer, NULL, gegl_color); - g_object_unref (gegl_color); - - gimp_palettes_add_color_history (image->gimp, &color); - } + buffer = gimp_fill_options_create_buffer (options, drawable, + GEGL_RECTANGLE (0, 0, + x2 - x1, y2 - y1)); gimp_gegl_apply_opacity (buffer, NULL, NULL, buffer, mask_buffer, diff --git a/app/core/gimpdrawable-fill.c b/app/core/gimpdrawable-fill.c index 1f436c3740..29e919a415 100644 --- a/app/core/gimpdrawable-fill.c +++ b/app/core/gimpdrawable-fill.c @@ -168,7 +168,7 @@ gimp_drawable_fill_scan_convert (GimpDrawable *drawable, { GimpContext *context; GimpImage *image; - GeglBuffer *base_buffer; + GeglBuffer *buffer; GeglBuffer *mask_buffer; gint x, y, w, h; gint off_x; @@ -214,51 +214,22 @@ gimp_drawable_fill_scan_convert (GimpDrawable *drawable, x + off_x, y + off_y, gimp_fill_options_get_antialias (options)); - base_buffer = gegl_buffer_new (GEGL_RECTANGLE (0, 0, w, h), - gimp_drawable_get_format_with_alpha (drawable)); + buffer = gimp_fill_options_create_buffer (options, drawable, + GEGL_RECTANGLE (0, 0, w, h)); - switch (gimp_fill_options_get_style (options)) - { - case GIMP_FILL_STYLE_SOLID: - { - GimpRGB fg; - GeglColor *color; - - gimp_context_get_foreground (context, &fg); - gimp_pickable_srgb_to_image_color (GIMP_PICKABLE (drawable), - &fg, &fg); - - color = gimp_gegl_color_new (&fg); - gegl_buffer_set_color (base_buffer, NULL, color); - g_object_unref (color); - } - break; - - case GIMP_FILL_STYLE_PATTERN: - { - GimpPattern *pattern = gimp_context_get_pattern (context); - GeglBuffer *pattern_buffer; - - pattern_buffer = gimp_pattern_create_buffer (pattern); - gegl_buffer_set_pattern (base_buffer, NULL, pattern_buffer, 0, 0); - g_object_unref (pattern_buffer); - } - break; - } - - gimp_gegl_apply_opacity (base_buffer, NULL, NULL, base_buffer, + gimp_gegl_apply_opacity (buffer, NULL, NULL, buffer, mask_buffer, 0, 0, 1.0); g_object_unref (mask_buffer); /* Apply to drawable */ - gimp_drawable_apply_buffer (drawable, base_buffer, + gimp_drawable_apply_buffer (drawable, buffer, GEGL_RECTANGLE (0, 0, w, h), push_undo, C_("undo-type", "Render Stroke"), gimp_context_get_opacity (context), gimp_context_get_paint_mode (context), NULL, x, y); - g_object_unref (base_buffer); + g_object_unref (buffer); gimp_drawable_update (drawable, x, y, w, h); } diff --git a/app/core/gimpfilloptions.c b/app/core/gimpfilloptions.c index 25e9c10f76..dff759281e 100644 --- a/app/core/gimpfilloptions.c +++ b/app/core/gimpfilloptions.c @@ -30,10 +30,15 @@ #include "core-types.h" +#include "gegl/gimp-gegl-utils.h" + #include "gimp.h" +#include "gimp-palettes.h" +#include "gimpdrawable.h" #include "gimperror.h" #include "gimpfilloptions.h" -#include "gimpviewable.h" +#include "gimppattern.h" +#include "gimppickable.h" #include "gimp-intl.h" @@ -381,3 +386,55 @@ gimp_fill_options_get_undo_desc (GimpFillOptions *options) g_return_val_if_reached (NULL); } + +GeglBuffer * +gimp_fill_options_create_buffer (GimpFillOptions *options, + GimpDrawable *drawable, + const GeglRectangle *rect) +{ + GeglBuffer *buffer; + GimpPattern *pattern = NULL; + GimpRGB color; + + g_return_val_if_fail (GIMP_IS_FILL_OPTIONS (options), NULL); + g_return_val_if_fail (gimp_fill_options_get_style (options) != + GIMP_FILL_STYLE_PATTERN || + gimp_context_get_pattern (GIMP_CONTEXT (options)) != NULL, + NULL); + g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), NULL); + g_return_val_if_fail (rect != NULL, NULL); + + switch (gimp_fill_options_get_style (options)) + { + case GIMP_FILL_STYLE_SOLID: + gimp_context_get_foreground (GIMP_CONTEXT (options), &color); + gimp_palettes_add_color_history (GIMP_CONTEXT (options)->gimp, &color); + gimp_pickable_srgb_to_image_color (GIMP_PICKABLE (drawable), + &color, &color); + break; + + case GIMP_FILL_STYLE_PATTERN: + pattern = gimp_context_get_pattern (GIMP_CONTEXT (options)); + break; + } + + buffer = gegl_buffer_new (rect, + gimp_drawable_get_format_with_alpha (drawable)); + + if (pattern) + { + GeglBuffer *pattern_buffer = gimp_pattern_create_buffer (pattern); + + gegl_buffer_set_pattern (buffer, NULL, pattern_buffer, 0, 0); + g_object_unref (pattern_buffer); + } + else + { + GeglColor *gegl_color = gimp_gegl_color_new (&color); + + gegl_buffer_set_color (buffer, NULL, gegl_color); + g_object_unref (gegl_color); + } + + return buffer; +} diff --git a/app/core/gimpfilloptions.h b/app/core/gimpfilloptions.h index 29374bfd7b..62ff629e2a 100644 --- a/app/core/gimpfilloptions.h +++ b/app/core/gimpfilloptions.h @@ -48,28 +48,32 @@ struct _GimpFillOptionsClass GType gimp_fill_options_get_type (void) G_GNUC_CONST; -GimpFillOptions * gimp_fill_options_new (Gimp *gimp, - GimpContext *context, - gboolean use_context_color); +GimpFillOptions * gimp_fill_options_new (Gimp *gimp, + GimpContext *context, + gboolean use_context_color); -GimpFillStyle gimp_fill_options_get_style (GimpFillOptions *options); -void gimp_fill_options_set_style (GimpFillOptions *options, - GimpFillStyle style); +GimpFillStyle gimp_fill_options_get_style (GimpFillOptions *options); +void gimp_fill_options_set_style (GimpFillOptions *options, + GimpFillStyle style); -gboolean gimp_fill_options_get_antialias (GimpFillOptions *options); -void gimp_fill_options_set_antialias (GimpFillOptions *options, - gboolean antialias); +gboolean gimp_fill_options_get_antialias (GimpFillOptions *options); +void gimp_fill_options_set_antialias (GimpFillOptions *options, + gboolean antialias); -gboolean gimp_fill_options_set_by_fill_type (GimpFillOptions *options, - GimpContext *context, - GimpFillType fill_type, - GError **error); -gboolean gimp_fill_options_set_by_fill_mode (GimpFillOptions *options, - GimpContext *context, - GimpBucketFillMode fill_mode, - GError **error); +gboolean gimp_fill_options_set_by_fill_type (GimpFillOptions *options, + GimpContext *context, + GimpFillType fill_type, + GError **error); +gboolean gimp_fill_options_set_by_fill_mode (GimpFillOptions *options, + GimpContext *context, + GimpBucketFillMode fill_mode, + GError **error); -const gchar * gimp_fill_options_get_undo_desc (GimpFillOptions *options); +const gchar * gimp_fill_options_get_undo_desc (GimpFillOptions *options); + +GeglBuffer * gimp_fill_options_create_buffer (GimpFillOptions *options, + GimpDrawable *drawable, + const GeglRectangle *rect); #endif /* __GIMP_FILL_OPTIONS_H__ */