From: Alexander Larsson <al...@redhat.com>

If a buffer_transform it specified in the window we automatically
compensate for it in the cairo_t
---
 clients/window.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 77 insertions(+)

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;
-- 
1.8.1.4

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to