From d992db3827016388e8069f5793b031153d423501 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Thu, 18 Aug 2011 18:31:00 -0700 Subject: [PATCH] give the proper orientation to the h/w composer HAL we were using the "orientation" value instead of the real transform, which may contain arbitrary rotations for instance, and in some case ended up with a final "orientation" that looked valid, but wasn't. this fixes a problem on devices with a h/w composer hal where the rotation animation looked weird. Change-Id: I4be8a2a1bde49c33456fcf5c8d87ab515c216763 --- services/surfaceflinger/Layer.cpp | 5 ++--- services/surfaceflinger/LayerBase.cpp | 1 + services/surfaceflinger/LayerBase.h | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 64eaecc86..19c7ddd4f 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -196,13 +196,12 @@ void Layer::setGeometry(hwc_layer_t* hwcl) * 1) buffer orientation/flip/mirror * 2) state transformation (window manager) * 3) layer orientation (screen orientation) - * mOrientation is already the composition of (2) and (3) + * mTransform is already the composition of (2) and (3) * (NOTE: the matrices are multiplied in reverse order) */ const Transform bufferOrientation(mCurrentTransform); - const Transform layerOrientation(mOrientation); - const Transform tr(layerOrientation * bufferOrientation); + const Transform tr(mTransform * bufferOrientation); // this gives us only the "orientation" component of the transform const uint32_t finalTransform = tr.getOrientation(); diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp index 7bf73d9ae..4cc245a11 100644 --- a/services/surfaceflinger/LayerBase.cpp +++ b/services/surfaceflinger/LayerBase.cpp @@ -257,6 +257,7 @@ void LayerBase::validateVisibility(const Transform& planeTransform) // cache a few things... mOrientation = tr.getOrientation(); + mTransform = tr; mTransformedBounds = tr.makeBounds(w, h); mLeft = tr.tx(); mTop = tr.ty(); diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h index a3d36444b..2cd3a9435 100644 --- a/services/surfaceflinger/LayerBase.h +++ b/services/surfaceflinger/LayerBase.h @@ -247,6 +247,7 @@ private: protected: // cached during validateVisibility() int32_t mOrientation; + Transform mTransform; GLfloat mVertices[4][2]; Rect mTransformedBounds; int mLeft;