OSDN Git Service

Fix a bug where non-cropped layer could be scaled incorrectly
authorMathias Agopian <mathias@google.com>
Wed, 21 Aug 2013 04:41:07 +0000 (21:41 -0700)
committerMathias Agopian <mathias@google.com>
Wed, 21 Aug 2013 04:46:45 +0000 (21:46 -0700)
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

index 7150fa1..d88f6d0 100644 (file)
@@ -287,7 +287,13 @@ FloatRect Layer::computeCrop(const sp<const DisplayDevice>& 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);