OSDN Git Service

give the proper orientation to the h/w composer HAL
authorMathias Agopian <mathias@google.com>
Fri, 19 Aug 2011 01:31:00 +0000 (18:31 -0700)
committerMathias Agopian <mathias@google.com>
Fri, 19 Aug 2011 01:33:44 +0000 (18:33 -0700)
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
services/surfaceflinger/LayerBase.cpp
services/surfaceflinger/LayerBase.h

index 64eaecc..19c7ddd 100644 (file)
@@ -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();
index 7bf73d9..4cc245a 100644 (file)
@@ -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();
index a3d3644..2cd3a94 100644 (file)
@@ -247,6 +247,7 @@ private:
 protected:
                 // cached during validateVisibility()
                 int32_t         mOrientation;
+                Transform       mTransform;
                 GLfloat         mVertices[4][2];
                 Rect            mTransformedBounds;
                 int             mLeft;