From ddc5de610b0b7f82851bc143c73cf8f242b81b1c Mon Sep 17 00:00:00 2001 From: msizanoen1 Date: Sun, 4 Dec 2022 11:14:21 +0700 Subject: [PATCH] clutter/actor: Introduce notify_transform_invalid This allows clients to maybe avoid triggering a redraw if they don't know beforehand if the transform would actually change. Part-of: --- clutter/clutter/clutter-actor.c | 33 ++++++++++++++++++++++++++++++++ clutter/clutter/clutter-mutter.h | 3 +++ 2 files changed, 36 insertions(+) diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index 4ee4b10ac..de218e84a 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -19184,3 +19184,36 @@ void clutter_actor_set_implicitly_grabbed (ClutterActor *self, g_assert (priv->implicitly_grabbed_count >= 0); } + +/** + * clutter_actor_notify_transform_invalid: + * @self: A #ClutterActor + * + * Invalidate the cached transformation matrix of @self and queue a redraw + * if the transformation matrix has changed. + * This is needed for implementations overriding the apply_transform() + * vfunc and has to be called if the matrix returned by apply_transform() + * would change due to state outside of the object itself. + */ +void +clutter_actor_notify_transform_invalid (ClutterActor *self) +{ + ClutterActorPrivate *priv = self->priv; + graphene_matrix_t old_transform; + + if (!priv->transform_valid) + { + clutter_actor_queue_redraw (self); + return; + } + + graphene_matrix_init_from_matrix (&old_transform, &priv->transform); + + transform_changed (self); + ensure_valid_actor_transform (self); + + g_assert (priv->transform_valid); + + if (!graphene_matrix_equal (&old_transform, &priv->transform)) + clutter_actor_queue_redraw (self); +} diff --git a/clutter/clutter/clutter-mutter.h b/clutter/clutter/clutter-mutter.h index 3250eb5d6..eb1ce19e5 100644 --- a/clutter/clutter/clutter-mutter.h +++ b/clutter/clutter/clutter-mutter.h @@ -132,6 +132,9 @@ void clutter_get_debug_flags (ClutterDebugFlag *debug_flags, ClutterDrawDebugFlag *draw_flags, ClutterPickDebugFlag *pick_flags); +CLUTTER_EXPORT +void clutter_actor_notify_transform_invalid (ClutterActor *self); + #undef __CLUTTER_H_INSIDE__ #endif /* __CLUTTER_MUTTER_H__ */