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().
This commit is contained in:
parent
8794d2481a
commit
2af860e6a6
5 changed files with 56 additions and 20 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in a new issue