From 58f2913f179f430439b4806bc15f8fd1ca6d24e4 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Thu, 29 Oct 2015 14:19:05 -0700 Subject: [PATCH] Ensure crop rect is scaled appropriately. Crop rectangles are scaled to layer space. Previously we were doing this for transformation applied crops but failing to do so for stack applied crops. This ensures we never fail. Bug: 23974105 Change-Id: I82f59a8696b87253f92cd89fe675aaeab0ecb38d --- .../com/android/server/wm/WindowState.java | 9 +++++++++ .../android/server/wm/WindowStateAnimator.java | 18 +++++------------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 1d2cb7535b970..19a049b8f3a11 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1968,4 +1968,13 @@ final class WindowState implements WindowManagerPolicy.WindowState { } return mStringNameCache; } + + void transformFromScreenToSurfaceSpace(Rect rect) { + if (mHScale >= 0) { + rect.right = rect.left + (int)((rect.right - rect.left) / mHScale); + } + if (mVScale >= 0) { + rect.bottom = rect.top + (int)((rect.bottom - rect.top) / mVScale); + } + } } diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 80f1094d61a6b..1c17c93df6fb8 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -1224,14 +1224,6 @@ class WindowStateAnimator { mShownAlpha *= appTransformation.getAlpha(); if (appTransformation.hasClipRect()) { mClipRect.set(appTransformation.getClipRect()); - if (mWin.mHScale > 0) { - mClipRect.left /= mWin.mHScale; - mClipRect.right /= mWin.mHScale; - } - if (mWin.mVScale > 0) { - mClipRect.top /= mWin.mVScale; - mClipRect.bottom /= mWin.mVScale; - } mHasClipRect = true; } } @@ -1351,11 +1343,7 @@ class WindowStateAnimator { final DisplayInfo displayInfo = displayContent.getDisplayInfo(); // Need to recompute a new system decor rect each time. - if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { - // Currently can't do this cropping for scaled windows. We'll - // just keep the crop rect the same as the source surface. - w.mSystemDecorRect.set(0, 0, w.mRequestedWidth, w.mRequestedHeight); - } else if (!w.isDefaultDisplay()) { + if (!w.isDefaultDisplay()) { // On a different display there is no system decor. Crop the window // by the screen boundaries. w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), w.mCompatFrame.height()); @@ -1408,9 +1396,13 @@ class WindowStateAnimator { clipRect.offset(attrs.surfaceInsets.left, attrs.surfaceInsets.top); // We don't want to clip to stack bounds windows that are currently doing entrance // animation for docked window, otherwise the animating window will be suddenly cut off. + if (!(mAnimator.mAnimating && w.inDockedWorkspace())) { adjustCropToStackBounds(w, clipRect); } + + w.transformFromScreenToSurfaceSpace(clipRect); + if (!clipRect.equals(mLastClipRect)) { mLastClipRect.set(clipRect); try {