From b290e94020c22852ce821d6e7f8ad973f0549b6e Mon Sep 17 00:00:00 2001 From: Alex Chau Date: Fri, 29 Oct 2021 19:23:06 +0100 Subject: [PATCH] Crop letterbox insets when thumbnail is from different aspect ratio - Extracted isAspectLargelyDifferent and use that to determine if letterbox inset should be cropped - Always attempt to fit thumbnail width to avoid drawing area outside the thumbnail Bug: 199743725 Test: manual Change-Id: I2a7b20730055858b2376788e3a1fbbc66c0967e2 --- .../quickstep/views/TaskThumbnailView.java | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java index a9db400df2..05ff881426 100644 --- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java @@ -444,15 +444,36 @@ public class TaskThumbnailView extends View { float availableHeight = surfaceHeight - (thumbnailClipHint.top + thumbnailClipHint.bottom); - if (isRotated) { - float canvasAspect = canvasWidth / (float) canvasHeight; - float availableAspect = availableHeight / availableWidth; + float canvasAspect = canvasWidth / (float) canvasHeight; + float availableAspect = isRotated + ? availableHeight / availableWidth + : availableWidth / availableHeight; + boolean isAspectLargelyDifferent = Utilities.isRelativePercentDifferenceGreaterThan( + canvasAspect, availableAspect, 0.1f); + if (isRotated && isAspectLargelyDifferent) { // Do not rotate thumbnail if it would not improve fit - if (Utilities.isRelativePercentDifferenceGreaterThan(canvasAspect, - availableAspect, 0.1f)) { - isRotated = false; - isOrientationDifferent = false; + isRotated = false; + isOrientationDifferent = false; + } + + if (isAspectLargelyDifferent) { + // Crop letterbox insets if insets isn't already clipped + if (!TaskView.clipLeft(dp)) { + thumbnailClipHint.left = thumbnailData.letterboxInsets.left; } + if (!TaskView.clipRight(dp)) { + thumbnailClipHint.right = thumbnailData.letterboxInsets.right; + } + if (!TaskView.clipTop(dp)) { + thumbnailClipHint.top = thumbnailData.letterboxInsets.top; + } + if (!TaskView.clipBottom(dp)) { + thumbnailClipHint.bottom = thumbnailData.letterboxInsets.bottom; + } + availableWidth = surfaceWidth + - (thumbnailClipHint.left + thumbnailClipHint.right); + availableHeight = surfaceHeight + - (thumbnailClipHint.top + thumbnailClipHint.bottom); } final float targetW, targetH; @@ -463,30 +484,25 @@ public class TaskThumbnailView extends View { targetW = canvasWidth; targetH = canvasHeight; } - float canvasAspect = targetW / targetH; + float targetAspect = targetW / targetH; // Update the clipHint such that // > the final clipped position has same aspect ratio as requested by canvas - // > the clipped region is within the task insets if possible - // > the clipped region is not scaled up when drawing. If that is not possible - // while staying within the taskInsets, move outside the insets. + // > first fit the width and crop the extra height + // > if that will leave empty space, fit the height and crop the width instead float croppedWidth = availableWidth; - if (croppedWidth < targetW) { - croppedWidth = Math.min(targetW, surfaceWidth); - } - - float croppedHeight = croppedWidth / canvasAspect; + float croppedHeight = croppedWidth / targetAspect; if (croppedHeight > availableHeight) { croppedHeight = availableHeight; if (croppedHeight < targetH) { croppedHeight = Math.min(targetH, surfaceHeight); } - croppedWidth = croppedHeight * canvasAspect; + croppedWidth = croppedHeight * targetAspect; // One last check in case the task aspect radio messed up something if (croppedWidth > surfaceWidth) { croppedWidth = surfaceWidth; - croppedHeight = croppedWidth / canvasAspect; + croppedHeight = croppedWidth / targetAspect; } }