summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2013-05-19 20:41:44 +0200
committerAlexander Larsson <alexl@redhat.com>2013-05-21 17:39:55 +0200
commit72812570329256f721011e46323975d468e72e5c (patch)
treee6695f1c055bfb8af262db1ff36b9cb2d3da1b14
parentfe097f95a340ed19299b39131cdbf4c66b0c7ce1 (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.c77
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;