gimp r26867 - in trunk: . app/display
- From: neo svn gnome org
- To: svn-commits-list gnome org
- Subject: gimp r26867 - in trunk: . app/display
- Date: Thu, 4 Sep 2008 18:14:57 +0000 (UTC)
Author: neo
Date: Thu Sep 4 18:14:56 2008
New Revision: 26867
URL: http://svn.gnome.org/viewvc/gimp?rev=26867&view=rev
Log:
2008-09-04 Sven Neumann <sven gimp org>
* app/display/gimpdisplayshell-dnd.c: improved the new DND code.
Modified:
trunk/ChangeLog
trunk/app/display/gimpdisplayshell-dnd.c
Modified: trunk/app/display/gimpdisplayshell-dnd.c
==============================================================================
--- trunk/app/display/gimpdisplayshell-dnd.c (original)
+++ trunk/app/display/gimpdisplayshell-dnd.c Thu Sep 4 18:14:56 2008
@@ -33,6 +33,7 @@
#include "core/gimpcontext.h"
#include "core/gimpdrawable-bucket-fill.h"
#include "core/gimpimage.h"
+#include "core/gimpimage-colormap.h"
#include "core/gimpimage-merge.h"
#include "core/gimpimage-undo.h"
#include "core/gimplayer.h"
@@ -176,10 +177,11 @@
GimpViewable *viewable,
gpointer data)
{
- GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
- GimpImage *image = shell->display->image;
+ GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
+ GimpImage *image = shell->display->image;
GType new_type;
GimpItem *new_item;
+ gboolean new_image = FALSE;
GIMP_LOG (DND, NULL);
@@ -188,12 +190,34 @@
if (! image)
{
- image = gimp_image_new (shell->display->gimp,
- gimp_item_width (GIMP_ITEM (viewable)),
- gimp_item_height (GIMP_ITEM (viewable)),
- GIMP_RGB);
+ GimpImage *src_image = gimp_item_get_image (GIMP_ITEM (viewable));
+ GimpDrawable *drawable = GIMP_DRAWABLE (viewable);
+ GimpImageBaseType type;
+ gdouble xres;
+ gdouble yres;
+
+ type = GIMP_IMAGE_TYPE_BASE_TYPE (gimp_drawable_type (drawable));
+
+ image = gimp_create_image (shell->display->gimp,
+ gimp_item_width (GIMP_ITEM (viewable)),
+ gimp_item_height (GIMP_ITEM (viewable)),
+ type, TRUE);
+ gimp_image_undo_disable (image);
+
+ if (type == GIMP_INDEXED)
+ gimp_image_set_colormap (image,
+ gimp_image_get_colormap (src_image),
+ gimp_image_get_colormap_size (src_image),
+ FALSE);
+
+ gimp_image_get_resolution (src_image, &xres, &yres);
+ gimp_image_set_resolution (image, xres, yres);
+ gimp_image_set_unit (image, gimp_image_get_unit (src_image));
gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0);
+ g_object_unref (image);
+
+ new_image = TRUE;
}
if (GIMP_IS_LAYER (viewable))
@@ -205,23 +229,28 @@
if (new_item)
{
- GimpLayer *new_layer;
- gint x, y, width, height;
- gint off_x, off_y;
-
- new_layer = GIMP_LAYER (new_item);
+ GimpLayer *new_layer = GIMP_LAYER (new_item);
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_EDIT_PASTE,
_("Drop New Layer"));
- gimp_display_shell_untransform_viewport (shell, &x, &y, &width, &height);
+ if (! new_image)
+ {
+ gint x, y;
+ gint width, height;
+ gint off_x, off_y;
- gimp_item_offsets (new_item, &off_x, &off_y);
+ gimp_item_offsets (new_item, &off_x, &off_y);
- off_x = x + (width - gimp_item_width (new_item)) / 2 - off_x;
- off_y = y + (height - gimp_item_height (new_item)) / 2 - off_y;
+ gimp_display_shell_untransform_viewport (shell,
+ &x, &y, &width, &height);
+
+ off_x = x + (width - gimp_item_width (new_item)) / 2 - off_x;
+ off_y = y + (height - gimp_item_height (new_item)) / 2 - off_y;
+
+ gimp_item_translate (new_item, off_x, off_y, FALSE);
+ }
- gimp_item_translate (new_item, off_x, off_y, FALSE);
gimp_item_set_visible (new_item, TRUE, FALSE);
gimp_item_set_linked (new_item, FALSE, FALSE);
@@ -231,6 +260,9 @@
gimp_display_shell_dnd_flush (shell, image);
}
+
+ if (new_image)
+ gimp_image_undo_enable (image);
}
static void
@@ -557,50 +589,76 @@
GdkPixbuf *pixbuf,
gpointer data)
{
- GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
- GimpImage *image = shell->display->image;
+ GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
+ GimpImage *image = shell->display->image;
GimpLayer *new_layer;
+ GimpImageType image_type;
+ gboolean new_image = FALSE;
GIMP_LOG (DND, NULL);
if (shell->display->gimp->busy)
return;
+ switch (gdk_pixbuf_get_n_channels (pixbuf))
+ {
+ case 1: image_type = GIMP_GRAY_IMAGE; break;
+ case 2: image_type = GIMP_GRAYA_IMAGE; break;
+ case 3: image_type = GIMP_RGB_IMAGE; break;
+ case 4: image_type = GIMP_RGBA_IMAGE; break;
+ break;
+
+ default:
+ g_return_if_reached ();
+ break;
+ }
+
if (! image)
{
- image = gimp_image_new (shell->display->gimp,
- gdk_pixbuf_get_width (pixbuf),
- gdk_pixbuf_get_height (pixbuf),
- GIMP_RGB);
-
+ image = gimp_create_image (shell->display->gimp,
+ gdk_pixbuf_get_width (pixbuf),
+ gdk_pixbuf_get_height (pixbuf),
+ GIMP_IMAGE_TYPE_BASE_TYPE (image_type),
+ FALSE);
+
gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0);
+ g_object_unref (image);
+
+ gimp_image_undo_disable (image);
+
+ new_image = TRUE;
}
new_layer =
- gimp_layer_new_from_pixbuf (pixbuf, image,
- gimp_image_base_type_with_alpha (image),
+ gimp_layer_new_from_pixbuf (pixbuf, image, image_type,
_("Dropped Buffer"),
GIMP_OPACITY_OPAQUE, GIMP_NORMAL_MODE);
if (new_layer)
{
- GimpItem *new_item;
- gint x, y, width, height;
- gint off_x, off_y;
+ GimpItem *new_item = GIMP_ITEM (new_layer);
new_item = GIMP_ITEM (new_layer);
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_EDIT_PASTE,
_("Drop New Layer"));
- gimp_display_shell_untransform_viewport (shell, &x, &y, &width, &height);
+ if (! new_image)
+ {
+ gint x, y;
+ gint width, height;
+ gint off_x, off_y;
- gimp_item_offsets (new_item, &off_x, &off_y);
+ gimp_display_shell_untransform_viewport (shell,
+ &x, &y, &width, &height);
- off_x = x + (width - gimp_item_width (new_item)) / 2 - off_x;
- off_y = y + (height - gimp_item_height (new_item)) / 2 - off_y;
+ gimp_item_offsets (new_item, &off_x, &off_y);
- gimp_item_translate (new_item, off_x, off_y, FALSE);
+ off_x = x + (width - gimp_item_width (new_item)) / 2 - off_x;
+ off_y = y + (height - gimp_item_height (new_item)) / 2 - off_y;
+
+ gimp_item_translate (new_item, off_x, off_y, FALSE);
+ }
gimp_image_add_layer (image, new_layer, -1);
@@ -608,4 +666,7 @@
gimp_display_shell_dnd_flush (shell, image);
}
+
+ if (new_image)
+ gimp_image_undo_enable (image);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]