summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Ekstrand <jason@jlekstrand.net>2014-05-20 19:26:39 -0500
committerJason Ekstrand <jason@jlekstrand.net>2014-05-20 22:47:00 -0500
commit24b6de27798b5b69cf2d3681d8daba05d5a1087e (patch)
tree52be849d2612b1882e7cceb88e1b6df916953a41
parentb1bb1c8fda35f95ac6f83fed0ecc86f8c2df12a2 (diff)
pixman-renderer: Simplify the buffer-to-output matrix computation
Now that we have a buffer-to-surface matrix and the global-to-output matrix is usable, we can remove a large chunk of confusing code from the pixman renderer. Hopefully, having this stuff in weston core will keep the pixman renderer from gettin broken quite as often.
-rw-r--r--src/pixman-renderer.c131
1 files changed, 8 insertions, 123 deletions
diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c
index 44b8a2c4..10c80fe3 100644
--- a/src/pixman-renderer.c
+++ b/src/pixman-renderer.c
@@ -139,35 +139,6 @@ region_global_to_output(struct weston_output *output, pixman_region32_t *region)
#define D2F(v) pixman_double_to_fixed((double)v)
static void
-transform_apply_viewport(pixman_transform_t *transform,
- struct weston_surface *surface)
-{
- struct weston_buffer_viewport *vp = &surface->buffer_viewport;
- double src_width, src_height;
- double src_x, src_y;
-
- if (vp->buffer.src_width == wl_fixed_from_int(-1)) {
- if (vp->surface.width == -1)
- return;
-
- src_x = 0.0;
- src_y = 0.0;
- src_width = surface->width_from_buffer;
- src_height = surface->height_from_buffer;
- } else {
- src_x = wl_fixed_to_double(vp->buffer.src_x);
- src_y = wl_fixed_to_double(vp->buffer.src_y);
- src_width = wl_fixed_to_double(vp->buffer.src_width);
- src_height = wl_fixed_to_double(vp->buffer.src_height);
- }
-
- pixman_transform_scale(transform, NULL,
- D2F(src_width / surface->width),
- D2F(src_height / surface->height));
- pixman_transform_translate(transform, NULL, D2F(src_x), D2F(src_y));
-}
-
-static void
weston_matrix_to_pixman_transform(pixman_transform_t *pt,
const struct weston_matrix *wm)
{
@@ -196,8 +167,8 @@ repaint_region(struct weston_view *ev, struct weston_output *output,
struct weston_buffer_viewport *vp = &ev->surface->buffer_viewport;
pixman_region32_t final_region;
float view_x, view_y;
- pixman_transform_t transform, surface_transform;
- pixman_fixed_t fw, fh;
+ pixman_transform_t transform;
+ struct weston_matrix matrix;
pixman_image_t *mask_image;
pixman_color_t mask = { 0, };
@@ -234,104 +205,18 @@ repaint_region(struct weston_view *ev, struct weston_output *output,
/* Set up the source transformation based on the surface
position, the output position/transform/scale and the client
specified buffer transform/scale */
- pixman_transform_init_identity(&transform);
- pixman_transform_scale(&transform, NULL,
- pixman_double_to_fixed ((double)1.0/output->current_scale),
- pixman_double_to_fixed ((double)1.0/output->current_scale));
-
- fw = pixman_int_to_fixed(output->width);
- fh = pixman_int_to_fixed(output->height);
- switch (output->transform) {
- default:
- case WL_OUTPUT_TRANSFORM_NORMAL:
- case WL_OUTPUT_TRANSFORM_FLIPPED:
- break;
- case WL_OUTPUT_TRANSFORM_90:
- case WL_OUTPUT_TRANSFORM_FLIPPED_90:
- pixman_transform_rotate(&transform, NULL, 0, -pixman_fixed_1);
- pixman_transform_translate(&transform, NULL, 0, fh);
- break;
- case WL_OUTPUT_TRANSFORM_180:
- case WL_OUTPUT_TRANSFORM_FLIPPED_180:
- pixman_transform_rotate(&transform, NULL, -pixman_fixed_1, 0);
- pixman_transform_translate(&transform, NULL, fw, fh);
- break;
- case WL_OUTPUT_TRANSFORM_270:
- case WL_OUTPUT_TRANSFORM_FLIPPED_270:
- pixman_transform_rotate(&transform, NULL, 0, pixman_fixed_1);
- pixman_transform_translate(&transform, NULL, fw, 0);
- break;
- }
-
- switch (output->transform) {
- case WL_OUTPUT_TRANSFORM_FLIPPED:
- case WL_OUTPUT_TRANSFORM_FLIPPED_90:
- case WL_OUTPUT_TRANSFORM_FLIPPED_180:
- case WL_OUTPUT_TRANSFORM_FLIPPED_270:
- pixman_transform_scale(&transform, NULL,
- pixman_int_to_fixed (-1),
- pixman_int_to_fixed (1));
- pixman_transform_translate(&transform, NULL, fw, 0);
- break;
- }
-
- pixman_transform_translate(&transform, NULL,
- pixman_double_to_fixed (output->x),
- pixman_double_to_fixed (output->y));
+ weston_matrix_invert(&matrix, &output->matrix);
if (ev->transform.enabled) {
- weston_matrix_to_pixman_transform(&surface_transform,
- &ev->transform.inverse);
- pixman_transform_multiply(&transform, &surface_transform, &transform);
+ weston_matrix_multiply(&matrix, &ev->transform.inverse);
} else {
- pixman_transform_translate(&transform, NULL,
- pixman_double_to_fixed ((double)-ev->geometry.x),
- pixman_double_to_fixed ((double)-ev->geometry.y));
- }
-
- transform_apply_viewport(&transform, ev->surface);
-
- fw = pixman_int_to_fixed(ev->surface->width_from_buffer);
- fh = pixman_int_to_fixed(ev->surface->height_from_buffer);
-
- switch (vp->buffer.transform) {
- case WL_OUTPUT_TRANSFORM_FLIPPED:
- case WL_OUTPUT_TRANSFORM_FLIPPED_90:
- case WL_OUTPUT_TRANSFORM_FLIPPED_180:
- case WL_OUTPUT_TRANSFORM_FLIPPED_270:
- pixman_transform_scale(&transform, NULL,
- pixman_int_to_fixed (-1),
- pixman_int_to_fixed (1));
- pixman_transform_translate(&transform, NULL, fw, 0);
- break;
+ weston_matrix_translate(&matrix,
+ -ev->geometry.x, -ev->geometry.y, 0);
}
- switch (vp->buffer.transform) {
- default:
- case WL_OUTPUT_TRANSFORM_NORMAL:
- case WL_OUTPUT_TRANSFORM_FLIPPED:
- break;
- case WL_OUTPUT_TRANSFORM_90:
- case WL_OUTPUT_TRANSFORM_FLIPPED_90:
- pixman_transform_rotate(&transform, NULL, 0, pixman_fixed_1);
- pixman_transform_translate(&transform, NULL, fh, 0);
- break;
- case WL_OUTPUT_TRANSFORM_180:
- case WL_OUTPUT_TRANSFORM_FLIPPED_180:
- pixman_transform_rotate(&transform, NULL, -pixman_fixed_1, 0);
- pixman_transform_translate(&transform, NULL, fw, fh);
- break;
- case WL_OUTPUT_TRANSFORM_270:
- case WL_OUTPUT_TRANSFORM_FLIPPED_270:
- pixman_transform_rotate(&transform, NULL, 0, -pixman_fixed_1);
- pixman_transform_translate(&transform, NULL, 0, fw);
- break;
- }
-
- pixman_transform_scale(&transform, NULL,
- pixman_double_to_fixed(vp->buffer.scale),
- pixman_double_to_fixed(vp->buffer.scale));
+ weston_matrix_multiply(&matrix, &ev->surface->surface_to_buffer_matrix);
+ weston_matrix_to_pixman_transform(&transform, &matrix);
pixman_image_set_transform(ps->image, &transform);
if (ev->transform.enabled || output->current_scale != vp->buffer.scale)