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,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useEditorGestures = useEditorGestures;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _reactNativeGestureHandler = require("react-native-gesture-handler");
|
|
9
|
+
var _reactNativeReanimated = require("react-native-reanimated");
|
|
10
|
+
var _EditorContext = require("../context/EditorContext");
|
|
11
|
+
var _constants = require("../constants");
|
|
12
|
+
var _math = require("../utils/math");
|
|
13
|
+
var _geometry = require("../annotations/geometry");
|
|
14
|
+
var _hitTest = require("./hitTest");
|
|
15
|
+
var _handles = require("./handles");
|
|
16
|
+
var _applyTransform = require("./applyTransform");
|
|
17
|
+
var _createAnnotation = require("./createAnnotation");
|
|
18
|
+
function isDrawTool(tool) {
|
|
19
|
+
'worklet';
|
|
20
|
+
|
|
21
|
+
return tool === 'circle' || tool === 'arrow' || tool === 'marker' || tool === 'freehand';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A single composed Pan gesture over the canvas. It branches on the active tool
|
|
26
|
+
* and, in select mode, on where the touch began (rotate handle → rotate, corner
|
|
27
|
+
* handle → resize, body → move, empty → (de)select). All geometry math runs on
|
|
28
|
+
* the UI thread; only final commits hop to JS via runOnJS.
|
|
29
|
+
*/
|
|
30
|
+
function useEditorGestures() {
|
|
31
|
+
const editor = (0, _EditorContext.useEditor)();
|
|
32
|
+
const {
|
|
33
|
+
tool,
|
|
34
|
+
selectedId,
|
|
35
|
+
annotations,
|
|
36
|
+
matrix,
|
|
37
|
+
draw,
|
|
38
|
+
live,
|
|
39
|
+
strokeColor,
|
|
40
|
+
strokeWidth,
|
|
41
|
+
dispatch,
|
|
42
|
+
setSelectedId,
|
|
43
|
+
setEditingTextId
|
|
44
|
+
} = editor;
|
|
45
|
+
const invMatrix = (0, _react.useMemo)(() => (0, _math.invert)(matrix), [matrix]);
|
|
46
|
+
const scaleFactor = (0, _react.useMemo)(() => Math.hypot(matrix.a, matrix.b) || 1, [matrix]);
|
|
47
|
+
const slopImage = _constants.HIT_SLOP / scaleFactor;
|
|
48
|
+
|
|
49
|
+
// Per-gesture UI-thread scratch state.
|
|
50
|
+
const mode = (0, _reactNativeReanimated.useSharedValue)('none');
|
|
51
|
+
const startImg = (0, _reactNativeReanimated.useSharedValue)({
|
|
52
|
+
x: 0,
|
|
53
|
+
y: 0
|
|
54
|
+
});
|
|
55
|
+
const startDist = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
56
|
+
const startAngle = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
57
|
+
const activeId = (0, _reactNativeReanimated.useSharedValue)(null);
|
|
58
|
+
|
|
59
|
+
// ---- JS-thread commit callbacks --------------------------------------
|
|
60
|
+
const selectId = id => setSelectedId(id);
|
|
61
|
+
const commitCircle = (center, radius) => dispatch({
|
|
62
|
+
type: 'ADD_ANNOTATION',
|
|
63
|
+
annotation: (0, _createAnnotation.makeCircle)(center, radius, {
|
|
64
|
+
strokeColor,
|
|
65
|
+
strokeWidth
|
|
66
|
+
})
|
|
67
|
+
});
|
|
68
|
+
const commitArrow = (start, end) => dispatch({
|
|
69
|
+
type: 'ADD_ANNOTATION',
|
|
70
|
+
annotation: (0, _createAnnotation.makeArrow)(start, end, {
|
|
71
|
+
strokeColor,
|
|
72
|
+
strokeWidth
|
|
73
|
+
})
|
|
74
|
+
});
|
|
75
|
+
const commitMarker = rect => dispatch({
|
|
76
|
+
type: 'ADD_ANNOTATION',
|
|
77
|
+
annotation: (0, _createAnnotation.makeMarker)(rect, strokeColor)
|
|
78
|
+
});
|
|
79
|
+
const commitFreehand = points => dispatch({
|
|
80
|
+
type: 'ADD_ANNOTATION',
|
|
81
|
+
annotation: (0, _createAnnotation.makeFreehand)(points, {
|
|
82
|
+
strokeColor,
|
|
83
|
+
strokeWidth
|
|
84
|
+
})
|
|
85
|
+
});
|
|
86
|
+
const placeText = origin => {
|
|
87
|
+
const annotation = (0, _createAnnotation.makeText)(origin, editor.textColor);
|
|
88
|
+
dispatch({
|
|
89
|
+
type: 'ADD_ANNOTATION',
|
|
90
|
+
annotation
|
|
91
|
+
});
|
|
92
|
+
setSelectedId(annotation.id);
|
|
93
|
+
setEditingTextId(annotation.id);
|
|
94
|
+
};
|
|
95
|
+
const commitTransform = (id, vals) => {
|
|
96
|
+
if (!id) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Skip no-op transforms (a plain tap) so they don't pollute history.
|
|
100
|
+
const identity = vals.tx === 0 && vals.ty === 0 && vals.rotate === 0 && vals.scale === 1;
|
|
101
|
+
if (identity) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const target = annotations.find(a => a.id === id);
|
|
105
|
+
if (!target) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const updated = (0, _applyTransform.applyTransformToAnnotation)(target, vals);
|
|
109
|
+
dispatch({
|
|
110
|
+
type: 'UPDATE_ANNOTATION',
|
|
111
|
+
id,
|
|
112
|
+
changes: updated
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
const resetLive = () => {
|
|
116
|
+
live.active.value = false;
|
|
117
|
+
live.tx.value = 0;
|
|
118
|
+
live.ty.value = 0;
|
|
119
|
+
live.rotate.value = 0;
|
|
120
|
+
live.scale.value = 1;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
// ---- The gesture ------------------------------------------------------
|
|
124
|
+
const pan = (0, _react.useMemo)(() => {
|
|
125
|
+
return _reactNativeGestureHandler.Gesture.Pan().maxPointers(1).onBegin(e => {
|
|
126
|
+
'worklet';
|
|
127
|
+
|
|
128
|
+
if (tool === 'crop') {
|
|
129
|
+
mode.value = 'none';
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const screen = {
|
|
133
|
+
x: e.x,
|
|
134
|
+
y: e.y
|
|
135
|
+
};
|
|
136
|
+
const img = (0, _math.applyToPoint)(invMatrix, screen);
|
|
137
|
+
startImg.value = img;
|
|
138
|
+
activeId.value = selectedId;
|
|
139
|
+
if (isDrawTool(tool)) {
|
|
140
|
+
mode.value = 'draw';
|
|
141
|
+
draw.active.value = true;
|
|
142
|
+
draw.start.value = img;
|
|
143
|
+
draw.current.value = img;
|
|
144
|
+
if (tool === 'freehand') {
|
|
145
|
+
draw.points.value = [img];
|
|
146
|
+
}
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (tool === 'text') {
|
|
150
|
+
mode.value = 'text';
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// select tool: figure out what was grabbed.
|
|
155
|
+
const sel = selectedId ? annotations.find(a => a.id === selectedId) : undefined;
|
|
156
|
+
if (sel) {
|
|
157
|
+
const h = (0, _handles.selectionHandles)(sel, matrix);
|
|
158
|
+
const center = (0, _geometry.annotationCenter)(sel);
|
|
159
|
+
if ((0, _math.distance)(screen, h.rotate) <= _constants.HANDLE_SIZE * 1.5) {
|
|
160
|
+
mode.value = 'rotate';
|
|
161
|
+
live.origin.value = center;
|
|
162
|
+
live.active.value = true;
|
|
163
|
+
startAngle.value = Math.atan2(img.y - center.y, img.x - center.x);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
for (let i = 0; i < h.corners.length; i++) {
|
|
167
|
+
if ((0, _math.distance)(screen, h.corners[i]) <= _constants.HANDLE_SIZE * 1.5) {
|
|
168
|
+
mode.value = 'resize';
|
|
169
|
+
live.origin.value = center;
|
|
170
|
+
live.active.value = true;
|
|
171
|
+
startDist.value = (0, _math.distance)(center, img);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Body of the selected annotation → move it.
|
|
176
|
+
if ((0, _hitTest.hitTest)([sel], img, slopImage) === sel.id) {
|
|
177
|
+
mode.value = 'move';
|
|
178
|
+
live.origin.value = center;
|
|
179
|
+
live.active.value = true;
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Otherwise (de)select whatever is under the touch.
|
|
185
|
+
const hitId = (0, _hitTest.hitTest)(annotations, img, slopImage);
|
|
186
|
+
(0, _reactNativeReanimated.runOnJS)(selectId)(hitId);
|
|
187
|
+
activeId.value = hitId;
|
|
188
|
+
if (hitId) {
|
|
189
|
+
const target = annotations.find(a => a.id === hitId);
|
|
190
|
+
mode.value = 'move';
|
|
191
|
+
live.origin.value = (0, _geometry.annotationCenter)(target);
|
|
192
|
+
live.active.value = true;
|
|
193
|
+
} else {
|
|
194
|
+
mode.value = 'none';
|
|
195
|
+
}
|
|
196
|
+
}).onChange(e => {
|
|
197
|
+
'worklet';
|
|
198
|
+
|
|
199
|
+
const screen = {
|
|
200
|
+
x: e.x,
|
|
201
|
+
y: e.y
|
|
202
|
+
};
|
|
203
|
+
const img = (0, _math.applyToPoint)(invMatrix, screen);
|
|
204
|
+
switch (mode.value) {
|
|
205
|
+
case 'draw':
|
|
206
|
+
if (tool === 'freehand') {
|
|
207
|
+
const pts = draw.points.value;
|
|
208
|
+
const last = pts[pts.length - 1];
|
|
209
|
+
if (!last || (0, _math.distance)(last, img) >= _constants.FREEHAND_MIN_DISTANCE) {
|
|
210
|
+
draw.points.value = [...pts, img];
|
|
211
|
+
}
|
|
212
|
+
} else {
|
|
213
|
+
draw.current.value = img;
|
|
214
|
+
}
|
|
215
|
+
break;
|
|
216
|
+
case 'move':
|
|
217
|
+
live.tx.value = img.x - startImg.value.x;
|
|
218
|
+
live.ty.value = img.y - startImg.value.y;
|
|
219
|
+
break;
|
|
220
|
+
case 'resize':
|
|
221
|
+
live.scale.value = startDist.value > 0 ? (0, _math.distance)(live.origin.value, img) / startDist.value : 1;
|
|
222
|
+
break;
|
|
223
|
+
case 'rotate':
|
|
224
|
+
{
|
|
225
|
+
const ang = Math.atan2(img.y - live.origin.value.y, img.x - live.origin.value.x);
|
|
226
|
+
live.rotate.value = ang - startAngle.value;
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
default:
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
}).onEnd(() => {
|
|
233
|
+
'worklet';
|
|
234
|
+
|
|
235
|
+
if (mode.value === 'draw') {
|
|
236
|
+
draw.active.value = false;
|
|
237
|
+
const s = draw.start.value;
|
|
238
|
+
const c = draw.current.value;
|
|
239
|
+
if (tool === 'circle') {
|
|
240
|
+
const r = (0, _math.distance)(s, c);
|
|
241
|
+
if (r > 2) (0, _reactNativeReanimated.runOnJS)(commitCircle)(s, r);
|
|
242
|
+
} else if (tool === 'arrow') {
|
|
243
|
+
if ((0, _math.distance)(s, c) > 2) (0, _reactNativeReanimated.runOnJS)(commitArrow)(s, c);
|
|
244
|
+
} else if (tool === 'marker') {
|
|
245
|
+
const rect = {
|
|
246
|
+
x: Math.min(s.x, c.x),
|
|
247
|
+
y: Math.min(s.y, c.y),
|
|
248
|
+
width: Math.abs(c.x - s.x),
|
|
249
|
+
height: Math.abs(c.y - s.y)
|
|
250
|
+
};
|
|
251
|
+
if (rect.width > 2 && rect.height > 2) (0, _reactNativeReanimated.runOnJS)(commitMarker)(rect);
|
|
252
|
+
} else if (tool === 'freehand') {
|
|
253
|
+
const pts = draw.points.value;
|
|
254
|
+
if (pts.length > 1) (0, _reactNativeReanimated.runOnJS)(commitFreehand)(pts);
|
|
255
|
+
draw.points.value = [];
|
|
256
|
+
}
|
|
257
|
+
mode.value = 'none';
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
if (mode.value === 'text') {
|
|
261
|
+
(0, _reactNativeReanimated.runOnJS)(placeText)(startImg.value);
|
|
262
|
+
mode.value = 'none';
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (mode.value === 'move' || mode.value === 'resize' || mode.value === 'rotate') {
|
|
266
|
+
const vals = {
|
|
267
|
+
tx: live.tx.value,
|
|
268
|
+
ty: live.ty.value,
|
|
269
|
+
rotate: live.rotate.value,
|
|
270
|
+
scale: live.scale.value,
|
|
271
|
+
origin: live.origin.value
|
|
272
|
+
};
|
|
273
|
+
(0, _reactNativeReanimated.runOnJS)(commitTransform)(activeId.value, vals);
|
|
274
|
+
(0, _reactNativeReanimated.runOnJS)(resetLive)();
|
|
275
|
+
mode.value = 'none';
|
|
276
|
+
}
|
|
277
|
+
}).onFinalize(() => {
|
|
278
|
+
'worklet';
|
|
279
|
+
|
|
280
|
+
// Safety: ensure draw preview is cleared if the gesture is cancelled.
|
|
281
|
+
if (draw.active.value && mode.value !== 'draw') {
|
|
282
|
+
draw.active.value = false;
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
286
|
+
}, [tool, selectedId, annotations, matrix, strokeColor, strokeWidth]);
|
|
287
|
+
return pan;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=useEditorGestures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNativeGestureHandler","_reactNativeReanimated","_EditorContext","_constants","_math","_geometry","_hitTest","_handles","_applyTransform","_createAnnotation","isDrawTool","tool","useEditorGestures","editor","useEditor","selectedId","annotations","matrix","draw","live","strokeColor","strokeWidth","dispatch","setSelectedId","setEditingTextId","invMatrix","useMemo","invert","scaleFactor","Math","hypot","a","b","slopImage","HIT_SLOP","mode","useSharedValue","startImg","x","y","startDist","startAngle","activeId","selectId","id","commitCircle","center","radius","type","annotation","makeCircle","commitArrow","start","end","makeArrow","commitMarker","rect","makeMarker","commitFreehand","points","makeFreehand","placeText","origin","makeText","textColor","commitTransform","vals","identity","tx","ty","rotate","scale","target","find","updated","applyTransformToAnnotation","changes","resetLive","active","value","pan","Gesture","Pan","maxPointers","onBegin","e","screen","img","applyToPoint","current","sel","undefined","h","selectionHandles","annotationCenter","distance","HANDLE_SIZE","atan2","i","corners","length","hitTest","hitId","runOnJS","onChange","pts","last","FREEHAND_MIN_DISTANCE","ang","onEnd","s","c","r","min","width","abs","height","onFinalize"],"sourceRoot":"..\\..\\..\\src","sources":["gestures/useEditorGestures.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.DisposeRegistry = void 0;
|
|
7
|
+
exports.safeDispose = safeDispose;
|
|
8
|
+
/**
|
|
9
|
+
* Tracks Skia native objects (SkImage / SkData / SkSurface / SkParagraph …) so
|
|
10
|
+
* they can be released deterministically. Skia objects are JSI HostObjects; the
|
|
11
|
+
* Hermes GC under-counts their native footprint and may never collect them, so
|
|
12
|
+
* we must call `.dispose()` explicitly. This registry is a safety net: register
|
|
13
|
+
* anything created imperatively, and `flush()` on unmount to guarantee cleanup.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
class DisposeRegistry {
|
|
17
|
+
items = new Set();
|
|
18
|
+
|
|
19
|
+
/** Track an object and return it for convenient chaining. */
|
|
20
|
+
add(item) {
|
|
21
|
+
this.items.add(item);
|
|
22
|
+
return item;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Stop tracking without disposing (e.g. ownership handed elsewhere). */
|
|
26
|
+
forget(item) {
|
|
27
|
+
this.items.delete(item);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Dispose a single tracked object now. */
|
|
31
|
+
release(item) {
|
|
32
|
+
if (!item) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
this.items.delete(item);
|
|
36
|
+
safeDispose(item);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Dispose everything still tracked. Call on unmount. */
|
|
40
|
+
flush() {
|
|
41
|
+
for (const item of this.items) {
|
|
42
|
+
safeDispose(item);
|
|
43
|
+
}
|
|
44
|
+
this.items.clear();
|
|
45
|
+
}
|
|
46
|
+
get size() {
|
|
47
|
+
return this.items.size;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Dispose without throwing if the object was already released. */
|
|
52
|
+
exports.DisposeRegistry = DisposeRegistry;
|
|
53
|
+
function safeDispose(item) {
|
|
54
|
+
if (!item) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
item.dispose();
|
|
59
|
+
} catch {
|
|
60
|
+
// Already disposed or not a real disposable — ignore.
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=disposeRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DisposeRegistry","items","Set","add","item","forget","delete","release","safeDispose","flush","clear","size","exports","dispose"],"sourceRoot":"..\\..\\..\\src","sources":["image/disposeRegistry.ts"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMO,MAAMA,eAAe,CAAC;EACnBC,KAAK,GAAG,IAAIC,GAAG,CAAa,CAAC;;EAErC;EACAC,GAAGA,CAAuBC,IAAO,EAAK;IACpC,IAAI,CAACH,KAAK,CAACE,GAAG,CAACC,IAAI,CAAC;IACpB,OAAOA,IAAI;EACb;;EAEA;EACAC,MAAMA,CAACD,IAAgB,EAAQ;IAC7B,IAAI,CAACH,KAAK,CAACK,MAAM,CAACF,IAAI,CAAC;EACzB;;EAEA;EACAG,OAAOA,CAACH,IAAmC,EAAQ;IACjD,IAAI,CAACA,IAAI,EAAE;MACT;IACF;IACA,IAAI,CAACH,KAAK,CAACK,MAAM,CAACF,IAAI,CAAC;IACvBI,WAAW,CAACJ,IAAI,CAAC;EACnB;;EAEA;EACAK,KAAKA,CAAA,EAAS;IACZ,KAAK,MAAML,IAAI,IAAI,IAAI,CAACH,KAAK,EAAE;MAC7BO,WAAW,CAACJ,IAAI,CAAC;IACnB;IACA,IAAI,CAACH,KAAK,CAACS,KAAK,CAAC,CAAC;EACpB;EAEA,IAAIC,IAAIA,CAAA,EAAW;IACjB,OAAO,IAAI,CAACV,KAAK,CAACU,IAAI;EACxB;AACF;;AAEA;AAAAC,OAAA,CAAAZ,eAAA,GAAAA,eAAA;AACO,SAASQ,WAAWA,CAACJ,IAAmC,EAAQ;EACrE,IAAI,CAACA,IAAI,EAAE;IACT;EACF;EACA,IAAI;IACFA,IAAI,CAACS,OAAO,CAAC,CAAC;EAChB,CAAC,CAAC,MAAM;IACN;EAAA;AAEJ","ignoreList":[]}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useLoadedImage = useLoadedImage;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _reactNativeSkia = require("@shopify/react-native-skia");
|
|
9
|
+
var _disposeRegistry = require("./disposeRegistry");
|
|
10
|
+
function stripDataUri(base64) {
|
|
11
|
+
const comma = base64.indexOf(',');
|
|
12
|
+
if (base64.startsWith('data:') && comma !== -1) {
|
|
13
|
+
return base64.slice(comma + 1);
|
|
14
|
+
}
|
|
15
|
+
return base64;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Decode an {@link ImageSource} into an `SkImage`, managing native memory.
|
|
20
|
+
*
|
|
21
|
+
* Memory rules enforced here:
|
|
22
|
+
* - The encoded `SkData` is disposed immediately after `MakeImageFromEncoded`;
|
|
23
|
+
* the decoded `SkImage` owns its pixels, so retaining the encoded bytes would
|
|
24
|
+
* roughly double memory usage.
|
|
25
|
+
* - When `source` changes (or the component unmounts) the previous `SkImage` is
|
|
26
|
+
* disposed before the next one is created.
|
|
27
|
+
* - The input base64 string is consumed inside the effect and never copied into
|
|
28
|
+
* state, so a large payload is not retained by this hook.
|
|
29
|
+
*/
|
|
30
|
+
function useLoadedImage(source) {
|
|
31
|
+
const [state, setState] = (0, _react.useState)({
|
|
32
|
+
image: null,
|
|
33
|
+
width: 0,
|
|
34
|
+
height: 0,
|
|
35
|
+
loading: true,
|
|
36
|
+
error: null
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Serialize the source so the effect re-runs only on a real change, without
|
|
40
|
+
// holding the (possibly huge) base64 string in a memoized ref.
|
|
41
|
+
const sourceKey = 'base64' in source ? `b64:${source.base64.length}:${source.base64.slice(-64)}` : `uri:${source.uri}`;
|
|
42
|
+
const currentImage = (0, _react.useRef)(null);
|
|
43
|
+
(0, _react.useEffect)(() => {
|
|
44
|
+
let cancelled = false;
|
|
45
|
+
const commit = image => {
|
|
46
|
+
if (cancelled) {
|
|
47
|
+
// A newer load superseded us — drop this result.
|
|
48
|
+
(0, _disposeRegistry.safeDispose)(image);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Dispose the previous image before swapping in the new one.
|
|
52
|
+
if (currentImage.current && currentImage.current !== image) {
|
|
53
|
+
(0, _disposeRegistry.safeDispose)(currentImage.current);
|
|
54
|
+
}
|
|
55
|
+
currentImage.current = image;
|
|
56
|
+
setState({
|
|
57
|
+
image,
|
|
58
|
+
width: image.width(),
|
|
59
|
+
height: image.height(),
|
|
60
|
+
loading: false,
|
|
61
|
+
error: null
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
const fail = error => {
|
|
65
|
+
if (cancelled) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
setState(prev => ({
|
|
69
|
+
...prev,
|
|
70
|
+
loading: false,
|
|
71
|
+
error
|
|
72
|
+
}));
|
|
73
|
+
};
|
|
74
|
+
setState(prev => ({
|
|
75
|
+
...prev,
|
|
76
|
+
loading: true,
|
|
77
|
+
error: null
|
|
78
|
+
}));
|
|
79
|
+
try {
|
|
80
|
+
if ('base64' in source) {
|
|
81
|
+
const data = _reactNativeSkia.Skia.Data.fromBase64(stripDataUri(source.base64));
|
|
82
|
+
const image = _reactNativeSkia.Skia.Image.MakeImageFromEncoded(data);
|
|
83
|
+
(0, _disposeRegistry.safeDispose)(data); // decoded pixels are owned by `image` now
|
|
84
|
+
if (!image) {
|
|
85
|
+
throw new Error('Failed to decode image from base64.');
|
|
86
|
+
}
|
|
87
|
+
commit(image);
|
|
88
|
+
} else {
|
|
89
|
+
// fromURI is async (may fetch a remote/local file).
|
|
90
|
+
_reactNativeSkia.Skia.Data.fromURI(source.uri).then(data => {
|
|
91
|
+
if (cancelled) {
|
|
92
|
+
(0, _disposeRegistry.safeDispose)(data);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const image = _reactNativeSkia.Skia.Image.MakeImageFromEncoded(data);
|
|
96
|
+
(0, _disposeRegistry.safeDispose)(data);
|
|
97
|
+
if (!image) {
|
|
98
|
+
throw new Error(`Failed to decode image from URI: ${source.uri}`);
|
|
99
|
+
}
|
|
100
|
+
commit(image);
|
|
101
|
+
}).catch(e => fail(e instanceof Error ? e : new Error(String(e))));
|
|
102
|
+
}
|
|
103
|
+
} catch (e) {
|
|
104
|
+
fail(e instanceof Error ? e : new Error(String(e)));
|
|
105
|
+
}
|
|
106
|
+
return () => {
|
|
107
|
+
cancelled = true;
|
|
108
|
+
};
|
|
109
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
110
|
+
}, [sourceKey]);
|
|
111
|
+
|
|
112
|
+
// Final safety net: dispose the last image when the hook unmounts.
|
|
113
|
+
(0, _react.useEffect)(() => {
|
|
114
|
+
return () => {
|
|
115
|
+
(0, _disposeRegistry.safeDispose)(currentImage.current);
|
|
116
|
+
currentImage.current = null;
|
|
117
|
+
};
|
|
118
|
+
}, []);
|
|
119
|
+
return state;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=useLoadedImage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNativeSkia","_disposeRegistry","stripDataUri","base64","comma","indexOf","startsWith","slice","useLoadedImage","source","state","setState","useState","image","width","height","loading","error","sourceKey","length","uri","currentImage","useRef","useEffect","cancelled","commit","safeDispose","current","fail","prev","data","Skia","Data","fromBase64","Image","MakeImageFromEncoded","Error","fromURI","then","catch","e","String"],"sourceRoot":"..\\..\\..\\src","sources":["image/useLoadedImage.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "DEFAULT_PALETTE", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _constants.DEFAULT_PALETTE;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "DEFAULT_STROKE_COLOR", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _constants.DEFAULT_STROKE_COLOR;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "DEFAULT_TEXT_COLOR", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _constants.DEFAULT_TEXT_COLOR;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "EditorProvider", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () {
|
|
27
|
+
return _EditorContext.EditorProvider;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(exports, "ImageEditor", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () {
|
|
33
|
+
return _ImageEditor.ImageEditor;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
Object.defineProperty(exports, "exportImage", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
get: function () {
|
|
39
|
+
return _exportImage.exportImage;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(exports, "useEditor", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function () {
|
|
45
|
+
return _EditorContext.useEditor;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
var _ImageEditor = require("./ImageEditor");
|
|
49
|
+
var _EditorContext = require("./context/EditorContext");
|
|
50
|
+
var _exportImage = require("./export/exportImage");
|
|
51
|
+
var _constants = require("./constants");
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_ImageEditor","require","_EditorContext","_exportImage","_constants"],"sourceRoot":"..\\..\\src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAwBA,IAAAC,cAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;AAEA,IAAAG,UAAA,GAAAH,OAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.canRedo = canRedo;
|
|
7
|
+
exports.canUndo = canUndo;
|
|
8
|
+
exports.commit = commit;
|
|
9
|
+
exports.initHistory = initHistory;
|
|
10
|
+
exports.redo = redo;
|
|
11
|
+
exports.replacePresent = replacePresent;
|
|
12
|
+
exports.undo = undo;
|
|
13
|
+
var _constants = require("../constants");
|
|
14
|
+
/**
|
|
15
|
+
* Generic, pure undo/redo history over an immutable document `T`.
|
|
16
|
+
* Snapshots are cheap here because the document is plain JSON (annotations +
|
|
17
|
+
* scene transform) — it never contains image bytes.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
function initHistory(present) {
|
|
21
|
+
return {
|
|
22
|
+
past: [],
|
|
23
|
+
present,
|
|
24
|
+
future: []
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Replace the present, pushing the old present onto the undo stack. */
|
|
29
|
+
function commit(history, next) {
|
|
30
|
+
if (next === history.present) {
|
|
31
|
+
return history;
|
|
32
|
+
}
|
|
33
|
+
const past = [...history.past, history.present];
|
|
34
|
+
// Cap the depth to bound memory.
|
|
35
|
+
if (past.length > _constants.MAX_HISTORY) {
|
|
36
|
+
past.shift();
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
past,
|
|
40
|
+
present: next,
|
|
41
|
+
future: []
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Replace the present WITHOUT creating a history entry — used for live edits
|
|
47
|
+
* (e.g. typing in a text box) that should collapse into the eventual commit.
|
|
48
|
+
*/
|
|
49
|
+
function replacePresent(history, next) {
|
|
50
|
+
return {
|
|
51
|
+
...history,
|
|
52
|
+
present: next
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function undo(history) {
|
|
56
|
+
if (history.past.length === 0) {
|
|
57
|
+
return history;
|
|
58
|
+
}
|
|
59
|
+
const previous = history.past[history.past.length - 1];
|
|
60
|
+
const past = history.past.slice(0, -1);
|
|
61
|
+
return {
|
|
62
|
+
past,
|
|
63
|
+
present: previous,
|
|
64
|
+
future: [history.present, ...history.future]
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function redo(history) {
|
|
68
|
+
if (history.future.length === 0) {
|
|
69
|
+
return history;
|
|
70
|
+
}
|
|
71
|
+
const next = history.future[0];
|
|
72
|
+
const future = history.future.slice(1);
|
|
73
|
+
return {
|
|
74
|
+
past: [...history.past, history.present],
|
|
75
|
+
present: next,
|
|
76
|
+
future
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function canUndo(history) {
|
|
80
|
+
return history.past.length > 0;
|
|
81
|
+
}
|
|
82
|
+
function canRedo(history) {
|
|
83
|
+
return history.future.length > 0;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_constants","require","initHistory","present","past","future","commit","history","next","length","MAX_HISTORY","shift","replacePresent","undo","previous","slice","redo","canUndo","canRedo"],"sourceRoot":"..\\..\\..\\src","sources":["state/history.ts"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;;AAOO,SAASC,WAAWA,CAAIC,OAAU,EAAc;EACrD,OAAO;IAAEC,IAAI,EAAE,EAAE;IAAED,OAAO;IAAEE,MAAM,EAAE;EAAG,CAAC;AAC1C;;AAEA;AACO,SAASC,MAAMA,CAAIC,OAAmB,EAAEC,IAAO,EAAc;EAClE,IAAIA,IAAI,KAAKD,OAAO,CAACJ,OAAO,EAAE;IAC5B,OAAOI,OAAO;EAChB;EACA,MAAMH,IAAI,GAAG,CAAC,GAAGG,OAAO,CAACH,IAAI,EAAEG,OAAO,CAACJ,OAAO,CAAC;EAC/C;EACA,IAAIC,IAAI,CAACK,MAAM,GAAGC,sBAAW,EAAE;IAC7BN,IAAI,CAACO,KAAK,CAAC,CAAC;EACd;EACA,OAAO;IAAEP,IAAI;IAAED,OAAO,EAAEK,IAAI;IAAEH,MAAM,EAAE;EAAG,CAAC;AAC5C;;AAEA;AACA;AACA;AACA;AACO,SAASO,cAAcA,CAAIL,OAAmB,EAAEC,IAAO,EAAc;EAC1E,OAAO;IAAE,GAAGD,OAAO;IAAEJ,OAAO,EAAEK;EAAK,CAAC;AACtC;AAEO,SAASK,IAAIA,CAAIN,OAAmB,EAAc;EACvD,IAAIA,OAAO,CAACH,IAAI,CAACK,MAAM,KAAK,CAAC,EAAE;IAC7B,OAAOF,OAAO;EAChB;EACA,MAAMO,QAAQ,GAAGP,OAAO,CAACH,IAAI,CAACG,OAAO,CAACH,IAAI,CAACK,MAAM,GAAG,CAAC,CAAE;EACvD,MAAML,IAAI,GAAGG,OAAO,CAACH,IAAI,CAACW,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EACtC,OAAO;IACLX,IAAI;IACJD,OAAO,EAAEW,QAAQ;IACjBT,MAAM,EAAE,CAACE,OAAO,CAACJ,OAAO,EAAE,GAAGI,OAAO,CAACF,MAAM;EAC7C,CAAC;AACH;AAEO,SAASW,IAAIA,CAAIT,OAAmB,EAAc;EACvD,IAAIA,OAAO,CAACF,MAAM,CAACI,MAAM,KAAK,CAAC,EAAE;IAC/B,OAAOF,OAAO;EAChB;EACA,MAAMC,IAAI,GAAGD,OAAO,CAACF,MAAM,CAAC,CAAC,CAAE;EAC/B,MAAMA,MAAM,GAAGE,OAAO,CAACF,MAAM,CAACU,KAAK,CAAC,CAAC,CAAC;EACtC,OAAO;IACLX,IAAI,EAAE,CAAC,GAAGG,OAAO,CAACH,IAAI,EAAEG,OAAO,CAACJ,OAAO,CAAC;IACxCA,OAAO,EAAEK,IAAI;IACbH;EACF,CAAC;AACH;AAEO,SAASY,OAAOA,CAAIV,OAAmB,EAAW;EACvD,OAAOA,OAAO,CAACH,IAAI,CAACK,MAAM,GAAG,CAAC;AAChC;AAEO,SAASS,OAAOA,CAAIX,OAAmB,EAAW;EACvD,OAAOA,OAAO,CAACF,MAAM,CAACI,MAAM,GAAG,CAAC;AAClC","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getAnnotationById = getAnnotationById;
|
|
7
|
+
exports.sortedByZ = sortedByZ;
|
|
8
|
+
function getAnnotationById(annotations, id) {
|
|
9
|
+
if (!id) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
return annotations.find(a => a.id === id);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Annotations in paint order (ascending z). */
|
|
16
|
+
function sortedByZ(annotations) {
|
|
17
|
+
return [...annotations].sort((a, b) => a.z - b.z);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=selectors.js.map
|