From 997ae1e28b2b300cf83bb39325c9a70a3b3f05b5 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Mon, 10 Oct 2016 00:02:16 +0200 Subject: [PATCH] Bug 764024 - Allow to choose fill color when resizing layers and images Add a GimpFillType argument to GimpItem::resize() and fill type widgets to the canvas and layer resize dialogs. Fill the new parts of the drawable according to fill type in gimp_drawable_resize(). Make sure places that need the old behavior get GIMP_FILL_TRANSPARENT passed by hardcoding it in the GimpItem::resize() implemetations of channel, mask, selection etc. --- app/actions/image-commands.c | 10 ++- app/actions/layers-commands.c | 14 +++- app/core/gimpchannel.c | 22 +++--- app/core/gimpdrawable.c | 39 ++++------ app/core/gimpgrouplayer.c | 18 +++-- app/core/gimpimage-crop.c | 27 ++++--- app/core/gimpimage-crop.h | 15 ++-- app/core/gimpimage-resize.c | 12 +-- app/core/gimpimage-resize.h | 1 + app/core/gimpitem.c | 30 ++++---- app/core/gimpitem.h | 2 + app/core/gimplayer.c | 32 +++++--- app/core/gimplayer.h | 3 +- app/core/gimpselection.c | 17 +++-- app/dialogs/resize-dialog.c | 105 +++++++++++++++++++-------- app/dialogs/resize-dialog.h | 1 + app/pdb/image-transform-cmds.c | 2 +- app/pdb/layer-cmds.c | 4 +- app/pdb/plug-in-compat-cmds.c | 6 +- app/text/gimptextlayer.c | 4 +- app/tools/gimpcroptool.c | 9 ++- app/vectors/gimpvectors.c | 16 ++-- tools/pdbgen/pdb/image_transform.pdb | 2 +- tools/pdbgen/pdb/layer.pdb | 4 +- tools/pdbgen/pdb/plug_in_compat.pdb | 6 +- 25 files changed, 244 insertions(+), 157 deletions(-) diff --git a/app/actions/image-commands.c b/app/actions/image-commands.c index 15b728d4b5..c39df9dac2 100644 --- a/app/actions/image-commands.c +++ b/app/actions/image-commands.c @@ -133,6 +133,7 @@ static void image_profile_convert_callback (GtkWidget *dialog static void image_resize_callback (GtkWidget *dialog, GimpViewable *viewable, GimpContext *context, + GimpFillType fill_type, gint width, gint height, GimpUnit unit, @@ -837,7 +838,8 @@ image_crop_to_selection_cmd_callback (GtkAction *action, return; } - gimp_image_crop (image, action_data_get_context (data), + gimp_image_crop (image, + action_data_get_context (data), GIMP_FILL_TRANSPARENT, x, y, width, height, TRUE); gimp_image_flush (image); } @@ -860,7 +862,8 @@ image_crop_to_content_cmd_callback (GtkAction *action, &x, &y, &width, &height)) { case GIMP_AUTO_SHRINK_SHRINK: - gimp_image_crop (image, action_data_get_context (data), + gimp_image_crop (image, + action_data_get_context (data), GIMP_FILL_TRANSPARENT, x, y, width, height, TRUE); gimp_image_flush (image); break; @@ -1274,6 +1277,7 @@ static void image_resize_callback (GtkWidget *dialog, GimpViewable *viewable, GimpContext *context, + GimpFillType fill_type, gint width, gint height, GimpUnit unit, @@ -1302,7 +1306,7 @@ image_resize_callback (GtkWidget *dialog, _("Resizing")); gimp_image_resize_with_layers (image, - context, + context, fill_type, width, height, offset_x, offset_y, layer_set, resize_text_layers, diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c index 998b95e556..b04b3ce034 100644 --- a/app/actions/layers-commands.c +++ b/app/actions/layers-commands.c @@ -151,6 +151,7 @@ static void layers_scale_callback (GtkWidget *dialog, static void layers_resize_callback (GtkWidget *dialog, GimpViewable *viewable, GimpContext *context, + GimpFillType fill_type, gint width, gint height, GimpUnit unit, @@ -677,7 +678,9 @@ layers_resize_to_image_cmd_callback (GtkAction *action, GimpLayer *layer; return_if_no_layer (image, layer, data); - gimp_layer_resize_to_image (layer, action_data_get_context (data)); + gimp_layer_resize_to_image (layer, + action_data_get_context (data), + GIMP_FILL_TRANSPARENT); gimp_image_flush (image); } @@ -755,7 +758,8 @@ layers_crop_to_selection_cmd_callback (GtkAction *action, gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_ITEM_RESIZE, _("Crop Layer to Selection")); - gimp_item_resize (GIMP_ITEM (layer), action_data_get_context (data), + gimp_item_resize (GIMP_ITEM (layer), + action_data_get_context (data), GIMP_FILL_TRANSPARENT, width, height, off_x, off_y); gimp_image_undo_group_end (image); @@ -784,7 +788,8 @@ layers_crop_to_content_cmd_callback (GtkAction *action, gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_ITEM_RESIZE, _("Crop Layer to Content")); - gimp_item_resize (GIMP_ITEM (layer), action_data_get_context (data), + gimp_item_resize (GIMP_ITEM (layer), + action_data_get_context (data), GIMP_FILL_TRANSPARENT, width, height, -x, -y); gimp_image_undo_group_end (image); @@ -1300,6 +1305,7 @@ static void layers_resize_callback (GtkWidget *dialog, GimpViewable *viewable, GimpContext *context, + GimpFillType fill_type, gint width, gint height, GimpUnit unit, @@ -1321,7 +1327,7 @@ layers_resize_callback (GtkWidget *dialog, height == gimp_item_get_height (item)) return; - gimp_item_resize (item, context, + gimp_item_resize (item, context, fill_type, width, height, offset_x, offset_y); gimp_image_flush (gimp_item_get_image (item)); } diff --git a/app/core/gimpchannel.c b/app/core/gimpchannel.c index 0b73e8796b..b36acf2a7b 100644 --- a/app/core/gimpchannel.c +++ b/app/core/gimpchannel.c @@ -101,10 +101,11 @@ static void gimp_channel_scale (GimpItem *item, GimpProgress *progress); static void gimp_channel_resize (GimpItem *item, GimpContext *context, + GimpFillType fill_type, gint new_width, gint new_height, - gint offx, - gint offy); + gint offset_x, + gint offset_y); static void gimp_channel_flip (GimpItem *item, GimpContext *context, GimpOrientationType flip_type, @@ -611,6 +612,7 @@ gimp_channel_convert (GimpItem *item, gimp_item_get_height (item) != height) { gimp_item_resize (item, gimp_get_user_context (dest_image->gimp), + GIMP_FILL_TRANSPARENT, width, height, 0, 0); } } @@ -750,14 +752,16 @@ gimp_channel_scale (GimpItem *item, } static void -gimp_channel_resize (GimpItem *item, - GimpContext *context, - gint new_width, - gint new_height, - gint offset_x, - gint offset_y) +gimp_channel_resize (GimpItem *item, + GimpContext *context, + GimpFillType fill_type, + gint new_width, + gint new_height, + gint offset_x, + gint offset_y) { - GIMP_ITEM_CLASS (parent_class)->resize (item, context, new_width, new_height, + GIMP_ITEM_CLASS (parent_class)->resize (item, context, GIMP_FILL_TRANSPARENT, + new_width, new_height, offset_x, offset_y); if (G_TYPE_FROM_INSTANCE (item) == GIMP_TYPE_CHANNEL) diff --git a/app/core/gimpdrawable.c b/app/core/gimpdrawable.c index 39c8293d29..b1e2731f10 100644 --- a/app/core/gimpdrawable.c +++ b/app/core/gimpdrawable.c @@ -35,6 +35,7 @@ #include "gimpchannel.h" #include "gimpcontext.h" #include "gimpdrawable-combine.h" +#include "gimpdrawable-fill.h" #include "gimpdrawable-floating-selection.h" #include "gimpdrawable-preview.h" #include "gimpdrawable-private.h" @@ -105,6 +106,7 @@ static void gimp_drawable_scale (GimpItem *item, GimpProgress *progress); static void gimp_drawable_resize (GimpItem *item, GimpContext *context, + GimpFillType fill_type, gint new_width, gint new_height, gint offset_x, @@ -532,12 +534,13 @@ gimp_drawable_scale (GimpItem *item, } static void -gimp_drawable_resize (GimpItem *item, - GimpContext *context, - gint new_width, - gint new_height, - gint offset_x, - gint offset_y) +gimp_drawable_resize (GimpItem *item, + GimpContext *context, + GimpFillType fill_type, + gint new_width, + gint new_height, + gint offset_x, + gint offset_y) { GimpDrawable *drawable = GIMP_DRAWABLE (item); GeglBuffer *new_buffer; @@ -578,26 +581,14 @@ gimp_drawable_resize (GimpItem *item, copy_width != new_width || copy_height != new_height) { - /* Clear the new tiles if needed */ + /* Clear the new buffer if needed */ - GimpRGB bg; - GeglColor *col; + GimpRGB color; + GimpPattern *pattern; - if (! gimp_drawable_has_alpha (drawable) && ! GIMP_IS_CHANNEL (drawable)) - { - gimp_context_get_background (context, &bg); - gimp_pickable_srgb_to_image_color (GIMP_PICKABLE (drawable), - &bg, &bg); - } - else - { - gimp_rgba_set (&bg, 0.0, 0.0, 0.0, 0.0); - } - - col = gimp_gegl_color_new (&bg); - - gegl_buffer_set_color (new_buffer, NULL, col); - g_object_unref (col); + gimp_get_fill_params (context, fill_type, &color, &pattern, NULL); + gimp_drawable_fill_buffer (drawable, new_buffer, + &color, pattern, 0, 0); } if (intersect && copy_width && copy_height) diff --git a/app/core/gimpgrouplayer.c b/app/core/gimpgrouplayer.c index 73ff83364c..981fb33926 100644 --- a/app/core/gimpgrouplayer.c +++ b/app/core/gimpgrouplayer.c @@ -109,6 +109,7 @@ static void gimp_group_layer_scale (GimpItem *item, GimpProgress *progress); static void gimp_group_layer_resize (GimpItem *item, GimpContext *context, + GimpFillType fill_type, gint new_width, gint new_height, gint offset_x, @@ -631,12 +632,13 @@ gimp_group_layer_scale (GimpItem *item, } static void -gimp_group_layer_resize (GimpItem *item, - GimpContext *context, - gint new_width, - gint new_height, - gint offset_x, - gint offset_y) +gimp_group_layer_resize (GimpItem *item, + GimpContext *context, + GimpFillType fill_type, + gint new_width, + gint new_height, + gint offset_x, + gint offset_y) { GimpGroupLayer *group = GIMP_GROUP_LAYER (item); GimpGroupLayerPrivate *private = GET_PRIVATE (item); @@ -677,7 +679,7 @@ gimp_group_layer_resize (GimpItem *item, gint child_offset_x = gimp_item_get_offset_x (child) - child_x; gint child_offset_y = gimp_item_get_offset_y (child) - child_y; - gimp_item_resize (child, context, + gimp_item_resize (child, context, fill_type, child_width, child_height, child_offset_x, child_offset_y); } @@ -696,7 +698,7 @@ gimp_group_layer_resize (GimpItem *item, mask = gimp_layer_get_mask (GIMP_LAYER (group)); if (mask) - gimp_item_resize (GIMP_ITEM (mask), context, + gimp_item_resize (GIMP_ITEM (mask), context, GIMP_FILL_TRANSPARENT, new_width, new_height, offset_x, offset_y); gimp_group_layer_resume_resize (group, TRUE); diff --git a/app/core/gimpimage-crop.c b/app/core/gimpimage-crop.c index 7a0d455ed3..1b901c96d1 100644 --- a/app/core/gimpimage-crop.c +++ b/app/core/gimpimage-crop.c @@ -40,13 +40,14 @@ /* public functions */ void -gimp_image_crop (GimpImage *image, - GimpContext *context, - gint x, - gint y, - gint width, - gint height, - gboolean crop_layers) +gimp_image_crop (GimpImage *image, + GimpContext *context, + GimpFillType fill_type, + gint x, + gint y, + gint width, + gint height, + gboolean crop_layers) { GList *list; gint previous_width; @@ -90,7 +91,8 @@ gimp_image_crop (GimpImage *image, { GimpItem *item = list->data; - gimp_item_resize (item, context, width, height, -x, -y); + gimp_item_resize (item, context, GIMP_FILL_TRANSPARENT, + width, height, -x, -y); } /* Resize all vectors */ @@ -100,11 +102,13 @@ gimp_image_crop (GimpImage *image, { GimpItem *item = list->data; - gimp_item_resize (item, context, width, height, -x, -y); + gimp_item_resize (item, context, GIMP_FILL_TRANSPARENT, + width, height, -x, -y); } /* Don't forget the selection mask! */ - gimp_item_resize (GIMP_ITEM (gimp_image_get_mask (image)), context, + gimp_item_resize (GIMP_ITEM (gimp_image_get_mask (image)), + context, GIMP_FILL_TRANSPARENT, width, height, -x, -y); /* crop all layers */ @@ -137,7 +141,8 @@ gimp_image_crop (GimpImage *image, if (width > 0 && height > 0) { - gimp_item_resize (item, context, width, height, + gimp_item_resize (item, context, fill_type, + width, height, -(lx1 - off_x), -(ly1 - off_y)); } diff --git a/app/core/gimpimage-crop.h b/app/core/gimpimage-crop.h index 33094e3614..af4d975754 100644 --- a/app/core/gimpimage-crop.h +++ b/app/core/gimpimage-crop.h @@ -19,13 +19,14 @@ #define __GIMP_IMAGE_CROP_H__ -void gimp_image_crop (GimpImage *image, - GimpContext *context, - gint x, - gint y, - gint width, - gint height, - gboolean crop_layers); +void gimp_image_crop (GimpImage *image, + GimpContext *context, + GimpFillType fill_type, + gint x, + gint y, + gint width, + gint height, + gboolean crop_layers); #endif /* __GIMP_IMAGE_CROP_H__ */ diff --git a/app/core/gimpimage-resize.c b/app/core/gimpimage-resize.c index e0cf5904c2..2011f2c9b0 100644 --- a/app/core/gimpimage-resize.c +++ b/app/core/gimpimage-resize.c @@ -53,7 +53,7 @@ gimp_image_resize (GimpImage *image, gint offset_y, GimpProgress *progress) { - gimp_image_resize_with_layers (image, context, + gimp_image_resize_with_layers (image, context, GIMP_FILL_TRANSPARENT, new_width, new_height, offset_x, offset_y, GIMP_ITEM_SET_NONE, TRUE, progress); @@ -62,6 +62,7 @@ gimp_image_resize (GimpImage *image, void gimp_image_resize_with_layers (GimpImage *image, GimpContext *context, + GimpFillType fill_type, gint new_width, gint new_height, gint offset_x, @@ -119,7 +120,7 @@ gimp_image_resize_with_layers (GimpImage *image, { GimpItem *item = list->data; - gimp_item_resize (item, context, + gimp_item_resize (item, context, GIMP_FILL_TRANSPARENT, new_width, new_height, offset_x, offset_y); if (progress) @@ -133,7 +134,7 @@ gimp_image_resize_with_layers (GimpImage *image, { GimpItem *item = list->data; - gimp_item_resize (item, context, + gimp_item_resize (item, context, GIMP_FILL_TRANSPARENT, new_width, new_height, offset_x, offset_y); if (progress) @@ -141,7 +142,8 @@ gimp_image_resize_with_layers (GimpImage *image, } /* Don't forget the selection mask! */ - gimp_item_resize (GIMP_ITEM (gimp_image_get_mask (image)), context, + gimp_item_resize (GIMP_ITEM (gimp_image_get_mask (image)), + context, GIMP_FILL_TRANSPARENT, new_width, new_height, offset_x, offset_y); if (progress) @@ -176,7 +178,7 @@ gimp_image_resize_with_layers (GimpImage *image, gimp_item_get_offset (item, &old_offset_x, &old_offset_y); - gimp_item_resize (item, context, + gimp_item_resize (item, context, fill_type, new_width, new_height, old_offset_x, old_offset_y); diff --git a/app/core/gimpimage-resize.h b/app/core/gimpimage-resize.h index 7edd646f43..003084d5bd 100644 --- a/app/core/gimpimage-resize.h +++ b/app/core/gimpimage-resize.h @@ -29,6 +29,7 @@ void gimp_image_resize (GimpImage *image, void gimp_image_resize_with_layers (GimpImage *image, GimpContext *context, + GimpFillType fill_type, gint new_width, gint new_height, gint offset_x, diff --git a/app/core/gimpitem.c b/app/core/gimpitem.c index cc778e5f6d..0fab4ca1e4 100644 --- a/app/core/gimpitem.c +++ b/app/core/gimpitem.c @@ -147,6 +147,7 @@ static void gimp_item_real_scale (GimpItem *item, GimpProgress *progress); static void gimp_item_real_resize (GimpItem *item, GimpContext *context, + GimpFillType fill_type, gint new_width, gint new_height, gint offset_x, @@ -602,12 +603,13 @@ gimp_item_real_scale (GimpItem *item, } static void -gimp_item_real_resize (GimpItem *item, - GimpContext *context, - gint new_width, - gint new_height, - gint offset_x, - gint offset_y) +gimp_item_real_resize (GimpItem *item, + GimpContext *context, + GimpFillType fill_type, + gint new_width, + gint new_height, + gint offset_x, + gint offset_y) { GimpItemPrivate *private = GET_PRIVATE (item); @@ -1393,12 +1395,13 @@ gimp_item_scale_by_origin (GimpItem *item, } void -gimp_item_resize (GimpItem *item, - GimpContext *context, - gint new_width, - gint new_height, - gint offset_x, - gint offset_y) +gimp_item_resize (GimpItem *item, + GimpContext *context, + GimpFillType fill_type, + gint new_width, + gint new_height, + gint offset_x, + gint offset_y) { GimpItemClass *item_class; GimpImage *image; @@ -1418,7 +1421,8 @@ gimp_item_resize (GimpItem *item, g_object_freeze_notify (G_OBJECT (item)); - item_class->resize (item, context, new_width, new_height, offset_x, offset_y); + item_class->resize (item, context, fill_type, + new_width, new_height, offset_x, offset_y); g_object_thaw_notify (G_OBJECT (item)); diff --git a/app/core/gimpitem.h b/app/core/gimpitem.h index 680671eb0e..dc053f02a1 100644 --- a/app/core/gimpitem.h +++ b/app/core/gimpitem.h @@ -80,6 +80,7 @@ struct _GimpItemClass GimpProgress *progress); void (* resize) (GimpItem *item, GimpContext *context, + GimpFillType fill_type, gint new_width, gint new_height, gint offset_x, @@ -232,6 +233,7 @@ void gimp_item_scale_by_origin (GimpItem *item, gboolean local_origin); void gimp_item_resize (GimpItem *item, GimpContext *context, + GimpFillType fill_type, gint new_width, gint new_height, gint offset_x, diff --git a/app/core/gimplayer.c b/app/core/gimplayer.c index 1532b17004..7b8507a52b 100644 --- a/app/core/gimplayer.c +++ b/app/core/gimplayer.c @@ -130,6 +130,7 @@ static void gimp_layer_scale (GimpItem *item, GimpProgress *progress); static void gimp_layer_resize (GimpItem *item, GimpContext *context, + GimpFillType fill_type, gint new_width, gint new_height, gint offset_x, @@ -929,20 +930,28 @@ gimp_layer_scale (GimpItem *item, } static void -gimp_layer_resize (GimpItem *item, - GimpContext *context, - gint new_width, - gint new_height, - gint offset_x, - gint offset_y) +gimp_layer_resize (GimpItem *item, + GimpContext *context, + GimpFillType fill_type, + gint new_width, + gint new_height, + gint offset_x, + gint offset_y) { GimpLayer *layer = GIMP_LAYER (item); - GIMP_ITEM_CLASS (parent_class)->resize (item, context, new_width, new_height, + if (fill_type == GIMP_FILL_TRANSPARENT && + ! gimp_drawable_has_alpha (GIMP_DRAWABLE (layer))) + { + fill_type = GIMP_FILL_BACKGROUND; + } + + GIMP_ITEM_CLASS (parent_class)->resize (item, context, fill_type, + new_width, new_height, offset_x, offset_y); if (layer->mask) - gimp_item_resize (GIMP_ITEM (layer->mask), context, + gimp_item_resize (GIMP_ITEM (layer->mask), context, GIMP_FILL_TRANSPARENT, new_width, new_height, offset_x, offset_y); } @@ -1939,8 +1948,9 @@ gimp_layer_remove_alpha (GimpLayer *layer, } void -gimp_layer_resize_to_image (GimpLayer *layer, - GimpContext *context) +gimp_layer_resize_to_image (GimpLayer *layer, + GimpContext *context, + GimpFillType fill_type) { GimpImage *image; gint offset_x; @@ -1956,7 +1966,7 @@ gimp_layer_resize_to_image (GimpLayer *layer, C_("undo-type", "Layer to Image Size")); gimp_item_get_offset (GIMP_ITEM (layer), &offset_x, &offset_y); - gimp_item_resize (GIMP_ITEM (layer), context, + gimp_item_resize (GIMP_ITEM (layer), context, fill_type, gimp_image_get_width (image), gimp_image_get_height (image), offset_x, offset_y); diff --git a/app/core/gimplayer.h b/app/core/gimplayer.h index b01131f713..af31a42af3 100644 --- a/app/core/gimplayer.h +++ b/app/core/gimplayer.h @@ -109,7 +109,8 @@ void gimp_layer_remove_alpha (GimpLayer *layer, GimpContext *context); void gimp_layer_resize_to_image (GimpLayer *layer, - GimpContext *context); + GimpContext *context, + GimpFillType fill_type); GimpDrawable * gimp_layer_get_floating_sel_drawable (GimpLayer *layer); void gimp_layer_set_floating_sel_drawable (GimpLayer *layer, diff --git a/app/core/gimpselection.c b/app/core/gimpselection.c index 32734cb0cd..4d59e8ef4f 100644 --- a/app/core/gimpselection.c +++ b/app/core/gimpselection.c @@ -61,6 +61,7 @@ static void gimp_selection_scale (GimpItem *item, GimpProgress *progress); static void gimp_selection_resize (GimpItem *item, GimpContext *context, + GimpFillType fill_type, gint new_width, gint new_height, gint offset_x, @@ -241,14 +242,16 @@ gimp_selection_scale (GimpItem *item, } static void -gimp_selection_resize (GimpItem *item, - GimpContext *context, - gint new_width, - gint new_height, - gint offset_x, - gint offset_y) +gimp_selection_resize (GimpItem *item, + GimpContext *context, + GimpFillType fill_type, + gint new_width, + gint new_height, + gint offset_x, + gint offset_y) { - GIMP_ITEM_CLASS (parent_class)->resize (item, context, new_width, new_height, + GIMP_ITEM_CLASS (parent_class)->resize (item, context, GIMP_FILL_TRANSPARENT, + new_width, new_height, offset_x, offset_y); gimp_item_set_offset (item, 0, 0); diff --git a/app/dialogs/resize-dialog.c b/app/dialogs/resize-dialog.c index 524d5215a2..d0ca128fa9 100644 --- a/app/dialogs/resize-dialog.c +++ b/app/dialogs/resize-dialog.c @@ -47,16 +47,18 @@ typedef struct { GimpViewable *viewable; GimpContext *context; - gint old_width; - gint old_height; + GimpFillType fill_type; GimpUnit old_unit; - GtkWidget *box; - GtkWidget *offset; - GtkWidget *area; GimpItemSet layer_set; gboolean resize_text_layers; GimpResizeCallback callback; gpointer user_data; + + gint old_width; + gint old_height; + GtkWidget *box; + GtkWidget *offset; + GtkWidget *area; } ResizeDialog; @@ -91,6 +93,7 @@ resize_dialog_new (GimpViewable *viewable, GimpResizeCallback callback, gpointer user_data) { + ResizeDialog *private; GtkWidget *dialog; GtkWidget *main_vbox; GtkWidget *vbox; @@ -99,11 +102,14 @@ resize_dialog_new (GimpViewable *viewable, GtkWidget *button; GtkWidget *spinbutton; GtkWidget *entry; + GtkWidget *hbox; + GtkWidget *combo; GtkAdjustment *adjustment; GdkPixbuf *pixbuf; - ResizeDialog *private; - GimpImage *image = NULL; - const gchar *text = NULL; + GtkSizeGroup *size_group = NULL; + GimpImage *image = NULL; + const gchar *size_title = NULL; + const gchar *layers_title = NULL; gint width, height; gdouble xres, yres; @@ -118,7 +124,8 @@ resize_dialog_new (GimpViewable *viewable, width = gimp_image_get_width (image); height = gimp_image_get_height (image); - text = _("Canvas Size"); + size_title = _("Canvas Size"); + layers_title = _("Layers"); } else if (GIMP_IS_ITEM (viewable)) { @@ -129,7 +136,8 @@ resize_dialog_new (GimpViewable *viewable, width = gimp_item_get_width (item); height = gimp_item_get_height (item); - text = _("Layer Size"); + size_title = _("Layer Size"); + layers_title = _("Fill With"); } else { @@ -140,13 +148,14 @@ resize_dialog_new (GimpViewable *viewable, private->viewable = viewable; private->context = context; - private->old_width = width; - private->old_height = height; + private->fill_type = GIMP_FILL_TRANSPARENT; private->old_unit = unit; private->layer_set = GIMP_ITEM_SET_NONE; private->resize_text_layers = FALSE; private->callback = callback; private->user_data = user_data; + private->old_width = width; + private->old_height = height; dialog = gimp_viewable_dialog_new (viewable, context, title, role, GIMP_STOCK_RESIZE, title, @@ -174,6 +183,16 @@ resize_dialog_new (GimpViewable *viewable, G_CALLBACK (resize_dialog_response), private); + main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12); + gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), + main_vbox, TRUE, TRUE, 0); + gtk_widget_show (main_vbox); + + frame = gimp_frame_new (size_title); + gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + gimp_image_get_resolution (image, &xres, &yres); private->box = g_object_new (GIMP_TYPE_SIZE_BOX, @@ -185,17 +204,6 @@ resize_dialog_new (GimpViewable *viewable, "keep-aspect", FALSE, "edit-resolution", FALSE, NULL); - - main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); - gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12); - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), - main_vbox, TRUE, TRUE, 0); - gtk_widget_show (main_vbox); - - frame = gimp_frame_new (text); - gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0); - gtk_widget_show (frame); - gtk_container_add (GTK_CONTAINER (frame), private->box); gtk_widget_show (private->box); @@ -282,28 +290,31 @@ resize_dialog_new (GimpViewable *viewable, G_CALLBACK (size_notify), private); + frame = gimp_frame_new (layers_title); + gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); + gtk_container_add (GTK_CONTAINER (frame), vbox); + gtk_widget_show (vbox); + if (GIMP_IS_IMAGE (viewable)) { - GtkWidget *hbox; GtkWidget *label; - GtkWidget *combo; - frame = gimp_frame_new (_("Layers")); - gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0); - gtk_widget_show (frame); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); - gtk_container_add (GTK_CONTAINER (frame), vbox); - gtk_widget_show (vbox); + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); label = gtk_label_new_with_mnemonic (_("Resize _layers:")); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); + gtk_size_group_add_widget (size_group, label); + combo = gimp_enum_combo_box_new (GIMP_TYPE_ITEM_SET); gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 0); gtk_widget_show (combo); @@ -314,6 +325,33 @@ resize_dialog_new (GimpViewable *viewable, private->layer_set, G_CALLBACK (gimp_int_combo_box_get_active), &private->layer_set); + } + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show (hbox); + + combo = gimp_enum_combo_box_new (GIMP_TYPE_FILL_TYPE); + gtk_box_pack_end (GTK_BOX (hbox), combo, TRUE, TRUE, 0); + gtk_widget_show (combo); + + gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo), + private->fill_type, + G_CALLBACK (gimp_int_combo_box_get_active), + &private->fill_type); + + if (GIMP_IS_IMAGE (viewable)) + { + GtkWidget *label; + + label = gtk_label_new_with_mnemonic (_("_Fill with:")); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); + + gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo); + + gtk_size_group_add_widget (size_group, label); button = gtk_check_button_new_with_mnemonic (_("Resize _text layers")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), @@ -324,6 +362,8 @@ resize_dialog_new (GimpViewable *viewable, g_signal_connect (button, "toggled", G_CALLBACK (gimp_toggle_button_update), &private->resize_text_layers); + + g_object_unref (size_group); } return dialog; @@ -355,6 +395,7 @@ resize_dialog_response (GtkWidget *dialog, private->callback (dialog, private->viewable, private->context, + private->fill_type, width, height, unit, diff --git a/app/dialogs/resize-dialog.h b/app/dialogs/resize-dialog.h index cd5d3d6b66..1041ee8933 100644 --- a/app/dialogs/resize-dialog.h +++ b/app/dialogs/resize-dialog.h @@ -22,6 +22,7 @@ typedef void (* GimpResizeCallback) (GtkWidget *dialog, GimpViewable *viewable, GimpContext *context, + GimpFillType fill_type, gint width, gint height, GimpUnit unit, diff --git a/app/pdb/image-transform-cmds.c b/app/pdb/image-transform-cmds.c index 1f685d1cb5..63081a6322 100644 --- a/app/pdb/image-transform-cmds.c +++ b/app/pdb/image-transform-cmds.c @@ -196,7 +196,7 @@ image_crop_invoker (GimpProcedure *procedure, offy > (gimp_image_get_height (image) - new_height)) success = FALSE; else - gimp_image_crop (image, context, + gimp_image_crop (image, context, GIMP_FILL_TRANSPARENT, offx, offy, new_width, new_height, TRUE); } diff --git a/app/pdb/layer-cmds.c b/app/pdb/layer-cmds.c index 234f7b1bf6..f7764ec02c 100644 --- a/app/pdb/layer-cmds.c +++ b/app/pdb/layer-cmds.c @@ -489,7 +489,7 @@ layer_resize_invoker (GimpProcedure *procedure, if (gimp_pdb_item_is_attached (GIMP_ITEM (layer), NULL, GIMP_PDB_ITEM_CONTENT | GIMP_PDB_ITEM_POSITION, error)) - gimp_item_resize (GIMP_ITEM (layer), context, + gimp_item_resize (GIMP_ITEM (layer), context, GIMP_FILL_TRANSPARENT, new_width, new_height, offx, offy); else success = FALSE; @@ -517,7 +517,7 @@ layer_resize_to_image_size_invoker (GimpProcedure *procedure, if (gimp_pdb_item_is_attached (GIMP_ITEM (layer), NULL, GIMP_PDB_ITEM_CONTENT | GIMP_PDB_ITEM_POSITION, error)) - gimp_layer_resize_to_image (layer, context); + gimp_layer_resize_to_image (layer, context, GIMP_FILL_TRANSPARENT); else success = FALSE; } diff --git a/app/pdb/plug-in-compat-cmds.c b/app/pdb/plug-in-compat-cmds.c index 7111819b41..e86deb5064 100644 --- a/app/pdb/plug-in-compat-cmds.c +++ b/app/pdb/plug-in-compat-cmds.c @@ -611,7 +611,8 @@ plug_in_autocrop_invoker (GimpProcedure *procedure, x = y = 0; } - gimp_image_crop (image, context, x, y, width, height, TRUE); + gimp_image_crop (image, context, GIMP_FILL_TRANSPARENT, + x, y, width, height, TRUE); gimp_image_undo_group_end (image); } @@ -658,7 +659,8 @@ plug_in_autocrop_layer_invoker (GimpProcedure *procedure, gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_ITEM_RESIZE, _("Autocrop layer")); - gimp_item_resize (GIMP_ITEM (layer), context, + gimp_item_resize (GIMP_ITEM (layer), + context, GIMP_FILL_TRANSPARENT, width, height, -x, -y); gimp_image_undo_group_end (image); diff --git a/app/text/gimptextlayer.c b/app/text/gimptextlayer.c index d06fa0fa1b..4630a22417 100644 --- a/app/text/gimptextlayer.c +++ b/app/text/gimptextlayer.c @@ -668,7 +668,9 @@ gimp_text_layer_render (GimpTextLayer *layer) if (! unused_eek) unused_eek = gimp_context_new (image->gimp, "eek", NULL); - gimp_item_resize (GIMP_ITEM (mask), unused_eek, width, height, 0, 0); + gimp_item_resize (GIMP_ITEM (mask), + unused_eek, GIMP_FILL_TRANSPARENT, + width, height, 0, 0); } } diff --git a/app/tools/gimpcroptool.c b/app/tools/gimpcroptool.c index 45430835da..d76d1ee6f9 100644 --- a/app/tools/gimpcroptool.c +++ b/app/tools/gimpcroptool.c @@ -331,14 +331,15 @@ gimp_crop_tool_execute (GimpRectangleTool *rectangle, off_x -= x; off_y -= y; - gimp_item_resize (GIMP_ITEM (layer), GIMP_CONTEXT (options), + gimp_item_resize (GIMP_ITEM (layer), + GIMP_CONTEXT (options), GIMP_FILL_TRANSPARENT, w, h, off_x, off_y); } else { - gimp_image_crop (image, GIMP_CONTEXT (options), - x, y, w, h, - TRUE); + gimp_image_crop (image, + GIMP_CONTEXT (options), GIMP_FILL_TRANSPARENT, + x, y, w, h, TRUE); } gimp_image_flush (image); diff --git a/app/vectors/gimpvectors.c b/app/vectors/gimpvectors.c index b4d39114bd..3a332c7e36 100644 --- a/app/vectors/gimpvectors.c +++ b/app/vectors/gimpvectors.c @@ -93,6 +93,7 @@ static void gimp_vectors_scale (GimpItem *item, GimpProgress *progress); static void gimp_vectors_resize (GimpItem *item, GimpContext *context, + GimpFillType fill_type, gint new_width, gint new_height, gint offset_x, @@ -502,12 +503,13 @@ gimp_vectors_scale (GimpItem *item, } static void -gimp_vectors_resize (GimpItem *item, - GimpContext *context, - gint new_width, - gint new_height, - gint offset_x, - gint offset_y) +gimp_vectors_resize (GimpItem *item, + GimpContext *context, + GimpFillType fill_type, + gint new_width, + gint new_height, + gint offset_x, + gint offset_y) { GimpVectors *vectors = GIMP_VECTORS (item); GimpImage *image = gimp_item_get_image (item); @@ -525,7 +527,7 @@ gimp_vectors_resize (GimpItem *item, gimp_stroke_translate (stroke, offset_x, offset_y); } - GIMP_ITEM_CLASS (parent_class)->resize (item, context, + GIMP_ITEM_CLASS (parent_class)->resize (item, context, fill_type, gimp_image_get_width (image), gimp_image_get_height (image), 0, 0); diff --git a/tools/pdbgen/pdb/image_transform.pdb b/tools/pdbgen/pdb/image_transform.pdb index c8983b1c12..51c587b0e1 100644 --- a/tools/pdbgen/pdb/image_transform.pdb +++ b/tools/pdbgen/pdb/image_transform.pdb @@ -194,7 +194,7 @@ HELP offy > (gimp_image_get_height (image) - new_height)) success = FALSE; else - gimp_image_crop (image, context, + gimp_image_crop (image, context, GIMP_FILL_TRANSPARENT, offx, offy, new_width, new_height, TRUE); } diff --git a/tools/pdbgen/pdb/layer.pdb b/tools/pdbgen/pdb/layer.pdb index b7dd101ca6..a9e0983f0e 100644 --- a/tools/pdbgen/pdb/layer.pdb +++ b/tools/pdbgen/pdb/layer.pdb @@ -560,7 +560,7 @@ HELP if (gimp_pdb_item_is_attached (GIMP_ITEM (layer), NULL, GIMP_PDB_ITEM_CONTENT | GIMP_PDB_ITEM_POSITION, error)) - gimp_item_resize (GIMP_ITEM (layer), context, + gimp_item_resize (GIMP_ITEM (layer), context, GIMP_FILL_TRANSPARENT, new_width, new_height, offx, offy); else success = FALSE; @@ -590,7 +590,7 @@ HELP if (gimp_pdb_item_is_attached (GIMP_ITEM (layer), NULL, GIMP_PDB_ITEM_CONTENT | GIMP_PDB_ITEM_POSITION, error)) - gimp_layer_resize_to_image (layer, context); + gimp_layer_resize_to_image (layer, context, GIMP_FILL_TRANSPARENT); else success = FALSE; } diff --git a/tools/pdbgen/pdb/plug_in_compat.pdb b/tools/pdbgen/pdb/plug_in_compat.pdb index de95815caa..b28deee9a6 100644 --- a/tools/pdbgen/pdb/plug_in_compat.pdb +++ b/tools/pdbgen/pdb/plug_in_compat.pdb @@ -304,7 +304,8 @@ HELP x = y = 0; } - gimp_image_crop (image, context, x, y, width, height, TRUE); + gimp_image_crop (image, context, GIMP_FILL_TRANSPARENT, + x, y, width, height, TRUE); gimp_image_undo_group_end (image); } @@ -356,7 +357,8 @@ HELP gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_ITEM_RESIZE, _("Autocrop layer")); - gimp_item_resize (GIMP_ITEM (layer), context, + gimp_item_resize (GIMP_ITEM (layer), + context, GIMP_FILL_TRANSPARENT, width, height, -x, -y); gimp_image_undo_group_end (image);