mirror of
https://github.com/Genymobile/scrcpy.git
synced 2026-01-10 17:24:33 +01:00
Expose two methods on Size directly: - limit() to downscale a size; - round8() to round both dimensions to multiples of 8. This will allow to remove ScreenInfo completely.
122 lines
4.0 KiB
Java
122 lines
4.0 KiB
Java
package com.genymobile.scrcpy.video;
|
|
|
|
import com.genymobile.scrcpy.device.Device;
|
|
import com.genymobile.scrcpy.device.Size;
|
|
import com.genymobile.scrcpy.util.Ln;
|
|
|
|
import android.graphics.Rect;
|
|
|
|
public final class ScreenInfo {
|
|
/**
|
|
* Device (physical) size, possibly cropped
|
|
*/
|
|
private final Rect contentRect; // device size, possibly cropped
|
|
|
|
/**
|
|
* Video size, possibly smaller than the device size, already taking the device rotation and crop into account.
|
|
* <p>
|
|
* However, it does not include the locked video orientation.
|
|
*/
|
|
private final Size unlockedVideoSize;
|
|
|
|
/**
|
|
* Device rotation, related to the natural device orientation (0, 1, 2 or 3)
|
|
*/
|
|
private final int deviceRotation;
|
|
|
|
/**
|
|
* The locked video orientation (-1: disabled, 0: normal, 1: 90° CCW, 2: 180°, 3: 90° CW)
|
|
*/
|
|
private final int lockedVideoOrientation;
|
|
|
|
public ScreenInfo(Rect contentRect, Size unlockedVideoSize, int deviceRotation, int lockedVideoOrientation) {
|
|
this.contentRect = contentRect;
|
|
this.unlockedVideoSize = unlockedVideoSize;
|
|
this.deviceRotation = deviceRotation;
|
|
this.lockedVideoOrientation = lockedVideoOrientation;
|
|
}
|
|
|
|
public Rect getContentRect() {
|
|
return contentRect;
|
|
}
|
|
|
|
/**
|
|
* Return the video size as if locked video orientation was not set.
|
|
*
|
|
* @return the unlocked video size
|
|
*/
|
|
public Size getUnlockedVideoSize() {
|
|
return unlockedVideoSize;
|
|
}
|
|
|
|
/**
|
|
* Return the actual video size if locked video orientation is set.
|
|
*
|
|
* @return the actual video size
|
|
*/
|
|
public Size getVideoSize() {
|
|
if (getVideoRotation() % 2 == 0) {
|
|
return unlockedVideoSize;
|
|
}
|
|
|
|
return unlockedVideoSize.rotate();
|
|
}
|
|
|
|
public static ScreenInfo computeScreenInfo(int rotation, Size deviceSize, Rect crop, int maxSize, int lockedVideoOrientation) {
|
|
if (lockedVideoOrientation == Device.LOCK_VIDEO_ORIENTATION_INITIAL) {
|
|
// The user requested to lock the video orientation to the current orientation
|
|
lockedVideoOrientation = rotation;
|
|
}
|
|
|
|
Rect contentRect = new Rect(0, 0, deviceSize.getWidth(), deviceSize.getHeight());
|
|
if (crop != null) {
|
|
if (rotation % 2 != 0) { // 180s preserve dimensions
|
|
// the crop (provided by the user) is expressed in the natural orientation
|
|
crop = flipRect(crop);
|
|
}
|
|
if (!contentRect.intersect(crop)) {
|
|
// intersect() changes contentRect so that it is intersected with crop
|
|
Ln.w("Crop rectangle (" + formatCrop(crop) + ") does not intersect device screen (" + formatCrop(deviceSize.toRect()) + ")");
|
|
contentRect = new Rect(); // empty
|
|
}
|
|
}
|
|
|
|
Size videoSize = new Size(contentRect.width(), contentRect.height()).limit(maxSize).round8();
|
|
return new ScreenInfo(contentRect, videoSize, rotation, lockedVideoOrientation);
|
|
}
|
|
|
|
private static String formatCrop(Rect rect) {
|
|
return rect.width() + ":" + rect.height() + ":" + rect.left + ":" + rect.top;
|
|
}
|
|
|
|
private static Rect flipRect(Rect crop) {
|
|
return new Rect(crop.top, crop.left, crop.bottom, crop.right);
|
|
}
|
|
|
|
/**
|
|
* Return the rotation to apply to the device rotation to get the requested locked video orientation
|
|
*
|
|
* @return the rotation offset
|
|
*/
|
|
public int getVideoRotation() {
|
|
if (lockedVideoOrientation == -1) {
|
|
// no offset
|
|
return 0;
|
|
}
|
|
return (deviceRotation + 4 - lockedVideoOrientation) % 4;
|
|
}
|
|
|
|
/**
|
|
* Return the rotation to apply to the requested locked video orientation to get the device rotation
|
|
*
|
|
* @return the (reverse) rotation offset
|
|
*/
|
|
public int getReverseVideoRotation() {
|
|
if (lockedVideoOrientation == -1) {
|
|
// no offset
|
|
return 0;
|
|
}
|
|
return (lockedVideoOrientation + 4 - deviceRotation) % 4;
|
|
}
|
|
}
|