diff options
author | Jason Ekstrand <jason@jlekstrand.net> | 2014-05-20 19:26:39 -0500 |
---|---|---|
committer | Jason Ekstrand <jason@jlekstrand.net> | 2014-05-20 22:47:00 -0500 |
commit | 24b6de27798b5b69cf2d3681d8daba05d5a1087e (patch) | |
tree | 52be849d2612b1882e7cceb88e1b6df916953a41 | |
parent | b1bb1c8fda35f95ac6f83fed0ecc86f8c2df12a2 (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.c | 131 |
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) |