From 2af860e6a638099d46f71d62445c575f96b6513a Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Sat, 12 Sep 2009 19:24:01 +0200 Subject: [PATCH] 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 52aa62fadc..190b87f8c7 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 ce40c77221..05c0e9f245 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 e732391bc2..b9a05ff508 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 2ccf34d2b9..5c3ec70d1e 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 8bf6a364d9..4eace41aec 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: