From e54e31c84ceda1d7b11f68496f65c38e35e1243d Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Wed, 4 Mar 2015 14:23:28 +0200 Subject: [PATCH] compositor: add weston_surface_to_buffer_region() This will be used by pixman-renderer. v2: Fix doc typo. Signed-off-by: Pekka Paalanen Reviewed-By: Derek Foreman Reviewed-by: Jason Ekstrand --- src/compositor.c | 36 ++++++++++++++++++++++++++++++++++++ src/compositor.h | 5 +++++ 2 files changed, 41 insertions(+) diff --git a/src/compositor.c b/src/compositor.c index 47552f40..60b7ee4b 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -933,6 +933,42 @@ weston_surface_to_buffer_rect(struct weston_surface *surface, rect); } +/** Transform a region from surface coordinates to buffer coordinates + * + * \param surface The surface to fetch wl_viewport and buffer transformation + * from. + * \param surface_region[in] The region in surface coordinates. + * \param buffer_region[out] The region converted to buffer coordinates. + * + * Buffer_region must be init'd, but will be completely overwritten. + * + * Viewport and buffer transformations can only do translation, scaling, + * and rotations in 90-degree steps. Therefore the only loss in the + * conversion is coordinate flooring (rounding). + */ +WL_EXPORT void +weston_surface_to_buffer_region(struct weston_surface *surface, + pixman_region32_t *surface_region, + pixman_region32_t *buffer_region) +{ + pixman_box32_t *src_rects, *dest_rects; + int nrects, i; + + src_rects = pixman_region32_rectangles(surface_region, &nrects); + dest_rects = malloc(nrects * sizeof(*dest_rects)); + if (!dest_rects) + return; + + for (i = 0; i < nrects; i++) { + dest_rects[i] = weston_surface_to_buffer_rect(surface, + src_rects[i]); + } + + pixman_region32_fini(buffer_region); + pixman_region32_init_rects(buffer_region, dest_rects, nrects); + free(dest_rects); +} + WL_EXPORT void weston_view_move_to_plane(struct weston_view *view, struct weston_plane *plane) diff --git a/src/compositor.h b/src/compositor.h index ead03ae2..76b07781 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -1033,6 +1033,11 @@ pixman_box32_t weston_surface_to_buffer_rect(struct weston_surface *surface, pixman_box32_t rect); +void +weston_surface_to_buffer_region(struct weston_surface *surface, + pixman_region32_t *surface_region, + pixman_region32_t *buffer_region); + void weston_spring_init(struct weston_spring *spring, double k, double current, double target);