[RFC weston 07/16] compositor: Move weston_matrix_transform_region to compositor.c and export it

Derek Foreman derekf at osg.samsung.com
Fri Sep 26 14:10:18 PDT 2014


We're going to use this to replace much of the other transform code so
it's no longer just relevant to pixman-renderer.c
---
 src/compositor.c      | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/compositor.h      |  4 ++++
 src/pixman-renderer.c | 51 ---------------------------------------------------
 3 files changed, 55 insertions(+), 51 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index 1e0d3ba..205397b 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -662,6 +662,57 @@ weston_transformed_rect(int width, int height,
 }
 
 WL_EXPORT void
+weston_matrix_transform_region(pixman_region32_t *dest,
+			       struct weston_matrix *matrix,
+			       pixman_region32_t *src)
+{
+	pixman_box32_t *src_rects, *dest_rects;
+	int nrects, i;
+
+	src_rects = pixman_region32_rectangles(src, &nrects);
+	dest_rects = malloc(nrects * sizeof(*dest_rects));
+	if (!dest_rects)
+		return;
+
+	for (i = 0; i < nrects; i++) {
+		struct weston_vector vec1 = {{
+			src_rects[i].x1, src_rects[i].y1, 0, 1
+		}};
+		weston_matrix_transform(matrix, &vec1);
+		vec1.f[0] /= vec1.f[3];
+		vec1.f[1] /= vec1.f[3];
+
+		struct weston_vector vec2 = {{
+			src_rects[i].x2, src_rects[i].y2, 0, 1
+		}};
+		weston_matrix_transform(matrix, &vec2);
+		vec2.f[0] /= vec2.f[3];
+		vec2.f[1] /= vec2.f[3];
+
+		if (vec1.f[0] < vec2.f[0]) {
+			dest_rects[i].x1 = floor(vec1.f[0]);
+			dest_rects[i].x2 = ceil(vec2.f[0]);
+		} else {
+			dest_rects[i].x1 = floor(vec2.f[0]);
+			dest_rects[i].x2 = ceil(vec1.f[0]);
+		}
+
+
+		if (vec1.f[1] < vec2.f[1]) {
+			dest_rects[i].y1 = floor(vec1.f[1]);
+			dest_rects[i].y2 = ceil(vec2.f[1]);
+		} else {
+			dest_rects[i].y1 = floor(vec2.f[1]);
+			dest_rects[i].y2 = ceil(vec1.f[1]);
+		}
+	}
+
+	pixman_region32_clear(dest);
+	pixman_region32_init_rects(dest, dest_rects, nrects);
+	free(dest_rects);
+}
+
+WL_EXPORT void
 weston_transformed_region(int width, int height,
 			  enum wl_output_transform transform,
 			  int32_t scale,
diff --git a/src/compositor.h b/src/compositor.h
index 234806a..1f1d33d 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -1433,6 +1433,10 @@ weston_transformed_rect(int width, int height,
 			int32_t scale,
 			pixman_box32_t rect);
 void
+weston_matrix_transform_region(pixman_region32_t *dest,
+                               struct weston_matrix *matrix,
+                               pixman_region32_t *src);
+void
 weston_transformed_region(int width, int height,
 			  enum wl_output_transform transform,
 			  int32_t scale,
diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c
index d3650d1..9494142 100644
--- a/src/pixman-renderer.c
+++ b/src/pixman-renderer.c
@@ -128,57 +128,6 @@ pixman_renderer_read_pixels(struct weston_output *output,
 }
 
 static void
-weston_matrix_transform_region(pixman_region32_t *dest,
-			       struct weston_matrix *matrix,
-			       pixman_region32_t *src)
-{
-	pixman_box32_t *src_rects, *dest_rects;
-	int nrects, i;
-
-	src_rects = pixman_region32_rectangles(src, &nrects);
-	dest_rects = malloc(nrects * sizeof(*dest_rects));
-	if (!dest_rects)
-		return;
-	
-	for (i = 0; i < nrects; i++) {
-		struct weston_vector vec1 = {{
-			src_rects[i].x1, src_rects[i].y1, 0, 1
-		}};
-		weston_matrix_transform(matrix, &vec1);
-		vec1.f[0] /= vec1.f[3];
-		vec1.f[1] /= vec1.f[3];
-
-		struct weston_vector vec2 = {{
-			src_rects[i].x2, src_rects[i].y2, 0, 1
-		}};
-		weston_matrix_transform(matrix, &vec2);
-		vec2.f[0] /= vec2.f[3];
-		vec2.f[1] /= vec2.f[3];
-
-		if (vec1.f[0] < vec2.f[0]) {
-			dest_rects[i].x1 = floor(vec1.f[0]);
-			dest_rects[i].x2 = ceil(vec2.f[0]);
-		} else {
-			dest_rects[i].x1 = floor(vec2.f[0]);
-			dest_rects[i].x2 = ceil(vec1.f[0]);
-		}
-
-
-		if (vec1.f[1] < vec2.f[1]) {
-			dest_rects[i].y1 = floor(vec1.f[1]);
-			dest_rects[i].y2 = ceil(vec2.f[1]);
-		} else {
-			dest_rects[i].y1 = floor(vec2.f[1]);
-			dest_rects[i].y2 = ceil(vec1.f[1]);
-		}
-	}
-
-	pixman_region32_clear(dest);
-	pixman_region32_init_rects(dest, dest_rects, nrects);
-	free(dest_rects);
-}
-
-static void
 region_global_to_output(struct weston_output *output, pixman_region32_t *region)
 {
 	if (output->zoom.active) {
-- 
2.1.0



More information about the wayland-devel mailing list