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
diff --git a/clients/window.c b/clients/window.c
index 627f1e8..edac77b 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -1621,6 +1621,81 @@
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)
{
@@ -1631,6 +1706,8 @@
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;