[gimp] Add utility function to create images to gimpimage-new.[ch]
- From: Michael Natterer <mitch src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gimp] Add utility function to create images to gimpimage-new.[ch]
- Date: Tue, 9 Feb 2010 21:41:46 +0000 (UTC)
commit 903604113f9fd7ccdde54849264879df7ea6ca3b
Author: Michael Natterer <mitch gimp org>
Date: Mon Feb 8 14:47:45 2010 +0100
Add utility function to create images to gimpimage-new.[ch]
Add gimp_image_new_from_drawable(), from_component() and from_pixbuf()
and remove that duplicated code from gimptoolbox-dnd.c and
gimpdisplayshell-dnd.c
app/core/gimpimage-new.c | 157 ++++++++++++++++++++++++++++++++++++
app/core/gimpimage-new.h | 17 +++-
app/display/gimpdisplayshell-dnd.c | 72 ++++-------------
app/widgets/gimptoolbox-dnd.c | 131 +++---------------------------
4 files changed, 197 insertions(+), 180 deletions(-)
---
diff --git a/app/core/gimpimage-new.c b/app/core/gimpimage-new.c
index baf8b5f..f7e0d46 100644
--- a/app/core/gimpimage-new.c
+++ b/app/core/gimpimage-new.c
@@ -19,6 +19,7 @@
#include <gegl.h>
+#include "libgimpbase/gimpbase.h"
#include "libgimpconfig/gimpconfig.h"
#include "core-types.h"
@@ -26,8 +27,12 @@
#include "config/gimpcoreconfig.h"
#include "gimp.h"
+#include "gimpchannel.h"
#include "gimpimage.h"
+#include "gimpimage-colormap.h"
#include "gimpimage-new.h"
+#include "gimpimage-undo.h"
+#include "gimplayer.h"
#include "gimptemplate.h"
#include "gimp-intl.h"
@@ -69,3 +74,155 @@ gimp_image_new_set_last_template (Gimp *gimp,
gimp_config_sync (G_OBJECT (template),
G_OBJECT (gimp->image_new_last_template), 0);
}
+
+GimpImage *
+gimp_image_new_from_drawable (Gimp *gimp,
+ GimpDrawable *drawable)
+{
+ GimpItem *item;
+ GimpImage *image;
+ GimpImage *new_image;
+ GimpLayer *new_layer;
+ GType new_type;
+ gint off_x, off_y;
+ GimpImageBaseType type;
+ gdouble xres;
+ gdouble yres;
+
+ g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
+ g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), NULL);
+
+ item = GIMP_ITEM (drawable);
+ image = gimp_item_get_image (item);
+
+ type = GIMP_IMAGE_TYPE_BASE_TYPE (gimp_drawable_type (drawable));
+
+ new_image = gimp_create_image (gimp,
+ gimp_item_get_width (item),
+ gimp_item_get_height (item),
+ type, TRUE);
+ gimp_image_undo_disable (new_image);
+
+ if (type == GIMP_INDEXED)
+ gimp_image_set_colormap (new_image,
+ gimp_image_get_colormap (image),
+ gimp_image_get_colormap_size (image),
+ FALSE);
+
+ gimp_image_get_resolution (image, &xres, &yres);
+ gimp_image_set_resolution (new_image, xres, yres);
+ gimp_image_set_unit (new_image, gimp_image_get_unit (image));
+
+ if (GIMP_IS_LAYER (drawable))
+ new_type = G_TYPE_FROM_INSTANCE (drawable);
+ else
+ new_type = GIMP_TYPE_LAYER;
+
+ new_layer = GIMP_LAYER (gimp_item_convert (GIMP_ITEM (drawable),
+ new_image, new_type));
+
+ gimp_object_set_name (GIMP_OBJECT (new_layer),
+ gimp_object_get_name (drawable));
+
+ gimp_item_get_offset (GIMP_ITEM (new_layer), &off_x, &off_y);
+ gimp_item_translate (GIMP_ITEM (new_layer), -off_x, -off_y, FALSE);
+ gimp_item_set_visible (GIMP_ITEM (new_layer), TRUE, FALSE);
+ gimp_item_set_linked (GIMP_ITEM (new_layer), FALSE, FALSE);
+ gimp_layer_set_mode (new_layer, GIMP_NORMAL_MODE, FALSE);
+ gimp_layer_set_opacity (new_layer, GIMP_OPACITY_OPAQUE, FALSE);
+ gimp_layer_set_lock_alpha (new_layer, FALSE, FALSE);
+
+ gimp_image_add_layer (new_image, new_layer, NULL, 0, TRUE);
+
+ gimp_image_undo_enable (new_image);
+
+ return new_image;
+}
+
+GimpImage *
+gimp_image_new_from_component (Gimp *gimp,
+ GimpImage *image,
+ GimpChannelType component)
+{
+ GimpImage *new_image;
+ GimpChannel *channel;
+ GimpLayer *layer;
+ const gchar *desc;
+ gdouble xres;
+ gdouble yres;
+
+ g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
+ g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
+
+ new_image = gimp_create_image (gimp,
+ gimp_image_get_width (image),
+ gimp_image_get_height (image),
+ GIMP_GRAY, TRUE);
+
+ gimp_image_undo_disable (new_image);
+
+ gimp_image_get_resolution (image, &xres, &yres);
+ gimp_image_set_resolution (new_image, xres, yres);
+ gimp_image_set_unit (new_image, gimp_image_get_unit (image));
+
+ channel = gimp_channel_new_from_component (image, component, NULL, NULL);
+
+ layer = GIMP_LAYER (gimp_item_convert (GIMP_ITEM (channel),
+ new_image, GIMP_TYPE_LAYER));
+ g_object_unref (channel);
+
+ gimp_enum_get_value (GIMP_TYPE_CHANNEL_TYPE, component,
+ NULL, NULL, &desc, NULL);
+ gimp_object_take_name (GIMP_OBJECT (layer),
+ g_strdup_printf (_("%s Channel Copy"), desc));
+
+ gimp_image_add_layer (new_image, layer, NULL, 0, TRUE);
+
+ gimp_image_undo_enable (new_image);
+
+ return new_image;
+}
+
+GimpImage *
+gimp_image_new_from_pixbuf (Gimp *gimp,
+ GdkPixbuf *pixbuf,
+ const gchar *layer_name)
+{
+ GimpImageType image_type;
+ GimpImage *new_image;
+ GimpLayer *layer;
+
+ g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
+ g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL);
+
+ 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_val_if_reached (NULL);
+ break;
+ }
+
+ new_image = gimp_create_image (gimp,
+ gdk_pixbuf_get_width (pixbuf),
+ gdk_pixbuf_get_height (pixbuf),
+ GIMP_IMAGE_TYPE_BASE_TYPE (image_type),
+ FALSE);
+
+ gimp_image_undo_disable (new_image);
+
+ layer = gimp_layer_new_from_pixbuf (pixbuf, new_image, image_type,
+ layer_name,
+ GIMP_OPACITY_OPAQUE, GIMP_NORMAL_MODE);
+
+ gimp_image_add_layer (new_image, layer, NULL, 0, TRUE);
+
+ gimp_image_undo_enable (new_image);
+
+ return new_image;
+}
diff --git a/app/core/gimpimage-new.h b/app/core/gimpimage-new.h
index e153611..12617be 100644
--- a/app/core/gimpimage-new.h
+++ b/app/core/gimpimage-new.h
@@ -19,10 +19,19 @@
#define __GIMP_IMAGE_NEW_H__
-GimpTemplate * gimp_image_new_get_last_template (Gimp *gimp,
- GimpImage *image);
-void gimp_image_new_set_last_template (Gimp *gimp,
- GimpTemplate *template);
+GimpTemplate * gimp_image_new_get_last_template (Gimp *gimp,
+ GimpImage *image);
+void gimp_image_new_set_last_template (Gimp *gimp,
+ GimpTemplate *template);
+
+GimpImage * gimp_image_new_from_drawable (Gimp *gimp,
+ GimpDrawable *drawable);
+GimpImage * gimp_image_new_from_component (Gimp *gimp,
+ GimpImage *image,
+ GimpChannelType component);
+GimpImage * gimp_image_new_from_pixbuf (Gimp *gimp,
+ GdkPixbuf *pixbuf,
+ const gchar *layer_name);
#endif /* __GIMP_IMAGE_NEW__ */
diff --git a/app/display/gimpdisplayshell-dnd.c b/app/display/gimpdisplayshell-dnd.c
index cabfa51..6634c5c 100644
--- a/app/display/gimpdisplayshell-dnd.c
+++ b/app/display/gimpdisplayshell-dnd.c
@@ -33,8 +33,8 @@
#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-new.h"
#include "core/gimpimage-undo.h"
#include "core/gimplayer.h"
#include "core/gimplayermask.h"
@@ -201,7 +201,6 @@ gimp_display_shell_drop_drawable (GtkWidget *widget,
GimpImage *image = gimp_display_get_image (shell->display);
GType new_type;
GimpItem *new_item;
- gboolean new_image = FALSE;
GIMP_LOG (DND, NULL);
@@ -210,34 +209,12 @@ gimp_display_shell_drop_drawable (GtkWidget *widget,
if (! image)
{
- 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_get_width (GIMP_ITEM (viewable)),
- gimp_item_get_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);
+ image = gimp_image_new_from_drawable (shell->display->gimp,
+ GIMP_DRAWABLE (viewable));
+ gimp_create_display (shell->display->gimp, image, GIMP_UNIT_PIXEL, 1.0);
g_object_unref (image);
- new_image = TRUE;
+ return;
}
if (GIMP_IS_LAYER (viewable))
@@ -254,8 +231,7 @@ gimp_display_shell_drop_drawable (GtkWidget *widget,
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_EDIT_PASTE,
_("Drop New Layer"));
- if (! new_image)
- gimp_display_shell_dnd_position_item (shell, new_item);
+ gimp_display_shell_dnd_position_item (shell, new_item);
gimp_item_set_visible (new_item, TRUE, FALSE);
gimp_item_set_linked (new_item, FALSE, FALSE);
@@ -267,9 +243,6 @@ gimp_display_shell_drop_drawable (GtkWidget *widget,
gimp_display_shell_dnd_flush (shell, image);
}
-
- if (new_image)
- gimp_image_undo_enable (image);
}
static void
@@ -650,13 +623,22 @@ gimp_display_shell_drop_pixbuf (GtkWidget *widget,
GimpImage *image = gimp_display_get_image (shell->display);
GimpLayer *new_layer;
GimpImageType image_type;
- gboolean new_image = FALSE;
GIMP_LOG (DND, NULL);
if (shell->display->gimp->busy)
return;
+ if (! image)
+ {
+ image = gimp_image_new_from_pixbuf (shell->display->gimp, pixbuf,
+ _("Dropped Buffer"));
+ gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0);
+ g_object_unref (image);
+
+ return;
+ }
+
switch (gdk_pixbuf_get_n_channels (pixbuf))
{
case 1: image_type = GIMP_GRAY_IMAGE; break;
@@ -670,22 +652,6 @@ gimp_display_shell_drop_pixbuf (GtkWidget *widget,
break;
}
- if (! image)
- {
- 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, image_type,
_("Dropped Buffer"),
@@ -700,8 +666,7 @@ gimp_display_shell_drop_pixbuf (GtkWidget *widget,
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_EDIT_PASTE,
_("Drop New Layer"));
- if (! new_image)
- gimp_display_shell_dnd_position_item (shell, new_item);
+ gimp_display_shell_dnd_position_item (shell, new_item);
gimp_image_add_layer (image, new_layer,
GIMP_IMAGE_ACTIVE_PARENT, -1, TRUE);
@@ -710,7 +675,4 @@ gimp_display_shell_drop_pixbuf (GtkWidget *widget,
gimp_display_shell_dnd_flush (shell, image);
}
-
- if (new_image)
- gimp_image_undo_enable (image);
}
diff --git a/app/widgets/gimptoolbox-dnd.c b/app/widgets/gimptoolbox-dnd.c
index 8ddc650..6405bd1 100644
--- a/app/widgets/gimptoolbox-dnd.c
+++ b/app/widgets/gimptoolbox-dnd.c
@@ -22,7 +22,6 @@
#include <gegl.h>
#include <gtk/gtk.h>
-#include "libgimpbase/gimpbase.h"
#include "libgimpwidgets/gimpwidgets.h"
#include "widgets-types.h"
@@ -32,7 +31,7 @@
#include "core/gimpbuffer.h"
#include "core/gimpcontext.h"
#include "core/gimpimage.h"
-#include "core/gimpimage-colormap.h"
+#include "core/gimpimage-new.h"
#include "core/gimpimage-undo.h"
#include "core/gimplayer.h"
#include "core/gimplayermask.h"
@@ -193,66 +192,15 @@ gimp_toolbox_drop_drawable (GtkWidget *widget,
GimpViewable *viewable,
gpointer data)
{
- GimpContext *context = GIMP_CONTEXT (data);
- GimpDrawable *drawable = GIMP_DRAWABLE (viewable);
- GimpItem *item = GIMP_ITEM (viewable);
- GimpImage *image = gimp_item_get_image (item);
- GimpImage *new_image;
- GimpLayer *new_layer;
- GType new_type;
- gint width, height;
- gint off_x, off_y;
- gint bytes;
- GimpImageBaseType type;
- gdouble xres;
- gdouble yres;
+ GimpContext *context = GIMP_CONTEXT (data);
+ GimpImage *new_image;
if (context->gimp->busy)
return;
- width = gimp_item_get_width (item);
- height = gimp_item_get_height (item);
- bytes = gimp_drawable_bytes (drawable);
-
- type = GIMP_IMAGE_TYPE_BASE_TYPE (gimp_drawable_type (drawable));
-
- new_image = gimp_create_image (image->gimp, width, height, type, TRUE);
- gimp_image_undo_disable (new_image);
-
- if (type == GIMP_INDEXED)
- gimp_image_set_colormap (new_image,
- gimp_image_get_colormap (image),
- gimp_image_get_colormap_size (image),
- FALSE);
-
- gimp_image_get_resolution (image, &xres, &yres);
- gimp_image_set_resolution (new_image, xres, yres);
- gimp_image_set_unit (new_image, gimp_image_get_unit (image));
-
- if (GIMP_IS_LAYER (drawable))
- new_type = G_TYPE_FROM_INSTANCE (drawable);
- else
- new_type = GIMP_TYPE_LAYER;
-
- new_layer = GIMP_LAYER (gimp_item_convert (GIMP_ITEM (drawable),
- new_image, new_type));
-
- gimp_object_set_name (GIMP_OBJECT (new_layer),
- gimp_object_get_name (drawable));
-
- gimp_item_get_offset (GIMP_ITEM (new_layer), &off_x, &off_y);
- gimp_item_translate (GIMP_ITEM (new_layer), -off_x, -off_y, FALSE);
- gimp_item_set_visible (GIMP_ITEM (new_layer), TRUE, FALSE);
- gimp_item_set_linked (GIMP_ITEM (new_layer), FALSE, FALSE);
- gimp_layer_set_mode (new_layer, GIMP_NORMAL_MODE, FALSE);
- gimp_layer_set_opacity (new_layer, GIMP_OPACITY_OPAQUE, FALSE);
- gimp_layer_set_lock_alpha (new_layer, FALSE, FALSE);
-
- gimp_image_add_layer (new_image, new_layer, NULL, 0, TRUE);
-
- gimp_image_undo_enable (new_image);
-
- gimp_create_display (image->gimp, new_image, GIMP_UNIT_PIXEL, 1.0);
+ new_image = gimp_image_new_from_drawable (context->gimp,
+ GIMP_DRAWABLE (viewable));
+ gimp_create_display (context->gimp, new_image, GIMP_UNIT_PIXEL, 1.0);
g_object_unref (new_image);
}
@@ -302,42 +250,13 @@ gimp_toolbox_drop_component (GtkWidget *widget,
gpointer data)
{
GimpContext *context = GIMP_CONTEXT (data);
- GimpChannel *channel;
GimpImage *new_image;
- GimpLayer *new_layer;
- const gchar *desc;
- gdouble xres;
- gdouble yres;
if (context->gimp->busy)
return;
- new_image = gimp_create_image (image->gimp,
- gimp_image_get_width (image),
- gimp_image_get_height (image),
- GIMP_GRAY, TRUE);
-
- gimp_image_undo_disable (new_image);
-
- gimp_image_get_resolution (image, &xres, &yres);
- gimp_image_set_resolution (new_image, xres, yres);
- gimp_image_set_unit (new_image, gimp_image_get_unit (image));
-
- channel = gimp_channel_new_from_component (image, component, NULL, NULL);
-
- new_layer = GIMP_LAYER (gimp_item_convert (GIMP_ITEM (channel),
- new_image, GIMP_TYPE_LAYER));
- g_object_unref (channel);
-
- gimp_enum_get_value (GIMP_TYPE_CHANNEL_TYPE, component,
- NULL, NULL, &desc, NULL);
- gimp_object_take_name (GIMP_OBJECT (new_layer),
- g_strdup_printf (_("%s Channel Copy"), desc));
-
- gimp_image_add_layer (new_image, new_layer, NULL, 0, TRUE);
-
- gimp_image_undo_enable (new_image);
-
+ new_image = gimp_image_new_from_component (context->gimp,
+ image, component);
gimp_create_display (new_image->gimp, new_image, GIMP_UNIT_PIXEL, 1.0);
g_object_unref (new_image);
}
@@ -350,43 +269,13 @@ gimp_toolbox_drop_pixbuf (GtkWidget *widget,
gpointer data)
{
GimpContext *context = GIMP_CONTEXT (data);
- GimpImageType image_type;
GimpImage *new_image;
- GimpLayer *new_layer;
if (context->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;
- }
-
- new_image = gimp_create_image (context->gimp,
- gdk_pixbuf_get_width (pixbuf),
- gdk_pixbuf_get_height (pixbuf),
- GIMP_IMAGE_TYPE_BASE_TYPE (image_type),
- FALSE);
-
- gimp_image_undo_disable (new_image);
-
- new_layer =
- gimp_layer_new_from_pixbuf (pixbuf, new_image, image_type,
- _("Dropped Buffer"),
- GIMP_OPACITY_OPAQUE, GIMP_NORMAL_MODE);
-
- gimp_image_add_layer (new_image, new_layer, NULL, 0, TRUE);
-
- gimp_image_undo_enable (new_image);
-
+ new_image = gimp_image_new_from_pixbuf (context->gimp, pixbuf,
+ _("Dropped Buffer"));
gimp_create_display (new_image->gimp, new_image, GIMP_UNIT_PIXEL, 1.0);
g_object_unref (new_image);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]