mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 23:50:41 -05:00
window-actor: Move the operations we need to do when we cull out here
Soon, we'll move this into a generic MetaCullable interface, but for now, just put hardcoded knowledge in MetaWindowGroup. https://bugzilla.gnome.org/show_bug.cgi?id=714706
This commit is contained in:
parent
59a01137e1
commit
d8c66077f0
@ -55,13 +55,10 @@ void meta_window_actor_set_updates_frozen (MetaWindowActor *self,
|
|||||||
void meta_window_actor_queue_frame_drawn (MetaWindowActor *self,
|
void meta_window_actor_queue_frame_drawn (MetaWindowActor *self,
|
||||||
gboolean no_delay_frame);
|
gboolean no_delay_frame);
|
||||||
|
|
||||||
cairo_region_t *meta_window_actor_get_obscured_region (MetaWindowActor *self);
|
void meta_window_actor_cull_out (MetaWindowActor *self,
|
||||||
|
cairo_region_t *unobscured_region,
|
||||||
void meta_window_actor_set_clip_region (MetaWindowActor *self,
|
cairo_region_t *clip_region);
|
||||||
cairo_region_t *clip_region);
|
void meta_window_actor_reset_culling (MetaWindowActor *self);
|
||||||
void meta_window_actor_set_clip_region_beneath (MetaWindowActor *self,
|
|
||||||
cairo_region_t *beneath_region);
|
|
||||||
void meta_window_actor_reset_clip_regions (MetaWindowActor *self);
|
|
||||||
|
|
||||||
void meta_window_actor_set_unobscured_region (MetaWindowActor *self,
|
void meta_window_actor_set_unobscured_region (MetaWindowActor *self,
|
||||||
cairo_region_t *unobscured_region);
|
cairo_region_t *unobscured_region);
|
||||||
|
@ -1717,7 +1717,7 @@ meta_window_actor_unmapped (MetaWindowActor *self)
|
|||||||
* Return value: (transfer none): the area obscured by the window,
|
* Return value: (transfer none): the area obscured by the window,
|
||||||
* %NULL is the same as an empty region.
|
* %NULL is the same as an empty region.
|
||||||
*/
|
*/
|
||||||
cairo_region_t *
|
static cairo_region_t *
|
||||||
meta_window_actor_get_obscured_region (MetaWindowActor *self)
|
meta_window_actor_get_obscured_region (MetaWindowActor *self)
|
||||||
{
|
{
|
||||||
MetaWindowActorPrivate *priv = self->priv;
|
MetaWindowActorPrivate *priv = self->priv;
|
||||||
@ -1806,7 +1806,7 @@ meta_window_actor_set_unobscured_region (MetaWindowActor *self,
|
|||||||
* not drawn in this frame.
|
* not drawn in this frame.
|
||||||
* This will be set before painting then unset afterwards.
|
* This will be set before painting then unset afterwards.
|
||||||
*/
|
*/
|
||||||
void
|
static void
|
||||||
meta_window_actor_set_clip_region (MetaWindowActor *self,
|
meta_window_actor_set_clip_region (MetaWindowActor *self,
|
||||||
cairo_region_t *clip_region)
|
cairo_region_t *clip_region)
|
||||||
{
|
{
|
||||||
@ -1828,7 +1828,7 @@ meta_window_actor_set_clip_region (MetaWindowActor *self,
|
|||||||
* shadow hid by the window itself. This will be set before painting
|
* shadow hid by the window itself. This will be set before painting
|
||||||
* then unset afterwards.
|
* then unset afterwards.
|
||||||
*/
|
*/
|
||||||
void
|
static void
|
||||||
meta_window_actor_set_clip_region_beneath (MetaWindowActor *self,
|
meta_window_actor_set_clip_region_beneath (MetaWindowActor *self,
|
||||||
cairo_region_t *beneath_region)
|
cairo_region_t *beneath_region)
|
||||||
{
|
{
|
||||||
@ -1848,15 +1848,42 @@ meta_window_actor_set_clip_region_beneath (MetaWindowActor *self,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_window_actor_cull_out (MetaWindowActor *self,
|
||||||
|
cairo_region_t *unobscured_region,
|
||||||
|
cairo_region_t *clip_region)
|
||||||
|
{
|
||||||
|
MetaCompScreen *info = meta_screen_get_compositor_data (self->priv->screen);
|
||||||
|
|
||||||
|
/* Don't do any culling for the unredirected window */
|
||||||
|
if (self == info->unredirected_window)
|
||||||
|
return;
|
||||||
|
|
||||||
|
meta_window_actor_set_unobscured_region (self, unobscured_region);
|
||||||
|
meta_window_actor_set_clip_region (self, clip_region);
|
||||||
|
|
||||||
|
if (clutter_actor_get_paint_opacity (CLUTTER_ACTOR (self)) == 0xff)
|
||||||
|
{
|
||||||
|
cairo_region_t *obscured_region = meta_window_actor_get_obscured_region (self);
|
||||||
|
if (obscured_region)
|
||||||
|
{
|
||||||
|
cairo_region_subtract (unobscured_region, obscured_region);
|
||||||
|
cairo_region_subtract (clip_region, obscured_region);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_window_actor_set_clip_region_beneath (self, clip_region);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_window_actor_reset_clip_regions:
|
* meta_window_actor_reset_culling:
|
||||||
* @self: a #MetaWindowActor
|
* @self: a #MetaWindowActor
|
||||||
*
|
*
|
||||||
* Unsets the regions set by meta_window_actor_set_clip_region() and
|
* Unsets the regions set by meta_window_actor_set_clip_region() and
|
||||||
* meta_window_actor_set_clip_region_beneath()
|
* meta_window_actor_set_clip_region_beneath()
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
meta_window_actor_reset_clip_regions (MetaWindowActor *self)
|
meta_window_actor_reset_culling (MetaWindowActor *self)
|
||||||
{
|
{
|
||||||
MetaWindowActorPrivate *priv = self->priv;
|
MetaWindowActorPrivate *priv = self->priv;
|
||||||
|
|
||||||
|
@ -102,15 +102,9 @@ meta_window_group_cull_out (MetaWindowGroup *group,
|
|||||||
clutter_actor_iter_init (&iter, actor);
|
clutter_actor_iter_init (&iter, actor);
|
||||||
while (clutter_actor_iter_prev (&iter, &child))
|
while (clutter_actor_iter_prev (&iter, &child))
|
||||||
{
|
{
|
||||||
MetaCompScreen *info = meta_screen_get_compositor_data (group->screen);
|
|
||||||
|
|
||||||
if (!CLUTTER_ACTOR_IS_VISIBLE (child))
|
if (!CLUTTER_ACTOR_IS_VISIBLE (child))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (info->unredirected_window != NULL &&
|
|
||||||
child == CLUTTER_ACTOR (info->unredirected_window))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* If an actor has effects applied, then that can change the area
|
/* If an actor has effects applied, then that can change the area
|
||||||
* it paints and the opacity, so we no longer can figure out what
|
* it paints and the opacity, so we no longer can figure out what
|
||||||
* portion of the actor is obscured and what portion of the screen
|
* portion of the actor is obscured and what portion of the screen
|
||||||
@ -132,30 +126,16 @@ meta_window_group_cull_out (MetaWindowGroup *group,
|
|||||||
|
|
||||||
if (META_IS_WINDOW_ACTOR (child))
|
if (META_IS_WINDOW_ACTOR (child))
|
||||||
{
|
{
|
||||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (child);
|
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
if (!meta_actor_is_untransformed (CLUTTER_ACTOR (window_actor), &x, &y))
|
if (!meta_actor_is_untransformed (child, &x, &y))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Temporarily move to the coordinate system of the actor */
|
/* Temporarily move to the coordinate system of the actor */
|
||||||
cairo_region_translate (unobscured_region, - x, - y);
|
cairo_region_translate (unobscured_region, - x, - y);
|
||||||
cairo_region_translate (clip_region, - x, - y);
|
cairo_region_translate (clip_region, - x, - y);
|
||||||
|
|
||||||
meta_window_actor_set_unobscured_region (window_actor, unobscured_region);
|
meta_window_actor_cull_out (META_WINDOW_ACTOR (child), unobscured_region, clip_region);
|
||||||
meta_window_actor_set_clip_region (window_actor, clip_region);
|
|
||||||
|
|
||||||
if (clutter_actor_get_paint_opacity (CLUTTER_ACTOR (window_actor)) == 0xff)
|
|
||||||
{
|
|
||||||
cairo_region_t *obscured_region = meta_window_actor_get_obscured_region (window_actor);
|
|
||||||
if (obscured_region)
|
|
||||||
{
|
|
||||||
cairo_region_subtract (unobscured_region, obscured_region);
|
|
||||||
cairo_region_subtract (clip_region, obscured_region);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_window_actor_set_clip_region_beneath (window_actor, clip_region);
|
|
||||||
|
|
||||||
cairo_region_translate (unobscured_region, x, y);
|
cairo_region_translate (unobscured_region, x, y);
|
||||||
cairo_region_translate (clip_region, x, y);
|
cairo_region_translate (clip_region, x, y);
|
||||||
@ -196,7 +176,7 @@ meta_window_group_reset_culling (MetaWindowGroup *group)
|
|||||||
if (META_IS_WINDOW_ACTOR (child))
|
if (META_IS_WINDOW_ACTOR (child))
|
||||||
{
|
{
|
||||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (child);
|
MetaWindowActor *window_actor = META_WINDOW_ACTOR (child);
|
||||||
meta_window_actor_reset_clip_regions (window_actor);
|
meta_window_actor_reset_culling (window_actor);
|
||||||
}
|
}
|
||||||
else if (META_IS_BACKGROUND_ACTOR (child))
|
else if (META_IS_BACKGROUND_ACTOR (child))
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user