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
This commit is contained in:
committed by
Kristian Høgsberg
parent
9777744cda
commit
15901f0377
@@ -1621,6 +1621,81 @@ widget_get_cairo_surface(struct widget *widget)
|
|||||||
return surface->cairo_surface;
|
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 *
|
cairo_t *
|
||||||
widget_cairo_create(struct widget *widget)
|
widget_cairo_create(struct widget *widget)
|
||||||
{
|
{
|
||||||
@@ -1631,6 +1706,8 @@ widget_cairo_create(struct widget *widget)
|
|||||||
cairo_surface = widget_get_cairo_surface(widget);
|
cairo_surface = widget_get_cairo_surface(widget);
|
||||||
cr = cairo_create(cairo_surface);
|
cr = cairo_create(cairo_surface);
|
||||||
|
|
||||||
|
widget_cairo_update_transform(widget, cr);
|
||||||
|
|
||||||
cairo_translate(cr, -surface->allocation.x, -surface->allocation.y);
|
cairo_translate(cr, -surface->allocation.x, -surface->allocation.y);
|
||||||
|
|
||||||
return cr;
|
return cr;
|
||||||
|
|||||||
Reference in New Issue
Block a user