Introduce several matrix transform types and track type for matrix.
Could be usefull for activating some fastpath that depends on some
transform type.

Signed-off-by: Vasily Khoruzhick <anars...@gmail.com>
---
 shared/matrix.c  | 23 ++++++++++++++++++++---
 shared/matrix.h  | 10 ++++++++++
 src/compositor.c |  3 +++
 src/shell.c      | 17 +++++------------
 4 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/shared/matrix.c b/shared/matrix.c
index 11b5b95..3ff4089 100644
--- a/shared/matrix.c
+++ b/shared/matrix.c
@@ -21,6 +21,7 @@
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <float.h>
 #include <string.h>
 #include <stdlib.h>
 #include <math.h>
@@ -46,7 +47,8 @@ WL_EXPORT void
 weston_matrix_init(struct weston_matrix *matrix)
 {
        static const struct weston_matrix identity = {
-               { 1, 0, 0, 0,  0, 1, 0, 0,  0, 0, 1, 0,  0, 0, 0, 1 }
+               .d = { 1, 0, 0, 0,  0, 1, 0, 0,  0, 0, 1, 0,  0, 0, 0, 1 },
+               .type = 0,
        };
 
        memcpy(matrix, &identity, sizeof identity);
@@ -69,6 +71,7 @@ weston_matrix_multiply(struct weston_matrix *m, const struct 
weston_matrix *n)
                for (j = 0; j < 4; j++)
                        tmp.d[i] += row[j] * column[j * 4];
        }
+       tmp.type = m->type | n->type;
        memcpy(m, &tmp, sizeof tmp);
 }
 
@@ -76,7 +79,8 @@ WL_EXPORT void
 weston_matrix_translate(struct weston_matrix *matrix, float x, float y, float 
z)
 {
        struct weston_matrix translate = {
-               { 1, 0, 0, 0,  0, 1, 0, 0,  0, 0, 1, 0,  x, y, z, 1 }
+               .d = { 1, 0, 0, 0,  0, 1, 0, 0,  0, 0, 1, 0,  x, y, z, 1 },
+               .type = WESTON_MATRIX_TRANSFORM_TRANSLATE,
        };
 
        weston_matrix_multiply(matrix, &translate);
@@ -86,12 +90,24 @@ WL_EXPORT void
 weston_matrix_scale(struct weston_matrix *matrix, float x, float y,float z)
 {
        struct weston_matrix scale = {
-               { x, 0, 0, 0,  0, y, 0, 0,  0, 0, z, 0,  0, 0, 0, 1 }
+               .d = { x, 0, 0, 0,  0, y, 0, 0,  0, 0, z, 0,  0, 0, 0, 1 },
+               .type = WESTON_MATRIX_TRANSFORM_SCALE,
        };
 
        weston_matrix_multiply(matrix, &scale);
 }
 
+WL_EXPORT void
+weston_matrix_rotate_xy(struct weston_matrix *matrix, float cos, float sin)
+{
+       struct weston_matrix translate = {
+               .d = { cos, sin, 0, 0,  -sin, cos, 0, 0,  0, 0, 1, 0,  0, 0, 0, 
1 },
+               .type = WESTON_MATRIX_TRANSFORM_ROTATE,
+       };
+
+       weston_matrix_multiply(matrix, &translate);
+}
+
 /* v <- m * v */
 WL_EXPORT void
 weston_matrix_transform(struct weston_matrix *matrix, struct weston_vector *v)
@@ -249,6 +265,7 @@ weston_matrix_invert(struct weston_matrix *inverse,
        weston_matrix_init(inverse);
        for (c = 0; c < 4; ++c)
                inverse_transform(LU, perm, &inverse->d[c * 4]);
+       inverse->type = matrix->type;
 
        return 0;
 }
diff --git a/shared/matrix.h b/shared/matrix.h
index bacb7bf..47354f6 100644
--- a/shared/matrix.h
+++ b/shared/matrix.h
@@ -24,8 +24,16 @@
 #ifndef WESTON_MATRIX_H
 #define WESTON_MATRIX_H
 
+enum weston_matrix_transform_type {
+       WESTON_MATRIX_TRANSFORM_TRANSLATE       = (1 << 0),
+       WESTON_MATRIX_TRANSFORM_SCALE           = (1 << 1),
+       WESTON_MATRIX_TRANSFORM_ROTATE          = (1 << 2),
+       WESTON_MATRIX_TRANSFORM_OTHER           = (1 << 3),
+};
+
 struct weston_matrix {
        float d[16];
+       unsigned int type;
 };
 
 struct weston_vector {
@@ -42,6 +50,8 @@ void
 weston_matrix_translate(struct weston_matrix *matrix,
                        float x, float y, float z);
 void
+weston_matrix_rotate_xy(struct weston_matrix *matrix, float cos, float sin);
+void
 weston_matrix_transform(struct weston_matrix *matrix, struct weston_vector *v);
 
 int
diff --git a/src/compositor.c b/src/compositor.c
index a2e95c9..5ac43f2 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -539,6 +539,7 @@ weston_surface_update_transform_enable(struct 
weston_surface *surface)
        surface->transform.enabled = 1;
 
        /* Otherwise identity matrix, but with x and y translation. */
+       surface->transform.position.matrix.type = 
WESTON_MATRIX_TRANSFORM_TRANSLATE;
        surface->transform.position.matrix.d[12] = surface->geometry.x;
        surface->transform.position.matrix.d[13] = surface->geometry.y;
 
@@ -2754,12 +2755,14 @@ weston_output_compute_transform(struct weston_output 
*output)
        int flip;
 
        weston_matrix_init(&transform);
+       transform.type = WESTON_MATRIX_TRANSFORM_ROTATE;
 
        switch(output->transform) {
        case WL_OUTPUT_TRANSFORM_FLIPPED:
        case WL_OUTPUT_TRANSFORM_FLIPPED_90:
        case WL_OUTPUT_TRANSFORM_FLIPPED_180:
        case WL_OUTPUT_TRANSFORM_FLIPPED_270:
+               transform.type |= WESTON_MATRIX_TRANSFORM_OTHER;
                flip = -1;
                break;
        default:
diff --git a/src/shell.c b/src/shell.c
index dcbabf3..a99786b 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -1876,6 +1876,8 @@ shell_map_popup(struct shell_surface *shsurf)
        } else {
                /* construct x, y translation matrix */
                weston_matrix_init(&shsurf->popup.parent_transform.matrix);
+               shsurf->popup.parent_transform.matrix.type =
+                       WESTON_MATRIX_TRANSFORM_TRANSLATE;
                shsurf->popup.parent_transform.matrix.d[12] =
                        parent->geometry.x;
                shsurf->popup.parent_transform.matrix.d[13] =
@@ -2502,10 +2504,7 @@ rotate_grab_motion(struct wl_pointer_grab *grab,
                        &shsurf->rotation.transform.matrix;
 
                weston_matrix_init(&rotate->rotation);
-               rotate->rotation.d[0] = dx / r;
-               rotate->rotation.d[4] = -dy / r;
-               rotate->rotation.d[1] = -rotate->rotation.d[4];
-               rotate->rotation.d[5] = rotate->rotation.d[0];
+               weston_matrix_rotate_xy(&rotate->rotation, dx / r, dy / r);
 
                weston_matrix_init(matrix);
                weston_matrix_translate(matrix, -cx, -cy, 0.0f);
@@ -2600,17 +2599,11 @@ rotate_binding(struct wl_seat *seat, uint32_t time, 
uint32_t button,
                struct weston_matrix inverse;
 
                weston_matrix_init(&inverse);
-               inverse.d[0] = dx / r;
-               inverse.d[4] = dy / r;
-               inverse.d[1] = -inverse.d[4];
-               inverse.d[5] = inverse.d[0];
+               weston_matrix_rotate_xy(&inverse, dx / r, -dy / r);
                weston_matrix_multiply(&surface->rotation.rotation, &inverse);
 
                weston_matrix_init(&rotate->rotation);
-               rotate->rotation.d[0] = dx / r;
-               rotate->rotation.d[4] = -dy / r;
-               rotate->rotation.d[1] = -rotate->rotation.d[4];
-               rotate->rotation.d[5] = rotate->rotation.d[0];
+               weston_matrix_rotate_xy(&rotate->rotation, dx / r, dy / r);
        } else {
                weston_matrix_init(&surface->rotation.rotation);
                weston_matrix_init(&rotate->rotation);
-- 
1.8.1.1

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to