diff options
author | Derek Foreman <derekf@osg.samsung.com> | 2015-11-18 16:32:30 -0600 |
---|---|---|
committer | Pekka Paalanen <pekka.paalanen@collabora.co.uk> | 2015-11-20 15:27:55 +0200 |
commit | bc9a61cc2325f832c3d5867c67b83acbd32a54ac (patch) | |
tree | 008477ff58ea5a763f58683f6602a768960720dc | |
parent | 52c476ac8d40d86ab846f63a95373efb71f1ff0c (diff) |
compositor: Move weston_matrix_transform_region to compositor.c and export it
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
Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
[Pekka: add the warning about matrix restrictions]
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
-rw-r--r-- | src/compositor.c | 57 | ||||
-rw-r--r-- | src/compositor.h | 4 | ||||
-rw-r--r-- | src/pixman-renderer.c | 58 |
3 files changed, 61 insertions, 58 deletions
diff --git a/src/compositor.c b/src/compositor.c index 67be07d4..bbac110e 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -726,6 +726,63 @@ weston_transformed_rect(int width, int height, return ret; } +/** Transform a region by a matrix, restricted to axis-aligned transformations + * + * Warning: This function does not work for projective, affine, or matrices + * that encode arbitrary rotations. Only 90-degree step rotations are + * supported. + */ +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, diff --git a/src/compositor.h b/src/compositor.h index a07b51a2..e64f30ce 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -1646,6 +1646,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 793a33d0..f66a11ed 100644 --- a/src/pixman-renderer.c +++ b/src/pixman-renderer.c @@ -133,64 +133,6 @@ pixman_renderer_read_pixels(struct weston_output *output, return 0; } -/* - * Warning: This function does not work for projective, affine, or matrices - * that encode arbitrary rotations. Only 90-degree step rotations are - * supported. - * - * Luckily it is only used for output matrices, so it is fine here. - */ -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) { |