Apply the zoom transformation before the output transformation

The zoom translation is just a scale and a translate. The translation
is calculated based on the coordinates of the pointer which are in
global space. Previously the calculated translation was transformed by
the output transformation so that when the zoom transform is applied
after the output transform then it will be correct. However if we just
apply the zoom transformation first then we get the same result
without the zoom code having to be aware of the output transformation.

This also fixes weston_output_transform_coordinate which was applying
the output and zoom transforms in the wrong order.

https://bugs.freedesktop.org/show_bug.cgi?id=78211
dev
Neil Roberts 11 years ago committed by Kristian Høgsberg
parent 2ef1cd177e
commit 6c3b01f81e
  1. 4
      src/compositor.c
  2. 47
      src/zoom.c

@ -3198,8 +3198,6 @@ weston_output_update_matrix(struct weston_output *output)
2.0 / output->width, 2.0 / output->width,
-2.0 / output->height, 1); -2.0 / output->height, 1);
weston_output_compute_transform(output);
if (output->zoom.active) { if (output->zoom.active) {
magnification = 1 / (1 - output->zoom.spring_z.current); magnification = 1 / (1 - output->zoom.spring_z.current);
weston_output_update_zoom(output); weston_output_update_zoom(output);
@ -3209,6 +3207,8 @@ weston_output_update_matrix(struct weston_output *output)
magnification, 1.0); magnification, 1.0);
} }
weston_output_compute_transform(output);
output->dirty = 0; output->dirty = 0;
} }

@ -110,50 +110,6 @@ zoom_area_center_from_pointer(struct weston_output *output,
*y -= ((((*y - offset_y) / (float) h) - 0.5) * (h * (1.0 - level))); *y -= ((((*y - offset_y) / (float) h) - 0.5) * (h * (1.0 - level)));
} }
static void
weston_zoom_apply_output_transform(struct weston_output *output,
float *x, float *y)
{
float tx, ty;
switch(output->transform) {
case WL_OUTPUT_TRANSFORM_NORMAL:
default:
return;
case WL_OUTPUT_TRANSFORM_90:
tx = -*y;
ty = *x;
break;
case WL_OUTPUT_TRANSFORM_180:
tx = -*x;
ty = -*y;
break;
case WL_OUTPUT_TRANSFORM_270:
tx = *y;
ty = -*x;
break;
case WL_OUTPUT_TRANSFORM_FLIPPED:
tx = -*x;
ty = *y;
break;
case WL_OUTPUT_TRANSFORM_FLIPPED_90:
tx = -*y;
ty = -*x;
break;
case WL_OUTPUT_TRANSFORM_FLIPPED_180:
tx = *x;
ty = -*y;
break;
case WL_OUTPUT_TRANSFORM_FLIPPED_270:
tx = *y;
ty = *x;
break;
}
*x = tx;
*y = ty;
}
static void static void
weston_output_update_zoom_transform(struct weston_output *output) weston_output_update_zoom_transform(struct weston_output *output)
{ {
@ -183,9 +139,6 @@ weston_output_update_zoom_transform(struct weston_output *output)
((((global_y - output->y) / output->height) * ((((global_y - output->y) / output->height) *
(level * 2)) - level) * ratio; (level * 2)) - level) * ratio;
weston_zoom_apply_output_transform(output, &output->zoom.trans_x,
&output->zoom.trans_y);
trans_max = level * 2 - level; trans_max = level * 2 - level;
trans_min = -trans_max; trans_min = -trans_max;

Loading…
Cancel
Save