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.
This commit is contained in:
Emmanuele Bassi 2010-09-09 12:30:29 +01:00 committed by Robert Bragg
parent fd41024d29
commit 16f7ee13f2
5 changed files with 62 additions and 60 deletions

View File

@ -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

View File

@ -812,4 +812,50 @@ _clutter_paint_volume_axis_align (ClutterPaintVolume *pv)
pv->is_2d = FALSE;
}
/*<private>
* _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;
}

View File

@ -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 */

View File

@ -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

View File

@ -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