[weston,v2,17/20] compositor: Add weston_matrix_to_transform function

Submitted by Derek Foreman on Oct. 16, 2014, 3:55 p.m.

Details

Message ID 1413474938-2407-18-git-send-email-derekf@osg.samsung.com
State Changes Requested
Headers show

Not browsing as part of any series.

Commit Message

Derek Foreman Oct. 16, 2014, 3:55 p.m.
This function examines a matrix to see if it can be built with simple
scale + translate + wl_output_transform enum.
---
 src/compositor.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/compositor.h |  5 +++++
 2 files changed, 62 insertions(+)

Patch hide | download patch | download mbox

diff --git a/src/compositor.c b/src/compositor.c
index ba9f886..d629bd7 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -754,6 +754,63 @@  weston_matrix_needs_filtering(struct weston_matrix *matrix)
 	return false;
 }
 
+WL_EXPORT bool
+weston_matrix_to_transform(const struct weston_matrix *mat,
+                           enum wl_output_transform *transform,
+                           float *sx, float *sy,
+                           float *tx, float *ty)
+{
+	if (!near_zero(mat->d[2]) || !near_zero(mat->d[3]) ||
+	    !near_zero(mat->d[6]) || !near_zero(mat->d[7]) ||
+	    !near_zero(mat->d[8]) || !near_zero(mat->d[9]) ||
+	    !near_zero(mat->d[11]))
+		return false;
+
+	if (!near_zero(mat->d[10] - 1.0) || !near_zero(mat->d[15] - 1.0))
+		return false;
+
+	if (near_zero(mat->d[0])) {
+		if (!near_zero(mat->d[5]))
+			return false;
+
+		if (mat->d[4] > 0) {
+			if (mat->d[1] > 0)
+				*transform = WL_OUTPUT_TRANSFORM_FLIPPED_270;
+			else
+				*transform = WL_OUTPUT_TRANSFORM_270;
+		} else {
+			if (mat->d[1] > 0)
+				*transform = WL_OUTPUT_TRANSFORM_90;
+			else
+				*transform = WL_OUTPUT_TRANSFORM_FLIPPED_90;
+		}
+		*sx = fabs(mat->d[1]);
+		*sy = fabs(mat->d[4]);
+	} else if (near_zero(mat->d[1])) {
+		if (!near_zero(mat->d[4]))
+			return false;
+
+		if (mat->d[0] > 0) {
+			if (mat->d[5] > 0)
+				*transform = WL_OUTPUT_TRANSFORM_NORMAL;
+			else
+				*transform = WL_OUTPUT_TRANSFORM_FLIPPED_180;
+		} else {
+			if (mat->d[5] > 0)
+				*transform = WL_OUTPUT_TRANSFORM_FLIPPED;
+			else
+				*transform = WL_OUTPUT_TRANSFORM_180;
+		}
+		*sx = fabs(mat->d[0]);
+		*sy = fabs(mat->d[5]);
+	} else return false;
+
+	*tx = mat->d[12];
+	*ty = mat->d[13];
+
+	return true;
+}
+
 WL_EXPORT void
 weston_surface_to_buffer_float(struct weston_surface *surface,
 			       float sx, float sy, float *bx, float *by)
diff --git a/src/compositor.h b/src/compositor.h
index 8d98306..8e2cf47 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -991,6 +991,11 @@  weston_view_from_global_fixed(struct weston_view *view,
 bool
 weston_matrix_needs_filtering(struct weston_matrix *matrix);
 
+bool
+weston_matrix_to_transform(const struct weston_matrix *mat,
+                           enum wl_output_transform *transform,
+                           float *sx, float *sy,
+                           float *tx, float *ty);
 void
 weston_surface_to_buffer_float(struct weston_surface *surface,
 			       float x, float y, float *bx, float *by);