From 4edf70f4f1002eea67e6c2599e12c19484f9b9e7 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Tue, 30 Jun 2015 12:34:46 +0200 Subject: [PATCH] app: add virtual function GimpItem::bounds() Which returns a boolean indicating if there is content at all, and the bounds as double x, y, width, height because for most use cases that's better than x1, y1, x2, y2. Wrap the method with two functions gimp_item_bounds() which returns integer bounds and gimp_item_bounds_f() which returns the original double bounds. --- app/core/gimpchannel.c | 26 ++++++++++++++ app/core/gimpitem.c | 71 +++++++++++++++++++++++++++++++++++++++ app/core/gimpitem.h | 16 +++++++++ app/vectors/gimpvectors.c | 26 ++++++++++++++ 4 files changed, 139 insertions(+) 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)