[gimp] Add GimpProjectable::get_image_type()



commit 2af860e6a638099d46f71d62445c575f96b6513a
Author: Michael Natterer <mitch gimp org>
Date:   Sat Sep 12 19:24:01 2009 +0200

    Add GimpProjectable::get_image_type()
    
    Needed because a group layer's projection can have a different type
    than its image, at least at some pathologic moment during image type
    conversion. But even if it didn't, it's cleaner this way anyway.
    
    * app/core/gimpprojectable.[ch]: add the new vfunc plus public API.
    
    * app/core/gimpprojection.c: use it instead of using the type of the
      image returned by gimp_projectable_get_image(). The get_image()
      function is now unused in the projection and only needs to stay
      because the projection is also a GimpPickable.
    
    * app/core/gimpgrouplayer.c: implement GimpProjectable::get_image_type().

 app/core/gimpgrouplayer.c  |    1 +
 app/core/gimpimage.c       |   13 +++++++++++++
 app/core/gimpprojectable.c |   15 +++++++++++++++
 app/core/gimpprojectable.h |   40 +++++++++++++++++++++-------------------
 app/core/gimpprojection.c  |    7 ++++++-
 5 files changed, 56 insertions(+), 20 deletions(-)
---
diff --git a/app/core/gimpgrouplayer.c b/app/core/gimpgrouplayer.c
index 52aa62f..190b87f 100644
--- a/app/core/gimpgrouplayer.c
+++ b/app/core/gimpgrouplayer.c
@@ -191,6 +191,7 @@ static void
 gimp_projectable_iface_init (GimpProjectableInterface *iface)
 {
   iface->get_image          = (GimpImage * (*) (GimpProjectable *)) gimp_item_get_image;
+  iface->get_image_type     = (GimpImageType (*) (GimpProjectable *)) gimp_drawable_type;
   iface->get_offset         = (void (*) (GimpProjectable*, gint*, gint*)) gimp_item_get_offset;
   iface->get_size           = (void (*) (GimpProjectable*, gint*, gint*)) gimp_viewable_get_size;
   iface->get_graph          = gimp_group_layer_get_graph;
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index ce40c77..05c0e9f 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -167,6 +167,7 @@ static void        gimp_image_projectable_flush  (GimpProjectable   *projectable
                                                   gboolean           invalidate_preview);
 static GeglNode     * gimp_image_get_graph       (GimpProjectable   *projectable);
 static GimpImage    * gimp_image_get_image       (GimpProjectable   *projectable);
+static GimpImageType  gimp_image_get_image_type  (GimpProjectable   *projectable);
 
 static void     gimp_image_mask_update           (GimpDrawable      *drawable,
                                                   gint               x,
@@ -568,6 +569,7 @@ gimp_projectable_iface_init (GimpProjectableInterface *iface)
 {
   iface->flush              = gimp_image_projectable_flush;
   iface->get_image          = gimp_image_get_image;
+  iface->get_image_type     = gimp_image_get_image_type;
   iface->get_size           = (void (*) (GimpProjectable*, gint*, gint*)) gimp_image_get_size;
   iface->get_graph          = gimp_image_get_graph;
   iface->invalidate_preview = (void (*) (GimpProjectable*)) gimp_viewable_invalidate_preview;
@@ -1212,6 +1214,17 @@ gimp_image_get_image (GimpProjectable *projectable)
   return GIMP_IMAGE (projectable);
 }
 
+static GimpImageType
+gimp_image_get_image_type (GimpProjectable *projectable)
+{
+  GimpImage     *image = GIMP_IMAGE (projectable);
+  GimpImageType  type;
+
+  type = GIMP_IMAGE_TYPE_FROM_BASE_TYPE (image->base_type);
+
+  return GIMP_IMAGE_TYPE_WITH_ALPHA (type);
+}
+
 static GeglNode *
 gimp_image_get_graph (GimpProjectable *projectable)
 {
diff --git a/app/core/gimpprojectable.c b/app/core/gimpprojectable.c
index e732391..b9a05ff 100644
--- a/app/core/gimpprojectable.c
+++ b/app/core/gimpprojectable.c
@@ -164,6 +164,21 @@ gimp_projectable_get_image (GimpProjectable *projectable)
   return NULL;
 }
 
+GimpImageType
+gimp_projectable_get_image_type (GimpProjectable *projectable)
+{
+  GimpProjectableInterface *iface;
+
+  g_return_val_if_fail (GIMP_IS_PROJECTABLE (projectable), 0);
+
+  iface = GIMP_PROJECTABLE_GET_INTERFACE (projectable);
+
+  if (iface->get_image_type)
+    return iface->get_image_type (projectable);
+
+  return 0;
+}
+
 void
 gimp_projectable_get_offset (GimpProjectable *projectable,
                              gint            *x,
diff --git a/app/core/gimpprojectable.h b/app/core/gimpprojectable.h
index 2ccf34d..5c3ec70 100644
--- a/app/core/gimpprojectable.h
+++ b/app/core/gimpprojectable.h
@@ -35,29 +35,30 @@ struct _GimpProjectableInterface
   GTypeInterface base_iface;
 
   /*  signals  */
-  void           (* invalidate)         (GimpProjectable *projectable,
-                                         gint             x,
-                                         gint             y,
-                                         gint             width,
-                                         gint             height);
-  void           (* flush)              (GimpProjectable *projectable,
-                                         gboolean         invalidate_preview);
-  void           (* structure_changed)  (GimpProjectable *projectable);
+  void            (* invalidate)         (GimpProjectable *projectable,
+                                          gint             x,
+                                          gint             y,
+                                          gint             width,
+                                          gint             height);
+  void            (* flush)              (GimpProjectable *projectable,
+                                          gboolean         invalidate_preview);
+  void            (* structure_changed)  (GimpProjectable *projectable);
 
   /*  virtual functions  */
-  GimpImage    * (* get_image)          (GimpProjectable *projectable);
-  void           (* get_offset)         (GimpProjectable *projectable,
-                                         gint            *x,
-                                         gint            *y);
-  void           (* get_size)           (GimpProjectable *projectable,
-                                         gint            *width,
-                                         gint            *height);
-  GeglNode     * (* get_graph)          (GimpProjectable *projectable);
-  void           (* invalidate_preview) (GimpProjectable *projectable);
+  GimpImage     * (* get_image)          (GimpProjectable *projectable);
+  GimpImageType   (* get_image_type)     (GimpProjectable *projectable);
+  void            (* get_offset)         (GimpProjectable *projectable,
+                                          gint            *x,
+                                          gint            *y);
+  void            (* get_size)           (GimpProjectable *projectable,
+                                          gint            *width,
+                                          gint            *height);
+  GeglNode      * (* get_graph)          (GimpProjectable *projectable);
+  void            (* invalidate_preview) (GimpProjectable *projectable);
 
   /*  legacy API virtual functions  */
-  GList        * (* get_layers)         (GimpProjectable *projectable);
-  GList        * (* get_channels)       (GimpProjectable *projectable);
+  GList         * (* get_layers)         (GimpProjectable *projectable);
+  GList         * (* get_channels)       (GimpProjectable *projectable);
 };
 
 
@@ -73,6 +74,7 @@ void           gimp_projectable_flush              (GimpProjectable *projectable
 void           gimp_projectable_structure_changed  (GimpProjectable *projectable);
 
 GimpImage    * gimp_projectable_get_image          (GimpProjectable *projectable);
+GimpImageType  gimp_projectable_get_image_type     (GimpProjectable *projectable);
 void           gimp_projectable_get_offset         (GimpProjectable *projectable,
                                                     gint            *x,
                                                     gint            *y);
diff --git a/app/core/gimpprojection.c b/app/core/gimpprojection.c
index 8bf6a36..4eace41 100644
--- a/app/core/gimpprojection.c
+++ b/app/core/gimpprojection.c
@@ -283,7 +283,12 @@ gimp_projection_get_image (GimpPickable *pickable)
 static GimpImageType
 gimp_projection_get_image_type (GimpPickable *pickable)
 {
-  switch (gimp_image_base_type (gimp_projection_get_image (pickable)))
+  GimpProjection *proj = GIMP_PROJECTION (pickable);
+  GimpImageType   type;
+
+  type = gimp_projectable_get_image_type (proj->projectable);
+
+  switch (GIMP_IMAGE_TYPE_BASE_TYPE (type))
     {
     case GIMP_RGB:
     case GIMP_INDEXED:



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