compositor: move opaque tracking into transform
Move the surface opaque region setup from weston_surface_configure() to
weston_surface_update_transform(), so we have less reason to call
update_transform from configure. Opaque region depends on geometry,
after all.
Also move the opaque field from weston_surface to
weston_surface::transform to make this obvious.
Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
diff --git a/src/compositor.c b/src/compositor.c
index 67bf778..3375558 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -199,7 +199,7 @@
surface->output = NULL;
pixman_region32_init(&surface->damage);
- pixman_region32_init(&surface->opaque);
+ pixman_region32_init(&surface->transform.opaque);
wl_list_init(&surface->frame_callback_list);
surface->buffer_destroy_listener.func = surface_handle_buffer_destroy;
@@ -376,6 +376,17 @@
pixman_region32_union(&surface->damage, &surface->damage,
&surface->transform.boundingbox);
+ pixman_region32_fini(&surface->transform.opaque);
+ if (surface->visual == WESTON_RGB_VISUAL &&
+ surface->transform.enabled == 0)
+ pixman_region32_init_rect(&surface->transform.opaque,
+ surface->geometry.x,
+ surface->geometry.y,
+ surface->geometry.width,
+ surface->geometry.height);
+ else
+ pixman_region32_init(&surface->transform.opaque);
+
weston_compositor_schedule_repaint(surface->compositor);
}
@@ -502,17 +513,6 @@
weston_surface_assign_output(surface);
weston_surface_damage(surface);
-
- pixman_region32_fini(&surface->opaque);
- if (surface->visual == WESTON_RGB_VISUAL &&
- surface->transform.enabled == 0)
- pixman_region32_init_rect(&surface->opaque,
- surface->geometry.x,
- surface->geometry.y,
- surface->geometry.width,
- surface->geometry.height);
- else
- pixman_region32_init(&surface->opaque);
}
WL_EXPORT uint32_t
@@ -593,7 +593,7 @@
pixman_region32_fini(&surface->transform.boundingbox);
pixman_region32_fini(&surface->damage);
- pixman_region32_fini(&surface->opaque);
+ pixman_region32_fini(&surface->transform.opaque);
free(surface);
}
@@ -965,7 +965,7 @@
wl_list_for_each(es, &ec->surface_list, link) {
pixman_region32_subtract(&es->damage, &es->damage, &opaque);
pixman_region32_union(&new_damage, &new_damage, &es->damage);
- pixman_region32_union(&opaque, &opaque, &es->opaque);
+ pixman_region32_union(&opaque, &opaque, &es->transform.opaque);
}
pixman_region32_init(&total_damage);
@@ -981,7 +981,7 @@
wl_list_for_each(es, &ec->surface_list, link) {
pixman_region32_copy(&es->damage, &total_damage);
pixman_region32_subtract(&total_damage,
- &total_damage, &es->opaque);
+ &total_damage, &es->transform.opaque);
}
output->repaint(output);