summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ui/Transform.cpp31
-rw-r--r--libs/ui/include/ui/Transform.h4
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp25
3 files changed, 37 insertions, 23 deletions
diff --git a/libs/ui/Transform.cpp b/libs/ui/Transform.cpp
index d13942dca4..28c3f7bdd9 100644
--- a/libs/ui/Transform.cpp
+++ b/libs/ui/Transform.cpp
@@ -381,6 +381,37 @@ bool Transform::preserveRects() const
return (getOrientation() & ROT_INVALID) ? false : true;
}
+mat4 Transform::asMatrix4() const {
+ // Internally Transform uses a 3x3 matrix since the transform is meant for
+ // two-dimensional values. An equivalent 4x4 matrix means inserting an extra
+ // row and column which adds as an identity transform on the third
+ // dimension.
+
+ mat4 m = mat4{mat4::NO_INIT}; // NO_INIT since we explicitly set every element
+
+ m[0][0] = mMatrix[0][0];
+ m[0][1] = mMatrix[0][1];
+ m[0][2] = 0.f;
+ m[0][3] = mMatrix[0][2];
+
+ m[1][0] = mMatrix[1][0];
+ m[1][1] = mMatrix[1][1];
+ m[1][2] = 0.f;
+ m[1][3] = mMatrix[1][2];
+
+ m[2][0] = 0.f;
+ m[2][1] = 0.f;
+ m[2][2] = 1.f;
+ m[2][3] = 0.f;
+
+ m[3][0] = mMatrix[2][0];
+ m[3][1] = mMatrix[2][1];
+ m[3][2] = 0.f;
+ m[3][3] = mMatrix[2][2];
+
+ return m;
+}
+
void Transform::dump(std::string& out, const char* name) const {
using android::base::StringAppendF;
diff --git a/libs/ui/include/ui/Transform.h b/libs/ui/include/ui/Transform.h
index dcb26cf5f4..f29a370194 100644
--- a/libs/ui/include/ui/Transform.h
+++ b/libs/ui/include/ui/Transform.h
@@ -22,6 +22,7 @@
#include <string>
#include <hardware/hardware.h>
+#include <math/mat4.h>
#include <math/vec2.h>
#include <math/vec3.h>
#include <ui/Point.h>
@@ -88,6 +89,9 @@ public:
vec2 transform(const vec2& v) const;
vec3 transform(const vec3& v) const;
+ // Expands from the internal 3x3 matrix to an equivalent 4x4 matrix
+ mat4 asMatrix4() const;
+
Transform inverse() const;
// for debugging
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 83e53fa869..ca94e15895 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -3288,17 +3288,7 @@ bool SurfaceFlinger::doComposeSurfaces(const sp<DisplayDevice>& displayDevice,
clientCompositionDisplay.physicalDisplay = displayState.scissor;
clientCompositionDisplay.clip = displayState.scissor;
const ui::Transform& displayTransform = displayState.transform;
- mat4 m;
- m[0][0] = displayTransform[0][0];
- m[0][1] = displayTransform[0][1];
- m[0][3] = displayTransform[0][2];
- m[1][0] = displayTransform[1][0];
- m[1][1] = displayTransform[1][1];
- m[1][3] = displayTransform[1][2];
- m[3][0] = displayTransform[2][0];
- m[3][1] = displayTransform[2][1];
- m[3][3] = displayTransform[2][2];
- clientCompositionDisplay.globalTransform = m;
+ clientCompositionDisplay.globalTransform = displayTransform.asMatrix4();
const auto* profile = display->getDisplayColorProfile();
Dataspace outputDataspace = Dataspace::UNKNOWN;
@@ -5591,18 +5581,7 @@ void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea,
// buffer bounds.
clientCompositionDisplay.physicalDisplay = Rect(reqWidth, reqHeight);
ui::Transform transform = renderArea.getTransform();
- mat4 m;
- m[0][0] = transform[0][0];
- m[0][1] = transform[0][1];
- m[0][3] = transform[0][2];
- m[1][0] = transform[1][0];
- m[1][1] = transform[1][1];
- m[1][3] = transform[1][2];
- m[3][0] = transform[2][0];
- m[3][1] = transform[2][1];
- m[3][3] = transform[2][2];
-
- clientCompositionDisplay.globalTransform = m;
+ clientCompositionDisplay.globalTransform = transform.asMatrix4();
mat4 rotMatrix;
// Displacement for repositioning the clipping rectangle after rotating it
// with the rotation hint.