diff --git a/src/compositor.c b/src/compositor.c index 47552f40ebc0dfad3bebcdaae2e3550488113091..60b7ee4bb37e91f60359051d0fd57586c22d1c93 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 ead03ae2e414a0a7e393f70044f9b05ac9b60307..76b0778143a4d122d44e47845e39abd097384314 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);