summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Ekstrand <jason@jlekstrand.net>2014-05-20 22:45:02 -0500
committerJason Ekstrand <jason@jlekstrand.net>2014-05-20 22:47:01 -0500
commite57b1d5653034d61ae03037aa579a104a326eace (patch)
tree72f28ca15b925be0a09d0b2d98e599bd3d813c91
parent24b6de27798b5b69cf2d3681d8daba05d5a1087e (diff)
zoom: Use pixels instead of GL coordinateswip/damage-coordinates
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.
-rw-r--r--src/zoom.c38
1 files changed, 14 insertions, 24 deletions
diff --git a/src/zoom.c b/src/zoom.c
index 7553849d..cbff2f32 100644
--- a/src/zoom.c
+++ b/src/zoom.c
@@ -106,8 +106,8 @@ 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
@@ -116,11 +116,9 @@ 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 y = output->zoom.current.y;
- float trans_min, trans_max;
- float ratio, level;
+ float level;
level = output->zoom.spring_z.current;
- ratio = 1 / level;
if (!output->zoom.active || level > output->zoom.max_level ||
level == 0.0f)
@@ -132,25 +130,17 @@ weston_output_update_zoom_transform(struct weston_output *output)
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