diff options
author | Alexander Larsson <alexl@redhat.com> | 2013-05-19 20:41:44 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2013-05-21 17:39:55 +0200 |
commit | 72812570329256f721011e46323975d468e72e5c (patch) | |
tree | e6695f1c055bfb8af262db1ff36b9cb2d3da1b14 | |
parent | fe097f95a340ed19299b39131cdbf4c66b0c7ce1 (diff) |
window: Support transform in widget_cairo_create()
If a buffer_transform it specified in the window we automatically
compensate for it in the cairo_t
-rw-r--r-- | clients/window.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/clients/window.c b/clients/window.c index 40c0ef4..48b784d 100644 --- a/clients/window.c +++ b/clients/window.c @@ -1607,6 +1607,81 @@ widget_get_cairo_surface(struct widget *widget) return surface->cairo_surface; } +static void +widget_cairo_update_transform(struct widget *widget, cairo_t *cr) +{ + struct surface *surface = widget->surface; + double angle; + cairo_matrix_t m; + enum wl_output_transform transform; + int surface_width, surface_height; + int translate_x, translate_y; + + surface_width = surface->allocation.width; + surface_height = surface->allocation.height; + + transform = window_get_buffer_transform(widget->window); + switch (transform) { + case WL_OUTPUT_TRANSFORM_FLIPPED: + case WL_OUTPUT_TRANSFORM_FLIPPED_90: + case WL_OUTPUT_TRANSFORM_FLIPPED_180: + case WL_OUTPUT_TRANSFORM_FLIPPED_270: + cairo_matrix_init(&m, -1, 0, 0, 1, 0, 0); + break; + default: + cairo_matrix_init_identity(&m); + break; + } + + switch (transform) { + case WL_OUTPUT_TRANSFORM_NORMAL: + default: + angle = 0; + translate_x = 0; + translate_y = 0; + break; + case WL_OUTPUT_TRANSFORM_FLIPPED: + angle = 0; + translate_x = surface_width; + translate_y = 0; + break; + case WL_OUTPUT_TRANSFORM_90: + angle = M_PI_2; + translate_x = surface_height; + translate_y = 0; + break; + case WL_OUTPUT_TRANSFORM_FLIPPED_90: + angle = M_PI_2; + translate_x = surface_height; + translate_y = surface_width; + break; + case WL_OUTPUT_TRANSFORM_180: + angle = M_PI; + translate_x = surface_width; + translate_y = surface_height; + break; + case WL_OUTPUT_TRANSFORM_FLIPPED_180: + angle = M_PI; + translate_x = 0; + translate_y = surface_height; + break; + case WL_OUTPUT_TRANSFORM_270: + angle = M_PI + M_PI_2; + translate_x = 0; + translate_y = surface_width; + break; + case WL_OUTPUT_TRANSFORM_FLIPPED_270: + angle = M_PI + M_PI_2; + translate_x = 0; + translate_y = 0; + break; + } + + cairo_translate(cr, translate_x, translate_y); + cairo_rotate(cr, angle); + cairo_transform(cr, &m); +} + cairo_t * widget_cairo_create(struct widget *widget) { @@ -1617,6 +1692,8 @@ widget_cairo_create(struct widget *widget) cairo_surface = widget_get_cairo_surface(widget); cr = cairo_create(cairo_surface); + widget_cairo_update_transform(widget, cr); + cairo_translate(cr, -surface->allocation.x, -surface->allocation.y); return cr; |