compositor: apply full transformation to input coordinates
When converting input coordinates from global to surface-local system,
apply the full inverse surface transformation instead of just
translation.
Move weston_surface_update_transform() implementation realier in the
file, no changes.
Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
diff --git a/src/compositor.c b/src/compositor.c
index 69ad60e..7b1b0f4 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -227,6 +227,32 @@
surface->shader = &surface->compositor->solid_shader;
}
+static void
+weston_surface_update_transform(struct weston_surface *surface)
+{
+ struct weston_matrix *matrix = &surface->transform.matrix;
+ struct weston_matrix *inverse = &surface->transform.inverse;
+ struct weston_transform *tform;
+
+ if (!surface->transform.dirty)
+ return;
+
+ surface->transform.dirty = 0;
+
+ if (wl_list_empty(&surface->transform.list)) {
+ surface->transform.enabled = 0;
+ return;
+ }
+
+ surface->transform.enabled = 1;
+
+ weston_matrix_init(matrix);
+ wl_list_for_each(tform, &surface->transform.list, link)
+ weston_matrix_multiply(matrix, &tform->matrix);
+
+ weston_matrix_invert(inverse, matrix);
+}
+
WL_EXPORT void
weston_surface_damage_rectangle(struct weston_surface *surface,
int32_t x, int32_t y,
@@ -310,6 +336,15 @@
weston_surface_transform(struct weston_surface *surface,
int32_t x, int32_t y, int32_t *sx, int32_t *sy)
{
+ weston_surface_update_transform(surface);
+
+ if (surface->transform.enabled) {
+ struct weston_vector v = { { x, y, 0.0f, 1.0f } };
+ weston_matrix_transform(&surface->transform.inverse, &v);
+ x = floorf(v.f[0] / v.f[3]);
+ y = floorf(v.f[1] / v.f[3]);
+ }
+
*sx = x - surface->x;
*sy = y - surface->y;
}
@@ -541,32 +576,6 @@
return 1;
}
-static void
-weston_surface_update_transform(struct weston_surface *surface)
-{
- struct weston_matrix *matrix = &surface->transform.matrix;
- struct weston_matrix *inverse = &surface->transform.inverse;
- struct weston_transform *tform;
-
- if (!surface->transform.dirty)
- return;
-
- surface->transform.dirty = 0;
-
- if (wl_list_empty(&surface->transform.list)) {
- surface->transform.enabled = 0;
- return;
- }
-
- surface->transform.enabled = 1;
-
- weston_matrix_init(matrix);
- wl_list_for_each(tform, &surface->transform.list, link)
- weston_matrix_multiply(matrix, &tform->matrix);
-
- weston_matrix_invert(inverse, matrix);
-}
-
WL_EXPORT void
weston_surface_draw(struct weston_surface *es, struct weston_output *output)
{