Fix surface picking
authorKristian Høgsberg <krh@bitplanet.net>
Tue, 8 Jun 2010 19:29:14 +0000 (15:29 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 8 Jun 2010 19:29:14 +0000 (15:29 -0400)
compositor.c

index 5af0a15..2a521ee 100644 (file)
@@ -319,14 +319,15 @@ static void
 wlsc_matrix_transform(struct wlsc_matrix *matrix, struct wlsc_vector *v)
 {
        int i, j;
-       GLfloat t;
+       struct wlsc_vector t;
 
        for (i = 0; i < 4; i++) {
-               t = 0;
+               t.f[i] = 0;
                for (j = 0; j < 4; j++)
-                       t += v->f[j] * matrix->d[i + j * 4];
-               v->f[i] = t;
+                       t.f[i] += v->f[j] * matrix->d[i + j * 4];
        }
+       
+       *v = t;
 }
 
 static void
@@ -694,6 +695,11 @@ surface_map(struct wl_client *client,
        wlsc_matrix_init(&es->matrix);
        wlsc_matrix_scale(&es->matrix, width, height, 1);
        wlsc_matrix_translate(&es->matrix, x, y, 0);
+
+       wlsc_matrix_init(&es->matrix_inv);
+       wlsc_matrix_translate(&es->matrix_inv, -x, -y, 0);
+       wlsc_matrix_scale(&es->matrix_inv, 1.0 / width, 1.0 / height, 1);
+
 }
 
 static void
@@ -762,8 +768,8 @@ wlsc_surface_transform(struct wlsc_surface *surface,
        struct wlsc_vector v = { { x, y, 0, 1 } };
        
        wlsc_matrix_transform(&surface->matrix_inv, &v);
-       *sx = v.f[0];
-       *sy = v.f[1];
+       *sx = v.f[0] * surface->width;
+       *sy = v.f[1] * surface->height;
 }
 
 static void