[PATCH weston v2 16/20] compositor: use weston_matrix_transform for weston_output_transform_coordinate

Derek Foreman derekf at osg.samsung.com
Thu Oct 16 08:55:34 PDT 2014


We can greatly simplify weston_output_transform_coordinate now by simply
multiplying by the output matrix and converting the result to fixed point.
---
 src/compositor.c | 62 ++++----------------------------------------------------
 1 file changed, 4 insertions(+), 58 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index aef3246..ba9f886 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -3539,66 +3539,12 @@ weston_output_transform_coordinate(struct weston_output *output,
 				   wl_fixed_t device_x, wl_fixed_t device_y,
 				   wl_fixed_t *x, wl_fixed_t *y)
 {
-	wl_fixed_t tx, ty;
-	wl_fixed_t width, height;
-	float zoom_scale, zx, zy;
+	struct weston_vector p = {{wl_fixed_to_double(device_x), wl_fixed_to_double(device_y), 0.0, 1.0}};
 
-	width = wl_fixed_from_int(output->width * output->current_scale - 1);
-	height = wl_fixed_from_int(output->height * output->current_scale - 1);
+	weston_matrix_transform(&output->matrix, &p);
 
-	switch(output->transform) {
-	case WL_OUTPUT_TRANSFORM_NORMAL:
-	default:
-		tx = device_x;
-		ty = device_y;
-		break;
-	case WL_OUTPUT_TRANSFORM_90:
-		tx = device_y;
-		ty = height - device_x;
-		break;
-	case WL_OUTPUT_TRANSFORM_180:
-		tx = width - device_x;
-		ty = height - device_y;
-		break;
-	case WL_OUTPUT_TRANSFORM_270:
-		tx = width - device_y;
-		ty = device_x;
-		break;
-	case WL_OUTPUT_TRANSFORM_FLIPPED:
-		tx = width - device_x;
-		ty = device_y;
-		break;
-	case WL_OUTPUT_TRANSFORM_FLIPPED_90:
-		tx = width - device_y;
-		ty = height - device_x;
-		break;
-	case WL_OUTPUT_TRANSFORM_FLIPPED_180:
-		tx = device_x;
-		ty = height - device_y;
-		break;
-	case WL_OUTPUT_TRANSFORM_FLIPPED_270:
-		tx = device_y;
-		ty = device_x;
-		break;
-	}
-
-	tx /= output->current_scale;
-	ty /= output->current_scale;
-
-	if (output->zoom.active) {
-		zoom_scale = output->zoom.spring_z.current;
-		zx = (wl_fixed_to_double(tx) * (1.0f - zoom_scale) +
-		      output->width / 2.0f *
-		      (zoom_scale + output->zoom.trans_x));
-		zy = (wl_fixed_to_double(ty) * (1.0f - zoom_scale) +
-		      output->height / 2.0f *
-		      (zoom_scale + output->zoom.trans_y));
-		tx = wl_fixed_from_double(zx);
-		ty = wl_fixed_from_double(zy);
-	}
-
-	*x = tx + wl_fixed_from_int(output->x);
-	*y = ty + wl_fixed_from_int(output->y);
+	*x = wl_fixed_from_double(p.f[0]/p.f[3]);
+	*y = wl_fixed_from_double(p.f[1]/p.f[3]);
 }
 
 static void
-- 
2.1.1



More information about the wayland-devel mailing list