From afcd3ace65e7904e8f6a57de8f09e6ecd37c00b0 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sun, 10 Nov 2024 13:47:14 +0100 Subject: [PATCH] Make PositionMapper use affine transforms This will allow to apply transformations performed by video filters. --- .../genymobile/scrcpy/control/PositionMapper.java | 14 ++++++++------ .../genymobile/scrcpy/video/NewDisplayCapture.java | 2 +- .../com/genymobile/scrcpy/video/ScreenCapture.java | 7 +++++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/server/src/main/java/com/genymobile/scrcpy/control/PositionMapper.java b/server/src/main/java/com/genymobile/scrcpy/control/PositionMapper.java index 7b546652..cf9b25ab 100644 --- a/server/src/main/java/com/genymobile/scrcpy/control/PositionMapper.java +++ b/server/src/main/java/com/genymobile/scrcpy/control/PositionMapper.java @@ -3,15 +3,16 @@ package com.genymobile.scrcpy.control; import com.genymobile.scrcpy.device.Point; import com.genymobile.scrcpy.device.Position; import com.genymobile.scrcpy.device.Size; +import com.genymobile.scrcpy.util.AffineMatrix; public final class PositionMapper { - private final Size sourceSize; private final Size videoSize; + private final AffineMatrix videoToDeviceMatrix; - public PositionMapper(Size sourceSize, Size videoSize) { - this.sourceSize = sourceSize; + public PositionMapper(Size videoSize, AffineMatrix videoToDeviceMatrix) { this.videoSize = videoSize; + this.videoToDeviceMatrix = videoToDeviceMatrix; } public Point map(Position position) { @@ -23,8 +24,9 @@ public final class PositionMapper { } Point point = position.getPoint(); - int convertedX = point.getX() * sourceSize.getWidth() / videoSize.getWidth(); - int convertedY = point.getY() * sourceSize.getHeight() / videoSize.getHeight(); - return new Point(convertedX, convertedY); + if (videoToDeviceMatrix != null) { + point = videoToDeviceMatrix.apply(point); + } + return point; } } diff --git a/server/src/main/java/com/genymobile/scrcpy/video/NewDisplayCapture.java b/server/src/main/java/com/genymobile/scrcpy/video/NewDisplayCapture.java index f657d1a8..cc54876a 100644 --- a/server/src/main/java/com/genymobile/scrcpy/video/NewDisplayCapture.java +++ b/server/src/main/java/com/genymobile/scrcpy/video/NewDisplayCapture.java @@ -106,7 +106,7 @@ public class NewDisplayCapture extends SurfaceCapture { } if (vdListener != null) { - PositionMapper positionMapper = new PositionMapper(size, size); + PositionMapper positionMapper = new PositionMapper(size, null); vdListener.onNewVirtualDisplay(virtualDisplayId, positionMapper); } } diff --git a/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java b/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java index 00ee89d8..8873cb6d 100644 --- a/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java +++ b/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java @@ -7,6 +7,7 @@ import com.genymobile.scrcpy.device.ConfigurationException; import com.genymobile.scrcpy.device.Device; import com.genymobile.scrcpy.device.DisplayInfo; import com.genymobile.scrcpy.device.Size; +import com.genymobile.scrcpy.util.AffineMatrix; import com.genymobile.scrcpy.util.Ln; import com.genymobile.scrcpy.util.LogUtils; import com.genymobile.scrcpy.wrappers.DisplayManager; @@ -145,7 +146,7 @@ public class ScreenCapture extends SurfaceCapture { .createVirtualDisplay("scrcpy", videoSize.getWidth(), videoSize.getHeight(), displayId, surface); virtualDisplayId = virtualDisplay.getDisplay().getDisplayId(); // The position are relative to the virtual display, not the original display - positionMapper = new PositionMapper(videoSize, videoSize); + positionMapper = new PositionMapper(videoSize, null); Ln.d("Display: using DisplayManager API"); } catch (Exception displayManagerException) { try { @@ -156,7 +157,9 @@ public class ScreenCapture extends SurfaceCapture { setDisplaySurface(display, surface, deviceSize.toRect(), videoSize.toRect(), layerStack); virtualDisplayId = displayId; - positionMapper = new PositionMapper(deviceSize, videoSize); + + AffineMatrix videoToDeviceMatrix = videoSize.equals(deviceSize) ? null : AffineMatrix.scale(videoSize, deviceSize); + positionMapper = new PositionMapper(videoSize, videoToDeviceMatrix); Ln.d("Display: using SurfaceControl API"); } catch (Exception surfaceControlException) { Ln.e("Could not create display using DisplayManager", displayManagerException);