From 16f7ee13f2efb545d7cfd33774f42bab92f0e1e6 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 9 Sep 2010 12:30:29 +0100 Subject: [PATCH] Move default paint volume computation into a function This should reduce the amount of copy and paste for actor sub-classes that use the default paint volume from the allocation. --- clutter/clutter-cairo-texture.c | 24 +++-------------- clutter/clutter-paint-volume.c | 46 +++++++++++++++++++++++++++++++++ clutter/clutter-private.h | 4 +++ clutter/clutter-rectangle.c | 24 +++-------------- clutter/clutter-texture.c | 24 +++-------------- 5 files changed, 62 insertions(+), 60 deletions(-) diff --git a/clutter/clutter-cairo-texture.c b/clutter/clutter-cairo-texture.c index 849e3f3f5..7c941ab0c 100644 --- a/clutter/clutter-cairo-texture.c +++ b/clutter/clutter-cairo-texture.c @@ -367,28 +367,12 @@ clutter_cairo_texture_get_preferred_height (ClutterActor *actor, } static gboolean -clutter_cairo_texture_get_paint_volume (ClutterActor *self, +clutter_cairo_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume) { - ClutterGeometry allocation; - - /* XXX: we are being conservative here and not making assumptions - * that sub-classes won't paint outside their allocation. */ - if (G_OBJECT_TYPE (self) != CLUTTER_TYPE_CAIRO_TEXTURE) - return FALSE; - - /* XXX: clutter_actor_get_allocation can potentially be very - * expensive to call if called while the actor doesn't have a valid - * allocation since it will trigger a synchronous relayout of the - * scenegraph. We explicitly check we have a valid allocation - * to avoid hitting that codepath. */ - if (!clutter_actor_has_allocation (self)) - return FALSE; - - clutter_actor_get_allocation_geometry (self, &allocation); - clutter_paint_volume_set_width (volume, allocation.width); - clutter_paint_volume_set_height (volume, allocation.height); - return TRUE; + return _clutter_actor_set_default_paint_volume (self, + CLUTTER_TYPE_CAIRO_TEXTURE, + volume); } static void diff --git a/clutter/clutter-paint-volume.c b/clutter/clutter-paint-volume.c index 1fa285598..c770691dd 100644 --- a/clutter/clutter-paint-volume.c +++ b/clutter/clutter-paint-volume.c @@ -812,4 +812,50 @@ _clutter_paint_volume_axis_align (ClutterPaintVolume *pv) pv->is_2d = FALSE; } +/* + * _clutter_actor_set_default_paint_volume: + * @self: a #ClutterActor + * @check_gtype: if not %G_TYPE_INVALID, match the type of @self against + * this type + * @volume: the #ClutterPaintVolume to set + * + * Sets the default paint volume for @self. + * + * This function should be called by #ClutterActor sub-classes that follow + * the default assumption that their paint volume is defined by their + * allocation. + * + * If @check_gtype is not %G_TYPE_INVALID, this function will check the + * type of @self and only compute the paint volume if the type matches; + * this can be used to avoid computing the paint volume for sub-classes + * of an actor class + * + * Return value: %TRUE if the paint volume was set, and %FALSE otherwise + */ +gboolean +_clutter_actor_set_default_paint_volume (ClutterActor *self, + GType check_gtype, + ClutterPaintVolume *volume) +{ + ClutterGeometry geometry = { 0, }; + if (check_gtype != G_TYPE_INVALID) + { + if (G_OBJECT_TYPE (self) != check_gtype) + return FALSE; + } + + /* calling clutter_actor_get_allocation_* can potentially be very + * expensive, as it can result in a synchronous full stage relayout + * and redraw + */ + if (!clutter_actor_has_allocation (self)) + return FALSE; + + clutter_actor_get_allocation_geometry (self, &geometry); + + clutter_paint_volume_set_width (volume, geometry.width); + clutter_paint_volume_set_height (volume, geometry.height); + + return TRUE; +} diff --git a/clutter/clutter-private.h b/clutter/clutter-private.h index 5d53e089c..1064cecfc 100644 --- a/clutter/clutter-private.h +++ b/clutter/clutter-private.h @@ -530,6 +530,10 @@ void _clutter_util_fully_transform_vertices (const CoglMatrix *mo ClutterVertex *vertices_out, int n_vertices); +gboolean _clutter_actor_set_default_paint_volume (ClutterActor *self, + GType check_gtype, + ClutterPaintVolume *volume); + G_END_DECLS #endif /* _HAVE_CLUTTER_PRIVATE_H */ diff --git a/clutter/clutter-rectangle.c b/clutter/clutter-rectangle.c index c0fd30a6d..64ba03ef9 100644 --- a/clutter/clutter-rectangle.c +++ b/clutter/clutter-rectangle.c @@ -153,28 +153,12 @@ clutter_rectangle_paint (ClutterActor *self) } static gboolean -clutter_rectangle_get_paint_volume (ClutterActor *self, +clutter_rectangle_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume) { - ClutterGeometry allocation; - - /* XXX: we are being conservative here and not making assumptions - * that sub-classes won't paint outside their allocation. */ - if (G_OBJECT_TYPE (self) != CLUTTER_TYPE_RECTANGLE) - return FALSE; - - /* XXX: clutter_actor_get_allocation can potentially be very - * expensive to call if called while the actor doesn't have a valid - * allocation since it will trigger a synchronous relayout of the - * scenegraph. We explicitly check we have a valid allocation - * to avoid hitting that codepath. */ - if (!clutter_actor_has_allocation (self)) - return FALSE; - - clutter_actor_get_allocation_geometry (self, &allocation); - clutter_paint_volume_set_width (volume, allocation.width); - clutter_paint_volume_set_height (volume, allocation.height); - return TRUE; + return _clutter_actor_set_default_paint_volume (self, + CLUTTER_TYPE_RECTANGLE, + volume); } static void diff --git a/clutter/clutter-texture.c b/clutter/clutter-texture.c index 0630fb872..5e48faf9a 100644 --- a/clutter/clutter-texture.c +++ b/clutter/clutter-texture.c @@ -686,28 +686,12 @@ clutter_texture_paint (ClutterActor *self) } static gboolean -clutter_texture_get_paint_volume (ClutterActor *self, +clutter_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume) { - ClutterGeometry allocation; - - /* XXX: we are being conservative here and not making assumptions - * that sub-classes won't paint outside their allocation. */ - if (G_OBJECT_TYPE (self) != CLUTTER_TYPE_TEXTURE) - return FALSE; - - /* XXX: clutter_actor_get_allocation can potentially be very - * expensive to call if called while the actor doesn't have a valid - * allocation since it will trigger a synchronous relayout of the - * scenegraph. We explicitly check we have a valid allocation - * to avoid hitting that codepath. */ - if (!clutter_actor_has_allocation (self)) - return FALSE; - - clutter_actor_get_allocation_geometry (self, &allocation); - clutter_paint_volume_set_width (volume, allocation.width); - clutter_paint_volume_set_height (volume, allocation.height); - return TRUE; + return _clutter_actor_set_default_paint_volume (self, + CLUTTER_TYPE_TEXTURE, + volume); } static void