From 28ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08 Mon Sep 17 00:00:00 2001 From: Michael Lentine Date: Wed, 19 Nov 2014 18:32:37 -0800 Subject: [PATCH] Add clamp to Layer and update Transform inverse. Ensure that the adjusted transparent region is within the display bounds by clamping after the transformation is applied and clean up transform's inverse function. Bug: 18452546 Change-Id: Ia473e483ee8374177bcb84d8192eb1f0e86f022a --- services/surfaceflinger/Layer.cpp | 15 ++++++++++++-- services/surfaceflinger/Transform.cpp | 29 ++++++++++++++------------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index c3e1a768e..5e3dfabb3 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -332,8 +332,12 @@ FloatRect Layer::computeCrop(const sp& hw) const { activeCrop.intersect(hw->getViewport(), &activeCrop); activeCrop = s.transform.inverse().transform(activeCrop); - // paranoia: make sure the window-crop is constrained in the - // window's bounds + // This needs to be here as transform.transform(Rect) computes the + // transformed rect and then takes the bounding box of the result before + // returning. This means + // transform.inverse().transform(transform.transform(Rect)) != Rect + // in which case we need to make sure the final rect is clipped to the + // display bounds. activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop); // subtract the transparent region and snap to the bounds @@ -432,6 +436,13 @@ void Layer::setGeometry( activeCrop = s.transform.transform(activeCrop); activeCrop.intersect(hw->getViewport(), &activeCrop); activeCrop = s.transform.inverse().transform(activeCrop); + // This needs to be here as transform.transform(Rect) computes the + // transformed rect and then takes the bounding box of the result before + // returning. This means + // transform.inverse().transform(transform.transform(Rect)) != Rect + // in which case we need to make sure the final rect is clipped to the + // display bounds. + activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop); // mark regions outside the crop as transparent activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, diff --git a/services/surfaceflinger/Transform.cpp b/services/surfaceflinger/Transform.cpp index 3456abfa6..35e7e7dac 100644 --- a/services/surfaceflinger/Transform.cpp +++ b/services/surfaceflinger/Transform.cpp @@ -301,16 +301,16 @@ Transform Transform::inverse() const { // (T*M)^-1 = M^-1 * T^-1 Transform result; if (mType <= TRANSLATE) { - // 1 0 x - // 0 1 y - // 0 0 1 + // 1 0 0 + // 0 1 0 + // x y 1 result = *this; result.mMatrix[2][0] = -result.mMatrix[2][0]; result.mMatrix[2][1] = -result.mMatrix[2][1]; } else { - // a c x - // b d y - // 0 0 1 + // a c 0 + // b d 0 + // x y 1 const mat33& M(mMatrix); const float a = M[0][0]; const float b = M[1][0]; @@ -319,16 +319,17 @@ Transform Transform::inverse() const { const float x = M[2][0]; const float y = M[2][1]; - Transform R, T; const float idet = 1.0 / (a*d - b*c); - R.mMatrix[0][0] = d*idet; R.mMatrix[0][1] = -c*idet; - R.mMatrix[1][0] = -b*idet; R.mMatrix[1][1] = a*idet; - R.mType = mType &= ~TRANSLATE; + result.mMatrix[0][0] = d*idet; + result.mMatrix[0][1] = -c*idet; + result.mMatrix[1][0] = -b*idet; + result.mMatrix[1][1] = a*idet; + result.mType = mType; - T.mMatrix[2][0] = -x; - T.mMatrix[2][1] = -y; - T.mType = TRANSLATE; - result = R * T; + vec2 T(-x, -y); + T = result.transform(T); + result.mMatrix[2][0] = T[0]; + result.mMatrix[2][1] = T[1]; } return result; }