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:
parent
a8a51394f5
commit
b290e94020
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue