Merge "Clean up some rotation utility methods"

This commit is contained in:
Riddle Hsu
2022-12-15 01:53:47 +00:00
committed by Android (Google) Code Review
6 changed files with 61 additions and 129 deletions

View File

@@ -16,7 +16,7 @@
package com.android.server.display;
import static com.android.server.wm.utils.RotationAnimationUtils.hasProtectedContent;
import static com.android.internal.policy.TransitionAnimation.hasProtectedContent;
import android.content.Context;
import android.graphics.BLASTBufferQueue;

View File

@@ -31,6 +31,7 @@ import static com.android.server.wm.ScreenRotationAnimationProto.STARTED;
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_SCREEN_ROTATION;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.utils.CoordinateTransforms.computeRotationMatrix;
import android.animation.ArgbEvaluator;
import android.content.Context;
@@ -60,7 +61,6 @@ import com.android.internal.protolog.common.ProtoLog;
import com.android.server.display.DisplayControl;
import com.android.server.wm.SurfaceAnimator.AnimationType;
import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
import com.android.server.wm.utils.RotationAnimationUtils;
import java.io.PrintWriter;
@@ -378,8 +378,7 @@ class ScreenRotationAnimation {
// to the snapshot to make it stay in the same original position
// with the current screen rotation.
int delta = deltaRotation(rotation, mOriginalRotation);
RotationAnimationUtils.createRotationMatrix(delta, mOriginalWidth, mOriginalHeight,
mSnapshotInitialMatrix);
computeRotationMatrix(delta, mOriginalWidth, mOriginalHeight, mSnapshotInitialMatrix);
setRotationTransform(t, mSnapshotInitialMatrix);
}

View File

@@ -22,11 +22,9 @@ import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
import android.annotation.Dimension;
import android.annotation.Nullable;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.DisplayInfo;
import android.view.Surface;
import android.view.Surface.Rotation;
public class CoordinateTransforms {
@@ -137,19 +135,24 @@ public class CoordinateTransforms {
out.postConcat(tmp);
}
/**
* Transforms a rect using a transformation matrix
*
* @param transform the transformation to apply to the rect
* @param inOutRect the rect to transform
* @param tmp a temporary value, if null the function will allocate its own.
*/
public static void transformRect(Matrix transform, Rect inOutRect, @Nullable RectF tmp) {
if (tmp == null) {
tmp = new RectF();
/** Computes the matrix that rotates the original w x h by the rotation delta. */
public static void computeRotationMatrix(int rotationDelta, int w, int h, Matrix outMatrix) {
switch (rotationDelta) {
case Surface.ROTATION_0:
outMatrix.reset();
break;
case Surface.ROTATION_90:
outMatrix.setRotate(90);
outMatrix.postTranslate(h, 0);
break;
case Surface.ROTATION_180:
outMatrix.setRotate(180);
outMatrix.postTranslate(w, h);
break;
case Surface.ROTATION_270:
outMatrix.setRotate(270);
outMatrix.postTranslate(0, w);
break;
}
tmp.set(inOutRect);
transform.mapRect(tmp);
inOutRect.set((int) tmp.left, (int) tmp.top, (int) tmp.right, (int) tmp.bottom);
}
}

View File

@@ -1,55 +0,0 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.wm.utils;
import static android.hardware.HardwareBuffer.USAGE_PROTECTED_CONTENT;
import android.graphics.Matrix;
import android.hardware.HardwareBuffer;
import android.view.Surface;
/** Helper functions for the {@link com.android.server.wm.ScreenRotationAnimation} class*/
public class RotationAnimationUtils {
/**
* @return whether the hardwareBuffer passed in is marked as protected.
*/
public static boolean hasProtectedContent(HardwareBuffer hardwareBuffer) {
return (hardwareBuffer.getUsage() & USAGE_PROTECTED_CONTENT) == USAGE_PROTECTED_CONTENT;
}
public static void createRotationMatrix(int rotation, int width, int height, Matrix outMatrix) {
switch (rotation) {
case Surface.ROTATION_0:
outMatrix.reset();
break;
case Surface.ROTATION_90:
outMatrix.setRotate(90, 0, 0);
outMatrix.postTranslate(height, 0);
break;
case Surface.ROTATION_180:
outMatrix.setRotate(180, 0, 0);
outMatrix.postTranslate(width, height);
break;
case Surface.ROTATION_270:
outMatrix.setRotate(270, 0, 0);
outMatrix.postTranslate(0, width);
break;
}
}
}

View File

@@ -21,6 +21,7 @@ import static android.view.Surface.ROTATION_180;
import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
import static com.android.server.wm.utils.CoordinateTransforms.computeRotationMatrix;
import static com.android.server.wm.utils.CoordinateTransforms.transformLogicalToPhysicalCoordinates;
import static com.android.server.wm.utils.CoordinateTransforms.transformPhysicalToLogicalCoordinates;
import static com.android.server.wm.utils.CoordinateTransforms.transformToRotation;
@@ -185,6 +186,44 @@ public class CoordinateTransformsTest {
assertEquals(mMatrix2, mMatrix);
}
@Test
public void rotate_0_bottomRight() {
computeRotationMatrix(ROTATION_0, W, H, mMatrix);
PointF newPoints = checkMappedPoints(W, H);
assertEquals(W, newPoints.x, 0);
assertEquals(H, newPoints.y, 0);
}
@Test
public void rotate_90_bottomRight() {
computeRotationMatrix(ROTATION_90, W, H, mMatrix);
PointF newPoints = checkMappedPoints(W, H);
assertEquals(0, newPoints.x, 0);
assertEquals(W, newPoints.y, 0);
}
@Test
public void rotate_180_bottomRight() {
computeRotationMatrix(ROTATION_180, W, H, mMatrix);
PointF newPoints = checkMappedPoints(W, H);
assertEquals(0, newPoints.x, 0);
assertEquals(0, newPoints.y, 0);
}
@Test
public void rotate_270_bottomRight() {
computeRotationMatrix(ROTATION_270, W, H, mMatrix);
PointF newPoints = checkMappedPoints(W, H);
assertEquals(H, newPoints.x, 0);
assertEquals(0, newPoints.y, 0);
}
private PointF checkMappedPoints(int x, int y) {
final float[] fs = new float[] {x, y};
mMatrix.mapPoints(fs);
return new PointF(fs[0], fs[1]);
}
private void assertMatricesAreInverses(Matrix matrix, Matrix matrix2) {
final Matrix concat = new Matrix();
concat.setConcat(matrix, matrix2);

View File

@@ -23,15 +23,11 @@ import static org.junit.Assert.assertEquals;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.ColorSpace;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.hardware.HardwareBuffer;
import android.platform.test.annotations.Presubmit;
import android.view.Surface;
import com.android.internal.policy.TransitionAnimation;
import org.junit.Before;
import org.junit.Test;
@Presubmit
@@ -39,16 +35,8 @@ public class RotationAnimationUtilsTest {
private static final int BITMAP_HEIGHT = 100;
private static final int BITMAP_WIDTH = 100;
private static final int POINT_WIDTH = 1000;
private static final int POINT_HEIGHT = 2000;
private ColorSpace mColorSpace = ColorSpace.get(ColorSpace.Named.DISPLAY_P3);
private Matrix mMatrix;
@Before
public void setup() {
mMatrix = new Matrix();
}
@Test
public void blackLuma() {
@@ -93,48 +81,6 @@ public class RotationAnimationUtilsTest {
assertEquals(1, borderLuma, 0);
}
@Test
public void rotate_0_bottomRight() {
RotationAnimationUtils.createRotationMatrix(Surface.ROTATION_0,
POINT_WIDTH, POINT_HEIGHT, mMatrix);
PointF newPoints = checkMappedPoints(POINT_WIDTH, POINT_HEIGHT);
assertEquals(POINT_WIDTH, newPoints.x, 0);
assertEquals(POINT_HEIGHT, newPoints.y, 0);
}
@Test
public void rotate_90_bottomRight() {
RotationAnimationUtils.createRotationMatrix(Surface.ROTATION_90,
POINT_WIDTH, POINT_HEIGHT, mMatrix);
PointF newPoints = checkMappedPoints(POINT_WIDTH, POINT_HEIGHT);
assertEquals(0, newPoints.x, 0);
assertEquals(POINT_WIDTH, newPoints.y, 0);
}
@Test
public void rotate_180_bottomRight() {
RotationAnimationUtils.createRotationMatrix(Surface.ROTATION_180,
POINT_WIDTH, POINT_HEIGHT, mMatrix);
PointF newPoints = checkMappedPoints(POINT_WIDTH, POINT_HEIGHT);
assertEquals(0, newPoints.x, 0);
assertEquals(0, newPoints.y, 0);
}
@Test
public void rotate_270_bottomRight() {
RotationAnimationUtils.createRotationMatrix(Surface.ROTATION_270,
POINT_WIDTH, POINT_HEIGHT, mMatrix);
PointF newPoints = checkMappedPoints(POINT_WIDTH, POINT_HEIGHT);
assertEquals(POINT_HEIGHT, newPoints.x, 0);
assertEquals(0, newPoints.y, 0);
}
private PointF checkMappedPoints(int x, int y) {
final float[] fs = new float[] {x, y};
mMatrix.mapPoints(fs);
return new PointF(fs[0], fs[1]);
}
private Bitmap createBitmap(float luma) {
return createBitmap(luma, BITMAP_WIDTH, BITMAP_HEIGHT);
}