diff options
| author | 2019-03-18 17:56:18 +0000 | |
|---|---|---|
| committer | 2019-03-18 17:56:18 +0000 | |
| commit | aba72b6d2f22076c062c13e02ffc14517b098040 (patch) | |
| tree | 567a2974abffa86293f8473d15245dfc5164e270 | |
| parent | 6b243887f3dec6eaba1101a106a8a4903dda9d37 (diff) | |
| parent | 7e06e7ffab0ee7c141435911971f34f5557ee3a4 (diff) | |
Merge "libui: Standardize getting a mat4 from a Transform"
| -rw-r--r-- | libs/ui/Transform.cpp | 31 | ||||
| -rw-r--r-- | libs/ui/include/ui/Transform.h | 4 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 25 |
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. |