[PATCH weston v2 09/16] compositor: add weston_surface_to_buffer_region()

Pekka Paalanen ppaalanen at gmail.com
Tue Mar 10 06:01:40 PDT 2015


From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>

This will be used by pixman-renderer.

v2: Fix doc typo.

Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
Reviewed-By: Derek Foreman <derekf at osg.samsung.com>
---
 src/compositor.c | 36 ++++++++++++++++++++++++++++++++++++
 src/compositor.h |  5 +++++
 2 files changed, 41 insertions(+)

diff --git a/src/compositor.c b/src/compositor.c
index 47552f4..60b7ee4 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 ead03ae..76b0778 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -1034,6 +1034,11 @@ 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);
 void
-- 
2.0.5



More information about the wayland-devel mailing list