[gimp] Add utility function to create images to gimpimage-new.[ch]



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]