summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Ekstrand <jason@jlekstrand.net>2014-05-20 22:45:02 -0500
committerJason Ekstrand <jason.ekstrand@intel.com>2014-06-20 17:08:44 -0700
commitcec9cca642119977a831e492188328516f6c1168 (patch)
treef4fb924b0f518ec96bfb708c2eea596eb64a8002
parentfc86bcb02c2eec2ecac5c81a70671b25a69e6c56 (diff)
zoom: Use pixels instead of GL 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