Merge "Pass the float9 values in PictureInPictureSurfaceTransaction" into sc-dev

This commit is contained in:
Hongwei Wang
2021-05-11 03:20:17 +00:00
committed by Android (Google) Code Review
3 changed files with 28 additions and 38 deletions

View File

@@ -24,6 +24,7 @@ import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.view.SurfaceControl; import android.view.SurfaceControl;
import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
/** /**
@@ -37,10 +38,11 @@ public final class PictureInPictureSurfaceTransaction implements Parcelable {
public final float mPositionX; public final float mPositionX;
public final float mPositionY; public final float mPositionY;
public final float mScaleX; public final float[] mFloat9;
public final float mScaleY;
// Though this can be determined by mFloat9, it's easier to set the value directly
public final float mRotation; public final float mRotation;
public final float mCornerRadius; public final float mCornerRadius;
private final Rect mWindowCrop = new Rect(); private final Rect mWindowCrop = new Rect();
@@ -48,21 +50,19 @@ public final class PictureInPictureSurfaceTransaction implements Parcelable {
public PictureInPictureSurfaceTransaction(Parcel in) { public PictureInPictureSurfaceTransaction(Parcel in) {
mPositionX = in.readFloat(); mPositionX = in.readFloat();
mPositionY = in.readFloat(); mPositionY = in.readFloat();
mScaleX = in.readFloat(); mFloat9 = new float[9];
mScaleY = in.readFloat(); in.readFloatArray(mFloat9);
mRotation = in.readFloat(); mRotation = in.readFloat();
mCornerRadius = in.readFloat(); mCornerRadius = in.readFloat();
mWindowCrop.set(Objects.requireNonNull(in.readTypedObject(Rect.CREATOR))); mWindowCrop.set(Objects.requireNonNull(in.readTypedObject(Rect.CREATOR)));
} }
public PictureInPictureSurfaceTransaction(float positionX, float positionY, public PictureInPictureSurfaceTransaction(float positionX, float positionY,
float scaleX, float scaleY, float[] float9, float rotation, float cornerRadius,
float rotation, float cornerRadius,
@Nullable Rect windowCrop) { @Nullable Rect windowCrop) {
mPositionX = positionX; mPositionX = positionX;
mPositionY = positionY; mPositionY = positionY;
mScaleX = scaleX; mFloat9 = Arrays.copyOf(float9, 9);
mScaleY = scaleY;
mRotation = rotation; mRotation = rotation;
mCornerRadius = cornerRadius; mCornerRadius = cornerRadius;
if (windowCrop != null) { if (windowCrop != null) {
@@ -72,13 +72,14 @@ public final class PictureInPictureSurfaceTransaction implements Parcelable {
public PictureInPictureSurfaceTransaction(PictureInPictureSurfaceTransaction other) { public PictureInPictureSurfaceTransaction(PictureInPictureSurfaceTransaction other) {
this(other.mPositionX, other.mPositionY, this(other.mPositionX, other.mPositionY,
other.mScaleX, other.mScaleY, other.mFloat9, other.mRotation, other.mCornerRadius, other.mWindowCrop);
other.mRotation, other.mCornerRadius,
other.mWindowCrop);
} }
public Rect getWindowCrop() { /** @return {@link Matrix} from {@link #mFloat9} */
return new Rect(mWindowCrop); public Matrix getMatrix() {
final Matrix matrix = new Matrix();
matrix.setValues(mFloat9);
return matrix;
} }
@Override @Override
@@ -88,8 +89,7 @@ public final class PictureInPictureSurfaceTransaction implements Parcelable {
PictureInPictureSurfaceTransaction that = (PictureInPictureSurfaceTransaction) o; PictureInPictureSurfaceTransaction that = (PictureInPictureSurfaceTransaction) o;
return Objects.equals(mPositionX, that.mPositionX) return Objects.equals(mPositionX, that.mPositionX)
&& Objects.equals(mPositionY, that.mPositionY) && Objects.equals(mPositionY, that.mPositionY)
&& Objects.equals(mScaleX, that.mScaleX) && Arrays.equals(mFloat9, that.mFloat9)
&& Objects.equals(mScaleY, that.mScaleY)
&& Objects.equals(mRotation, that.mRotation) && Objects.equals(mRotation, that.mRotation)
&& Objects.equals(mCornerRadius, that.mCornerRadius) && Objects.equals(mCornerRadius, that.mCornerRadius)
&& Objects.equals(mWindowCrop, that.mWindowCrop); && Objects.equals(mWindowCrop, that.mWindowCrop);
@@ -97,7 +97,7 @@ public final class PictureInPictureSurfaceTransaction implements Parcelable {
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(mPositionX, mPositionY, mScaleX, mScaleY, return Objects.hash(mPositionX, mPositionY, Arrays.hashCode(mFloat9),
mRotation, mCornerRadius, mWindowCrop); mRotation, mCornerRadius, mWindowCrop);
} }
@@ -110,8 +110,7 @@ public final class PictureInPictureSurfaceTransaction implements Parcelable {
public void writeToParcel(Parcel out, int flags) { public void writeToParcel(Parcel out, int flags) {
out.writeFloat(mPositionX); out.writeFloat(mPositionX);
out.writeFloat(mPositionY); out.writeFloat(mPositionY);
out.writeFloat(mScaleX); out.writeFloatArray(mFloat9);
out.writeFloat(mScaleY);
out.writeFloat(mRotation); out.writeFloat(mRotation);
out.writeFloat(mCornerRadius); out.writeFloat(mCornerRadius);
out.writeTypedObject(mWindowCrop, 0 /* flags */); out.writeTypedObject(mWindowCrop, 0 /* flags */);
@@ -119,11 +118,11 @@ public final class PictureInPictureSurfaceTransaction implements Parcelable {
@Override @Override
public String toString() { public String toString() {
final Matrix matrix = getMatrix();
return "PictureInPictureSurfaceTransaction(" return "PictureInPictureSurfaceTransaction("
+ " posX=" + mPositionX + " posX=" + mPositionX
+ " posY=" + mPositionY + " posY=" + mPositionY
+ " scaleX=" + mScaleX + " matrix=" + matrix.toShortString()
+ " scaleY=" + mScaleY
+ " rotation=" + mRotation + " rotation=" + mRotation
+ " cornerRadius=" + mCornerRadius + " cornerRadius=" + mCornerRadius
+ " crop=" + mWindowCrop + " crop=" + mWindowCrop
@@ -134,15 +133,11 @@ public final class PictureInPictureSurfaceTransaction implements Parcelable {
public static void apply(@NonNull PictureInPictureSurfaceTransaction surfaceTransaction, public static void apply(@NonNull PictureInPictureSurfaceTransaction surfaceTransaction,
@NonNull SurfaceControl surfaceControl, @NonNull SurfaceControl surfaceControl,
@NonNull SurfaceControl.Transaction tx) { @NonNull SurfaceControl.Transaction tx) {
final Matrix matrix = new Matrix(); final Matrix matrix = surfaceTransaction.getMatrix();
matrix.setScale(surfaceTransaction.mScaleX, surfaceTransaction.mScaleY);
if (surfaceTransaction.mRotation != 0) {
matrix.postRotate(surfaceTransaction.mRotation);
}
tx.setMatrix(surfaceControl, matrix, new float[9]) tx.setMatrix(surfaceControl, matrix, new float[9])
.setPosition(surfaceControl, .setPosition(surfaceControl,
surfaceTransaction.mPositionX, surfaceTransaction.mPositionY) surfaceTransaction.mPositionX, surfaceTransaction.mPositionY)
.setWindowCrop(surfaceControl, surfaceTransaction.getWindowCrop()) .setWindowCrop(surfaceControl, surfaceTransaction.mWindowCrop)
.setCornerRadius(surfaceControl, surfaceTransaction.mCornerRadius); .setCornerRadius(surfaceControl, surfaceTransaction.mCornerRadius);
} }

View File

@@ -16,9 +16,6 @@
package com.android.systemui.shared.pip; package com.android.systemui.shared.pip;
import static android.graphics.Matrix.MSCALE_X;
import static android.graphics.Matrix.MSCALE_Y;
import android.graphics.Matrix; import android.graphics.Matrix;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.RectF; import android.graphics.RectF;
@@ -52,8 +49,7 @@ public class PipSurfaceTransactionHelper {
.setCornerRadius(leash, mCornerRadius); .setCornerRadius(leash, mCornerRadius);
return new PictureInPictureSurfaceTransaction( return new PictureInPictureSurfaceTransaction(
mTmpDestinationRectF.left, mTmpDestinationRectF.top, mTmpDestinationRectF.left, mTmpDestinationRectF.top,
mTmpFloat9[MSCALE_X], mTmpFloat9[MSCALE_Y], mTmpFloat9, 0 /* rotation */, mCornerRadius, sourceBounds);
0 /* rotation*/, mCornerRadius, sourceBounds);
} }
public PictureInPictureSurfaceTransaction scale( public PictureInPictureSurfaceTransaction scale(
@@ -68,9 +64,7 @@ public class PipSurfaceTransactionHelper {
.setPosition(leash, positionX, positionY) .setPosition(leash, positionX, positionY)
.setCornerRadius(leash, mCornerRadius); .setCornerRadius(leash, mCornerRadius);
return new PictureInPictureSurfaceTransaction( return new PictureInPictureSurfaceTransaction(
positionX, positionY, positionX, positionY, mTmpFloat9, degree, mCornerRadius, sourceBounds);
mTmpFloat9[MSCALE_X], mTmpFloat9[MSCALE_Y],
degree, mCornerRadius, sourceBounds);
} }
public PictureInPictureSurfaceTransaction scaleAndCrop( public PictureInPictureSurfaceTransaction scaleAndCrop(
@@ -92,7 +86,7 @@ public class PipSurfaceTransactionHelper {
.setPosition(leash, left, top) .setPosition(leash, left, top)
.setCornerRadius(leash, mCornerRadius); .setCornerRadius(leash, mCornerRadius);
return new PictureInPictureSurfaceTransaction( return new PictureInPictureSurfaceTransaction(
left, top, scale, scale, 0 /* rotation */, mCornerRadius, mTmpDestinationRect); left, top, mTmpFloat9, 0 /* rotation */, mCornerRadius, mTmpDestinationRect);
} }
public PictureInPictureSurfaceTransaction scaleAndRotate( public PictureInPictureSurfaceTransaction scaleAndRotate(
@@ -114,7 +108,7 @@ public class PipSurfaceTransactionHelper {
.setPosition(leash, positionX, positionY) .setPosition(leash, positionX, positionY)
.setCornerRadius(leash, mCornerRadius); .setCornerRadius(leash, mCornerRadius);
return new PictureInPictureSurfaceTransaction( return new PictureInPictureSurfaceTransaction(
positionX, positionY, scale, scale, degree, mCornerRadius, mTmpDestinationRect); positionX, positionY, mTmpFloat9, degree, mCornerRadius, mTmpDestinationRect);
} }
/** @return {@link SurfaceControl.Transaction} instance with vsync-id */ /** @return {@link SurfaceControl.Transaction} instance with vsync-id */

View File

@@ -257,15 +257,16 @@ class PinnedTaskController {
// be rotated. // be rotated.
float dx = pipTx.mPositionX; float dx = pipTx.mPositionX;
float dy = pipTx.mPositionY; float dy = pipTx.mPositionY;
final Matrix matrix = pipTx.getMatrix();
if (pipTx.mRotation == 90) { if (pipTx.mRotation == 90) {
dx = pipTx.mPositionY; dx = pipTx.mPositionY;
dy = areaBounds.right - pipTx.mPositionX; dy = areaBounds.right - pipTx.mPositionX;
matrix.postRotate(-90);
} else if (pipTx.mRotation == -90) { } else if (pipTx.mRotation == -90) {
dx = areaBounds.bottom - pipTx.mPositionY; dx = areaBounds.bottom - pipTx.mPositionY;
dy = pipTx.mPositionX; dy = pipTx.mPositionX;
matrix.postRotate(90);
} }
final Matrix matrix = new Matrix();
matrix.setScale(pipTx.mScaleX, pipTx.mScaleY);
matrix.postTranslate(dx, dy); matrix.postTranslate(dx, dy);
t.setMatrix(pinnedTask.getSurfaceControl(), matrix, new float[9]); t.setMatrix(pinnedTask.getSurfaceControl(), matrix, new float[9]);
Slog.i(TAG, "Seamless rotation PiP tx=" + pipTx + " pos=" + dx + "," + dy); Slog.i(TAG, "Seamless rotation PiP tx=" + pipTx + " pos=" + dx + "," + dy);