@netless/app-presentation 0.1.10 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,19 @@
1
+ export interface CameraTransformOptions {
2
+ disableCameraTransform?: boolean;
3
+ disableDeviceCameraTransform?: boolean;
4
+ }
5
+
6
+ export function getCameraScaleRange(
7
+ fitScale: number,
8
+ maxCameraScale: number,
9
+ disableCameraTransform?: boolean
10
+ ): { minScale: number; maxScale: number } {
11
+ return {
12
+ minScale: fitScale,
13
+ maxScale: fitScale * (disableCameraTransform ? 1 : maxCameraScale),
14
+ }
15
+ }
16
+
17
+ export function shouldDisableDeviceCameraTransform(options: CameraTransformOptions): boolean {
18
+ return Boolean(options.disableCameraTransform || options.disableDeviceCameraTransform)
19
+ }
@@ -0,0 +1,81 @@
1
+ import type { Camera, Rectangle, Size } from "@netless/window-manager"
2
+
3
+ export function isValidSize(size: Size | null | undefined): size is Size {
4
+ return Boolean(
5
+ size &&
6
+ Number.isFinite(size.width) &&
7
+ Number.isFinite(size.height) &&
8
+ size.width > 0 &&
9
+ size.height > 0
10
+ )
11
+ }
12
+
13
+ export function isValidSharedViewport(
14
+ viewport: Rectangle | null | undefined
15
+ ): viewport is Rectangle {
16
+ return Boolean(
17
+ viewport &&
18
+ Number.isFinite(viewport.originX) &&
19
+ Number.isFinite(viewport.originY) &&
20
+ isValidSize(viewport)
21
+ )
22
+ }
23
+
24
+ export function getCameraReferenceSize(
25
+ originSize: Size | null | undefined,
26
+ pageSize: Size
27
+ ): Size {
28
+ return isValidSize(originSize) ? originSize : pageSize
29
+ }
30
+
31
+ export function fitPageSizeToOrigin(
32
+ pageSize: Size,
33
+ originSize: Size | null | undefined
34
+ ): Size {
35
+ if (!isValidSize(pageSize) || !isValidSize(originSize)) return { ...pageSize }
36
+ const ratio = Math.min(
37
+ originSize.width / pageSize.width,
38
+ originSize.height / pageSize.height
39
+ )
40
+ if (!(Number.isFinite(ratio) && ratio > 0)) return { ...pageSize }
41
+ return {
42
+ width: pageSize.width * ratio,
43
+ height: pageSize.height * ratio,
44
+ }
45
+ }
46
+
47
+ export function getFitScale(viewSize: Size, referenceSize: Size): number | undefined {
48
+ if (!isValidSize(viewSize) || !isValidSize(referenceSize)) return
49
+ const scale = Math.min(
50
+ viewSize.width / referenceSize.width,
51
+ viewSize.height / referenceSize.height
52
+ )
53
+ return Number.isFinite(scale) && scale > 0 ? scale : undefined
54
+ }
55
+
56
+ export function cameraToSharedViewport(
57
+ camera: Camera,
58
+ viewSize: Size,
59
+ referenceSize: Size
60
+ ): Rectangle | undefined {
61
+ const fitScale = getFitScale(viewSize, referenceSize)
62
+ if (
63
+ fitScale === undefined ||
64
+ !Number.isFinite(camera.centerX) ||
65
+ !Number.isFinite(camera.centerY) ||
66
+ !Number.isFinite(camera.scale) ||
67
+ camera.scale <= 0
68
+ ) {
69
+ return
70
+ }
71
+
72
+ const normalizedScale = camera.scale / fitScale
73
+ const width = referenceSize.width / normalizedScale
74
+ const height = referenceSize.height / normalizedScale
75
+ return {
76
+ originX: camera.centerX - width / 2,
77
+ originY: camera.centerY - height / 2,
78
+ width,
79
+ height,
80
+ }
81
+ }