[PATCH weston 2/2 v3] compositor: add a masking mechanism to weston_layer
Pekka Paalanen
ppaalanen at gmail.com
Thu Dec 12 00:17:40 PST 2013
On Wed, 11 Dec 2013 18:55:08 +0100
Giulio Camuffo <giuliocamuffo at gmail.com> wrote:
> 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, while it needs to be
> implemented in the rpi renderer.
> ---
>
> v3: no new code. added a comment in the rpi renderer about the
> missing implementation.
>
> src/compositor.c | 25 ++++++++++++++++++++++++-
> src/compositor.h | 9 +++++++++
> src/gl-renderer.c | 4 ++++
> src/pixman-renderer.c | 4 ++++
> src/rpi-renderer.c | 6 ++++++
> 5 files changed, 47 insertions(+), 1 deletion(-)
>
> diff --git a/src/compositor.c b/src/compositor.c
> index 260be3c..18b12a0 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -1193,10 +1193,14 @@ 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->mask.x1 && iy >=
> view->layer->mask.y1 &&
> + ix <= view->layer->mask.x2 && iy <=
> view->layer->mask.y2 &&
> +
> pixman_region32_contains_point(&view->surface->input,
> wl_fixed_to_int(*vx), wl_fixed_to_int(*vy),
> NULL))
> @@ -1652,6 +1656,7 @@ weston_compositor_build_view_list(struct
> weston_compositor *compositor) wl_list_init(&compositor->view_list);
> wl_list_for_each(layer, &compositor->layer_list, link) {
> wl_list_for_each(view, &layer->view_list,
> layer_link) {
> + view->layer = layer;
> view_list_add(compositor, view);
> }
> }
> @@ -1776,11 +1781,29 @@ WL_EXPORT void
> weston_layer_init(struct weston_layer *layer, struct wl_list *below)
> {
> wl_list_init(&layer->view_list);
> + 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 6bd637e..9f34d40 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -519,6 +519,7 @@ enum {
> struct weston_layer {
> struct wl_list view_list;
> struct wl_list link;
> + pixman_box32_t mask;
> };
>
> struct weston_plane {
> @@ -749,6 +750,8 @@ struct weston_view {
> struct wl_list link;
> struct wl_list layer_link;
> struct weston_plane *plane;
> + /* layer is set when building the views list, it's not
> always valid! */
> + struct weston_layer *layer;
>
> pixman_region32_t clip;
> float alpha; /* part of geometry, see
> below */ @@ -976,6 +979,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..b4f94eb 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->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 e854e2a..69d3ed4 100644
> --- a/src/pixman-renderer.c
> +++ b/src/pixman-renderer.c
> @@ -355,6 +355,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->mask);
> + pixman_region32_intersect(&repaint, &repaint, &mask);
> + pixman_region32_fini(&mask);
>
> if (!pixman_region32_not_empty(&repaint))
> goto out;
> diff --git a/src/rpi-renderer.c b/src/rpi-renderer.c
> index c6b924c..f0e63fd 100644
> --- a/src/rpi-renderer.c
> +++ b/src/rpi-renderer.c
> @@ -694,6 +694,12 @@ rpir_view_compute_rects(struct rpir_view *view,
> * huge elements like 8192x8192.
> */
>
> + /* XXX: implement layer masking.
> + * layers can have an axis aligned rectangular mask to clip
> + * away parts of the views that don't fit into it.
> + * view->view->layer_link.layer->mask
> + */
> +
> src_x = 0 << 16;
> src_y = 0 << 16;
>
I'm happy with the rpi notes here.
Thanks,
pq
More information about the wayland-devel
mailing list