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
This commit is contained in:
Alex Chau 2021-10-29 19:23:06 +01:00
parent a8a51394f5
commit b290e94020
1 changed files with 34 additions and 18 deletions

View File

@ -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;
}
}