Issue #8924: Paste as new image uses the full canvas instead of just…

… the copied selection.
This commit is contained in:
Jehan 2023-01-24 12:47:02 +01:00
parent 2e30a92c0a
commit ba5c423331
6 changed files with 54 additions and 9 deletions

View File

@ -123,7 +123,8 @@ buffers_paste_as_new_image_cmd_callback (GimpAction *action,
GimpImage *new_image;
new_image = gimp_edit_paste_as_new_image (context->gimp,
GIMP_OBJECT (buffer));
GIMP_OBJECT (buffer),
context);
gimp_create_display (context->gimp, new_image,
GIMP_UNIT_PIXEL, 1.0,
G_OBJECT (gimp_widget_get_monitor (widget)));

View File

@ -426,7 +426,8 @@ edit_paste_as_new_image_cmd_callback (GimpAction *action,
if (paste)
{
image = gimp_edit_paste_as_new_image (gimp, paste);
image = gimp_edit_paste_as_new_image (gimp, paste,
action_data_get_context (data));
g_object_unref (paste);
}

View File

@ -36,6 +36,7 @@
#include "gimpimage-duplicate.h"
#include "gimpimage-merge.h"
#include "gimpimage-new.h"
#include "gimpimage-resize.h"
#include "gimpimage-undo.h"
#include "gimplayer-floating-selection.h"
#include "gimplayer-new.h"
@ -251,6 +252,24 @@ gimp_edit_copy (GimpImage *image,
item_x - selection_bounds.x, item_y - selection_bounds.y);
}
g_list_free (all_items);
/* We need to keep the image size as-is, because even after cropping
* layers to selection, their offset stay important for in-place paste
* variants. Yet we also need to store the dimensions where we'd have
* cropped the image for the "Paste as New Image" action.
*/
g_object_set_data (G_OBJECT (clip_image),
"gimp-edit-new-image-x",
GINT_TO_POINTER (selection_bounds.x));
g_object_set_data (G_OBJECT (clip_image),
"gimp-edit-new-image-y",
GINT_TO_POINTER (selection_bounds.y));
g_object_set_data (G_OBJECT (clip_image),
"gimp-edit-new-image-width",
GINT_TO_POINTER (selection_bounds.width));
g_object_set_data (G_OBJECT (clip_image),
"gimp-edit-new-image-height",
GINT_TO_POINTER (selection_bounds.height));
}
/* Remove selection from the clipboard image. */
gimp_channel_clear (clip_selection, NULL, FALSE);
@ -914,8 +933,9 @@ gimp_edit_paste (GimpImage *image,
}
GimpImage *
gimp_edit_paste_as_new_image (Gimp *gimp,
GimpObject *paste)
gimp_edit_paste_as_new_image (Gimp *gimp,
GimpObject *paste,
GimpContext *context)
{
GimpImage *image = NULL;
@ -924,7 +944,29 @@ gimp_edit_paste_as_new_image (Gimp *gimp,
if (GIMP_IS_IMAGE (paste))
{
gint offset_x;
gint offset_y;
gint new_width;
gint new_height;
offset_x = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (paste),
"gimp-edit-new-image-x"));
offset_y = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (paste),
"gimp-edit-new-image-y"));
new_width = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (paste),
"gimp-edit-new-image-width"));
new_height = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (paste),
"gimp-edit-new-image-height"));
image = gimp_image_duplicate (GIMP_IMAGE (paste));
if (new_width > 0 && new_height > 0)
{
gimp_image_undo_disable (image);
gimp_image_resize (image, context,
new_width, new_height,
-offset_x, -offset_y,
NULL);
gimp_image_undo_enable (image);
}
}
else if (GIMP_IS_BUFFER (paste))
{

View File

@ -42,7 +42,8 @@ GList * gimp_edit_paste (GimpImage *image,
gint viewport_width,
gint viewport_height);
GimpImage * gimp_edit_paste_as_new_image (Gimp *gimp,
GimpObject *paste);
GimpObject *paste,
GimpContext *context);
const gchar * gimp_edit_named_cut (GimpImage *image,
const gchar *name,

View File

@ -325,7 +325,7 @@ edit_paste_as_new_image_invoker (GimpProcedure *procedure,
if (paste)
{
image = gimp_edit_paste_as_new_image (gimp, paste);
image = gimp_edit_paste_as_new_image (gimp, paste, context);
if (! image)
success = FALSE;
@ -641,7 +641,7 @@ edit_named_paste_as_new_image_invoker (GimpProcedure *procedure,
if (buffer)
{
image = gimp_edit_paste_as_new_image (gimp, GIMP_OBJECT (buffer));
image = gimp_edit_paste_as_new_image (gimp, GIMP_OBJECT (buffer), context);
if (! image)
success = FALSE;

View File

@ -332,7 +332,7 @@ HELP
if (paste)
{
image = gimp_edit_paste_as_new_image (gimp, paste);
image = gimp_edit_paste_as_new_image (gimp, paste, context);
if (! image)
success = FALSE;
@ -660,7 +660,7 @@ HELP
if (buffer)
{
image = gimp_edit_paste_as_new_image (gimp, GIMP_OBJECT (buffer));
image = gimp_edit_paste_as_new_image (gimp, GIMP_OBJECT (buffer), context);
if (! image)
success = FALSE;