Restructure output zoom.
authorScott Moreau <oreaus@gmail.com>
Mon, 21 May 2012 21:21:25 +0000 (15:21 -0600)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 22 May 2012 16:58:47 +0000 (12:58 -0400)
A quick clean-up of zoom to prepare for the other patches in this series.

src/compositor.c
src/compositor.h
src/shell.c

index ab4c970..5e77bc8 100644 (file)
@@ -2442,20 +2442,18 @@ weston_output_destroy(struct weston_output *output)
 WL_EXPORT void
 weston_output_update_zoom(struct weston_output *output, wl_fixed_t fx, wl_fixed_t fy)
 {
-       float ratio;
        int32_t x, y;
 
-       if (output->zoom.level <= 0)
+       if (output->zoom.level >= 1.0)
                return;
 
        x = wl_fixed_to_int(fx);
        y = wl_fixed_to_int(fy);
 
-       output->zoom.magnification = 1 / output->zoom.level;
-       ratio = 1 - (1 / output->zoom.magnification);
-
-       output->zoom.trans_x = (((float)(x - output->x) / output->current->width) * (ratio * 2)) - ratio;
-       output->zoom.trans_y = (((float)(y - output->y) / output->current->height) * (ratio * 2)) - ratio;
+       output->zoom.trans_x = (((float)(x - output->x) / output->current->width) *
+                                       (output->zoom.level * 2)) - output->zoom.level;
+       output->zoom.trans_y = (((float)(y - output->y) / output->current->height) *
+                                       (output->zoom.level * 2)) - output->zoom.level;
 
        output->dirty = 1;
        weston_output_damage(output);
@@ -2465,6 +2463,7 @@ WL_EXPORT void
 weston_output_update_matrix(struct weston_output *output)
 {
        int flip;
+       float magnification;
        struct weston_matrix camera;
        struct weston_matrix modelview;
 
@@ -2477,12 +2476,14 @@ weston_output_update_matrix(struct weston_output *output)
        weston_matrix_scale(&output->matrix,
                            2.0 / (output->current->width + output->border.left + output->border.right),
                            flip * 2.0 / (output->current->height + output->border.top + output->border.bottom), 1);
+
        if (output->zoom.active) {
+               magnification = 1 / (1 - output->zoom.level);
                weston_matrix_init(&camera);
                weston_matrix_init(&modelview);
                weston_matrix_translate(&camera, output->zoom.trans_x, flip * output->zoom.trans_y, 0);
                weston_matrix_invert(&modelview, &camera);
-               weston_matrix_scale(&modelview, output->zoom.magnification, output->zoom.magnification, 1.0);
+               weston_matrix_scale(&modelview, magnification, magnification, 1.0);
                weston_matrix_multiply(&output->matrix, &modelview);
        }
 
@@ -2519,8 +2520,7 @@ weston_output_init(struct weston_output *output, struct weston_compositor *c,
 
        output->zoom.active = 0;
        output->zoom.increment = 0.05;
-       output->zoom.level = 1.0;
-       output->zoom.magnification = 1.0;
+       output->zoom.level = 0.0;
        output->zoom.trans_x = 0.0;
        output->zoom.trans_y = 0.0;
 
index 7af423d..744b6b7 100644 (file)
@@ -77,7 +77,6 @@ struct weston_output_zoom {
        int active;
        float increment;
        float level;
-       float magnification;
        float trans_x, trans_y;
 };
 
index 104b6f7..8cd2129 100644 (file)
@@ -1637,6 +1637,7 @@ zoom_binding(struct wl_seat *seat, uint32_t time,
        struct weston_seat *ws = (struct weston_seat *) seat;
        struct weston_compositor *compositor = ws->compositor;
        struct weston_output *output;
+       float maximum_level;
 
        wl_list_for_each(output, &compositor->output_list, link) {
                if (pixman_region32_contains_point(&output->region,
@@ -1644,15 +1645,17 @@ zoom_binding(struct wl_seat *seat, uint32_t time,
                                                   wl_fixed_to_double(seat->pointer->y),
                                                   NULL)) {
                        output->zoom.active = 1;
-                       output->zoom.level += output->zoom.increment * -value;
+                       output->zoom.level += output->zoom.increment * value;
 
-                       if (output->zoom.level >= 1.0) {
+                       if (output->zoom.level <= 0.0) {
                                output->zoom.active = 0;
-                               output->zoom.level = 1.0;
+                               output->zoom.level = 0.0;
                        }
 
-                       if (output->zoom.level < output->zoom.increment)
-                               output->zoom.level = output->zoom.increment;
+                       maximum_level = 1 - output->zoom.increment;
+
+                       if (output->zoom.level > maximum_level)
+                               output->zoom.level = maximum_level;
 
                        weston_output_update_zoom(output,
                                                  seat->pointer->x,