diff options
author | Emmanuele Bassi <ebassi@linux.intel.com> | 2011-10-31 11:53:45 +0000 |
---|---|---|
committer | Emmanuele Bassi <ebassi@linux.intel.com> | 2011-12-12 17:29:58 +0000 |
commit | f0a246cdc6f3ca35d409b82297d2a99c5e8c7b32 (patch) | |
tree | 87d36928d1d6866c62d2f528a57deba9f729a212 | |
parent | c3639fd798ddd195075a2edf1e37825deb5f5aa2 (diff) | |
download | clutter-f0a246cdc6f3ca35d409b82297d2a99c5e8c7b32.tar.gz |
actor: Add queue_redraw_with_clip()
Add a public version of the clipped queue redraw, using a 2D clip. This
allows implementing actors with trackable 2D clipped regions, like the
ClutterX11TexturePixmap, outside of Clutter itself.
https://bugzilla.gnome.org/show_bug.cgi?id=660997
-rw-r--r-- | clutter/clutter-actor.c | 47 | ||||
-rw-r--r-- | clutter/clutter-actor.h | 2 | ||||
-rw-r--r-- | clutter/clutter-types.h | 2 |
3 files changed, 49 insertions, 2 deletions
diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c index 3c2040681..1f7a25909 100644 --- a/clutter/clutter-actor.c +++ b/clutter/clutter-actor.c @@ -5696,8 +5696,8 @@ clutter_actor_queue_redraw (ClutterActor *self) NULL /* effect */); } -/* - * clutter_actor_queue_redraw_with_clip: +/*< private > + * _clutter_actor_queue_redraw_with_clip: * @self: A #ClutterActor * @flags: A mask of #ClutterRedrawFlags controlling the behaviour of * this queue redraw. @@ -5771,6 +5771,49 @@ _clutter_actor_queue_only_relayout (ClutterActor *self) } /** + * clutter_actor_queue_redraw_with_clip: + * @self: a #ClutterActor + * @clip: (allow-none): a rectangular clip region, or %NULL + * + * Queues a redraw on @self limited to a specific, actor-relative + * rectangular area. + * + * If @clip is %NULL this function is equivalent to + * clutter_actor_queue_redraw(). + * + * Since: 1.10 + */ +void +clutter_actor_queue_redraw_with_clip (ClutterActor *self, + const cairo_rectangle_int_t *clip) +{ + ClutterPaintVolume volume; + ClutterVertex origin; + + g_return_if_fail (CLUTTER_IS_ACTOR (self)); + + if (clip == NULL) + { + clutter_actor_queue_redraw (self); + return; + } + + _clutter_paint_volume_init_static (&volume, self); + + origin.x = clip->x; + origin.y = clip->y; + origin.z = 0.0f; + + clutter_paint_volume_set_origin (&volume, &origin); + clutter_paint_volume_set_width (&volume, clip->width); + clutter_paint_volume_set_height (&volume, clip->height); + + _clutter_actor_queue_redraw_full (self, 0, &volume, NULL); + + clutter_paint_volume_free (&volume); +} + +/** * clutter_actor_queue_relayout: * @self: A #ClutterActor * diff --git a/clutter/clutter-actor.h b/clutter/clutter-actor.h index 7adabf4ae..7bd2f0d97 100644 --- a/clutter/clutter-actor.h +++ b/clutter/clutter-actor.h @@ -280,6 +280,8 @@ void clutter_actor_unmap (ClutterActor void clutter_actor_paint (ClutterActor *self); void clutter_actor_continue_paint (ClutterActor *self); void clutter_actor_queue_redraw (ClutterActor *self); +void clutter_actor_queue_redraw_with_clip (ClutterActor *self, + const cairo_rectangle_int_t *clip); void clutter_actor_queue_relayout (ClutterActor *self); void clutter_actor_destroy (ClutterActor *self); diff --git a/clutter/clutter-types.h b/clutter/clutter-types.h index 69665c076..7d5b513fa 100644 --- a/clutter/clutter-types.h +++ b/clutter/clutter-types.h @@ -28,6 +28,8 @@ #ifndef __CLUTTER_TYPES_H__ #define __CLUTTER_TYPES_H__ +#include <cairo.h> + #include <clutter/clutter-enums.h> G_BEGIN_DECLS |