[PATCH 2/2] compositor: add a masking mechanism to weston_layer
Giulio Camuffo
giuliocamuffo at gmail.com
Mon Jan 27 11:46:50 PST 2014
this adds a mechanism to mask the views belonging to a layer
to an arbitrary rect, in the global space. The parts that don't fit
in that rect will be clipped away.
Implemented in the gl and pixman renderers only for now.
---
src/compositor.c | 26 +++++++++++++++++++++++++-
src/compositor.h | 7 +++++++
src/gl-renderer.c | 4 ++++
src/pixman-renderer.c | 4 ++++
4 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/src/compositor.c b/src/compositor.c
index 9a269e5..25068b8 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1340,10 +1340,16 @@ weston_compositor_pick_view(struct weston_compositor *compositor,
wl_fixed_t *vx, wl_fixed_t *vy)
{
struct weston_view *view;
+ int ix = wl_fixed_to_int(x);
+ int iy = wl_fixed_to_int(y);
wl_list_for_each(view, &compositor->view_list, link) {
weston_view_from_global_fixed(view, x, y, vx, vy);
- if (pixman_region32_contains_point(&view->surface->input,
+ if (ix >= view->layer_link.layer->mask.x1 &&
+ iy >= view->layer_link.layer->mask.y1 &&
+ ix <= view->layer_link.layer->mask.x2 &&
+ iy <= view->layer_link.layer->mask.y2 &&
+ pixman_region32_contains_point(&view->surface->input,
wl_fixed_to_int(*vx),
wl_fixed_to_int(*vy),
NULL))
@@ -1946,11 +1952,29 @@ weston_layer_init(struct weston_layer *layer, struct wl_list *below)
{
wl_list_init(&layer->view_list.link);
layer->view_list.layer = layer;
+ weston_layer_set_mask_infinite(layer);
if (below != NULL)
wl_list_insert(below, &layer->link);
}
WL_EXPORT void
+weston_layer_set_mask(struct weston_layer *layer,
+ int x, int y, int width, int height)
+{
+ layer->mask.x1 = x;
+ layer->mask.x2 = x + width;
+ layer->mask.y1 = y;
+ layer->mask.y2 = y + height;
+}
+
+WL_EXPORT void
+weston_layer_set_mask_infinite(struct weston_layer *layer)
+{
+ weston_layer_set_mask(layer, INT32_MIN, INT32_MIN,
+ UINT32_MAX, UINT32_MAX);
+}
+
+WL_EXPORT void
weston_output_schedule_repaint(struct weston_output *output)
{
struct weston_compositor *compositor = output->compositor;
diff --git a/src/compositor.h b/src/compositor.h
index 7140bdf..2dfa359 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -530,6 +530,7 @@ struct weston_layer_entry {
struct weston_layer {
struct weston_layer_entry view_list;
struct wl_list link;
+ pixman_box32_t mask;
};
struct weston_plane {
@@ -1014,6 +1015,12 @@ void
weston_layer_init(struct weston_layer *layer, struct wl_list *below);
void
+weston_layer_set_mask(struct weston_layer *layer, int x, int y, int width, int height);
+
+void
+weston_layer_set_mask_infinite(struct weston_layer *layer);
+
+void
weston_plane_init(struct weston_plane *plane,
struct weston_compositor *ec,
int32_t x, int32_t y);
diff --git a/src/gl-renderer.c b/src/gl-renderer.c
index 0e5afbe..899c280 100644
--- a/src/gl-renderer.c
+++ b/src/gl-renderer.c
@@ -521,6 +521,10 @@ draw_view(struct weston_view *ev, struct weston_output *output,
pixman_region32_intersect(&repaint,
&ev->transform.boundingbox, damage);
pixman_region32_subtract(&repaint, &repaint, &ev->clip);
+ pixman_region32_t mask;
+ pixman_region32_init_with_extents(&mask, &ev->layer_link.layer->mask);
+ pixman_region32_intersect(&repaint, &repaint, &mask);
+ pixman_region32_fini(&mask);
if (!pixman_region32_not_empty(&repaint))
goto out;
diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c
index 26f6f27..511dd8b 100644
--- a/src/pixman-renderer.c
+++ b/src/pixman-renderer.c
@@ -374,6 +374,10 @@ draw_view(struct weston_view *ev, struct weston_output *output,
pixman_region32_intersect(&repaint,
&ev->transform.boundingbox, damage);
pixman_region32_subtract(&repaint, &repaint, &ev->clip);
+ pixman_region32_t mask;
+ pixman_region32_init_with_extents(&mask, &ev->layer_link.layer->mask);
+ pixman_region32_intersect(&repaint, &repaint, &mask);
+ pixman_region32_fini(&mask);
if (!pixman_region32_not_empty(&repaint))
goto out;
--
1.8.5.3
More information about the wayland-devel
mailing list