[PATCH weston v2 04/16] zoom: Use pixels instead of GL coordinates
Pekka Paalanen
ppaalanen at gmail.com
Tue Mar 10 06:01:35 PDT 2015
From: Jason Ekstrand <jason at jlekstrand.net>
Previously, the zoom functions used GL coordinates natively which doesn't
work with the new output matrix calculations. This changes zoom to work in
pixel coordinates to match the new output matrix format. This also cleans
up the math in the zoom code substantially.
This patch changes the meaning of weston_output_zoom::trans_x,trans_y,
and doing so probably breaks zoom on the rpi-renderer and all absolute
input devices. These problems are fixed by the following patches:
rpi-renderer: minimal fix to zoom coordinates
compositor: use weston_matrix_transform for
weston_output_transform_coordinate
[Pekka: added a comment]
Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
---
src/zoom.c | 41 +++++++++++++++--------------------------
1 file changed, 15 insertions(+), 26 deletions(-)
diff --git a/src/zoom.c b/src/zoom.c
index c70a70c..5848889 100644
--- a/src/zoom.c
+++ b/src/zoom.c
@@ -73,18 +73,17 @@ zoom_area_center_from_pointer(struct weston_output *output,
wl_fixed_t w = wl_fixed_from_int(output->width);
wl_fixed_t h = wl_fixed_from_int(output->height);
- *x -= ((((*x - offset_x) / (float) w) - 0.5) * (w * (1.0 - level)));
- *y -= ((((*y - offset_y) / (float) h) - 0.5) * (h * (1.0 - level)));
+ *x = (*x - offset_x) * level + w / 2;
+ *y = (*y - offset_y) * level + h / 2;
}
static void
weston_output_update_zoom_transform(struct weston_output *output)
{
float global_x, global_y;
- wl_fixed_t x = output->zoom.current.x;
+ wl_fixed_t x = output->zoom.current.x; /* global pointer coords */
wl_fixed_t y = output->zoom.current.y;
- float trans_min, trans_max;
- float ratio, level;
+ float level;
level = output->zoom.spring_z.current;
@@ -92,32 +91,22 @@ weston_output_update_zoom_transform(struct weston_output *output)
level == 0.0f)
return;
- ratio = 1 / level;
-
zoom_area_center_from_pointer(output, &x, &y);
global_x = wl_fixed_to_double(x);
global_y = wl_fixed_to_double(y);
- output->zoom.trans_x =
- ((((global_x - output->x) / output->width) *
- (level * 2)) - level) * ratio;
- output->zoom.trans_y =
- ((((global_y - output->y) / output->height) *
- (level * 2)) - level) * ratio;
-
- trans_max = level * 2 - level;
- trans_min = -trans_max;
-
- /* Clip zoom area to output */
- if (output->zoom.trans_x > trans_max)
- output->zoom.trans_x = trans_max;
- else if (output->zoom.trans_x < trans_min)
- output->zoom.trans_x = trans_min;
- if (output->zoom.trans_y > trans_max)
- output->zoom.trans_y = trans_max;
- else if (output->zoom.trans_y < trans_min)
- output->zoom.trans_y = trans_min;
+ output->zoom.trans_x = global_x - (output->x + output->width / 2);
+ output->zoom.trans_y = global_y - (output->y + output->height / 2);
+
+ if (output->zoom.trans_x < 0)
+ output->zoom.trans_x = 0;
+ if (output->zoom.trans_y < 0)
+ output->zoom.trans_y = 0;
+ if (output->zoom.trans_x > level * output->width)
+ output->zoom.trans_x = level * output->width;
+ if (output->zoom.trans_y > level * output->height)
+ output->zoom.trans_y = level * output->height;
}
static void
--
2.0.5
More information about the wayland-devel
mailing list