diff --git a/compositor/screen-share.c b/compositor/screen-share.c index 67b0c1e7a..15cd0e36a 100644 --- a/compositor/screen-share.c +++ b/compositor/screen-share.c @@ -862,11 +862,11 @@ shared_output_repainted(struct wl_listener *listener, void *data) wl_list_for_each(sb, &so->shm.buffers, link) pixman_region32_union(&sb->damage, &sb->damage, &damage); + /* Translate back to global space for transform_region */ + pixman_region32_translate(&damage, so->output->x, so->output->y); + /* Transform to buffer coordinates */ - weston_transformed_region(so->output->width, so->output->height, - so->output->transform, - so->output->current_scale, - &damage, &damage); + weston_matrix_transform_region(&damage, &so->output->matrix, &damage); if (shared_output_ensure_tmp_data(so, &damage) < 0) goto err_pixman_init; diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c index 7d607ca63..bf9c2b90e 100644 --- a/libweston/backend-drm/drm.c +++ b/libweston/backend-drm/drm.c @@ -421,16 +421,10 @@ drm_output_render(struct drm_output_state *state, pixman_region32_t *damage) return; pixman_region32_init(&scanout_damage); - pixman_region32_copy(&scanout_damage, damage); - pixman_region32_translate(&scanout_damage, - -output->base.x, -output->base.y); - weston_transformed_region(output->base.width, - output->base.height, - output->base.transform, - output->base.current_scale, - &scanout_damage, - &scanout_damage); + weston_matrix_transform_region(&scanout_damage, + &output->base.matrix, + damage); assert(scanout_state->damage_blob_id == 0); diff --git a/libweston/backend-wayland/wayland.c b/libweston/backend-wayland/wayland.c index a5e0183ae..fe139e626 100644 --- a/libweston/backend-wayland/wayland.c +++ b/libweston/backend-wayland/wayland.c @@ -615,15 +615,7 @@ wayland_shm_buffer_attach(struct wayland_shm_buffer *sb) int i, n; pixman_region32_init(&damage); - pixman_region32_copy(&damage, &sb->damage); - pixman_region32_translate(&damage, -sb->output->base.x, - -sb->output->base.y); - - weston_transformed_region(sb->output->base.width, - sb->output->base.height, - sb->output->base.transform, - sb->output->base.current_scale, - &damage, &damage); + weston_matrix_transform_region(&damage, &sb->output->base.matrix, &sb->damage); if (sb->output->frame) { frame_interior(sb->output->frame, &ix, &iy, &iwidth, &iheight); diff --git a/libweston/backend-x11/x11.c b/libweston/backend-x11/x11.c index 34820a060..536a603c6 100644 --- a/libweston/backend-x11/x11.c +++ b/libweston/backend-x11/x11.c @@ -466,13 +466,9 @@ set_clip_for_output(struct weston_output *output_base, pixman_region32_t *region b = to_x11_backend(ec); pixman_region32_init(&transformed_region); - pixman_region32_copy(&transformed_region, region); - pixman_region32_translate(&transformed_region, - -output_base->x, -output_base->y); - weston_transformed_region(output_base->width, output_base->height, - output_base->transform, - output_base->current_scale, - &transformed_region, &transformed_region); + weston_matrix_transform_region(&transformed_region, + &output_base->matrix, + region); rects = pixman_region32_rectangles(&transformed_region, &nrects); output_rects = calloc(nrects, sizeof(xcb_rectangle_t)); diff --git a/libweston/compositor.c b/libweston/compositor.c index b0c5382fc..d6caade26 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -846,116 +846,6 @@ weston_matrix_transform_region(pixman_region32_t *dest, free(dest_rects); } -/** Transform a region to buffer coordinates - * - * \param width Surface width. - * \param height Surface height. - * \param transform Buffer transform. - * \param scale Buffer scale. - * \param[in] src Region in surface coordinates. - * \param[out] dest Resulting region in buffer coordinates. - * - * Converts the given surface-local region to buffer coordinates - * according to the given buffer transform and scale. - * This ignores wp_viewport. - * - * The given width and height must be the result of inverse scaled and - * inverse transformed buffer size. - * - * src and dest are allowed to point to the same memory for in-place conversion. - */ -WL_EXPORT void -weston_transformed_region(int width, int height, - enum wl_output_transform transform, - int32_t scale, - pixman_region32_t *src, pixman_region32_t *dest) -{ - pixman_box32_t *src_rects, *dest_rects; - int nrects, i; - - if (transform == WL_OUTPUT_TRANSFORM_NORMAL && scale == 1) { - if (src != dest) - pixman_region32_copy(dest, src); - return; - } - - src_rects = pixman_region32_rectangles(src, &nrects); - dest_rects = malloc(nrects * sizeof(*dest_rects)); - if (!dest_rects) - return; - - if (transform == WL_OUTPUT_TRANSFORM_NORMAL) { - memcpy(dest_rects, src_rects, nrects * sizeof(*dest_rects)); - } else { - for (i = 0; i < nrects; i++) { - switch (transform) { - default: - case WL_OUTPUT_TRANSFORM_NORMAL: - dest_rects[i].x1 = src_rects[i].x1; - dest_rects[i].y1 = src_rects[i].y1; - dest_rects[i].x2 = src_rects[i].x2; - dest_rects[i].y2 = src_rects[i].y2; - break; - case WL_OUTPUT_TRANSFORM_90: - dest_rects[i].x1 = src_rects[i].y1; - dest_rects[i].y1 = width - src_rects[i].x2; - dest_rects[i].x2 = src_rects[i].y2; - dest_rects[i].y2 = width - src_rects[i].x1; - break; - case WL_OUTPUT_TRANSFORM_180: - dest_rects[i].x1 = width - src_rects[i].x2; - dest_rects[i].y1 = height - src_rects[i].y2; - dest_rects[i].x2 = width - src_rects[i].x1; - dest_rects[i].y2 = height - src_rects[i].y1; - break; - case WL_OUTPUT_TRANSFORM_270: - dest_rects[i].x1 = height - src_rects[i].y2; - dest_rects[i].y1 = src_rects[i].x1; - dest_rects[i].x2 = height - src_rects[i].y1; - dest_rects[i].y2 = src_rects[i].x2; - break; - case WL_OUTPUT_TRANSFORM_FLIPPED: - dest_rects[i].x1 = width - src_rects[i].x2; - dest_rects[i].y1 = src_rects[i].y1; - dest_rects[i].x2 = width - src_rects[i].x1; - dest_rects[i].y2 = src_rects[i].y2; - break; - case WL_OUTPUT_TRANSFORM_FLIPPED_90: - dest_rects[i].x1 = src_rects[i].y1; - dest_rects[i].y1 = src_rects[i].x1; - dest_rects[i].x2 = src_rects[i].y2; - dest_rects[i].y2 = src_rects[i].x2; - break; - case WL_OUTPUT_TRANSFORM_FLIPPED_180: - dest_rects[i].x1 = src_rects[i].x1; - dest_rects[i].y1 = height - src_rects[i].y2; - dest_rects[i].x2 = src_rects[i].x2; - dest_rects[i].y2 = height - src_rects[i].y1; - break; - case WL_OUTPUT_TRANSFORM_FLIPPED_270: - dest_rects[i].x1 = height - src_rects[i].y2; - dest_rects[i].y1 = width - src_rects[i].x2; - dest_rects[i].x2 = height - src_rects[i].y1; - dest_rects[i].y2 = width - src_rects[i].x1; - break; - } - } - } - - if (scale != 1) { - for (i = 0; i < nrects; i++) { - dest_rects[i].x1 *= scale; - dest_rects[i].x2 *= scale; - dest_rects[i].y1 *= scale; - dest_rects[i].y2 *= scale; - } - } - - pixman_region32_clear(dest); - pixman_region32_init_rects(dest, dest_rects, nrects); - free(dest_rects); -} - WL_EXPORT void weston_surface_to_buffer_float(struct weston_surface *surface, float sx, float sy, float *bx, float *by) @@ -6443,11 +6333,7 @@ WL_EXPORT void weston_output_region_from_global(struct weston_output *output, pixman_region32_t *region) { - pixman_region32_translate(region, -output->x, -output->y); - weston_transformed_region(output->width, output->height, - output->transform, - output->current_scale, - region, region); + weston_matrix_transform_region(region, &output->matrix, region); } static void diff --git a/libweston/libweston-internal.h b/libweston/libweston-internal.h index e8e762eb1..d5806a843 100644 --- a/libweston/libweston-internal.h +++ b/libweston/libweston-internal.h @@ -347,11 +347,6 @@ weston_transformed_rect(int width, int height, int32_t scale, pixman_box32_t rect); void -weston_transformed_region(int width, int height, - enum wl_output_transform transform, - int32_t scale, - pixman_region32_t *src, pixman_region32_t *dest); -void weston_matrix_transform_region(pixman_region32_t *dest, struct weston_matrix *matrix, pixman_region32_t *src); diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index 0f2dab5a1..3efd805f8 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -1447,12 +1447,9 @@ pixman_region_to_egl_y_invert(struct weston_output *output, /* Translate from global to output co-ordinate space. */ pixman_region32_init(&transformed); - pixman_region32_copy(&transformed, global_region); - pixman_region32_translate(&transformed, -output->x, -output->y); - weston_transformed_region(output->width, output->height, - output->transform, - output->current_scale, - &transformed, &transformed); + weston_matrix_transform_region(&transformed, + &output->matrix, + global_region); /* If we have borders drawn around the output, shift our output damage * to account for borders being drawn around the outside, adding any diff --git a/libweston/screenshooter.c b/libweston/screenshooter.c index b866829ba..6f6725a03 100644 --- a/libweston/screenshooter.c +++ b/libweston/screenshooter.c @@ -287,10 +287,9 @@ weston_recorder_frame_notify(struct wl_listener *listener, void *data) pixman_region32_init(&damage); pixman_region32_init(&transformed_damage); pixman_region32_intersect(&damage, &output->region, data); - pixman_region32_translate(&damage, -output->x, -output->y); - weston_transformed_region(output->width, output->height, - output->transform, output->current_scale, - &damage, &transformed_damage); + weston_matrix_transform_region(&transformed_damage, + &output->matrix, + &damage); pixman_region32_fini(&damage); r = pixman_region32_rectangles(&transformed_damage, &n);