surfaceflinger: improve RenderArea needsFiltering
Compare source crop (instead of the logical render area) against
physical render area to decide whether filtering is required. This
allows us to get rid of Layer::setFiltering.
As a result, captureLayers for Recents no longer enables filtering.
Screenshots under landscape mode no longer enables filtering.
Bug: 113041375
Test: take screenshot, rotate screen, screencap
Change-Id: Ida95fdfec3a0dde7a19adf35c91bf3d570bab6bb
diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h
index 3613e1a..f7ffffd 100644
--- a/services/surfaceflinger/DisplayDevice.h
+++ b/services/surfaceflinger/DisplayDevice.h
@@ -353,7 +353,20 @@
int getHeight() const override { return mDevice->getHeight(); }
int getWidth() const override { return mDevice->getWidth(); }
bool isSecure() const override { return mDevice->isSecure(); }
- bool needsFiltering() const override { return mDevice->needsFiltering(); }
+
+ bool needsFiltering() const override {
+ if (mDevice->needsFiltering()) {
+ return true;
+ }
+
+ const Rect sourceCrop = getSourceCrop();
+ int width = sourceCrop.width();
+ int height = sourceCrop.height();
+ if (getRotationFlags() & ui::Transform::ROT_90) {
+ std::swap(width, height);
+ }
+ return width != getReqWidth() || height != getReqHeight();
+ }
Rect getSourceCrop() const override {
const int orientation = mDevice->getInstallOrientation();