react-native-image-editor-skia 0.1.0
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.
- package/LICENSE +21 -0
- package/README.md +202 -0
- package/lib/commonjs/ImageEditor.js +141 -0
- package/lib/commonjs/ImageEditor.js.map +1 -0
- package/lib/commonjs/annotations/AnnotationView.js +42 -0
- package/lib/commonjs/annotations/AnnotationView.js.map +1 -0
- package/lib/commonjs/annotations/ArrowAnnotation.js +29 -0
- package/lib/commonjs/annotations/ArrowAnnotation.js.map +1 -0
- package/lib/commonjs/annotations/CircleAnnotation.js +31 -0
- package/lib/commonjs/annotations/CircleAnnotation.js.map +1 -0
- package/lib/commonjs/annotations/FreehandAnnotation.js +29 -0
- package/lib/commonjs/annotations/FreehandAnnotation.js.map +1 -0
- package/lib/commonjs/annotations/MarkerAnnotation.js +27 -0
- package/lib/commonjs/annotations/MarkerAnnotation.js.map +1 -0
- package/lib/commonjs/annotations/RotatedGroup.js +34 -0
- package/lib/commonjs/annotations/RotatedGroup.js.map +1 -0
- package/lib/commonjs/annotations/TextAnnotation.js +40 -0
- package/lib/commonjs/annotations/TextAnnotation.js.map +1 -0
- package/lib/commonjs/annotations/geometry.js +73 -0
- package/lib/commonjs/annotations/geometry.js.map +1 -0
- package/lib/commonjs/annotations/geometryPure.js +104 -0
- package/lib/commonjs/annotations/geometryPure.js.map +1 -0
- package/lib/commonjs/canvas/AnnotationLayer.js +58 -0
- package/lib/commonjs/canvas/AnnotationLayer.js.map +1 -0
- package/lib/commonjs/canvas/BaseImageLayer.js +27 -0
- package/lib/commonjs/canvas/BaseImageLayer.js.map +1 -0
- package/lib/commonjs/canvas/CropOverlay.js +135 -0
- package/lib/commonjs/canvas/CropOverlay.js.map +1 -0
- package/lib/commonjs/canvas/EditorCanvas.js +91 -0
- package/lib/commonjs/canvas/EditorCanvas.js.map +1 -0
- package/lib/commonjs/canvas/InFlightLayer.js +152 -0
- package/lib/commonjs/canvas/InFlightLayer.js.map +1 -0
- package/lib/commonjs/canvas/SelectionOverlay.js +90 -0
- package/lib/commonjs/canvas/SelectionOverlay.js.map +1 -0
- package/lib/commonjs/constants.js +56 -0
- package/lib/commonjs/constants.js.map +1 -0
- package/lib/commonjs/context/EditorContext.js +132 -0
- package/lib/commonjs/context/EditorContext.js.map +1 -0
- package/lib/commonjs/export/drawScene.js +97 -0
- package/lib/commonjs/export/drawScene.js.map +1 -0
- package/lib/commonjs/export/exportImage.js +92 -0
- package/lib/commonjs/export/exportImage.js.map +1 -0
- package/lib/commonjs/gestures/applyTransform.js +79 -0
- package/lib/commonjs/gestures/applyTransform.js.map +1 -0
- package/lib/commonjs/gestures/createAnnotation.js +73 -0
- package/lib/commonjs/gestures/createAnnotation.js.map +1 -0
- package/lib/commonjs/gestures/handles.js +53 -0
- package/lib/commonjs/gestures/handles.js.map +1 -0
- package/lib/commonjs/gestures/hitTest.js +72 -0
- package/lib/commonjs/gestures/hitTest.js.map +1 -0
- package/lib/commonjs/gestures/useCropGesture.js +149 -0
- package/lib/commonjs/gestures/useCropGesture.js.map +1 -0
- package/lib/commonjs/gestures/useEditorGestures.js +289 -0
- package/lib/commonjs/gestures/useEditorGestures.js.map +1 -0
- package/lib/commonjs/image/disposeRegistry.js +63 -0
- package/lib/commonjs/image/disposeRegistry.js.map +1 -0
- package/lib/commonjs/image/useLoadedImage.js +121 -0
- package/lib/commonjs/image/useLoadedImage.js.map +1 -0
- package/lib/commonjs/index.js +52 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/state/history.js +85 -0
- package/lib/commonjs/state/history.js.map +1 -0
- package/lib/commonjs/state/selectors.js +19 -0
- package/lib/commonjs/state/selectors.js.map +1 -0
- package/lib/commonjs/state/useEditorReducer.js +83 -0
- package/lib/commonjs/state/useEditorReducer.js.map +1 -0
- package/lib/commonjs/toolbar/ColorPicker.js +84 -0
- package/lib/commonjs/toolbar/ColorPicker.js.map +1 -0
- package/lib/commonjs/toolbar/CropControls.js +65 -0
- package/lib/commonjs/toolbar/CropControls.js.map +1 -0
- package/lib/commonjs/toolbar/RotationSlider.js +73 -0
- package/lib/commonjs/toolbar/RotationSlider.js.map +1 -0
- package/lib/commonjs/toolbar/TextInputOverlay.js +108 -0
- package/lib/commonjs/toolbar/TextInputOverlay.js.map +1 -0
- package/lib/commonjs/toolbar/ToolButton.js +56 -0
- package/lib/commonjs/toolbar/ToolButton.js.map +1 -0
- package/lib/commonjs/toolbar/Toolbar.js +137 -0
- package/lib/commonjs/toolbar/Toolbar.js.map +1 -0
- package/lib/commonjs/types.js +47 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/utils/color.js +37 -0
- package/lib/commonjs/utils/color.js.map +1 -0
- package/lib/commonjs/utils/id.js +14 -0
- package/lib/commonjs/utils/id.js.map +1 -0
- package/lib/commonjs/utils/math.js +277 -0
- package/lib/commonjs/utils/math.js.map +1 -0
- package/lib/module/ImageEditor.js +138 -0
- package/lib/module/ImageEditor.js.map +1 -0
- package/lib/module/annotations/AnnotationView.js +39 -0
- package/lib/module/annotations/AnnotationView.js.map +1 -0
- package/lib/module/annotations/ArrowAnnotation.js +26 -0
- package/lib/module/annotations/ArrowAnnotation.js.map +1 -0
- package/lib/module/annotations/CircleAnnotation.js +27 -0
- package/lib/module/annotations/CircleAnnotation.js.map +1 -0
- package/lib/module/annotations/FreehandAnnotation.js +25 -0
- package/lib/module/annotations/FreehandAnnotation.js.map +1 -0
- package/lib/module/annotations/MarkerAnnotation.js +23 -0
- package/lib/module/annotations/MarkerAnnotation.js.map +1 -0
- package/lib/module/annotations/RotatedGroup.js +29 -0
- package/lib/module/annotations/RotatedGroup.js.map +1 -0
- package/lib/module/annotations/TextAnnotation.js +37 -0
- package/lib/module/annotations/TextAnnotation.js.map +1 -0
- package/lib/module/annotations/geometry.js +56 -0
- package/lib/module/annotations/geometry.js.map +1 -0
- package/lib/module/annotations/geometryPure.js +100 -0
- package/lib/module/annotations/geometryPure.js.map +1 -0
- package/lib/module/canvas/AnnotationLayer.js +55 -0
- package/lib/module/canvas/AnnotationLayer.js.map +1 -0
- package/lib/module/canvas/BaseImageLayer.js +23 -0
- package/lib/module/canvas/BaseImageLayer.js.map +1 -0
- package/lib/module/canvas/CropOverlay.js +131 -0
- package/lib/module/canvas/CropOverlay.js.map +1 -0
- package/lib/module/canvas/EditorCanvas.js +88 -0
- package/lib/module/canvas/EditorCanvas.js.map +1 -0
- package/lib/module/canvas/InFlightLayer.js +149 -0
- package/lib/module/canvas/InFlightLayer.js.map +1 -0
- package/lib/module/canvas/SelectionOverlay.js +85 -0
- package/lib/module/canvas/SelectionOverlay.js.map +1 -0
- package/lib/module/constants.js +52 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/context/EditorContext.js +126 -0
- package/lib/module/context/EditorContext.js.map +1 -0
- package/lib/module/export/drawScene.js +93 -0
- package/lib/module/export/drawScene.js.map +1 -0
- package/lib/module/export/exportImage.js +88 -0
- package/lib/module/export/exportImage.js.map +1 -0
- package/lib/module/gestures/applyTransform.js +75 -0
- package/lib/module/gestures/applyTransform.js.map +1 -0
- package/lib/module/gestures/createAnnotation.js +65 -0
- package/lib/module/gestures/createAnnotation.js.map +1 -0
- package/lib/module/gestures/handles.js +49 -0
- package/lib/module/gestures/handles.js.map +1 -0
- package/lib/module/gestures/hitTest.js +69 -0
- package/lib/module/gestures/hitTest.js.map +1 -0
- package/lib/module/gestures/useCropGesture.js +145 -0
- package/lib/module/gestures/useCropGesture.js.map +1 -0
- package/lib/module/gestures/useEditorGestures.js +285 -0
- package/lib/module/gestures/useEditorGestures.js.map +1 -0
- package/lib/module/image/disposeRegistry.js +57 -0
- package/lib/module/image/disposeRegistry.js.map +1 -0
- package/lib/module/image/useLoadedImage.js +117 -0
- package/lib/module/image/useLoadedImage.js.map +1 -0
- package/lib/module/index.js +8 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/state/history.js +76 -0
- package/lib/module/state/history.js.map +1 -0
- package/lib/module/state/selectors.js +14 -0
- package/lib/module/state/selectors.js.map +1 -0
- package/lib/module/state/useEditorReducer.js +79 -0
- package/lib/module/state/useEditorReducer.js.map +1 -0
- package/lib/module/toolbar/ColorPicker.js +80 -0
- package/lib/module/toolbar/ColorPicker.js.map +1 -0
- package/lib/module/toolbar/CropControls.js +62 -0
- package/lib/module/toolbar/CropControls.js.map +1 -0
- package/lib/module/toolbar/RotationSlider.js +69 -0
- package/lib/module/toolbar/RotationSlider.js.map +1 -0
- package/lib/module/toolbar/TextInputOverlay.js +105 -0
- package/lib/module/toolbar/TextInputOverlay.js.map +1 -0
- package/lib/module/toolbar/ToolButton.js +52 -0
- package/lib/module/toolbar/ToolButton.js.map +1 -0
- package/lib/module/toolbar/Toolbar.js +133 -0
- package/lib/module/toolbar/Toolbar.js.map +1 -0
- package/lib/module/types.js +43 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/color.js +33 -0
- package/lib/module/utils/color.js.map +1 -0
- package/lib/module/utils/id.js +10 -0
- package/lib/module/utils/id.js.map +1 -0
- package/lib/module/utils/math.js +258 -0
- package/lib/module/utils/math.js.map +1 -0
- package/lib/typescript/src/ImageEditor.d.ts +9 -0
- package/lib/typescript/src/ImageEditor.d.ts.map +1 -0
- package/lib/typescript/src/annotations/AnnotationView.d.ts +6 -0
- package/lib/typescript/src/annotations/AnnotationView.d.ts.map +1 -0
- package/lib/typescript/src/annotations/ArrowAnnotation.d.ts +5 -0
- package/lib/typescript/src/annotations/ArrowAnnotation.d.ts.map +1 -0
- package/lib/typescript/src/annotations/CircleAnnotation.d.ts +5 -0
- package/lib/typescript/src/annotations/CircleAnnotation.d.ts.map +1 -0
- package/lib/typescript/src/annotations/FreehandAnnotation.d.ts +5 -0
- package/lib/typescript/src/annotations/FreehandAnnotation.d.ts.map +1 -0
- package/lib/typescript/src/annotations/MarkerAnnotation.d.ts +5 -0
- package/lib/typescript/src/annotations/MarkerAnnotation.d.ts.map +1 -0
- package/lib/typescript/src/annotations/RotatedGroup.d.ts +13 -0
- package/lib/typescript/src/annotations/RotatedGroup.d.ts.map +1 -0
- package/lib/typescript/src/annotations/TextAnnotation.d.ts +10 -0
- package/lib/typescript/src/annotations/TextAnnotation.d.ts.map +1 -0
- package/lib/typescript/src/annotations/geometry.d.ts +11 -0
- package/lib/typescript/src/annotations/geometry.d.ts.map +1 -0
- package/lib/typescript/src/annotations/geometryPure.d.ts +14 -0
- package/lib/typescript/src/annotations/geometryPure.d.ts.map +1 -0
- package/lib/typescript/src/canvas/AnnotationLayer.d.ts +11 -0
- package/lib/typescript/src/canvas/AnnotationLayer.d.ts.map +1 -0
- package/lib/typescript/src/canvas/BaseImageLayer.d.ts +12 -0
- package/lib/typescript/src/canvas/BaseImageLayer.d.ts.map +1 -0
- package/lib/typescript/src/canvas/CropOverlay.d.ts +10 -0
- package/lib/typescript/src/canvas/CropOverlay.d.ts.map +1 -0
- package/lib/typescript/src/canvas/EditorCanvas.d.ts +18 -0
- package/lib/typescript/src/canvas/EditorCanvas.d.ts.map +1 -0
- package/lib/typescript/src/canvas/InFlightLayer.d.ts +12 -0
- package/lib/typescript/src/canvas/InFlightLayer.d.ts.map +1 -0
- package/lib/typescript/src/canvas/SelectionOverlay.d.ts +11 -0
- package/lib/typescript/src/canvas/SelectionOverlay.d.ts.map +1 -0
- package/lib/typescript/src/constants.d.ts +25 -0
- package/lib/typescript/src/constants.d.ts.map +1 -0
- package/lib/typescript/src/context/EditorContext.d.ts +66 -0
- package/lib/typescript/src/context/EditorContext.d.ts.map +1 -0
- package/lib/typescript/src/export/drawScene.d.ts +10 -0
- package/lib/typescript/src/export/drawScene.d.ts.map +1 -0
- package/lib/typescript/src/export/exportImage.d.ts +23 -0
- package/lib/typescript/src/export/exportImage.d.ts.map +1 -0
- package/lib/typescript/src/gestures/applyTransform.d.ts +17 -0
- package/lib/typescript/src/gestures/applyTransform.d.ts.map +1 -0
- package/lib/typescript/src/gestures/createAnnotation.d.ts +11 -0
- package/lib/typescript/src/gestures/createAnnotation.d.ts.map +1 -0
- package/lib/typescript/src/gestures/handles.d.ts +17 -0
- package/lib/typescript/src/gestures/handles.d.ts.map +1 -0
- package/lib/typescript/src/gestures/hitTest.d.ts +9 -0
- package/lib/typescript/src/gestures/hitTest.d.ts.map +1 -0
- package/lib/typescript/src/gestures/useCropGesture.d.ts +7 -0
- package/lib/typescript/src/gestures/useCropGesture.d.ts.map +1 -0
- package/lib/typescript/src/gestures/useEditorGestures.d.ts +8 -0
- package/lib/typescript/src/gestures/useEditorGestures.d.ts.map +1 -0
- package/lib/typescript/src/image/disposeRegistry.d.ts +25 -0
- package/lib/typescript/src/image/disposeRegistry.d.ts.map +1 -0
- package/lib/typescript/src/image/useLoadedImage.d.ts +23 -0
- package/lib/typescript/src/image/useLoadedImage.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +6 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/state/history.d.ts +23 -0
- package/lib/typescript/src/state/history.d.ts.map +1 -0
- package/lib/typescript/src/state/selectors.d.ts +5 -0
- package/lib/typescript/src/state/selectors.d.ts.map +1 -0
- package/lib/typescript/src/state/useEditorReducer.d.ts +32 -0
- package/lib/typescript/src/state/useEditorReducer.d.ts.map +1 -0
- package/lib/typescript/src/toolbar/ColorPicker.d.ts +7 -0
- package/lib/typescript/src/toolbar/ColorPicker.d.ts.map +1 -0
- package/lib/typescript/src/toolbar/CropControls.d.ts +3 -0
- package/lib/typescript/src/toolbar/CropControls.d.ts.map +1 -0
- package/lib/typescript/src/toolbar/RotationSlider.d.ts +8 -0
- package/lib/typescript/src/toolbar/RotationSlider.d.ts.map +1 -0
- package/lib/typescript/src/toolbar/TextInputOverlay.d.ts +9 -0
- package/lib/typescript/src/toolbar/TextInputOverlay.d.ts.map +1 -0
- package/lib/typescript/src/toolbar/ToolButton.d.ts +7 -0
- package/lib/typescript/src/toolbar/ToolButton.d.ts.map +1 -0
- package/lib/typescript/src/toolbar/Toolbar.d.ts +4 -0
- package/lib/typescript/src/toolbar/Toolbar.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +170 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/color.d.ts +8 -0
- package/lib/typescript/src/utils/color.d.ts.map +1 -0
- package/lib/typescript/src/utils/id.d.ts +3 -0
- package/lib/typescript/src/utils/id.d.ts.map +1 -0
- package/lib/typescript/src/utils/math.d.ts +68 -0
- package/lib/typescript/src/utils/math.d.ts.map +1 -0
- package/package.json +90 -0
- package/src/ImageEditor.tsx +133 -0
- package/src/annotations/AnnotationView.tsx +24 -0
- package/src/annotations/ArrowAnnotation.tsx +26 -0
- package/src/annotations/CircleAnnotation.tsx +22 -0
- package/src/annotations/FreehandAnnotation.tsx +22 -0
- package/src/annotations/MarkerAnnotation.tsx +20 -0
- package/src/annotations/RotatedGroup.tsx +28 -0
- package/src/annotations/TextAnnotation.tsx +42 -0
- package/src/annotations/geometry.ts +62 -0
- package/src/annotations/geometryPure.ts +73 -0
- package/src/canvas/AnnotationLayer.tsx +43 -0
- package/src/canvas/BaseImageLayer.tsx +28 -0
- package/src/canvas/CropOverlay.tsx +92 -0
- package/src/canvas/EditorCanvas.tsx +70 -0
- package/src/canvas/InFlightLayer.tsx +140 -0
- package/src/canvas/SelectionOverlay.tsx +92 -0
- package/src/constants.ts +46 -0
- package/src/context/EditorContext.tsx +229 -0
- package/src/export/drawScene.ts +120 -0
- package/src/export/exportImage.ts +111 -0
- package/src/gestures/applyTransform.ts +76 -0
- package/src/gestures/createAnnotation.ts +92 -0
- package/src/gestures/handles.ts +50 -0
- package/src/gestures/hitTest.ts +79 -0
- package/src/gestures/useCropGesture.ts +123 -0
- package/src/gestures/useEditorGestures.ts +308 -0
- package/src/image/disposeRegistry.ts +59 -0
- package/src/image/useLoadedImage.ts +131 -0
- package/src/index.ts +32 -0
- package/src/state/history.ts +71 -0
- package/src/state/selectors.ts +16 -0
- package/src/state/useEditorReducer.ts +93 -0
- package/src/toolbar/ColorPicker.tsx +72 -0
- package/src/toolbar/CropControls.tsx +46 -0
- package/src/toolbar/RotationSlider.tsx +56 -0
- package/src/toolbar/TextInputOverlay.tsx +104 -0
- package/src/toolbar/ToolButton.tsx +46 -0
- package/src/toolbar/Toolbar.tsx +110 -0
- package/src/types.ts +203 -0
- package/src/utils/color.ts +34 -0
- package/src/utils/id.ts +7 -0
- package/src/utils/math.ts +222 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { Path } from '@shopify/react-native-skia';
|
|
5
|
+
import { annotationCenter, buildFreehandPath } from './geometry';
|
|
6
|
+
import { RotatedGroup } from './RotatedGroup';
|
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
+
export function FreehandAnnotationView({
|
|
9
|
+
a
|
|
10
|
+
}) {
|
|
11
|
+
const path = useMemo(() => buildFreehandPath(a.points), [a.points]);
|
|
12
|
+
return /*#__PURE__*/_jsx(RotatedGroup, {
|
|
13
|
+
center: annotationCenter(a),
|
|
14
|
+
rotation: a.rotation,
|
|
15
|
+
children: /*#__PURE__*/_jsx(Path, {
|
|
16
|
+
path: path,
|
|
17
|
+
color: a.strokeColor,
|
|
18
|
+
style: "stroke",
|
|
19
|
+
strokeWidth: a.strokeWidth,
|
|
20
|
+
strokeCap: "round",
|
|
21
|
+
strokeJoin: "round"
|
|
22
|
+
})
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=FreehandAnnotation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useMemo","Path","annotationCenter","buildFreehandPath","RotatedGroup","jsx","_jsx","FreehandAnnotationView","a","path","points","center","rotation","children","color","strokeColor","style","strokeWidth","strokeCap","strokeJoin"],"sourceRoot":"..\\..\\..\\src","sources":["annotations/FreehandAnnotation.tsx"],"mappings":";;AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,IAAI,QAAQ,4BAA4B;AAGjD,SAASC,gBAAgB,EAAEC,iBAAiB,QAAQ,YAAY;AAChE,SAASC,YAAY,QAAQ,gBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAE9C,OAAO,SAASC,sBAAsBA,CAAC;EAAEC;AAAiC,CAAC,EAAE;EAC3E,MAAMC,IAAI,GAAGT,OAAO,CAAC,MAAMG,iBAAiB,CAACK,CAAC,CAACE,MAAM,CAAC,EAAE,CAACF,CAAC,CAACE,MAAM,CAAC,CAAC;EACnE,oBACEJ,IAAA,CAACF,YAAY;IAACO,MAAM,EAAET,gBAAgB,CAACM,CAAC,CAAE;IAACI,QAAQ,EAAEJ,CAAC,CAACI,QAAS;IAAAC,QAAA,eAC9DP,IAAA,CAACL,IAAI;MACHQ,IAAI,EAAEA,IAAK;MACXK,KAAK,EAAEN,CAAC,CAACO,WAAY;MACrBC,KAAK,EAAC,QAAQ;MACdC,WAAW,EAAET,CAAC,CAACS,WAAY;MAC3BC,SAAS,EAAC,OAAO;MACjBC,UAAU,EAAC;IAAO,CACnB;EAAC,CACU,CAAC;AAEnB","ignoreList":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Rect } from '@shopify/react-native-skia';
|
|
4
|
+
import { annotationCenter } from './geometry';
|
|
5
|
+
import { RotatedGroup } from './RotatedGroup';
|
|
6
|
+
import { withOpacity } from '../utils/color';
|
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
+
export function MarkerAnnotationView({
|
|
9
|
+
a
|
|
10
|
+
}) {
|
|
11
|
+
return /*#__PURE__*/_jsx(RotatedGroup, {
|
|
12
|
+
center: annotationCenter(a),
|
|
13
|
+
rotation: a.rotation,
|
|
14
|
+
children: /*#__PURE__*/_jsx(Rect, {
|
|
15
|
+
x: a.rect.x,
|
|
16
|
+
y: a.rect.y,
|
|
17
|
+
width: a.rect.width,
|
|
18
|
+
height: a.rect.height,
|
|
19
|
+
color: withOpacity(a.color, a.opacity)
|
|
20
|
+
})
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=MarkerAnnotation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Rect","annotationCenter","RotatedGroup","withOpacity","jsx","_jsx","MarkerAnnotationView","a","center","rotation","children","x","rect","y","width","height","color","opacity"],"sourceRoot":"..\\..\\..\\src","sources":["annotations/MarkerAnnotation.tsx"],"mappings":";;AAAA,SAASA,IAAI,QAAQ,4BAA4B;AAGjD,SAASC,gBAAgB,QAAQ,YAAY;AAC7C,SAASC,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,WAAW,QAAQ,gBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAE7C,OAAO,SAASC,oBAAoBA,CAAC;EAAEC;AAA+B,CAAC,EAAE;EACvE,oBACEF,IAAA,CAACH,YAAY;IAACM,MAAM,EAAEP,gBAAgB,CAACM,CAAC,CAAE;IAACE,QAAQ,EAAEF,CAAC,CAACE,QAAS;IAAAC,QAAA,eAC9DL,IAAA,CAACL,IAAI;MACHW,CAAC,EAAEJ,CAAC,CAACK,IAAI,CAACD,CAAE;MACZE,CAAC,EAAEN,CAAC,CAACK,IAAI,CAACC,CAAE;MACZC,KAAK,EAAEP,CAAC,CAACK,IAAI,CAACE,KAAM;MACpBC,MAAM,EAAER,CAAC,CAACK,IAAI,CAACG,MAAO;MACtBC,KAAK,EAAEb,WAAW,CAACI,CAAC,CAACS,KAAK,EAAET,CAAC,CAACU,OAAO;IAAE,CACxC;EAAC,CACU,CAAC;AAEnB","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { Group } from '@shopify/react-native-skia';
|
|
5
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
+
/**
|
|
7
|
+
* Wraps children in a Skia Group rotated by `rotation` radians about `center`.
|
|
8
|
+
* Every annotation renderer uses this so its stored `rotation` is applied
|
|
9
|
+
* consistently (and identically in the off-screen export path).
|
|
10
|
+
*/
|
|
11
|
+
export function RotatedGroup({
|
|
12
|
+
center,
|
|
13
|
+
rotation,
|
|
14
|
+
children
|
|
15
|
+
}) {
|
|
16
|
+
if (!rotation) {
|
|
17
|
+
return /*#__PURE__*/_jsx(_Fragment, {
|
|
18
|
+
children: children
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return /*#__PURE__*/_jsx(Group, {
|
|
22
|
+
origin: center,
|
|
23
|
+
transform: [{
|
|
24
|
+
rotate: rotation
|
|
25
|
+
}],
|
|
26
|
+
children: children
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=RotatedGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","Group","Fragment","_Fragment","jsx","_jsx","RotatedGroup","center","rotation","children","origin","transform","rotate"],"sourceRoot":"..\\..\\..\\src","sources":["annotations/RotatedGroup.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,KAAK,QAAQ,4BAA4B;AAAC,SAAAC,QAAA,IAAAC,SAAA,EAAAC,GAAA,IAAAC,IAAA;AAInD;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAC;EAC3BC,MAAM;EACNC,QAAQ;EACRC;AAKF,CAAC,EAAE;EACD,IAAI,CAACD,QAAQ,EAAE;IACb,oBAAOH,IAAA,CAAAF,SAAA;MAAAM,QAAA,EAAGA;IAAQ,CAAG,CAAC;EACxB;EACA,oBACEJ,IAAA,CAACJ,KAAK;IAACS,MAAM,EAAEH,MAAO;IAACI,SAAS,EAAE,CAAC;MAAEC,MAAM,EAAEJ;IAAS,CAAC,CAAE;IAAAC,QAAA,EACtDA;EAAQ,CACJ,CAAC;AAEZ","ignoreList":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { Text, matchFont } from '@shopify/react-native-skia';
|
|
5
|
+
import { annotationCenter } from './geometry';
|
|
6
|
+
import { RotatedGroup } from './RotatedGroup';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Renders text using a system font via `matchFont` (no bundled font file
|
|
10
|
+
* required). Honors explicit newlines; automatic width-wrapping is intentionally
|
|
11
|
+
* out of scope for v1 (would require SkParagraph + a shared FontMgr).
|
|
12
|
+
*/
|
|
13
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
14
|
+
export function TextAnnotationView({
|
|
15
|
+
a
|
|
16
|
+
}) {
|
|
17
|
+
const font = useMemo(() => matchFont({
|
|
18
|
+
fontFamily: 'sans-serif',
|
|
19
|
+
fontSize: a.fontSize,
|
|
20
|
+
fontStyle: 'normal',
|
|
21
|
+
fontWeight: 'normal'
|
|
22
|
+
}), [a.fontSize]);
|
|
23
|
+
const lines = a.text.split('\n');
|
|
24
|
+
const lineHeight = a.fontSize * 1.2;
|
|
25
|
+
return /*#__PURE__*/_jsx(RotatedGroup, {
|
|
26
|
+
center: annotationCenter(a),
|
|
27
|
+
rotation: a.rotation,
|
|
28
|
+
children: lines.map((line, i) => /*#__PURE__*/_jsx(Text, {
|
|
29
|
+
x: a.origin.x,
|
|
30
|
+
y: a.origin.y + a.fontSize + i * lineHeight,
|
|
31
|
+
text: line,
|
|
32
|
+
font: font,
|
|
33
|
+
color: a.color
|
|
34
|
+
}, i))
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=TextAnnotation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useMemo","Text","matchFont","annotationCenter","RotatedGroup","jsx","_jsx","TextAnnotationView","a","font","fontFamily","fontSize","fontStyle","fontWeight","lines","text","split","lineHeight","center","rotation","children","map","line","i","x","origin","y","color"],"sourceRoot":"..\\..\\..\\src","sources":["annotations/TextAnnotation.tsx"],"mappings":";;AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,IAAI,EAAEC,SAAS,QAAQ,4BAA4B;AAG5D,SAASC,gBAAgB,QAAQ,YAAY;AAC7C,SAASC,YAAY,QAAQ,gBAAgB;;AAE7C;AACA;AACA;AACA;AACA;AAJA,SAAAC,GAAA,IAAAC,IAAA;AAKA,OAAO,SAASC,kBAAkBA,CAAC;EAAEC;AAA6B,CAAC,EAAE;EACnE,MAAMC,IAAI,GAAGT,OAAO,CAClB,MACEE,SAAS,CAAC;IACRQ,UAAU,EAAE,YAAY;IACxBC,QAAQ,EAAEH,CAAC,CAACG,QAAQ;IACpBC,SAAS,EAAE,QAAQ;IACnBC,UAAU,EAAE;EACd,CAAC,CAAC,EACJ,CAACL,CAAC,CAACG,QAAQ,CACb,CAAC;EAED,MAAMG,KAAK,GAAGN,CAAC,CAACO,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC;EAChC,MAAMC,UAAU,GAAGT,CAAC,CAACG,QAAQ,GAAG,GAAG;EAEnC,oBACEL,IAAA,CAACF,YAAY;IAACc,MAAM,EAAEf,gBAAgB,CAACK,CAAC,CAAE;IAACW,QAAQ,EAAEX,CAAC,CAACW,QAAS;IAAAC,QAAA,EAC7DN,KAAK,CAACO,GAAG,CAAC,CAACC,IAAI,EAAEC,CAAC,kBACjBjB,IAAA,CAACL,IAAI;MAEHuB,CAAC,EAAEhB,CAAC,CAACiB,MAAM,CAACD,CAAE;MACdE,CAAC,EAAElB,CAAC,CAACiB,MAAM,CAACC,CAAC,GAAGlB,CAAC,CAACG,QAAQ,GAAGY,CAAC,GAAGN,UAAW;MAC5CF,IAAI,EAAEO,IAAK;MACXb,IAAI,EAAEA,IAAK;MACXkB,KAAK,EAAEnB,CAAC,CAACmB;IAAM,GALVJ,CAMN,CACF;EAAC,CACU,CAAC;AAEnB","ignoreList":[]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Skia } from '@shopify/react-native-skia';
|
|
4
|
+
// Re-export the pure helpers so existing imports from './geometry' keep working.
|
|
5
|
+
// (Worklet/test-safe versions with no Skia dependency live in ./geometryPure.)
|
|
6
|
+
export { annotationCenter, annotationBounds } from './geometryPure';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Build a Skia path for an arrow (shaft + two arrowhead barbs).
|
|
10
|
+
* Not a worklet — it allocates an `SkPath` (a Skia object) on the JS thread.
|
|
11
|
+
*/
|
|
12
|
+
export function buildArrowPath(start, end, headSize) {
|
|
13
|
+
const path = Skia.Path.Make();
|
|
14
|
+
path.moveTo(start.x, start.y);
|
|
15
|
+
path.lineTo(end.x, end.y);
|
|
16
|
+
const angle = Math.atan2(end.y - start.y, end.x - start.x);
|
|
17
|
+
const barb = Math.PI * 5 / 6; // 150° from the shaft direction
|
|
18
|
+
const b1 = {
|
|
19
|
+
x: end.x + headSize * Math.cos(angle + barb),
|
|
20
|
+
y: end.y + headSize * Math.sin(angle + barb)
|
|
21
|
+
};
|
|
22
|
+
const b2 = {
|
|
23
|
+
x: end.x + headSize * Math.cos(angle - barb),
|
|
24
|
+
y: end.y + headSize * Math.sin(angle - barb)
|
|
25
|
+
};
|
|
26
|
+
path.moveTo(end.x, end.y);
|
|
27
|
+
path.lineTo(b1.x, b1.y);
|
|
28
|
+
path.moveTo(end.x, end.y);
|
|
29
|
+
path.lineTo(b2.x, b2.y);
|
|
30
|
+
return path;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Build a smoothed (quadratic) path through freehand points. */
|
|
34
|
+
export function buildFreehandPath(points) {
|
|
35
|
+
const path = Skia.Path.Make();
|
|
36
|
+
if (points.length === 0) {
|
|
37
|
+
return path;
|
|
38
|
+
}
|
|
39
|
+
path.moveTo(points[0].x, points[0].y);
|
|
40
|
+
if (points.length === 1) {
|
|
41
|
+
// Draw a dot.
|
|
42
|
+
path.lineTo(points[0].x + 0.01, points[0].y + 0.01);
|
|
43
|
+
return path;
|
|
44
|
+
}
|
|
45
|
+
for (let i = 1; i < points.length - 1; i++) {
|
|
46
|
+
const p = points[i];
|
|
47
|
+
const next = points[i + 1];
|
|
48
|
+
const midX = (p.x + next.x) / 2;
|
|
49
|
+
const midY = (p.y + next.y) / 2;
|
|
50
|
+
path.quadTo(p.x, p.y, midX, midY);
|
|
51
|
+
}
|
|
52
|
+
const last = points[points.length - 1];
|
|
53
|
+
path.lineTo(last.x, last.y);
|
|
54
|
+
return path;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Skia","annotationCenter","annotationBounds","buildArrowPath","start","end","headSize","path","Path","Make","moveTo","x","y","lineTo","angle","Math","atan2","barb","PI","b1","cos","sin","b2","buildFreehandPath","points","length","i","p","next","midX","midY","quadTo","last"],"sourceRoot":"..\\..\\..\\src","sources":["annotations/geometry.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Pure annotation geometry (no Skia imports) so it is safe to use from worklets
|
|
5
|
+
* AND from plain unit tests without loading the native Skia module.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { boundsOfPoints } from '../utils/math';
|
|
9
|
+
|
|
10
|
+
/** Center of an annotation in image space (used as rotation/scale origin). */
|
|
11
|
+
export function annotationCenter(a) {
|
|
12
|
+
'worklet';
|
|
13
|
+
|
|
14
|
+
switch (a.type) {
|
|
15
|
+
case 'circle':
|
|
16
|
+
return {
|
|
17
|
+
x: a.center.x,
|
|
18
|
+
y: a.center.y
|
|
19
|
+
};
|
|
20
|
+
case 'arrow':
|
|
21
|
+
return {
|
|
22
|
+
x: (a.start.x + a.end.x) / 2,
|
|
23
|
+
y: (a.start.y + a.end.y) / 2
|
|
24
|
+
};
|
|
25
|
+
case 'marker':
|
|
26
|
+
return {
|
|
27
|
+
x: a.rect.x + a.rect.width / 2,
|
|
28
|
+
y: a.rect.y + a.rect.height / 2
|
|
29
|
+
};
|
|
30
|
+
case 'freehand':
|
|
31
|
+
{
|
|
32
|
+
const b = boundsOfPoints(a.points);
|
|
33
|
+
return {
|
|
34
|
+
x: b.x + b.width / 2,
|
|
35
|
+
y: b.y + b.height / 2
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
case 'text':
|
|
39
|
+
return {
|
|
40
|
+
x: a.origin.x + a.width / 2,
|
|
41
|
+
y: a.origin.y + a.fontSize * 1.2 / 2
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Axis-aligned bounding box of an annotation in its LOCAL (unrotated) frame.
|
|
48
|
+
* The selection overlay rotates this box by `annotation.rotation` about the
|
|
49
|
+
* center when drawing handles.
|
|
50
|
+
*/
|
|
51
|
+
export function annotationBounds(a) {
|
|
52
|
+
'worklet';
|
|
53
|
+
|
|
54
|
+
switch (a.type) {
|
|
55
|
+
case 'circle':
|
|
56
|
+
return {
|
|
57
|
+
x: a.center.x - a.radius,
|
|
58
|
+
y: a.center.y - a.radius,
|
|
59
|
+
width: a.radius * 2,
|
|
60
|
+
height: a.radius * 2
|
|
61
|
+
};
|
|
62
|
+
case 'arrow':
|
|
63
|
+
{
|
|
64
|
+
const pad = a.headSize + a.strokeWidth;
|
|
65
|
+
const minX = Math.min(a.start.x, a.end.x) - pad;
|
|
66
|
+
const minY = Math.min(a.start.y, a.end.y) - pad;
|
|
67
|
+
const maxX = Math.max(a.start.x, a.end.x) + pad;
|
|
68
|
+
const maxY = Math.max(a.start.y, a.end.y) + pad;
|
|
69
|
+
return {
|
|
70
|
+
x: minX,
|
|
71
|
+
y: minY,
|
|
72
|
+
width: maxX - minX,
|
|
73
|
+
height: maxY - minY
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
case 'marker':
|
|
77
|
+
return {
|
|
78
|
+
...a.rect
|
|
79
|
+
};
|
|
80
|
+
case 'freehand':
|
|
81
|
+
{
|
|
82
|
+
const b = boundsOfPoints(a.points);
|
|
83
|
+
const pad = a.strokeWidth / 2;
|
|
84
|
+
return {
|
|
85
|
+
x: b.x - pad,
|
|
86
|
+
y: b.y - pad,
|
|
87
|
+
width: b.width + pad * 2,
|
|
88
|
+
height: b.height + pad * 2
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
case 'text':
|
|
92
|
+
return {
|
|
93
|
+
x: a.origin.x,
|
|
94
|
+
y: a.origin.y,
|
|
95
|
+
width: a.width,
|
|
96
|
+
height: a.fontSize * 1.2
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=geometryPure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["boundsOfPoints","annotationCenter","a","type","x","center","y","start","end","rect","width","height","b","points","origin","fontSize","annotationBounds","radius","pad","headSize","strokeWidth","minX","Math","min","minY","maxX","max","maxY"],"sourceRoot":"..\\..\\..\\src","sources":["annotations/geometryPure.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Group } from '@shopify/react-native-skia';
|
|
4
|
+
import { useDerivedValue } from 'react-native-reanimated';
|
|
5
|
+
import { sortedByZ } from '../state/selectors';
|
|
6
|
+
import { AnnotationView } from '../annotations/AnnotationView';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Renders all committed annotations in paint order. The selected annotation is
|
|
10
|
+
* wrapped in a Group whose transform is driven by the `live` shared values, so
|
|
11
|
+
* move/resize/rotate previews run on the UI thread with zero React re-renders.
|
|
12
|
+
* When idle the live transform is identity, so this is a no-op visually.
|
|
13
|
+
*/
|
|
14
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
15
|
+
export function AnnotationLayer({
|
|
16
|
+
editor
|
|
17
|
+
}) {
|
|
18
|
+
const {
|
|
19
|
+
annotations,
|
|
20
|
+
selectedId,
|
|
21
|
+
live,
|
|
22
|
+
editingTextId
|
|
23
|
+
} = editor;
|
|
24
|
+
const liveTransform = useDerivedValue(() => [{
|
|
25
|
+
translateX: live.tx.value
|
|
26
|
+
}, {
|
|
27
|
+
translateY: live.ty.value
|
|
28
|
+
}, {
|
|
29
|
+
rotate: live.rotate.value
|
|
30
|
+
}, {
|
|
31
|
+
scale: live.scale.value
|
|
32
|
+
}]);
|
|
33
|
+
const liveOrigin = useDerivedValue(() => live.origin.value);
|
|
34
|
+
return /*#__PURE__*/_jsx(_Fragment, {
|
|
35
|
+
children: sortedByZ(annotations).map(a => {
|
|
36
|
+
// Hide the text annotation currently being edited in the native overlay.
|
|
37
|
+
if (a.type === 'text' && a.id === editingTextId) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
if (a.id === selectedId) {
|
|
41
|
+
return /*#__PURE__*/_jsx(Group, {
|
|
42
|
+
origin: liveOrigin,
|
|
43
|
+
transform: liveTransform,
|
|
44
|
+
children: /*#__PURE__*/_jsx(AnnotationView, {
|
|
45
|
+
a: a
|
|
46
|
+
})
|
|
47
|
+
}, a.id);
|
|
48
|
+
}
|
|
49
|
+
return /*#__PURE__*/_jsx(AnnotationView, {
|
|
50
|
+
a: a
|
|
51
|
+
}, a.id);
|
|
52
|
+
})
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=AnnotationLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Group","useDerivedValue","sortedByZ","AnnotationView","jsx","_jsx","Fragment","_Fragment","AnnotationLayer","editor","annotations","selectedId","live","editingTextId","liveTransform","translateX","tx","value","translateY","ty","rotate","scale","liveOrigin","origin","children","map","a","type","id","transform"],"sourceRoot":"..\\..\\..\\src","sources":["canvas/AnnotationLayer.tsx"],"mappings":";;AAAA,SAASA,KAAK,QAAQ,4BAA4B;AAClD,SAASC,eAAe,QAAQ,yBAAyB;AAGzD,SAASC,SAAS,QAAQ,oBAAoB;AAC9C,SAASC,cAAc,QAAQ,+BAA+B;;AAE9D;AACA;AACA;AACA;AACA;AACA;AALA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,QAAA,IAAAC,SAAA;AAMA,OAAO,SAASC,eAAeA,CAAC;EAAEC;AAAuC,CAAC,EAAE;EAC1E,MAAM;IAAEC,WAAW;IAAEC,UAAU;IAAEC,IAAI;IAAEC;EAAc,CAAC,GAAGJ,MAAM;EAE/D,MAAMK,aAAa,GAAGb,eAAe,CAAC,MAAM,CAC1C;IAAEc,UAAU,EAAEH,IAAI,CAACI,EAAE,CAACC;EAAM,CAAC,EAC7B;IAAEC,UAAU,EAAEN,IAAI,CAACO,EAAE,CAACF;EAAM,CAAC,EAC7B;IAAEG,MAAM,EAAER,IAAI,CAACQ,MAAM,CAACH;EAAM,CAAC,EAC7B;IAAEI,KAAK,EAAET,IAAI,CAACS,KAAK,CAACJ;EAAM,CAAC,CAC5B,CAAC;EACF,MAAMK,UAAU,GAAGrB,eAAe,CAAC,MAAMW,IAAI,CAACW,MAAM,CAACN,KAAK,CAAC;EAE3D,oBACEZ,IAAA,CAAAE,SAAA;IAAAiB,QAAA,EACGtB,SAAS,CAACQ,WAAW,CAAC,CAACe,GAAG,CAAEC,CAAC,IAAK;MACjC;MACA,IAAIA,CAAC,CAACC,IAAI,KAAK,MAAM,IAAID,CAAC,CAACE,EAAE,KAAKf,aAAa,EAAE;QAC/C,OAAO,IAAI;MACb;MACA,IAAIa,CAAC,CAACE,EAAE,KAAKjB,UAAU,EAAE;QACvB,oBACEN,IAAA,CAACL,KAAK;UAAYuB,MAAM,EAAED,UAAW;UAACO,SAAS,EAAEf,aAAc;UAAAU,QAAA,eAC7DnB,IAAA,CAACF,cAAc;YAACuB,CAAC,EAAEA;UAAE,CAAE;QAAC,GADdA,CAAC,CAACE,EAEP,CAAC;MAEZ;MACA,oBAAOvB,IAAA,CAACF,cAAc;QAAYuB,CAAC,EAAEA;MAAE,GAAXA,CAAC,CAACE,EAAW,CAAC;IAC5C,CAAC;EAAC,CACF,CAAC;AAEP","ignoreList":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Image } from '@shopify/react-native-skia';
|
|
4
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
|
+
/**
|
|
6
|
+
* Draws the base image in IMAGE space (x=0,y=0, native width/height). The parent
|
|
7
|
+
* scene `<Group>` maps it onto the screen, so this same layer renders identically
|
|
8
|
+
* off-screen at full resolution during export.
|
|
9
|
+
*/
|
|
10
|
+
export function BaseImageLayer({
|
|
11
|
+
image,
|
|
12
|
+
size
|
|
13
|
+
}) {
|
|
14
|
+
return /*#__PURE__*/_jsx(Image, {
|
|
15
|
+
image: image,
|
|
16
|
+
x: 0,
|
|
17
|
+
y: 0,
|
|
18
|
+
width: size.width,
|
|
19
|
+
height: size.height,
|
|
20
|
+
fit: "fill"
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=BaseImageLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Image","jsx","_jsx","BaseImageLayer","image","size","x","y","width","height","fit"],"sourceRoot":"..\\..\\..\\src","sources":["canvas/BaseImageLayer.tsx"],"mappings":";;AAAA,SAASA,KAAK,QAAQ,4BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAKnD;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAAC;EAC7BC,KAAK;EACLC;AAIF,CAAC,EAAE;EACD,oBACEH,IAAA,CAACF,KAAK;IACJI,KAAK,EAAEA,KAAM;IACbE,CAAC,EAAE,CAAE;IACLC,CAAC,EAAE,CAAE;IACLC,KAAK,EAAEH,IAAI,CAACG,KAAM;IAClBC,MAAM,EAAEJ,IAAI,CAACI,MAAO;IACpBC,GAAG,EAAC;EAAM,CACX,CAAC;AAEN","ignoreList":[]}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useEffect } from 'react';
|
|
4
|
+
import { Circle, Group, Path, Rect, Skia } from '@shopify/react-native-skia';
|
|
5
|
+
import { useDerivedValue } from 'react-native-reanimated';
|
|
6
|
+
import { HANDLE_SIZE } from '../constants';
|
|
7
|
+
import { applyToPoint } from '../utils/math';
|
|
8
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
+
/**
|
|
10
|
+
* Crop UI drawn in screen space: a dimmed full-screen scrim plus the crop
|
|
11
|
+
* rectangle's border and corner handles, which follow `cropRectSV` on the UI
|
|
12
|
+
* thread (works even when the scene is rotated, since the border is a quad).
|
|
13
|
+
*/
|
|
14
|
+
export function CropOverlay({
|
|
15
|
+
editor
|
|
16
|
+
}) {
|
|
17
|
+
const {
|
|
18
|
+
tool,
|
|
19
|
+
doc,
|
|
20
|
+
cropRectSV,
|
|
21
|
+
matrixSV,
|
|
22
|
+
imageSize,
|
|
23
|
+
layout
|
|
24
|
+
} = editor;
|
|
25
|
+
|
|
26
|
+
// When entering the crop tool, seed the crop rect from the current scene.
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (tool === 'crop') {
|
|
29
|
+
cropRectSV.value = doc.scene.cropRect ?? {
|
|
30
|
+
x: 0,
|
|
31
|
+
y: 0,
|
|
32
|
+
width: imageSize.width,
|
|
33
|
+
height: imageSize.height
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
37
|
+
}, [tool]);
|
|
38
|
+
const cropPath = useDerivedValue(() => {
|
|
39
|
+
const r = cropRectSV.value;
|
|
40
|
+
const m = matrixSV.value;
|
|
41
|
+
const p = Skia.Path.Make();
|
|
42
|
+
const c0 = applyToPoint(m, {
|
|
43
|
+
x: r.x,
|
|
44
|
+
y: r.y
|
|
45
|
+
});
|
|
46
|
+
const c1 = applyToPoint(m, {
|
|
47
|
+
x: r.x + r.width,
|
|
48
|
+
y: r.y
|
|
49
|
+
});
|
|
50
|
+
const c2 = applyToPoint(m, {
|
|
51
|
+
x: r.x + r.width,
|
|
52
|
+
y: r.y + r.height
|
|
53
|
+
});
|
|
54
|
+
const c3 = applyToPoint(m, {
|
|
55
|
+
x: r.x,
|
|
56
|
+
y: r.y + r.height
|
|
57
|
+
});
|
|
58
|
+
p.moveTo(c0.x, c0.y);
|
|
59
|
+
p.lineTo(c1.x, c1.y);
|
|
60
|
+
p.lineTo(c2.x, c2.y);
|
|
61
|
+
p.lineTo(c3.x, c3.y);
|
|
62
|
+
p.close();
|
|
63
|
+
return p;
|
|
64
|
+
});
|
|
65
|
+
const corners = useDerivedValue(() => {
|
|
66
|
+
const r = cropRectSV.value;
|
|
67
|
+
const m = matrixSV.value;
|
|
68
|
+
return [applyToPoint(m, {
|
|
69
|
+
x: r.x,
|
|
70
|
+
y: r.y
|
|
71
|
+
}), applyToPoint(m, {
|
|
72
|
+
x: r.x + r.width,
|
|
73
|
+
y: r.y
|
|
74
|
+
}), applyToPoint(m, {
|
|
75
|
+
x: r.x + r.width,
|
|
76
|
+
y: r.y + r.height
|
|
77
|
+
}), applyToPoint(m, {
|
|
78
|
+
x: r.x,
|
|
79
|
+
y: r.y + r.height
|
|
80
|
+
})];
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// Per-corner x/y derived values (declared unconditionally — rules of hooks).
|
|
84
|
+
const c0x = useDerivedValue(() => corners.value[0].x);
|
|
85
|
+
const c0y = useDerivedValue(() => corners.value[0].y);
|
|
86
|
+
const c1x = useDerivedValue(() => corners.value[1].x);
|
|
87
|
+
const c1y = useDerivedValue(() => corners.value[1].y);
|
|
88
|
+
const c2x = useDerivedValue(() => corners.value[2].x);
|
|
89
|
+
const c2y = useDerivedValue(() => corners.value[2].y);
|
|
90
|
+
const c3x = useDerivedValue(() => corners.value[3].x);
|
|
91
|
+
const c3y = useDerivedValue(() => corners.value[3].y);
|
|
92
|
+
if (tool !== 'crop') {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const r = HANDLE_SIZE / 2;
|
|
96
|
+
return /*#__PURE__*/_jsxs(Group, {
|
|
97
|
+
children: [/*#__PURE__*/_jsx(Rect, {
|
|
98
|
+
x: 0,
|
|
99
|
+
y: 0,
|
|
100
|
+
width: layout.width,
|
|
101
|
+
height: layout.height,
|
|
102
|
+
color: "rgba(0,0,0,0.45)"
|
|
103
|
+
}), /*#__PURE__*/_jsx(Path, {
|
|
104
|
+
path: cropPath,
|
|
105
|
+
color: "#FFFFFF",
|
|
106
|
+
style: "stroke",
|
|
107
|
+
strokeWidth: 2
|
|
108
|
+
}), /*#__PURE__*/_jsx(Circle, {
|
|
109
|
+
cx: c0x,
|
|
110
|
+
cy: c0y,
|
|
111
|
+
r: r,
|
|
112
|
+
color: "#FFFFFF"
|
|
113
|
+
}), /*#__PURE__*/_jsx(Circle, {
|
|
114
|
+
cx: c1x,
|
|
115
|
+
cy: c1y,
|
|
116
|
+
r: r,
|
|
117
|
+
color: "#FFFFFF"
|
|
118
|
+
}), /*#__PURE__*/_jsx(Circle, {
|
|
119
|
+
cx: c2x,
|
|
120
|
+
cy: c2y,
|
|
121
|
+
r: r,
|
|
122
|
+
color: "#FFFFFF"
|
|
123
|
+
}), /*#__PURE__*/_jsx(Circle, {
|
|
124
|
+
cx: c3x,
|
|
125
|
+
cy: c3y,
|
|
126
|
+
r: r,
|
|
127
|
+
color: "#FFFFFF"
|
|
128
|
+
})]
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=CropOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","Circle","Group","Path","Rect","Skia","useDerivedValue","HANDLE_SIZE","applyToPoint","jsx","_jsx","jsxs","_jsxs","CropOverlay","editor","tool","doc","cropRectSV","matrixSV","imageSize","layout","value","scene","cropRect","x","y","width","height","cropPath","r","m","p","Make","c0","c1","c2","c3","moveTo","lineTo","close","corners","c0x","c0y","c1x","c1y","c2x","c2y","c3x","c3y","children","color","path","style","strokeWidth","cx","cy"],"sourceRoot":"..\\..\\..\\src","sources":["canvas/CropOverlay.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { StyleSheet, View } from 'react-native';
|
|
5
|
+
import { Canvas, Group } from '@shopify/react-native-skia';
|
|
6
|
+
import { GestureDetector, Gesture } from 'react-native-gesture-handler';
|
|
7
|
+
import { useEditor } from '../context/EditorContext';
|
|
8
|
+
import { sceneTransforms2d } from '../utils/math';
|
|
9
|
+
import { useEditorGestures } from '../gestures/useEditorGestures';
|
|
10
|
+
import { useCropGesture } from '../gestures/useCropGesture';
|
|
11
|
+
import { BaseImageLayer } from './BaseImageLayer';
|
|
12
|
+
import { AnnotationLayer } from './AnnotationLayer';
|
|
13
|
+
import { InFlightLayer } from './InFlightLayer';
|
|
14
|
+
import { SelectionOverlay } from './SelectionOverlay';
|
|
15
|
+
import { CropOverlay } from './CropOverlay';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The Skia canvas host. Layers, under one scene `<Group>` transform:
|
|
19
|
+
* base image → committed annotations → in-flight draft
|
|
20
|
+
* plus screen-space overlays (selection handles, crop UI). A single composed
|
|
21
|
+
* gesture drives all editing.
|
|
22
|
+
*
|
|
23
|
+
* IMPORTANT: React Context does NOT cross the Skia `<Canvas>` boundary — Skia
|
|
24
|
+
* renders Canvas children with its own reconciler, so a Provider mounted outside
|
|
25
|
+
* the Canvas is invisible inside it. Every Canvas child therefore receives the
|
|
26
|
+
* whole editor value via an `editor` PROP instead of calling `useEditor()`.
|
|
27
|
+
* Also, `<Canvas onLayout>` is unsupported on the New Architecture, so we measure
|
|
28
|
+
* on a wrapping `<View>`.
|
|
29
|
+
*/
|
|
30
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
31
|
+
export function EditorCanvas({
|
|
32
|
+
image
|
|
33
|
+
}) {
|
|
34
|
+
const editor = useEditor();
|
|
35
|
+
const {
|
|
36
|
+
doc,
|
|
37
|
+
imageSize,
|
|
38
|
+
setLayout,
|
|
39
|
+
layout
|
|
40
|
+
} = editor;
|
|
41
|
+
const pan = useEditorGestures();
|
|
42
|
+
const cropPan = useCropGesture();
|
|
43
|
+
const gesture = useMemo(() => Gesture.Race(cropPan, pan), [cropPan, pan]);
|
|
44
|
+
const transform = useMemo(() => sceneTransforms2d(doc.scene, imageSize, layout), [doc.scene, imageSize, layout]);
|
|
45
|
+
const onLayout = e => {
|
|
46
|
+
const {
|
|
47
|
+
width,
|
|
48
|
+
height
|
|
49
|
+
} = e.nativeEvent.layout;
|
|
50
|
+
if (width > 0 && height > 0) {
|
|
51
|
+
setLayout({
|
|
52
|
+
width,
|
|
53
|
+
height
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
return /*#__PURE__*/_jsx(View, {
|
|
58
|
+
style: styles.fill,
|
|
59
|
+
onLayout: onLayout,
|
|
60
|
+
children: /*#__PURE__*/_jsx(GestureDetector, {
|
|
61
|
+
gesture: gesture,
|
|
62
|
+
children: /*#__PURE__*/_jsxs(Canvas, {
|
|
63
|
+
style: styles.fill,
|
|
64
|
+
children: [/*#__PURE__*/_jsxs(Group, {
|
|
65
|
+
transform: transform,
|
|
66
|
+
children: [/*#__PURE__*/_jsx(BaseImageLayer, {
|
|
67
|
+
image: image,
|
|
68
|
+
size: imageSize
|
|
69
|
+
}), /*#__PURE__*/_jsx(AnnotationLayer, {
|
|
70
|
+
editor: editor
|
|
71
|
+
}), /*#__PURE__*/_jsx(InFlightLayer, {
|
|
72
|
+
editor: editor
|
|
73
|
+
})]
|
|
74
|
+
}), /*#__PURE__*/_jsx(SelectionOverlay, {
|
|
75
|
+
editor: editor
|
|
76
|
+
}), /*#__PURE__*/_jsx(CropOverlay, {
|
|
77
|
+
editor: editor
|
|
78
|
+
})]
|
|
79
|
+
})
|
|
80
|
+
})
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const styles = StyleSheet.create({
|
|
84
|
+
fill: {
|
|
85
|
+
flex: 1
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=EditorCanvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useMemo","StyleSheet","View","Canvas","Group","GestureDetector","Gesture","useEditor","sceneTransforms2d","useEditorGestures","useCropGesture","BaseImageLayer","AnnotationLayer","InFlightLayer","SelectionOverlay","CropOverlay","jsx","_jsx","jsxs","_jsxs","EditorCanvas","image","editor","doc","imageSize","setLayout","layout","pan","cropPan","gesture","Race","transform","scene","onLayout","e","width","height","nativeEvent","style","styles","fill","children","size","create","flex"],"sourceRoot":"..\\..\\..\\src","sources":["canvas/EditorCanvas.tsx"],"mappings":"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","ignoreList":[]}
|