Loading services/surfaceflinger/Layer.cpp +13 −2 Original line number Diff line number Diff line Loading @@ -332,8 +332,12 @@ FloatRect Layer::computeCrop(const sp<const DisplayDevice>& 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 Loading Loading @@ -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, Loading services/surfaceflinger/Transform.cpp +16 −15 Original line number Diff line number Diff line Loading @@ -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]; Loading @@ -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; T.mMatrix[2][0] = -x; T.mMatrix[2][1] = -y; T.mType = TRANSLATE; result = R * T; 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; vec2 T(-x, -y); T = result.transform(T); result.mMatrix[2][0] = T[0]; result.mMatrix[2][1] = T[1]; } return result; } Loading Loading
services/surfaceflinger/Layer.cpp +13 −2 Original line number Diff line number Diff line Loading @@ -332,8 +332,12 @@ FloatRect Layer::computeCrop(const sp<const DisplayDevice>& 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 Loading Loading @@ -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, Loading
services/surfaceflinger/Transform.cpp +16 −15 Original line number Diff line number Diff line Loading @@ -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]; Loading @@ -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; T.mMatrix[2][0] = -x; T.mMatrix[2][1] = -y; T.mType = TRANSLATE; result = R * T; 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; vec2 T(-x, -y); T = result.transform(T); result.mMatrix[2][0] = T[0]; result.mMatrix[2][1] = T[1]; } return result; } Loading