diff --git a/app/core/gimpchannel.c b/app/core/gimpchannel.c index 1b94ba08d0..c481a352d0 100644 --- a/app/core/gimpchannel.c +++ b/app/core/gimpchannel.c @@ -77,6 +77,11 @@ static GeglNode * gimp_channel_get_node (GimpFilter *filter); static gboolean gimp_channel_is_attached (const GimpItem *item); static GimpItemTree * gimp_channel_get_tree (GimpItem *item); +static gboolean gimp_channel_item_bounds (GimpItem *item, + gdouble *x, + gdouble *y, + gdouble *width, + gdouble *height); static GimpItem * gimp_channel_duplicate (GimpItem *item, GType new_type); static void gimp_channel_convert (GimpItem *item, @@ -262,6 +267,7 @@ gimp_channel_class_init (GimpChannelClass *klass) item_class->is_attached = gimp_channel_is_attached; item_class->get_tree = gimp_channel_get_tree; + item_class->bounds = gimp_channel_item_bounds; item_class->duplicate = gimp_channel_duplicate; item_class->convert = gimp_channel_convert; item_class->translate = gimp_channel_translate; @@ -481,6 +487,26 @@ gimp_channel_get_tree (GimpItem *item) return NULL; } +static gboolean +gimp_channel_item_bounds (GimpItem *item, + gdouble *x, + gdouble *y, + gdouble *width, + gdouble *height) +{ + gint x1, y1, x2, y2; + gdouble retval; + + retval = gimp_channel_bounds (GIMP_CHANNEL (item), &x1, &y1, &x2, &y2); + + *x = x1; + *y = y1; + *width = x2 - x1; + *height = y2 - y1; + + return retval; +} + static GimpItem * gimp_channel_duplicate (GimpItem *item, GType new_type) diff --git a/app/core/gimpitem.c b/app/core/gimpitem.c index 1b6cb35e70..3f4a5035ab 100644 --- a/app/core/gimpitem.c +++ b/app/core/gimpitem.c @@ -125,6 +125,11 @@ static void gimp_item_real_visibility_changed (GimpItem *item); static gboolean gimp_item_real_is_content_locked (const GimpItem *item); static gboolean gimp_item_real_is_position_locked (const GimpItem *item); +static gboolean gimp_item_real_bounds (GimpItem *item, + gdouble *x, + gdouble *y, + gdouble *width, + gdouble *height); static GimpItem * gimp_item_real_duplicate (GimpItem *item, GType new_type); static void gimp_item_real_convert (GimpItem *item, @@ -232,6 +237,7 @@ gimp_item_class_init (GimpItemClass *klass) klass->is_content_locked = gimp_item_real_is_content_locked; klass->is_position_locked = gimp_item_real_is_position_locked; klass->get_tree = NULL; + klass->bounds = gimp_item_real_bounds; klass->duplicate = gimp_item_real_duplicate; klass->convert = gimp_item_real_convert; klass->rename = gimp_item_real_rename; @@ -494,6 +500,23 @@ gimp_item_real_is_position_locked (const GimpItem *item) return GET_PRIVATE (item)->lock_position; } +static gboolean +gimp_item_real_bounds (GimpItem *item, + gdouble *x, + gdouble *y, + gdouble *width, + gdouble *height) +{ + GimpItemPrivate *private = GET_PRIVATE (item); + + *x = 0; + *y = 0; + *width = private->width; + *height = private->height; + + return TRUE; +} + static GimpItem * gimp_item_real_duplicate (GimpItem *item, GType new_type) @@ -882,6 +905,54 @@ gimp_item_get_path (GimpItem *item) return path; } +gboolean +gimp_item_bounds (GimpItem *item, + gint *x, + gint *y, + gint *width, + gint *height) +{ + gdouble tmp_x, tmp_y, tmp_width, tmp_height; + gboolean retval; + + g_return_val_if_fail (GIMP_IS_ITEM (item), FALSE); + + retval = GIMP_ITEM_GET_CLASS (item)->bounds (item, + &tmp_x, &tmp_y, + &tmp_width, &tmp_height); + + if (x) *x = floor (tmp_x); + if (y) *y = floor (tmp_y); + if (width) *width = ceil (tmp_x + tmp_width) - floor (tmp_x); + if (height) *height = ceil (tmp_y + tmp_height) - floor (tmp_y); + + return retval; +} + +gboolean +gimp_item_bounds_f (GimpItem *item, + gdouble *x, + gdouble *y, + gdouble *width, + gdouble *height) +{ + gdouble tmp_x, tmp_y, tmp_width, tmp_height; + gboolean retval; + + g_return_val_if_fail (GIMP_IS_ITEM (item), FALSE); + + retval = GIMP_ITEM_GET_CLASS (item)->bounds (item, + &tmp_x, &tmp_y, + &tmp_width, &tmp_height); + + if (x) *x = tmp_x; + if (y) *y = tmp_y; + if (width) *width = tmp_width; + if (height) *height = tmp_height; + + return retval; +} + /** * gimp_item_duplicate: * @item: The #GimpItem to duplicate. diff --git a/app/core/gimpitem.h b/app/core/gimpitem.h index a8ef1168c5..8a567d2736 100644 --- a/app/core/gimpitem.h +++ b/app/core/gimpitem.h @@ -54,6 +54,11 @@ struct _GimpItemClass gboolean (* is_content_locked) (const GimpItem *item); gboolean (* is_position_locked) (const GimpItem *item); GimpItemTree * (* get_tree) (GimpItem *item); + gboolean (* bounds) (GimpItem *item, + gdouble *x, + gdouble *y, + gdouble *width, + gdouble *height); GimpItem * (* duplicate) (GimpItem *item, GType new_type); void (* convert) (GimpItem *item, @@ -156,6 +161,17 @@ GList * gimp_item_get_container_iter (GimpItem *item); gint gimp_item_get_index (GimpItem *item); GList * gimp_item_get_path (GimpItem *item); +gboolean gimp_item_bounds (GimpItem *item, + gint *x, + gint *y, + gint *width, + gint *height); +gboolean gimp_item_bounds_f (GimpItem *item, + gdouble *x, + gdouble *y, + gdouble *width, + gdouble *height); + GimpItem * gimp_item_duplicate (GimpItem *item, GType new_type); GimpItem * gimp_item_convert (GimpItem *item, diff --git a/app/vectors/gimpvectors.c b/app/vectors/gimpvectors.c index 0adfd37302..048afa0eef 100644 --- a/app/vectors/gimpvectors.c +++ b/app/vectors/gimpvectors.c @@ -69,6 +69,11 @@ static gint64 gimp_vectors_get_memsize (GimpObject *object, static gboolean gimp_vectors_is_attached (const GimpItem *item); static GimpItemTree * gimp_vectors_get_tree (GimpItem *item); +static gboolean gimp_vectors_item_bounds (GimpItem *item, + gdouble *x, + gdouble *y, + gdouble *width, + gdouble *height); static GimpItem * gimp_vectors_duplicate (GimpItem *item, GType new_type); static void gimp_vectors_convert (GimpItem *item, @@ -194,6 +199,7 @@ gimp_vectors_class_init (GimpVectorsClass *klass) item_class->is_attached = gimp_vectors_is_attached; item_class->get_tree = gimp_vectors_get_tree; + item_class->bounds = gimp_vectors_item_bounds; item_class->duplicate = gimp_vectors_duplicate; item_class->convert = gimp_vectors_convert; item_class->translate = gimp_vectors_translate; @@ -316,6 +322,26 @@ gimp_vectors_get_tree (GimpItem *item) return NULL; } +static gboolean +gimp_vectors_item_bounds (GimpItem *item, + gdouble *x, + gdouble *y, + gdouble *width, + gdouble *height) +{ + gdouble x1, y1, x2, y2; + gdouble retval; + + retval = gimp_vectors_bounds (GIMP_VECTORS (item), &x1, &y1, &x2, &y2); + + *x = x1; + *y = y1; + *width = x2 - x1; + *height = y2 - y1; + + return retval; +} + static GimpItem * gimp_vectors_duplicate (GimpItem *item, GType new_type)