From 0e8f1443b87f9009159cef6394de48894f98f826 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 20 Aug 2013 21:41:07 -0700 Subject: [PATCH] Fix a bug where non-cropped layer could be scaled incorrectly If a layer is not cropped but its bounds are outside of the viewport (i.e.: clipped), the crop rectangle passed to hw composer would be invalid because it started invalid in the first place (to indicate "no crop"). Bug: 10410944 Change-Id: I4ae4d49a1adef0be7fa4304ecf84b1a5b7d03fe0 --- services/surfaceflinger/Layer.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 7150fa1d0..d88f6d0dd 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -287,7 +287,13 @@ FloatRect Layer::computeCrop(const sp& hw) const { // pixels in the buffer. // FIXME: the 3 lines below can produce slightly incorrect clipping when we have // a viewport clipping and a window transform. we should use floating point to fix this. - Rect activeCrop(s.transform.transform(s.active.crop)); + + Rect activeCrop(s.active.w, s.active.h); + if (!s.active.crop.isEmpty()) { + activeCrop = s.active.crop; + } + + activeCrop = s.transform.transform(activeCrop); activeCrop.intersect(hw->getViewport(), &activeCrop); activeCrop = s.transform.inverse().transform(activeCrop);