matrix: track transform type

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 <anarsoul@gmail.com>
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 @@
 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 @@
 		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 @@
 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 @@
 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_init(inverse);
 	for (c = 0; c < 4; ++c)
 		inverse_transform(LU, perm, &inverse->d[c * 4]);
+	inverse->type = matrix->type;
 
 	return 0;
 }