<p dir="ltr">Giulio,<br>
Couple thoughts.  First, you don't provide an implementation of the clipping in  any of the renderers.  Probably have to wait on the Collabora people for the RPi renderer, but we should have pixman and gl implementations of this.</p>

<p dir="ltr">Second, is there any particular reason why you're using pixman_box32_t instead of pixman_rectangle32_t?  One's as good as the other, it just seems a little strange that there's a difference between how it's storred and the function to set it.</p>

<p dir="ltr">More comments below.</p>
<p dir="ltr">On Dec 9, 2013 3:36 PM, "Giulio Camuffo" <<a href="mailto:giuliocamuffo@gmail.com">giuliocamuffo@gmail.com</a>> wrote:<br>
><br>
> this adds a mechanism to mask the views belonging to a layer<br>
> to an arbitrary rect, in the global space. The parts that don't fit<br>
> in that rect will be clipped away.<br>
> ---<br>
><br>
> As per the discussion on IRC, masking layers is preferred to masking views,<br>
> so this replaces<br>
> <a href="http://lists.freedesktop.org/archives/wayland-devel/2013-December/012422.html">http://lists.freedesktop.org/archives/wayland-devel/2013-December/012422.html</a><br>
><br>
>  src/compositor.c | 37 ++++++++++++++++++++++++++++++++++++-<br>
>  src/compositor.h |  9 +++++++++<br>
>  2 files changed, 45 insertions(+), 1 deletion(-)<br>
><br>
> diff --git a/src/compositor.c b/src/compositor.c<br>
> index 8f4bdef..6beea9c 100644<br>
> --- a/src/compositor.c<br>
> +++ b/src/compositor.c<br>
> @@ -1193,10 +1193,14 @@ weston_compositor_pick_view(struct weston_compositor *compositor,<br>
>                             wl_fixed_t *vx, wl_fixed_t *vy)<br>
>  {<br>
>         struct weston_view *view;<br>
> +        int ix = wl_fixed_to_int(x);<br>
> +        int iy = wl_fixed_to_int(y);<br>
><br>
>         wl_list_for_each(view, &compositor->view_list, link) {<br>
>                 weston_view_from_global_fixed(view, x, y, vx, vy);<br>
> -               if (pixman_region32_contains_point(&view->surface->input,<br>
> +               if (ix >= view->layer->mask.x1 && iy >= view->layer->mask.y1 &&<br>
> +                   ix <= view->layer->mask.x2 && iy <= view->layer->mask.y2 &&<br>
> +                   pixman_region32_contains_point(&view->surface->input,<br>
>                                                    wl_fixed_to_int(*vx),<br>
>                                                    wl_fixed_to_int(*vy),<br>
>                                                    NULL))<br>
> @@ -1489,6 +1493,18 @@ view_accumulate_damage(struct weston_view *view,<br>
>         pixman_region32_union(&view->plane->damage,<br>
>                               &view->plane->damage, &damage);<br>
>         pixman_region32_fini(&damage);<br>
> +<br>
> +       /* set view->clip with the part of view->transform.boundingbox<br>
> +        * that doesn't fit into view->layer->mask, then add the opaque region<br>
> +        * to it. We don't do the opposite, adding view->clip to opaque,<br>
> +        * because opaque is then passed to the next views, which may be<br>
> +        * in a different layer with a different mask.<br>
> +        */<br>
> +       pixman_region32_t mask;<br>
> +       pixman_region32_init_with_extents(&mask, &view->layer->mask);<br>
> +       pixman_region32_subtract(&view->clip, &view->transform.boundingbox, &mask);<br>
> +       pixman_region32_fini(&mask);<br>
> +<br>
>         pixman_region32_copy(&view->clip, opaque);<br>
>         pixman_region32_union(opaque, opaque, &view->transform.opaque);<br>
>  }<br>
> @@ -1652,6 +1668,7 @@ weston_compositor_build_view_list(struct weston_compositor *compositor)<br>
>         wl_list_init(&compositor->view_list);<br>
>         wl_list_for_each(layer, &compositor->layer_list, link) {<br>
>                 wl_list_for_each(view, &layer->view_list, layer_link) {<br>
> +                       view->layer = layer;<br>
>                         view_list_add(compositor, view);</p>
<p dir="ltr">I think it's probably better to have a function to add a view to a layer.  I'm not a big fan of saying view.layer may or may not be null and may not correspond in any way to layer_link.  We should keep layer and layer_link in sync at all times.</p>

<p dir="ltr">>                 }<br>
>         }<br>
> @@ -1776,11 +1793,29 @@ WL_EXPORT void<br>
>  weston_layer_init(struct weston_layer *layer, struct wl_list *below)<br>
>  {<br>
>         wl_list_init(&layer->view_list);<br>
> +       weston_layer_set_mask_infinite(layer);<br>
>         if (below != NULL)<br>
>                 wl_list_insert(below, &layer->link);<br>
>  }<br>
><br>
>  WL_EXPORT void<br>
> +weston_layer_set_mask(struct weston_layer *layer,<br>
> +                     int x, int y, int width, int height)<br>
> +{<br>
> +       layer->mask.x1 = x;<br>
> +       layer->mask.x2 = x + width;<br>
> +       layer->mask.y1 = y;<br>
> +       layer->mask.y2 = y + height;<br>
> +}<br>
> +<br>
> +WL_EXPORT void<br>
> +weston_layer_set_mask_infinite(struct weston_layer *layer)<br>
> +{<br>
> +       weston_layer_set_mask(layer, INT32_MIN, INT32_MIN,<br>
> +                                    UINT32_MAX, UINT32_MAX);<br>
> +}<br>
> +<br>
> +WL_EXPORT void<br>
>  weston_output_schedule_repaint(struct weston_output *output)<br>
>  {<br>
>         struct weston_compositor *compositor = output->compositor;<br>
> diff --git a/src/compositor.h b/src/compositor.h<br>
> index a161345..ab3de19 100644<br>
> --- a/src/compositor.h<br>
> +++ b/src/compositor.h<br>
> @@ -523,6 +523,7 @@ enum {<br>
>  struct weston_layer {<br>
>         struct wl_list view_list;<br>
>         struct wl_list link;<br>
> +       pixman_box32_t mask;<br>
>  };<br>
><br>
>  struct weston_plane {<br>
> @@ -753,6 +754,8 @@ struct weston_view {<br>
>         struct wl_list link;<br>
>         struct wl_list layer_link;<br>
>         struct weston_plane *plane;<br>
> +       /* layer is set when building the views list, it's not always valid! */<br>
> +       struct weston_layer *layer;<br>
><br>
>         pixman_region32_t clip;<br>
>         float alpha;                     /* part of geometry, see below */<br>
> @@ -980,6 +983,12 @@ void<br>
>  weston_layer_init(struct weston_layer *layer, struct wl_list *below);<br>
><br>
>  void<br>
> +weston_layer_set_mask(struct weston_layer *layer, int x, int y, int width, int height);<br>
> +<br>
> +void<br>
> +weston_layer_set_mask_infinite(struct weston_layer *layer);<br>
> +<br>
> +void<br>
>  weston_plane_init(struct weston_plane *plane,<br>
>                         struct weston_compositor *ec,<br>
>                         int32_t x, int32_t y);<br>
> --<br>
> 1.8.5.1<br>
><br>
> _______________________________________________<br>
> wayland-devel mailing list<br>
> <a href="mailto:wayland-devel@lists.freedesktop.org">wayland-devel@lists.freedesktop.org</a><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/wayland-devel">http://lists.freedesktop.org/mailman/listinfo/wayland-devel</a><br>
</p>