compositor: restructure weston_surface::transform

Separate mutable data and cached immutable data in struct
weston_surface.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
diff --git a/src/compositor.c b/src/compositor.c
index 3950ad7..3330ffb 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -205,8 +205,8 @@
 
 	surface->buffer_destroy_listener.func = surface_handle_buffer_destroy;
 
-	wl_list_init(&surface->transform.list);
-	surface->transform.dirty = 1;
+	wl_list_init(&surface->geometry.transformation_list);
+	surface->geometry.dirty = 1;
 
 	return surface;
 }
@@ -234,12 +234,12 @@
 	struct weston_matrix *inverse = &surface->transform.inverse;
 	struct weston_transform *tform;
 
-	if (!surface->transform.dirty)
+	if (!surface->geometry.dirty)
 		return;
 
-	surface->transform.dirty = 0;
+	surface->geometry.dirty = 0;
 
-	if (wl_list_empty(&surface->transform.list)) {
+	if (wl_list_empty(&surface->geometry.transformation_list)) {
 		surface->transform.enabled = 0;
 		return;
 	}
@@ -247,7 +247,7 @@
 	surface->transform.enabled = 1;
 
 	weston_matrix_init(matrix);
-	wl_list_for_each(tform, &surface->transform.list, link)
+	wl_list_for_each(tform, &surface->geometry.transformation_list, link)
 		weston_matrix_multiply(matrix, &tform->matrix);
 
 	if (weston_matrix_invert(inverse, matrix) < 0) {
diff --git a/src/compositor.h b/src/compositor.h
index 580800d..7555e85 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -224,14 +224,27 @@
 	uint32_t visual;
 	int overlapped;
 
+	/* Surface geometry state, mutable.
+	 * If you change anything, set dirty = 1.
+	 * That includes the transformations referenced from the list.
+	 */
 	struct {
-		struct wl_list list;
-		int dirty;
+		/* struct weston_transform */
+		struct wl_list transformation_list;
 
-		/* derived state, set up by weston_surface_update_transform */
+		int dirty;
+	} geometry;
+
+	/* State derived from geometry state, read-only.
+	 * This is updated by weston_surface_update_transform().
+	 */
+	struct {
+		/* matrix and inverse are used only if enabled = 1.
+		 * If enabled = 0, use x, y, width, height directly.
+		 */
+		int enabled;
 		struct weston_matrix matrix;
 		struct weston_matrix inverse;
-		int enabled;
 	} transform;
 
 	/*
diff --git a/src/shell.c b/src/shell.c
index 49b0b10..d6e0205 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -979,7 +979,7 @@
 	r = sqrtf(dx * dx + dy * dy);
 
 	wl_list_remove(&surface->rotation.transform.link);
-	surface->surface->transform.dirty = 1;
+	surface->surface->geometry.dirty = 1;
 
 	if (r > 20.0f) {
 		struct weston_matrix roto;
@@ -999,8 +999,9 @@
 		weston_matrix_translate(matrix, rotate->center.x,
 					rotate->center.y, 0.0f);
 
-		wl_list_insert(surface->surface->transform.list.prev,
-			       &surface->rotation.transform.link);
+		wl_list_insert(
+			surface->surface->geometry.transformation_list.prev,
+			&surface->rotation.transform.link);
 	} else {
 		wl_list_init(&surface->rotation.transform.link);
 	}
diff --git a/src/util.c b/src/util.c
index 6b8477a..c749f29 100644
--- a/src/util.c
+++ b/src/util.c
@@ -99,7 +99,7 @@
 	wl_list_remove(&zoom->animation.link);
 	wl_list_remove(&zoom->listener.link);
 	wl_list_remove(&zoom->transform.link);
-	zoom->surface->transform.dirty = 1;
+	zoom->surface->geometry.dirty = 1;
 	if (zoom->done)
 		zoom->done(zoom, zoom->data);
 	free(zoom);
@@ -146,7 +146,7 @@
 	if (es->alpha > 255)
 		es->alpha = 255;
 
-	zoom->surface->transform.dirty = 1;
+	zoom->surface->geometry.dirty = 1;
 
 	weston_compositor_damage_all(es->compositor);
 }
@@ -166,7 +166,8 @@
 	zoom->data = data;
 	zoom->start = start;
 	zoom->stop = stop;
-	wl_list_insert(&surface->transform.list, &zoom->transform.link);
+	wl_list_insert(&surface->geometry.transformation_list,
+		       &zoom->transform.link);
 	weston_spring_init(&zoom->spring, 200.0, 0.0, 1.0);
 	zoom->spring.friction = 700;
 	zoom->spring.timestamp = weston_compositor_get_time();