diff options
author | Jason Ekstrand <jason@jlekstrand.net> | 2014-05-20 22:45:02 -0500 |
---|---|---|
committer | Jason Ekstrand <jason@jlekstrand.net> | 2014-05-20 22:47:01 -0500 |
commit | e57b1d5653034d61ae03037aa579a104a326eace (patch) | |
tree | 72f28ca15b925be0a09d0b2d98e599bd3d813c91 | |
parent | 24b6de27798b5b69cf2d3681d8daba05d5a1087e (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.c | 38 |
1 files changed, 14 insertions, 24 deletions
@@ -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 |