gimp r27571 - in trunk: . app/core



Author: mitch
Date: Sat Nov  8 00:16:40 2008
New Revision: 27571
URL: http://svn.gnome.org/viewvc/gimp?rev=27571&view=rev

Log:
2008-11-08  Michael Natterer  <mitch gimp org>

	Abstract the legacy projection code away into a virtual function
	of GimpDrawable:

	* app/core/gimpdrawable.[ch]: add new virtual function
	GimpDrawable::project_region() which projects an area of a
	drawable onto a passed in PixelRegion.

	* app/core/Makefile.am
	* app/core/gimpchannel-project.[ch]
	* app/core/gimplayer-project.[ch]: new files which implement it.

	* app/core/gimpchannel.c
	* app/core/gimplayer.c: hook it in.

	* app/core/gimpprojection-construct.c: get rid all the projection
	code moved to above new files and project all drawables in one
	loop.

	* app/core/gimpprojectable.[ch]: remove the legacy methods
	get_colormap() and get_components(), they are not needed any
	longer.

	* app/core/gimpimage.c: changed accordingly.



Added:
   trunk/app/core/gimpchannel-project.c
   trunk/app/core/gimpchannel-project.h
   trunk/app/core/gimplayer-project.c
   trunk/app/core/gimplayer-project.h
Modified:
   trunk/ChangeLog
   trunk/app/core/Makefile.am
   trunk/app/core/gimpchannel.c
   trunk/app/core/gimpdrawable.c
   trunk/app/core/gimpdrawable.h
   trunk/app/core/gimpimage.c
   trunk/app/core/gimplayer.c
   trunk/app/core/gimpprojectable.c
   trunk/app/core/gimpprojectable.h
   trunk/app/core/gimpprojection-construct.c

Modified: trunk/app/core/Makefile.am
==============================================================================
--- trunk/app/core/Makefile.am	(original)
+++ trunk/app/core/Makefile.am	Sat Nov  8 00:16:40 2008
@@ -74,6 +74,8 @@
 	gimpchannel.h				\
 	gimpchannel-combine.c			\
 	gimpchannel-combine.h			\
+	gimpchannel-project.c			\
+	gimpchannel-project.h			\
 	gimpchannel-select.c			\
 	gimpchannel-select.h			\
 	gimpchannelpropundo.c			\
@@ -252,6 +254,8 @@
 	gimplayer.h				\
 	gimplayer-floating-sel.c		\
 	gimplayer-floating-sel.h		\
+	gimplayer-project.c			\
+	gimplayer-project.h			\
 	gimplayermask.c				\
 	gimplayermask.h				\
 	gimplayermaskpropundo.c			\

Added: trunk/app/core/gimpchannel-project.c
==============================================================================
--- (empty file)
+++ trunk/app/core/gimpchannel-project.c	Sat Nov  8 00:16:40 2008
@@ -0,0 +1,78 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpchannel-project.h
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+
+#include "libgimpcolor/gimpcolor.h"
+
+#include "core-types.h"
+
+#include "base/pixel-region.h"
+
+#include "paint-funcs/paint-funcs.h"
+
+#include "gimpchannel.h"
+#include "gimpchannel-project.h"
+
+
+void
+gimp_channel_project_region (GimpDrawable *drawable,
+                             gint          x,
+                             gint          y,
+                             gint          width,
+                             gint          height,
+                             PixelRegion  *projPR,
+                             gboolean      combine)
+{
+  GimpChannel *channel = GIMP_CHANNEL (drawable);
+  PixelRegion  srcPR;
+  guchar       col[3];
+  guchar       opacity;
+
+  gimp_rgba_get_uchar (&channel->color,
+                       &col[0], &col[1], &col[2], &opacity);
+
+  pixel_region_init (&srcPR, gimp_drawable_get_tiles (drawable),
+                     x, y, width, height,
+                     FALSE);
+
+  if (combine)
+    {
+      combine_regions (projPR, &srcPR, projPR, NULL, col,
+                       opacity,
+                       GIMP_NORMAL_MODE,
+                       NULL,
+                       (gimp_channel_get_show_masked (channel) ?
+                        COMBINE_INTEN_A_CHANNEL_MASK :
+                        COMBINE_INTEN_A_CHANNEL_SELECTION));
+    }
+  else
+    {
+      initial_region (projPR, &srcPR, NULL, col,
+                      opacity,
+                      GIMP_NORMAL_MODE,
+                      NULL,
+                      (gimp_channel_get_show_masked (channel) ?
+                       INITIAL_CHANNEL_MASK :
+                       INITIAL_CHANNEL_SELECTION));
+    }
+}

Added: trunk/app/core/gimpchannel-project.h
==============================================================================
--- (empty file)
+++ trunk/app/core/gimpchannel-project.h	Sat Nov  8 00:16:40 2008
@@ -0,0 +1,34 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpchannel-project.h
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GIMP_CHANNEL_PROJECT_H__
+#define __GIMP_CHANNEL_PROJECT_H__
+
+
+void   gimp_channel_project_region (GimpDrawable *drawable,
+                                    gint          x,
+                                    gint          y,
+                                    gint          width,
+                                    gint          height,
+                                    PixelRegion  *projPR,
+                                    gboolean      combine);
+
+
+#endif /* __GIMP_CHANNEL_PROJECT_H__ */

Modified: trunk/app/core/gimpchannel.c
==============================================================================
--- trunk/app/core/gimpchannel.c	(original)
+++ trunk/app/core/gimpchannel.c	Sat Nov  8 00:16:40 2008
@@ -48,6 +48,7 @@
 #include "gimpimage-undo.h"
 #include "gimpimage-undo-push.h"
 #include "gimpchannel.h"
+#include "gimpchannel-project.h"
 #include "gimpcontext.h"
 #include "gimpdrawable-stroke.h"
 #include "gimpmarshal.h"
@@ -278,6 +279,7 @@
   drawable_class->get_active_components = gimp_channel_get_active_components;
   drawable_class->apply_region          = gimp_channel_apply_region;
   drawable_class->replace_region        = gimp_channel_replace_region;
+  drawable_class->project_region        = gimp_channel_project_region;
   drawable_class->set_tiles             = gimp_channel_set_tiles;
   drawable_class->swap_pixels           = gimp_channel_swap_pixels;
 

Modified: trunk/app/core/gimpdrawable.c
==============================================================================
--- trunk/app/core/gimpdrawable.c	(original)
+++ trunk/app/core/gimpdrawable.c	Sat Nov  8 00:16:40 2008
@@ -1039,6 +1039,24 @@
                                                       x, y);
 }
 
+void
+gimp_drawable_project_region (GimpDrawable *drawable,
+                              gint          x,
+                              gint          y,
+                              gint          width,
+                              gint          height,
+                              PixelRegion  *projPR,
+                              gboolean      combine)
+{
+  g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
+  g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable)));
+  g_return_if_fail (projPR != NULL);
+
+  GIMP_DRAWABLE_GET_CLASS (drawable)->project_region (drawable,
+                                                      x, y, width, height,
+                                                      projPR, combine);
+}
+
 TileManager *
 gimp_drawable_get_tiles (GimpDrawable *drawable)
 {

Modified: trunk/app/core/gimpdrawable.h
==============================================================================
--- trunk/app/core/gimpdrawable.h	(original)
+++ trunk/app/core/gimpdrawable.h	Sat Nov  8 00:16:40 2008
@@ -89,6 +89,13 @@
                                            PixelRegion          *maskPR,
                                            gint                  x,
                                            gint                  y);
+  void           (* project_region)       (GimpDrawable         *drawable,
+                                           gint                  x,
+                                           gint                  y,
+                                           gint                  width,
+                                           gint                  height,
+                                           PixelRegion          *projPR,
+                                           gboolean              combine);
   TileManager * (* get_tiles)             (GimpDrawable         *drawable);
   void          (* set_tiles)             (GimpDrawable         *drawable,
                                            gboolean              push_undo,
@@ -158,6 +165,13 @@
                                                   PixelRegion        *maskPR,
                                                   gint                x,
                                                   gint                y);
+void            gimp_drawable_project_region     (GimpDrawable       *drawable,
+                                                  gint                x,
+                                                  gint                y,
+                                                  gint                width,
+                                                  gint                height,
+                                                  PixelRegion        *projPR,
+                                                  gboolean            combine);
 
 TileManager   * gimp_drawable_get_tiles          (GimpDrawable       *drawable);
 void            gimp_drawable_set_tiles          (GimpDrawable       *drawable,

Modified: trunk/app/core/gimpimage.c
==============================================================================
--- trunk/app/core/gimpimage.c	(original)
+++ trunk/app/core/gimpimage.c	Sat Nov  8 00:16:40 2008
@@ -174,7 +174,6 @@
                                                   gboolean           invalidate_preview);
 static GeglNode     * gimp_image_get_graph       (GimpProjectable   *projectable);
 static GimpImage    * gimp_image_get_image       (GimpProjectable   *projectable);
-static gboolean     * gimp_image_get_components  (GimpProjectable   *projectable);
 
 static void     gimp_image_mask_update           (GimpDrawable      *drawable,
                                                   gint               x,
@@ -570,8 +569,6 @@
   iface->invalidate_preview = (void (*) (GimpProjectable*)) gimp_viewable_invalidate_preview;
   iface->get_layers         = (GList * (*) (GimpProjectable*)) gimp_image_get_layer_iter;
   iface->get_channels       = (GList * (*) (GimpProjectable*)) gimp_image_get_channel_iter;
-  iface->get_components     = gimp_image_get_components;
-  iface->get_colormap       = (const guchar * (*) (GimpProjectable*)) gimp_image_get_colormap;
 }
 
 static void
@@ -1196,14 +1193,6 @@
   return GIMP_IMAGE (projectable);
 }
 
-static gboolean *
-gimp_image_get_components (GimpProjectable *projectable)
-{
-  GimpImage *image = GIMP_IMAGE (projectable);
-
-  return image->visible;
-}
-
 static GeglNode *
 gimp_image_get_graph (GimpProjectable *projectable)
 {

Added: trunk/app/core/gimplayer-project.c
==============================================================================
--- (empty file)
+++ trunk/app/core/gimplayer-project.c	Sat Nov  8 00:16:40 2008
@@ -0,0 +1,142 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimplayer-project.h
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+
+#include "core-types.h"
+
+#include "base/pixel-region.h"
+
+#include "paint-funcs/paint-funcs.h"
+
+#include "gimpimage.h"
+#include "gimpimage-colormap.h"
+#include "gimplayer.h"
+#include "gimplayer-project.h"
+#include "gimplayermask.h"
+
+
+void
+gimp_layer_project_region (GimpDrawable *drawable,
+                           gint          x,
+                           gint          y,
+                           gint          width,
+                           gint          height,
+                           PixelRegion  *projPR,
+                           gboolean      combine)
+{
+  GimpLayer     *layer = GIMP_LAYER (drawable);
+  GimpLayerMask *mask  = gimp_layer_get_mask (layer);
+
+  if (mask && gimp_layer_mask_get_show (mask))
+    {
+      /*  If we're showing the layer mask instead of the layer...  */
+
+      PixelRegion srcPR;
+
+      pixel_region_init (&srcPR,
+                         gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
+                         x, y, width, height,
+                         FALSE);
+
+      copy_gray_to_region (&srcPR, projPR);
+    }
+  else
+    {
+      /*  Otherwise, normal  */
+
+      GimpImage       *image    = gimp_item_get_image (GIMP_ITEM (layer));
+      PixelRegion      srcPR;
+      PixelRegion      maskPR;
+      PixelRegion     *mask_pr  = NULL;
+      const guchar    *colormap = NULL;
+      InitialMode      initial_mode;
+      CombinationMode  combination_mode;
+
+      pixel_region_init (&srcPR,
+                         gimp_drawable_get_tiles (drawable),
+                         x, y, width, height,
+                         FALSE);
+
+      if (mask && gimp_layer_mask_get_apply (mask))
+        {
+          pixel_region_init (&maskPR,
+                             gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
+                             x, y, width, height,
+                             FALSE);
+          mask_pr = &maskPR;
+        }
+
+      /*  Based on the type of the layer, project the layer onto the
+       *  projection image...
+       */
+      switch (gimp_drawable_type (drawable))
+        {
+        case GIMP_RGB_IMAGE:
+        case GIMP_GRAY_IMAGE:
+          initial_mode     = INITIAL_INTENSITY;
+          combination_mode = COMBINE_INTEN_A_INTEN;
+          break;
+
+        case GIMP_RGBA_IMAGE:
+        case GIMP_GRAYA_IMAGE:
+          initial_mode     = INITIAL_INTENSITY_ALPHA;
+          combination_mode = COMBINE_INTEN_A_INTEN_A;
+          break;
+
+        case GIMP_INDEXED_IMAGE:
+          colormap         = gimp_image_get_colormap (image),
+          initial_mode     = INITIAL_INDEXED;
+          combination_mode = COMBINE_INTEN_A_INDEXED;
+          break;
+
+        case GIMP_INDEXEDA_IMAGE:
+          colormap         = gimp_image_get_colormap (image),
+          initial_mode     = INITIAL_INDEXED_ALPHA;
+          combination_mode = COMBINE_INTEN_A_INDEXED_A;
+         break;
+
+        default:
+          g_assert_not_reached ();
+          break;
+        }
+
+      if (combine)
+        {
+          combine_regions (projPR, &srcPR, projPR, mask_pr,
+                           colormap,
+                           gimp_layer_get_opacity (layer) * 255.999,
+                           gimp_layer_get_mode (layer),
+                           image->visible,
+                           combination_mode);
+        }
+      else
+        {
+          initial_region (&srcPR, projPR, mask_pr,
+                          colormap,
+                          gimp_layer_get_opacity (layer) * 255.999,
+                          gimp_layer_get_mode (layer),
+                          image->visible,
+                          initial_mode);
+        }
+    }
+}

Added: trunk/app/core/gimplayer-project.h
==============================================================================
--- (empty file)
+++ trunk/app/core/gimplayer-project.h	Sat Nov  8 00:16:40 2008
@@ -0,0 +1,34 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimplayer-project.h
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GIMP_LAYER_PROJECT_H__
+#define __GIMP_LAYER_PROJECT_H__
+
+
+void   gimp_layer_project_region (GimpDrawable *drawable,
+                                  gint          x,
+                                  gint          y,
+                                  gint          width,
+                                  gint          height,
+                                  PixelRegion  *projPR,
+                                  gboolean      combine);
+
+
+#endif /* __GIMP_LAYER_PROJECT_H__ */

Modified: trunk/app/core/gimplayer.c
==============================================================================
--- trunk/app/core/gimplayer.c	(original)
+++ trunk/app/core/gimplayer.c	Sat Nov  8 00:16:40 2008
@@ -46,6 +46,7 @@
 #include "gimpimage.h"
 #include "gimplayer-floating-sel.h"
 #include "gimplayer.h"
+#include "gimplayer-project.h"
 #include "gimplayermask.h"
 #include "gimpmarshal.h"
 #include "gimppickable.h"
@@ -275,6 +276,7 @@
   drawable_class->estimate_memsize      = gimp_layer_estimate_memsize;
   drawable_class->invalidate_boundary   = gimp_layer_invalidate_boundary;
   drawable_class->get_active_components = gimp_layer_get_active_components;
+  drawable_class->project_region        = gimp_layer_project_region;
   drawable_class->set_tiles             = gimp_layer_set_tiles;
 
   klass->opacity_changed              = NULL;

Modified: trunk/app/core/gimpprojectable.c
==============================================================================
--- trunk/app/core/gimpprojectable.c	(original)
+++ trunk/app/core/gimpprojectable.c	Sat Nov  8 00:16:40 2008
@@ -242,33 +242,3 @@
 
   return NULL;
 }
-
-gboolean *
-gimp_projectable_get_components (GimpProjectable *projectable)
-{
-  GimpProjectableInterface *iface;
-
-  g_return_val_if_fail (GIMP_IS_PROJECTABLE (projectable), NULL);
-
-  iface = GIMP_PROJECTABLE_GET_INTERFACE (projectable);
-
-  if (iface->get_components)
-    return iface->get_components (projectable);
-
-  return NULL;
-}
-
-const guchar *
-gimp_projectable_get_colormap (GimpProjectable *projectable)
-{
-  GimpProjectableInterface *iface;
-
-  g_return_val_if_fail (GIMP_IS_PROJECTABLE (projectable), NULL);
-
-  iface = GIMP_PROJECTABLE_GET_INTERFACE (projectable);
-
-  if (iface->get_colormap)
-    return iface->get_colormap (projectable);
-
-  return NULL;
-}

Modified: trunk/app/core/gimpprojectable.h
==============================================================================
--- trunk/app/core/gimpprojectable.h	(original)
+++ trunk/app/core/gimpprojectable.h	Sat Nov  8 00:16:40 2008
@@ -56,8 +56,6 @@
   /*  legacy API virtual functions  */
   GList        * (* get_layers)         (GimpProjectable *projectable);
   GList        * (* get_channels)       (GimpProjectable *projectable);
-  gboolean     * (* get_components)     (GimpProjectable *projectable);
-  const guchar * (* get_colormap)       (GimpProjectable *projectable);
 };
 
 
@@ -82,8 +80,6 @@
 /*  legacy API  */
 GList        * gimp_projectable_get_layers         (GimpProjectable *projectable);
 GList        * gimp_projectable_get_channels       (GimpProjectable *projectable);
-gboolean     * gimp_projectable_get_components     (GimpProjectable *projectable);
-const guchar * gimp_projectable_get_colormap       (GimpProjectable *projectable);
 
 
 #endif  /* __GIMP_PROJECTABLE_H__ */

Modified: trunk/app/core/gimpprojection-construct.c
==============================================================================
--- trunk/app/core/gimpprojection-construct.c	(original)
+++ trunk/app/core/gimpprojection-construct.c	Sat Nov  8 00:16:40 2008
@@ -20,8 +20,6 @@
 
 #include <gegl.h>
 
-#include "libgimpcolor/gimpcolor.h"
-
 #include "core-types.h"
 
 #include "base/pixel-region.h"
@@ -31,7 +29,6 @@
 
 #include "gimplayer.h"
 #include "gimplayer-floating-sel.h"
-#include "gimplayermask.h"
 #include "gimppickable.h"
 #include "gimpprojectable.h"
 #include "gimpprojection.h"
@@ -40,51 +37,22 @@
 
 /*  local function prototypes  */
 
-static void   gimp_projection_construct_gegl     (GimpProjection *proj,
-                                                  gint            x,
-                                                  gint            y,
-                                                  gint            w,
-                                                  gint            h);
-static void   gimp_projection_construct_layers   (GimpProjection *proj,
-                                                  gint            x,
-                                                  gint            y,
-                                                  gint            w,
-                                                  gint            h);
-static void   gimp_projection_construct_channels (GimpProjection *proj,
-                                                  gint            x,
-                                                  gint            y,
-                                                  gint            w,
-                                                  gint            h);
-static void   gimp_projection_initialize         (GimpProjection *proj,
-                                                  gint            x,
-                                                  gint            y,
-                                                  gint            w,
-                                                  gint            h);
-
-static void   project_intensity                  (GimpProjection *proj,
-                                                  GimpLayer      *layer,
-                                                  PixelRegion    *src,
-                                                  PixelRegion    *dest,
-                                                  PixelRegion    *mask);
-static void   project_intensity_alpha            (GimpProjection *proj,
-                                                  GimpLayer      *layer,
-                                                  PixelRegion    *src,
-                                                  PixelRegion    *dest,
-                                                  PixelRegion    *mask);
-static void   project_indexed                    (GimpProjection *proj,
-                                                  GimpLayer      *layer,
-                                                  PixelRegion    *src,
-                                                  PixelRegion    *dest,
-                                                  PixelRegion    *mask);
-static void   project_indexed_alpha              (GimpProjection *proj,
-                                                  GimpLayer      *layer,
-                                                  PixelRegion    *src,
-                                                  PixelRegion    *dest,
-                                                  PixelRegion    *mask);
-static void   project_channel                    (GimpProjection *proj,
-                                                  GimpChannel    *channel,
-                                                  PixelRegion    *src,
-                                                  PixelRegion    *src2);
+static void   gimp_projection_construct_gegl   (GimpProjection *proj,
+                                                gint            x,
+                                                gint            y,
+                                                gint            w,
+                                                gint            h);
+static void   gimp_projection_construct_legacy (GimpProjection *proj,
+                                                gboolean        with_layers,
+                                                gint            x,
+                                                gint            y,
+                                                gint            w,
+                                                gint            h);
+static void   gimp_projection_initialize       (GimpProjection *proj,
+                                                gint            x,
+                                                gint            y,
+                                                gint            w,
+                                                gint            h);
 
 
 /*  public functions  */
@@ -137,7 +105,7 @@
 
           proj->construct_flag = TRUE;
 
-          gimp_projection_construct_channels (proj, x, y, w, h);
+          gimp_projection_construct_legacy (proj, FALSE, x, y, w, h);
 
           return;
         }
@@ -162,8 +130,7 @@
     {
       proj->construct_flag = FALSE;
 
-      gimp_projection_construct_layers (proj, x, y, w, h);
-      gimp_projection_construct_channels (proj, x, y, w, h);
+      gimp_projection_construct_legacy (proj, TRUE, x, y, w, h);
     }
 }
 
@@ -196,170 +163,78 @@
 }
 
 static void
-gimp_projection_construct_layers (GimpProjection *proj,
+gimp_projection_construct_legacy (GimpProjection *proj,
+                                  gboolean        with_layers,
                                   gint            x,
                                   gint            y,
                                   gint            w,
                                   gint            h)
 {
-  GimpLayer *layer;
-  GList     *list;
-  GList     *reverse_list = NULL;
-  gint       x1, y1, x2, y2;
-  gint       off_x;
-  gint       off_y;
+  GList *list;
+  GList *reverse_list = NULL;
 
-  for (list = gimp_projectable_get_layers (proj->projectable);
+  for (list = gimp_projectable_get_channels (proj->projectable);
        list;
        list = g_list_next (list))
     {
-      layer = list->data;
-
-      if (gimp_layer_is_floating_sel (layer))
+      if (gimp_item_get_visible (GIMP_ITEM (list->data)))
         {
-          /*  composite the floating selection if it exists
-           */
-          floating_sel_composite (layer, x, y, w, h, FALSE);
-        }
-      else if (gimp_item_get_visible (GIMP_ITEM (layer)))
-        {
-          /*  only add layers that are visible and not floating selections
-           *  to the list
-           */
-          reverse_list = g_list_prepend (reverse_list, layer);
+          reverse_list = g_list_prepend (reverse_list, list->data);
         }
     }
 
-  for (list = reverse_list; list; list = g_list_next (list))
+  if (with_layers)
     {
-      GimpLayerMask *mask;
-      PixelRegion    src1PR;
-      PixelRegion    src2PR;
-      PixelRegion    maskPR;
-
-      layer = list->data;
-      mask  = gimp_layer_get_mask (layer);
-
-      gimp_item_get_offset (GIMP_ITEM (layer), &off_x, &off_y);
-
-      x1 = CLAMP (off_x, x, x + w);
-      y1 = CLAMP (off_y, y, y + h);
-      x2 = CLAMP (off_x + gimp_item_get_width  (GIMP_ITEM (layer)), x, x + w);
-      y2 = CLAMP (off_y + gimp_item_get_height (GIMP_ITEM (layer)), y, y + h);
-
-      /* configure the pixel regions  */
-      pixel_region_init (&src1PR,
-                         gimp_pickable_get_tiles (GIMP_PICKABLE (proj)),
-                         x1, y1, (x2 - x1), (y2 - y1),
-                         TRUE);
-
-      /*  If we're showing the layer mask instead of the layer...  */
-      if (mask && gimp_layer_mask_get_show (mask))
-        {
-          pixel_region_init (&src2PR,
-                             gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
-                             x1 - off_x, y1 - off_y,
-                             x2 - x1,    y2 - y1,
-                             FALSE);
-
-          copy_gray_to_region (&src2PR, &src1PR);
-        }
-      /*  Otherwise, normal  */
-      else
+      for (list = gimp_projectable_get_layers (proj->projectable);
+           list;
+           list = g_list_next (list))
         {
-          PixelRegion *mask_pr = NULL;
-
-          pixel_region_init (&src2PR,
-                             gimp_drawable_get_tiles (GIMP_DRAWABLE (layer)),
-                             x1 - off_x, y1 - off_y,
-                             x2 - x1,    y2 - y1,
-                             FALSE);
+          GimpLayer *layer = list->data;
 
-          if (mask && gimp_layer_mask_get_apply (mask))
+          if (gimp_layer_is_floating_sel (layer))
             {
-              pixel_region_init (&maskPR,
-                                 gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
-                                 x1 - off_x, y1 - off_y,
-                                 x2 - x1,    y2 - y1,
-                                 FALSE);
-              mask_pr = &maskPR;
+              /*  composite the floating selection if it exists
+               */
+              floating_sel_composite (layer, x, y, w, h, FALSE);
             }
-
-          /*  Based on the type of the layer, project the layer onto the
-           *  projection image...
-           */
-          switch (gimp_drawable_type (GIMP_DRAWABLE (layer)))
+          else if (gimp_item_get_visible (GIMP_ITEM (layer)))
             {
-            case GIMP_RGB_IMAGE:
-            case GIMP_GRAY_IMAGE:
-              project_intensity (proj, layer, &src2PR, &src1PR, mask_pr);
-              break;
-
-            case GIMP_RGBA_IMAGE:
-            case GIMP_GRAYA_IMAGE:
-              project_intensity_alpha (proj, layer, &src2PR, &src1PR, mask_pr);
-              break;
-
-            case GIMP_INDEXED_IMAGE:
-              project_indexed (proj, layer, &src2PR, &src1PR, mask_pr);
-              break;
-
-            case GIMP_INDEXEDA_IMAGE:
-              project_indexed_alpha (proj, layer, &src2PR, &src1PR, mask_pr);
-              break;
-
-            default:
-              break;
+              /*  only add layers that are visible and not floating selections
+               *  to the list
+               */
+              reverse_list = g_list_prepend (reverse_list, layer);
             }
         }
-
-      proj->construct_flag = TRUE;  /*  something was projected  */
-    }
-
-  g_list_free (reverse_list);
-}
-
-static void
-gimp_projection_construct_channels (GimpProjection *proj,
-                                    gint            x,
-                                    gint            y,
-                                    gint            w,
-                                    gint            h)
-{
-  GList *list;
-  GList *reverse_list = NULL;
-
-  /*  reverse the channel list  */
-  for (list = gimp_projectable_get_channels (proj->projectable);
-       list;
-       list = g_list_next (list))
-    {
-      reverse_list = g_list_prepend (reverse_list, list->data);
     }
 
   for (list = reverse_list; list; list = g_list_next (list))
     {
-      GimpChannel *channel = list->data;
+      GimpItem    *item = list->data;
+      PixelRegion  projPR;
+      gint         x1, y1;
+      gint         x2, y2;
+      gint         off_x;
+      gint         off_y;
 
-      if (gimp_item_get_visible (GIMP_ITEM (channel)))
-        {
-          PixelRegion  src1PR;
-          PixelRegion  src2PR;
+      gimp_item_get_offset (item, &off_x, &off_y);
 
-          /* configure the pixel regions  */
-          pixel_region_init (&src1PR,
-                             gimp_pickable_get_tiles (GIMP_PICKABLE (proj)),
-                             x, y, w, h,
-                             TRUE);
-          pixel_region_init (&src2PR,
-                             gimp_drawable_get_tiles (GIMP_DRAWABLE (channel)),
-                             x, y, w, h,
-                             FALSE);
+      x1 = CLAMP (off_x,                               x, x + w);
+      y1 = CLAMP (off_y,                               y, y + h);
+      x2 = CLAMP (off_x + gimp_item_get_width  (item), x, x + w);
+      y2 = CLAMP (off_y + gimp_item_get_height (item), y, y + h);
 
-          project_channel (proj, channel, &src1PR, &src2PR);
+      pixel_region_init (&projPR,
+                         gimp_pickable_get_tiles (GIMP_PICKABLE (proj)),
+                         x1, y1, x2 - x1, y2 - y1,
+                         TRUE);
 
-          proj->construct_flag = TRUE;
-        }
+      gimp_drawable_project_region (GIMP_DRAWABLE (item),
+                                    x1 - off_x, y1 - off_y,
+                                    x2 - x1,    y2 - y1,
+                                    &projPR,
+                                    proj->construct_flag);
+
+      proj->construct_flag = TRUE;  /*  something was projected  */
     }
 
   g_list_free (reverse_list);
@@ -423,141 +298,3 @@
       clear_region (&region);
     }
 }
-
-static void
-project_intensity (GimpProjection *proj,
-                   GimpLayer      *layer,
-                   PixelRegion    *src,
-                   PixelRegion    *dest,
-                   PixelRegion    *mask)
-{
-  if (proj->construct_flag)
-    {
-      combine_regions (dest, src, dest, mask, NULL,
-                       gimp_layer_get_opacity (layer) * 255.999,
-                       gimp_layer_get_mode (layer),
-                       gimp_projectable_get_components (proj->projectable),
-                       COMBINE_INTEN_A_INTEN);
-    }
-  else
-    {
-      initial_region (src, dest, mask, NULL,
-                      gimp_layer_get_opacity (layer) * 255.999,
-                      gimp_layer_get_mode (layer),
-                      gimp_projectable_get_components (proj->projectable),
-                      INITIAL_INTENSITY);
-    }
-}
-
-static void
-project_intensity_alpha (GimpProjection *proj,
-                         GimpLayer      *layer,
-                         PixelRegion    *src,
-                         PixelRegion    *dest,
-                         PixelRegion    *mask)
-{
-  if (proj->construct_flag)
-    {
-      combine_regions (dest, src, dest, mask, NULL,
-                       gimp_layer_get_opacity (layer) * 255.999,
-                       gimp_layer_get_mode (layer),
-                       gimp_projectable_get_components (proj->projectable),
-                       COMBINE_INTEN_A_INTEN_A);
-    }
-  else
-    {
-      initial_region (src, dest, mask, NULL,
-                      gimp_layer_get_opacity (layer) * 255.999,
-                      gimp_layer_get_mode (layer),
-                      gimp_projectable_get_components (proj->projectable),
-                      INITIAL_INTENSITY_ALPHA);
-    }
-}
-
-static void
-project_indexed (GimpProjection *proj,
-                 GimpLayer      *layer,
-                 PixelRegion    *src,
-                 PixelRegion    *dest,
-                 PixelRegion    *mask)
-{
-  if (proj->construct_flag)
-    {
-      combine_regions (dest, src, dest, mask,
-                       gimp_projectable_get_colormap (proj->projectable),
-                       gimp_layer_get_opacity (layer) * 255.999,
-                       gimp_layer_get_mode (layer),
-                       gimp_projectable_get_components (proj->projectable),
-                       COMBINE_INTEN_A_INDEXED);
-    }
-  else
-    {
-      initial_region (src, dest, mask,
-                      gimp_projectable_get_colormap (proj->projectable),
-                      gimp_layer_get_opacity (layer) * 255.999,
-                      gimp_layer_get_mode (layer),
-                      gimp_projectable_get_components (proj->projectable),
-                      INITIAL_INDEXED);
-    }
-}
-
-static void
-project_indexed_alpha (GimpProjection *proj,
-                       GimpLayer      *layer,
-                       PixelRegion    *src,
-                       PixelRegion    *dest,
-                       PixelRegion    *mask)
-{
-  if (proj->construct_flag)
-    {
-      combine_regions (dest, src, dest, mask,
-                       gimp_projectable_get_colormap (proj->projectable),
-                       gimp_layer_get_opacity (layer) * 255.999,
-                       gimp_layer_get_mode (layer),
-                       gimp_projectable_get_components (proj->projectable),
-                       COMBINE_INTEN_A_INDEXED_A);
-    }
-  else
-    {
-      initial_region (src, dest, mask,
-                      gimp_projectable_get_colormap (proj->projectable),
-                      gimp_layer_get_opacity (layer) * 255.999,
-                      gimp_layer_get_mode (layer),
-                      gimp_projectable_get_components (proj->projectable),
-                      INITIAL_INDEXED_ALPHA);
-    }
-}
-
-static void
-project_channel (GimpProjection *proj,
-                 GimpChannel    *channel,
-                 PixelRegion    *src,
-                 PixelRegion    *src2)
-{
-  guchar col[3];
-  guchar opacity;
-
-  gimp_rgba_get_uchar (&channel->color,
-                       &col[0], &col[1], &col[2], &opacity);
-
-  if (proj->construct_flag)
-    {
-      combine_regions (src, src2, src, NULL, col,
-                       opacity,
-                       GIMP_NORMAL_MODE,
-                       NULL,
-                       (gimp_channel_get_show_masked (channel) ?
-                        COMBINE_INTEN_A_CHANNEL_MASK :
-                        COMBINE_INTEN_A_CHANNEL_SELECTION));
-    }
-  else
-    {
-      initial_region (src2, src, NULL, col,
-                      opacity,
-                      GIMP_NORMAL_MODE,
-                      NULL,
-                      (gimp_channel_get_show_masked (channel) ?
-                       INITIAL_CHANNEL_MASK :
-                       INITIAL_CHANNEL_SELECTION));
-    }
-}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]