We can greatly simplify weston_output_transform_coordinate now by simply multiplying by the output matrix and converting the result to fixed point. --- src/compositor.c | 62 ++++---------------------------------------------------- 1 file changed, 4 insertions(+), 58 deletions(-)
diff --git a/src/compositor.c b/src/compositor.c index aef3246..ba9f886 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -3539,66 +3539,12 @@ weston_output_transform_coordinate(struct weston_output *output, wl_fixed_t device_x, wl_fixed_t device_y, wl_fixed_t *x, wl_fixed_t *y) { - wl_fixed_t tx, ty; - wl_fixed_t width, height; - float zoom_scale, zx, zy; + struct weston_vector p = {{wl_fixed_to_double(device_x), wl_fixed_to_double(device_y), 0.0, 1.0}}; - width = wl_fixed_from_int(output->width * output->current_scale - 1); - height = wl_fixed_from_int(output->height * output->current_scale - 1); + weston_matrix_transform(&output->matrix, &p); - switch(output->transform) { - case WL_OUTPUT_TRANSFORM_NORMAL: - default: - tx = device_x; - ty = device_y; - break; - case WL_OUTPUT_TRANSFORM_90: - tx = device_y; - ty = height - device_x; - break; - case WL_OUTPUT_TRANSFORM_180: - tx = width - device_x; - ty = height - device_y; - break; - case WL_OUTPUT_TRANSFORM_270: - tx = width - device_y; - ty = device_x; - break; - case WL_OUTPUT_TRANSFORM_FLIPPED: - tx = width - device_x; - ty = device_y; - break; - case WL_OUTPUT_TRANSFORM_FLIPPED_90: - tx = width - device_y; - ty = height - device_x; - break; - case WL_OUTPUT_TRANSFORM_FLIPPED_180: - tx = device_x; - ty = height - device_y; - break; - case WL_OUTPUT_TRANSFORM_FLIPPED_270: - tx = device_y; - ty = device_x; - break; - } - - tx /= output->current_scale; - ty /= output->current_scale; - - if (output->zoom.active) { - zoom_scale = output->zoom.spring_z.current; - zx = (wl_fixed_to_double(tx) * (1.0f - zoom_scale) + - output->width / 2.0f * - (zoom_scale + output->zoom.trans_x)); - zy = (wl_fixed_to_double(ty) * (1.0f - zoom_scale) + - output->height / 2.0f * - (zoom_scale + output->zoom.trans_y)); - tx = wl_fixed_from_double(zx); - ty = wl_fixed_from_double(zy); - } - - *x = tx + wl_fixed_from_int(output->x); - *y = ty + wl_fixed_from_int(output->y); + *x = wl_fixed_from_double(p.f[0]/p.f[3]); + *y = wl_fixed_from_double(p.f[1]/p.f[3]); } static void -- 2.1.1 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel