[PATCH weston 2/2] compositor: add a masking mechanism to weston_layer
Jason Ekstrand
jason at jlekstrand.net
Fri Jul 18 17:57:52 PDT 2014
One comment below. Otherwise, it looks good (though I haven't tested it
yet.) Also, I'd like to decide what I think about the first patch before
merging. I'll get back to you Monday or Tuesday.
--Jason
On Wed, Jul 9, 2014 at 12:12 PM, 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.
> Supported by the gl and pixman renderer only for now.
> ---
> src/compositor.c | 61
> ++++++++++++++++++++++++++++++++++++++++++++++++---
> src/compositor.h | 10 +++++++++
> src/gl-renderer.c | 2 +-
> src/pixman-renderer.c | 2 +-
> 4 files changed, 70 insertions(+), 5 deletions(-)
>
> diff --git a/src/compositor.c b/src/compositor.c
> index 1d8d00e..2b52b4f 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -349,8 +349,11 @@ weston_view_create(struct weston_surface *surface)
>
> view->plane = NULL;
> view->layer_link.layer = NULL;
> + view->parent_view = NULL;
>
> pixman_region32_init(&view->clip);
> + pixman_region32_init(&view->transform.masked_boundingbox);
> + pixman_region32_init(&view->transform.masked_opaque);
>
> view->alpha = 1.0;
> pixman_region32_init(&view->transform.opaque);
> @@ -783,7 +786,7 @@ weston_view_damage_below(struct weston_view *view)
> pixman_region32_t damage;
>
> pixman_region32_init(&damage);
> - pixman_region32_subtract(&damage, &view->transform.boundingbox,
> + pixman_region32_subtract(&damage,
> &view->transform.masked_boundingbox,
> &view->clip);
> if (view->plane)
> pixman_region32_union(&view->plane->damage,
> @@ -1009,10 +1012,20 @@ weston_view_update_transform_enable(struct
> weston_view *view)
> return 0;
> }
>
> +static struct weston_layer *
> +get_view_layer(struct weston_view *view)
> +{
> + if (view->parent_view)
> + return get_view_layer(view->parent_view);
> + return view->layer_link.layer;
> +}
> +
> WL_EXPORT void
> weston_view_update_transform(struct weston_view *view)
> {
> struct weston_view *parent = view->geometry.parent;
> + struct weston_layer *layer;
> + pixman_region32_t mask;
>
> if (!view->transform.dirty)
> return;
> @@ -1040,6 +1053,16 @@ weston_view_update_transform(struct weston_view
> *view)
> weston_view_update_transform_disable(view);
> }
>
> + layer = get_view_layer(view);
> + if (layer) {
> + pixman_region32_init_with_extents(&mask, &layer->mask);
> +
> pixman_region32_intersect(&view->transform.masked_boundingbox,
> + &view->transform.boundingbox,
> &mask);
> + pixman_region32_intersect(&view->transform.masked_opaque,
> + &view->transform.opaque, &mask);
> + pixman_region32_fini(&mask);
> + }
>
Don't you want an else case here that just blindly copies the regions?
Maybe it doesn't matter since in that case we're not on a layer. However,
there should at least be a comment to this effect.
> +
> weston_view_damage_below(view);
>
> weston_view_assign_output(view);
> @@ -1331,10 +1354,15 @@ 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 (pixman_region32_contains_point(
> + &view->transform.masked_boundingbox,
> + ix, iy, NULL) &&
> + pixman_region32_contains_point(&view->surface->input,
> wl_fixed_to_int(*vx),
> wl_fixed_to_int(*vy),
> NULL))
> @@ -1426,6 +1454,8 @@ weston_view_destroy(struct weston_view *view)
>
> pixman_region32_fini(&view->clip);
> pixman_region32_fini(&view->transform.boundingbox);
> + pixman_region32_fini(&view->transform.masked_boundingbox);
> + pixman_region32_fini(&view->transform.masked_opaque);
>
> weston_view_set_transform_parent(view, NULL);
>
> @@ -1625,7 +1655,7 @@ view_accumulate_damage(struct weston_view *view,
> &view->plane->damage, &damage);
> pixman_region32_fini(&damage);
> pixman_region32_copy(&view->clip, opaque);
> - pixman_region32_union(opaque, opaque, &view->transform.opaque);
> + pixman_region32_union(opaque, opaque,
> &view->transform.masked_opaque);
> }
>
> static void
> @@ -1740,6 +1770,7 @@ view_list_add_subsurface_view(struct
> weston_compositor *compositor,
> weston_view_set_transform_parent(view, parent);
> }
>
> + view->parent_view = parent;
> weston_view_update_transform(view);
>
> if (wl_list_empty(&sub->surface->subsurface_list)) {
> @@ -1933,11 +1964,35 @@ 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)
> +{
> + struct weston_view *view;
> +
> + layer->mask.x1 = x;
> + layer->mask.x2 = x + width;
> + layer->mask.y1 = y;
> + layer->mask.y2 = y + height;
> +
> + wl_list_for_each(view, &layer->view_list.link, layer_link.link) {
> + weston_view_geometry_dirty(view);
> + }
> +}
> +
> +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 78a59cb..23323de 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -534,6 +534,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 {
> @@ -738,6 +739,7 @@ struct weston_view {
> struct wl_list link;
> struct weston_layer_entry layer_link;
> struct weston_plane *plane;
> + struct weston_view *parent_view;
>
> pixman_region32_t clip;
> float alpha; /* part of geometry, see below */
> @@ -769,6 +771,8 @@ struct weston_view {
>
> pixman_region32_t boundingbox;
> pixman_region32_t opaque;
> + pixman_region32_t masked_boundingbox;
> + pixman_region32_t masked_opaque;
>
> /* matrix and inverse are used only if enabled = 1.
> * If enabled = 0, use x, y, width, height directly.
> @@ -1010,6 +1014,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 63af75d..f7f29b3 100644
> --- a/src/gl-renderer.c
> +++ b/src/gl-renderer.c
> @@ -542,7 +542,7 @@ draw_view(struct weston_view *ev, struct weston_output
> *output,
>
> pixman_region32_init(&repaint);
> pixman_region32_intersect(&repaint,
> - &ev->transform.boundingbox, damage);
> + &ev->transform.masked_boundingbox,
> damage);
> pixman_region32_subtract(&repaint, &repaint, &ev->clip);
>
> if (!pixman_region32_not_empty(&repaint))
> diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c
> index 93be968..a816d02 100644
> --- a/src/pixman-renderer.c
> +++ b/src/pixman-renderer.c
> @@ -397,7 +397,7 @@ draw_view(struct weston_view *ev, struct weston_output
> *output,
>
> pixman_region32_init(&repaint);
> pixman_region32_intersect(&repaint,
> - &ev->transform.boundingbox, damage);
> + &ev->transform.masked_boundingbox,
> damage);
> pixman_region32_subtract(&repaint, &repaint, &ev->clip);
>
> if (!pixman_region32_not_empty(&repaint))
> --
> 2.0.0
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20140718/f760230c/attachment.html>
More information about the wayland-devel
mailing list