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,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Circle, Group, Line, Path, Rect, Skia } from '@shopify/react-native-skia';
|
|
4
|
+
import { useDerivedValue } from 'react-native-reanimated';
|
|
5
|
+
import { ARROW_HEAD_RATIO, MARKER_OPACITY } from '../constants';
|
|
6
|
+
import { withOpacity } from '../utils/color';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Renders the shape currently being drawn, bound to the `draw` shared values so
|
|
10
|
+
* it updates on the UI thread. The active tool is fixed for the duration of a
|
|
11
|
+
* draw, so switching on it here is safe. Opacity is 0 when not drawing.
|
|
12
|
+
*
|
|
13
|
+
* Receives `editor` as a prop (context does not cross the Skia Canvas boundary).
|
|
14
|
+
*/
|
|
15
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
16
|
+
export function InFlightLayer({
|
|
17
|
+
editor
|
|
18
|
+
}) {
|
|
19
|
+
const {
|
|
20
|
+
tool,
|
|
21
|
+
draw,
|
|
22
|
+
strokeColor,
|
|
23
|
+
strokeWidth
|
|
24
|
+
} = editor;
|
|
25
|
+
const opacity = useDerivedValue(() => draw.active.value ? 1 : 0);
|
|
26
|
+
return /*#__PURE__*/_jsxs(Group, {
|
|
27
|
+
opacity: opacity,
|
|
28
|
+
children: [tool === 'circle' && /*#__PURE__*/_jsx(CirclePreview, {
|
|
29
|
+
draw: draw,
|
|
30
|
+
color: strokeColor,
|
|
31
|
+
width: strokeWidth
|
|
32
|
+
}), tool === 'arrow' && /*#__PURE__*/_jsx(ArrowPreview, {
|
|
33
|
+
draw: draw,
|
|
34
|
+
color: strokeColor,
|
|
35
|
+
width: strokeWidth
|
|
36
|
+
}), tool === 'marker' && /*#__PURE__*/_jsx(MarkerPreview, {
|
|
37
|
+
draw: draw,
|
|
38
|
+
color: strokeColor
|
|
39
|
+
}), tool === 'freehand' && /*#__PURE__*/_jsx(FreehandPreview, {
|
|
40
|
+
draw: draw,
|
|
41
|
+
color: strokeColor,
|
|
42
|
+
width: strokeWidth
|
|
43
|
+
})]
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function CirclePreview({
|
|
47
|
+
draw,
|
|
48
|
+
color,
|
|
49
|
+
width
|
|
50
|
+
}) {
|
|
51
|
+
const cx = useDerivedValue(() => draw.start.value.x);
|
|
52
|
+
const cy = useDerivedValue(() => draw.start.value.y);
|
|
53
|
+
const r = useDerivedValue(() => Math.hypot(draw.current.value.x - draw.start.value.x, draw.current.value.y - draw.start.value.y));
|
|
54
|
+
return /*#__PURE__*/_jsx(Circle, {
|
|
55
|
+
cx: cx,
|
|
56
|
+
cy: cy,
|
|
57
|
+
r: r,
|
|
58
|
+
color: color,
|
|
59
|
+
style: "stroke",
|
|
60
|
+
strokeWidth: width
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function ArrowPreview({
|
|
64
|
+
draw,
|
|
65
|
+
color,
|
|
66
|
+
width
|
|
67
|
+
}) {
|
|
68
|
+
const headSize = width * ARROW_HEAD_RATIO;
|
|
69
|
+
const p1 = useDerivedValue(() => draw.start.value);
|
|
70
|
+
const p2 = useDerivedValue(() => draw.current.value);
|
|
71
|
+
const barb1 = useDerivedValue(() => {
|
|
72
|
+
const s = draw.start.value;
|
|
73
|
+
const e = draw.current.value;
|
|
74
|
+
const angle = Math.atan2(e.y - s.y, e.x - s.x);
|
|
75
|
+
const barb = Math.PI * 5 / 6;
|
|
76
|
+
return {
|
|
77
|
+
x: e.x + headSize * Math.cos(angle + barb),
|
|
78
|
+
y: e.y + headSize * Math.sin(angle + barb)
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
const barb2 = useDerivedValue(() => {
|
|
82
|
+
const s = draw.start.value;
|
|
83
|
+
const e = draw.current.value;
|
|
84
|
+
const angle = Math.atan2(e.y - s.y, e.x - s.x);
|
|
85
|
+
const barb = Math.PI * 5 / 6;
|
|
86
|
+
return {
|
|
87
|
+
x: e.x + headSize * Math.cos(angle - barb),
|
|
88
|
+
y: e.y + headSize * Math.sin(angle - barb)
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
return /*#__PURE__*/_jsxs(Group, {
|
|
92
|
+
color: color,
|
|
93
|
+
style: "stroke",
|
|
94
|
+
strokeWidth: width,
|
|
95
|
+
strokeCap: "round",
|
|
96
|
+
children: [/*#__PURE__*/_jsx(Line, {
|
|
97
|
+
p1: p1,
|
|
98
|
+
p2: p2
|
|
99
|
+
}), /*#__PURE__*/_jsx(Line, {
|
|
100
|
+
p1: p2,
|
|
101
|
+
p2: barb1
|
|
102
|
+
}), /*#__PURE__*/_jsx(Line, {
|
|
103
|
+
p1: p2,
|
|
104
|
+
p2: barb2
|
|
105
|
+
})]
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function MarkerPreview({
|
|
109
|
+
draw,
|
|
110
|
+
color
|
|
111
|
+
}) {
|
|
112
|
+
const x = useDerivedValue(() => Math.min(draw.start.value.x, draw.current.value.x));
|
|
113
|
+
const y = useDerivedValue(() => Math.min(draw.start.value.y, draw.current.value.y));
|
|
114
|
+
const w = useDerivedValue(() => Math.abs(draw.current.value.x - draw.start.value.x));
|
|
115
|
+
const h = useDerivedValue(() => Math.abs(draw.current.value.y - draw.start.value.y));
|
|
116
|
+
return /*#__PURE__*/_jsx(Rect, {
|
|
117
|
+
x: x,
|
|
118
|
+
y: y,
|
|
119
|
+
width: w,
|
|
120
|
+
height: h,
|
|
121
|
+
color: withOpacity(color, MARKER_OPACITY)
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function FreehandPreview({
|
|
125
|
+
draw,
|
|
126
|
+
color,
|
|
127
|
+
width
|
|
128
|
+
}) {
|
|
129
|
+
const path = useDerivedValue(() => {
|
|
130
|
+
const pts = draw.points.value;
|
|
131
|
+
const p = Skia.Path.Make();
|
|
132
|
+
if (pts.length > 0) {
|
|
133
|
+
p.moveTo(pts[0].x, pts[0].y);
|
|
134
|
+
for (let i = 1; i < pts.length; i++) {
|
|
135
|
+
p.lineTo(pts[i].x, pts[i].y);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return p;
|
|
139
|
+
});
|
|
140
|
+
return /*#__PURE__*/_jsx(Path, {
|
|
141
|
+
path: path,
|
|
142
|
+
color: color,
|
|
143
|
+
style: "stroke",
|
|
144
|
+
strokeWidth: width,
|
|
145
|
+
strokeCap: "round",
|
|
146
|
+
strokeJoin: "round"
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=InFlightLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Circle","Group","Line","Path","Rect","Skia","useDerivedValue","ARROW_HEAD_RATIO","MARKER_OPACITY","withOpacity","jsx","_jsx","jsxs","_jsxs","InFlightLayer","editor","tool","draw","strokeColor","strokeWidth","opacity","active","value","children","CirclePreview","color","width","ArrowPreview","MarkerPreview","FreehandPreview","cx","start","x","cy","y","r","Math","hypot","current","style","headSize","p1","p2","barb1","s","e","angle","atan2","barb","PI","cos","sin","barb2","strokeCap","min","w","abs","h","height","path","pts","points","p","Make","length","moveTo","i","lineTo","strokeJoin"],"sourceRoot":"..\\..\\..\\src","sources":["canvas/InFlightLayer.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
|
+
import { Circle, Group, Line, Path, Rect, Skia } from '@shopify/react-native-skia';
|
|
5
|
+
import { useDerivedValue } from 'react-native-reanimated';
|
|
6
|
+
import { getAnnotationById } from '../state/selectors';
|
|
7
|
+
import { selectionHandles } from '../gestures/handles';
|
|
8
|
+
import { HANDLE_SIZE } from '../constants';
|
|
9
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
|
+
const SELECTION_COLOR = '#1E90FF';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Draws the selection bounding box + resize corners + rotate handle in SCREEN
|
|
14
|
+
* space (outside the scene transform, so handle size is zoom-independent). The
|
|
15
|
+
* overlay hides itself during an active live transform to avoid a stale double.
|
|
16
|
+
*/
|
|
17
|
+
export function SelectionOverlay({
|
|
18
|
+
editor
|
|
19
|
+
}) {
|
|
20
|
+
const {
|
|
21
|
+
annotations,
|
|
22
|
+
selectedId,
|
|
23
|
+
matrix,
|
|
24
|
+
live
|
|
25
|
+
} = editor;
|
|
26
|
+
const selected = getAnnotationById(annotations, selectedId);
|
|
27
|
+
const opacity = useDerivedValue(() => live.active.value ? 0 : 1);
|
|
28
|
+
const handles = useMemo(() => selected ? selectionHandles(selected, matrix) : null, [selected, matrix]);
|
|
29
|
+
const boxPath = useMemo(() => {
|
|
30
|
+
if (!handles) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const p = Skia.Path.Make();
|
|
34
|
+
const c = handles.corners;
|
|
35
|
+
p.moveTo(c[0].x, c[0].y);
|
|
36
|
+
p.lineTo(c[1].x, c[1].y);
|
|
37
|
+
p.lineTo(c[2].x, c[2].y);
|
|
38
|
+
p.lineTo(c[3].x, c[3].y);
|
|
39
|
+
p.close();
|
|
40
|
+
return p;
|
|
41
|
+
}, [handles]);
|
|
42
|
+
if (!selected || !handles || !boxPath) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const topMid = {
|
|
46
|
+
x: (handles.corners[0].x + handles.corners[1].x) / 2,
|
|
47
|
+
y: (handles.corners[0].y + handles.corners[1].y) / 2
|
|
48
|
+
};
|
|
49
|
+
return /*#__PURE__*/_jsxs(Group, {
|
|
50
|
+
opacity: opacity,
|
|
51
|
+
children: [/*#__PURE__*/_jsx(Path, {
|
|
52
|
+
path: boxPath,
|
|
53
|
+
color: SELECTION_COLOR,
|
|
54
|
+
style: "stroke",
|
|
55
|
+
strokeWidth: 2
|
|
56
|
+
}), /*#__PURE__*/_jsx(Line, {
|
|
57
|
+
p1: topMid,
|
|
58
|
+
p2: handles.rotate,
|
|
59
|
+
color: SELECTION_COLOR,
|
|
60
|
+
strokeWidth: 2
|
|
61
|
+
}), /*#__PURE__*/_jsx(Circle, {
|
|
62
|
+
cx: handles.rotate.x,
|
|
63
|
+
cy: handles.rotate.y,
|
|
64
|
+
r: HANDLE_SIZE / 2,
|
|
65
|
+
color: SELECTION_COLOR
|
|
66
|
+
}), handles.corners.map((corner, i) => /*#__PURE__*/_jsxs(React.Fragment, {
|
|
67
|
+
children: [/*#__PURE__*/_jsx(Rect, {
|
|
68
|
+
x: corner.x - HANDLE_SIZE / 2,
|
|
69
|
+
y: corner.y - HANDLE_SIZE / 2,
|
|
70
|
+
width: HANDLE_SIZE,
|
|
71
|
+
height: HANDLE_SIZE,
|
|
72
|
+
color: "#FFFFFF"
|
|
73
|
+
}), /*#__PURE__*/_jsx(Rect, {
|
|
74
|
+
x: corner.x - HANDLE_SIZE / 2,
|
|
75
|
+
y: corner.y - HANDLE_SIZE / 2,
|
|
76
|
+
width: HANDLE_SIZE,
|
|
77
|
+
height: HANDLE_SIZE,
|
|
78
|
+
color: SELECTION_COLOR,
|
|
79
|
+
style: "stroke",
|
|
80
|
+
strokeWidth: 2
|
|
81
|
+
})]
|
|
82
|
+
}, i))]
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=SelectionOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useMemo","Circle","Group","Line","Path","Rect","Skia","useDerivedValue","getAnnotationById","selectionHandles","HANDLE_SIZE","jsx","_jsx","jsxs","_jsxs","SELECTION_COLOR","SelectionOverlay","editor","annotations","selectedId","matrix","live","selected","opacity","active","value","handles","boxPath","p","Make","c","corners","moveTo","x","y","lineTo","close","topMid","children","path","color","style","strokeWidth","p1","p2","rotate","cx","cy","r","map","corner","i","Fragment","width","height"],"sourceRoot":"..\\..\\..\\src","sources":["canvas/SelectionOverlay.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/** Default stroke width (in image pixels) for new shapes. */
|
|
4
|
+
export const DEFAULT_STROKE_WIDTH = 8;
|
|
5
|
+
|
|
6
|
+
/** Default font size (in image pixels) for new text annotations. */
|
|
7
|
+
export const DEFAULT_FONT_SIZE = 48;
|
|
8
|
+
|
|
9
|
+
/** Default wrap width (in image pixels) for new text boxes. */
|
|
10
|
+
export const DEFAULT_TEXT_WIDTH = 400;
|
|
11
|
+
|
|
12
|
+
/** Semi-transparent opacity for the marker/highlighter tool. */
|
|
13
|
+
export const MARKER_OPACITY = 0.4;
|
|
14
|
+
|
|
15
|
+
/** Arrowhead barb length as a multiple of stroke width. */
|
|
16
|
+
export const ARROW_HEAD_RATIO = 4;
|
|
17
|
+
|
|
18
|
+
/** Touch slop (in screen points) added to hit-test radii for easier selection. */
|
|
19
|
+
export const HIT_SLOP = 12;
|
|
20
|
+
|
|
21
|
+
/** On-screen size (points) of selection handles. */
|
|
22
|
+
export const HANDLE_SIZE = 14;
|
|
23
|
+
|
|
24
|
+
/** Distance (points) the rotate handle sits above the selection's top edge. */
|
|
25
|
+
export const ROTATE_HANDLE_OFFSET = 36;
|
|
26
|
+
|
|
27
|
+
/** Max entries retained in the undo/redo history. */
|
|
28
|
+
export const MAX_HISTORY = 50;
|
|
29
|
+
|
|
30
|
+
/** Minimum spacing (image px) between sampled freehand points. */
|
|
31
|
+
export const FREEHAND_MIN_DISTANCE = 3;
|
|
32
|
+
export const DEFAULT_STROKE_COLOR = '#FF3B30';
|
|
33
|
+
export const DEFAULT_TEXT_COLOR = '#FFFFFF';
|
|
34
|
+
export const DEFAULT_PALETTE = ['#FF3B30',
|
|
35
|
+
// red
|
|
36
|
+
'#FF9500',
|
|
37
|
+
// orange
|
|
38
|
+
'#FFCC00',
|
|
39
|
+
// yellow
|
|
40
|
+
'#34C759',
|
|
41
|
+
// green
|
|
42
|
+
'#007AFF',
|
|
43
|
+
// blue
|
|
44
|
+
'#5856D6',
|
|
45
|
+
// indigo
|
|
46
|
+
'#AF52DE',
|
|
47
|
+
// purple
|
|
48
|
+
'#FFFFFF',
|
|
49
|
+
// white
|
|
50
|
+
'#000000' // black
|
|
51
|
+
];
|
|
52
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DEFAULT_STROKE_WIDTH","DEFAULT_FONT_SIZE","DEFAULT_TEXT_WIDTH","MARKER_OPACITY","ARROW_HEAD_RATIO","HIT_SLOP","HANDLE_SIZE","ROTATE_HANDLE_OFFSET","MAX_HISTORY","FREEHAND_MIN_DISTANCE","DEFAULT_STROKE_COLOR","DEFAULT_TEXT_COLOR","DEFAULT_PALETTE"],"sourceRoot":"..\\..\\src","sources":["constants.ts"],"mappings":";;AAEA;AACA,OAAO,MAAMA,oBAAoB,GAAG,CAAC;;AAErC;AACA,OAAO,MAAMC,iBAAiB,GAAG,EAAE;;AAEnC;AACA,OAAO,MAAMC,kBAAkB,GAAG,GAAG;;AAErC;AACA,OAAO,MAAMC,cAAc,GAAG,GAAG;;AAEjC;AACA,OAAO,MAAMC,gBAAgB,GAAG,CAAC;;AAEjC;AACA,OAAO,MAAMC,QAAQ,GAAG,EAAE;;AAE1B;AACA,OAAO,MAAMC,WAAW,GAAG,EAAE;;AAE7B;AACA,OAAO,MAAMC,oBAAoB,GAAG,EAAE;;AAEtC;AACA,OAAO,MAAMC,WAAW,GAAG,EAAE;;AAE7B;AACA,OAAO,MAAMC,qBAAqB,GAAG,CAAC;AAEtC,OAAO,MAAMC,oBAAiC,GAAG,SAAS;AAC1D,OAAO,MAAMC,kBAA+B,GAAG,SAAS;AAExD,OAAO,MAAMC,eAA8B,GAAG,CAC5C,SAAS;AAAE;AACX,SAAS;AAAE;AACX,SAAS;AAAE;AACX,SAAS;AAAE;AACX,SAAS;AAAE;AACX,SAAS;AAAE;AACX,SAAS;AAAE;AACX,SAAS;AAAE;AACX,SAAS,CAAE;AAAA,CACZ","ignoreList":[]}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';
|
|
4
|
+
import { useSharedValue } from 'react-native-reanimated';
|
|
5
|
+
import { DEFAULT_PALETTE, DEFAULT_STROKE_COLOR, DEFAULT_STROKE_WIDTH, DEFAULT_TEXT_COLOR } from '../constants';
|
|
6
|
+
import { useEditorReducer } from '../state/useEditorReducer';
|
|
7
|
+
import { canRedo, canUndo } from '../state/history';
|
|
8
|
+
import { identity, imageToScreenMatrix } from '../utils/math';
|
|
9
|
+
|
|
10
|
+
/** Live geometry of a shape currently being drawn (UI-thread shared values). */
|
|
11
|
+
|
|
12
|
+
/** Live transform applied to the selected annotation during move/resize/rotate. */
|
|
13
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
14
|
+
const EditorContext = /*#__PURE__*/createContext(null);
|
|
15
|
+
export function useEditor() {
|
|
16
|
+
const ctx = useContext(EditorContext);
|
|
17
|
+
if (!ctx) {
|
|
18
|
+
throw new Error('useEditor must be used within <EditorProvider>');
|
|
19
|
+
}
|
|
20
|
+
return ctx;
|
|
21
|
+
}
|
|
22
|
+
export function EditorProvider({
|
|
23
|
+
imageSize,
|
|
24
|
+
initialStrokeColor = DEFAULT_STROKE_COLOR,
|
|
25
|
+
initialTextColor = DEFAULT_TEXT_COLOR,
|
|
26
|
+
palette = DEFAULT_PALETTE,
|
|
27
|
+
children
|
|
28
|
+
}) {
|
|
29
|
+
const [state, dispatch] = useEditorReducer();
|
|
30
|
+
const [tool, setTool] = useState('select');
|
|
31
|
+
const [selectedId, setSelectedId] = useState(null);
|
|
32
|
+
const [strokeColor, setStrokeColor] = useState(initialStrokeColor);
|
|
33
|
+
const [textColor, setTextColor] = useState(initialTextColor);
|
|
34
|
+
const [strokeWidth, setStrokeWidth] = useState(DEFAULT_STROKE_WIDTH);
|
|
35
|
+
const [editingTextId, setEditingTextId] = useState(null);
|
|
36
|
+
const [layout, setLayout] = useState({
|
|
37
|
+
width: 1,
|
|
38
|
+
height: 1
|
|
39
|
+
});
|
|
40
|
+
const doc = state.present;
|
|
41
|
+
|
|
42
|
+
// Draw shared values.
|
|
43
|
+
const drawActive = useSharedValue(false);
|
|
44
|
+
const drawStart = useSharedValue({
|
|
45
|
+
x: 0,
|
|
46
|
+
y: 0
|
|
47
|
+
});
|
|
48
|
+
const drawCurrent = useSharedValue({
|
|
49
|
+
x: 0,
|
|
50
|
+
y: 0
|
|
51
|
+
});
|
|
52
|
+
const drawPoints = useSharedValue([]);
|
|
53
|
+
|
|
54
|
+
// Live transform shared values.
|
|
55
|
+
const liveActive = useSharedValue(false);
|
|
56
|
+
const liveTx = useSharedValue(0);
|
|
57
|
+
const liveTy = useSharedValue(0);
|
|
58
|
+
const liveRotate = useSharedValue(0);
|
|
59
|
+
const liveScale = useSharedValue(1);
|
|
60
|
+
const liveOrigin = useSharedValue({
|
|
61
|
+
x: 0,
|
|
62
|
+
y: 0
|
|
63
|
+
});
|
|
64
|
+
const matrixSV = useSharedValue(identity());
|
|
65
|
+
const cropRectSV = useSharedValue({
|
|
66
|
+
x: 0,
|
|
67
|
+
y: 0,
|
|
68
|
+
width: imageSize.width,
|
|
69
|
+
height: imageSize.height
|
|
70
|
+
});
|
|
71
|
+
const matrix = useMemo(() => imageToScreenMatrix(doc.scene, imageSize, layout), [doc.scene, imageSize, layout]);
|
|
72
|
+
|
|
73
|
+
// Mirror the JS-thread matrix into the shared value for worklet reads.
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
matrixSV.value = matrix;
|
|
76
|
+
}, [matrix, matrixSV]);
|
|
77
|
+
const value = useMemo(() => ({
|
|
78
|
+
state,
|
|
79
|
+
dispatch,
|
|
80
|
+
doc,
|
|
81
|
+
annotations: doc.annotations,
|
|
82
|
+
canUndo: canUndo(state),
|
|
83
|
+
canRedo: canRedo(state),
|
|
84
|
+
tool,
|
|
85
|
+
setTool,
|
|
86
|
+
selectedId,
|
|
87
|
+
setSelectedId,
|
|
88
|
+
strokeColor,
|
|
89
|
+
setStrokeColor,
|
|
90
|
+
textColor,
|
|
91
|
+
setTextColor,
|
|
92
|
+
strokeWidth,
|
|
93
|
+
setStrokeWidth,
|
|
94
|
+
palette,
|
|
95
|
+
editingTextId,
|
|
96
|
+
setEditingTextId,
|
|
97
|
+
layout,
|
|
98
|
+
setLayout,
|
|
99
|
+
imageSize,
|
|
100
|
+
matrix,
|
|
101
|
+
matrixSV,
|
|
102
|
+
draw: {
|
|
103
|
+
active: drawActive,
|
|
104
|
+
start: drawStart,
|
|
105
|
+
current: drawCurrent,
|
|
106
|
+
points: drawPoints
|
|
107
|
+
},
|
|
108
|
+
live: {
|
|
109
|
+
active: liveActive,
|
|
110
|
+
tx: liveTx,
|
|
111
|
+
ty: liveTy,
|
|
112
|
+
rotate: liveRotate,
|
|
113
|
+
scale: liveScale,
|
|
114
|
+
origin: liveOrigin
|
|
115
|
+
},
|
|
116
|
+
cropRectSV
|
|
117
|
+
}),
|
|
118
|
+
// Shared values are stable refs; only re-memoize on JS-state changes.
|
|
119
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
120
|
+
[state, doc, tool, selectedId, strokeColor, textColor, strokeWidth, palette, editingTextId, layout, imageSize, matrix]);
|
|
121
|
+
return /*#__PURE__*/_jsx(EditorContext.Provider, {
|
|
122
|
+
value: value,
|
|
123
|
+
children: children
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=EditorContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","createContext","useContext","useEffect","useMemo","useState","useSharedValue","DEFAULT_PALETTE","DEFAULT_STROKE_COLOR","DEFAULT_STROKE_WIDTH","DEFAULT_TEXT_COLOR","useEditorReducer","canRedo","canUndo","identity","imageToScreenMatrix","jsx","_jsx","EditorContext","useEditor","ctx","Error","EditorProvider","imageSize","initialStrokeColor","initialTextColor","palette","children","state","dispatch","tool","setTool","selectedId","setSelectedId","strokeColor","setStrokeColor","textColor","setTextColor","strokeWidth","setStrokeWidth","editingTextId","setEditingTextId","layout","setLayout","width","height","doc","present","drawActive","drawStart","x","y","drawCurrent","drawPoints","liveActive","liveTx","liveTy","liveRotate","liveScale","liveOrigin","matrixSV","cropRectSV","matrix","scene","value","annotations","draw","active","start","current","points","live","tx","ty","rotate","scale","origin","Provider"],"sourceRoot":"..\\..\\..\\src","sources":["context/EditorContext.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { PaintStyle, Skia, StrokeCap, StrokeJoin, matchFont } from '@shopify/react-native-skia';
|
|
4
|
+
import { sortedByZ } from '../state/selectors';
|
|
5
|
+
import { annotationCenter, buildArrowPath, buildFreehandPath } from '../annotations/geometry';
|
|
6
|
+
import { withOpacity } from '../utils/color';
|
|
7
|
+
const RAD_TO_DEG = 180 / Math.PI;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Imperative draw of the base image + all annotations onto `canvas`, in IMAGE
|
|
11
|
+
* space. Shared by the off-screen export path. Mirrors the declarative on-screen
|
|
12
|
+
* renderers (same geometry, same rotation-about-center), so exports match the
|
|
13
|
+
* preview. The caller sets up the output transform + clip before calling this.
|
|
14
|
+
*/
|
|
15
|
+
export function drawScene(canvas, image, annotations) {
|
|
16
|
+
canvas.drawImage(image, 0, 0);
|
|
17
|
+
for (const a of sortedByZ(annotations)) {
|
|
18
|
+
drawAnnotation(canvas, a);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function strokePaint(color, width) {
|
|
22
|
+
const paint = Skia.Paint();
|
|
23
|
+
paint.setColor(Skia.Color(color));
|
|
24
|
+
paint.setStyle(PaintStyle.Stroke);
|
|
25
|
+
paint.setStrokeWidth(width);
|
|
26
|
+
paint.setAntiAlias(true);
|
|
27
|
+
paint.setStrokeCap(StrokeCap.Round);
|
|
28
|
+
paint.setStrokeJoin(StrokeJoin.Round);
|
|
29
|
+
return paint;
|
|
30
|
+
}
|
|
31
|
+
function fillPaint(color) {
|
|
32
|
+
const paint = Skia.Paint();
|
|
33
|
+
paint.setColor(Skia.Color(color));
|
|
34
|
+
paint.setStyle(PaintStyle.Fill);
|
|
35
|
+
paint.setAntiAlias(true);
|
|
36
|
+
return paint;
|
|
37
|
+
}
|
|
38
|
+
function drawAnnotation(canvas, a) {
|
|
39
|
+
const center = annotationCenter(a);
|
|
40
|
+
canvas.save();
|
|
41
|
+
if (a.rotation) {
|
|
42
|
+
canvas.translate(center.x, center.y);
|
|
43
|
+
canvas.rotate(a.rotation * RAD_TO_DEG, 0, 0);
|
|
44
|
+
canvas.translate(-center.x, -center.y);
|
|
45
|
+
}
|
|
46
|
+
switch (a.type) {
|
|
47
|
+
case 'circle':
|
|
48
|
+
{
|
|
49
|
+
if (a.fill) {
|
|
50
|
+
canvas.drawCircle(a.center.x, a.center.y, a.radius, fillPaint(a.fill));
|
|
51
|
+
}
|
|
52
|
+
canvas.drawCircle(a.center.x, a.center.y, a.radius, strokePaint(a.strokeColor, a.strokeWidth));
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
case 'arrow':
|
|
56
|
+
{
|
|
57
|
+
const path = buildArrowPath(a.start, a.end, a.headSize);
|
|
58
|
+
canvas.drawPath(path, strokePaint(a.strokeColor, a.strokeWidth));
|
|
59
|
+
path.dispose?.();
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
case 'marker':
|
|
63
|
+
{
|
|
64
|
+
const rect = Skia.XYWHRect(a.rect.x, a.rect.y, a.rect.width, a.rect.height);
|
|
65
|
+
canvas.drawRect(rect, fillPaint(withOpacity(a.color, a.opacity)));
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case 'freehand':
|
|
69
|
+
{
|
|
70
|
+
const path = buildFreehandPath(a.points);
|
|
71
|
+
canvas.drawPath(path, strokePaint(a.strokeColor, a.strokeWidth));
|
|
72
|
+
path.dispose?.();
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case 'text':
|
|
76
|
+
{
|
|
77
|
+
const font = matchFont({
|
|
78
|
+
fontFamily: 'sans-serif',
|
|
79
|
+
fontSize: a.fontSize,
|
|
80
|
+
fontStyle: 'normal',
|
|
81
|
+
fontWeight: 'normal'
|
|
82
|
+
});
|
|
83
|
+
const paint = fillPaint(a.color);
|
|
84
|
+
const lineHeight = a.fontSize * 1.2;
|
|
85
|
+
a.text.split('\n').forEach((line, i) => {
|
|
86
|
+
canvas.drawText(line, a.origin.x, a.origin.y + a.fontSize + i * lineHeight, paint, font);
|
|
87
|
+
});
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
canvas.restore();
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=drawScene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["PaintStyle","Skia","StrokeCap","StrokeJoin","matchFont","sortedByZ","annotationCenter","buildArrowPath","buildFreehandPath","withOpacity","RAD_TO_DEG","Math","PI","drawScene","canvas","image","annotations","drawImage","a","drawAnnotation","strokePaint","color","width","paint","Paint","setColor","Color","setStyle","Stroke","setStrokeWidth","setAntiAlias","setStrokeCap","Round","setStrokeJoin","fillPaint","Fill","center","save","rotation","translate","x","y","rotate","type","fill","drawCircle","radius","strokeColor","strokeWidth","path","start","end","headSize","drawPath","dispose","rect","XYWHRect","height","drawRect","opacity","points","font","fontFamily","fontSize","fontStyle","fontWeight","lineHeight","text","split","forEach","line","i","drawText","origin","restore"],"sourceRoot":"..\\..\\..\\src","sources":["export/drawScene.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { ClipOp, ImageFormat, Skia } from '@shopify/react-native-skia';
|
|
4
|
+
import { clampSizeToMax } from '../utils/math';
|
|
5
|
+
import { drawScene } from './drawScene';
|
|
6
|
+
import { safeDispose } from '../image/disposeRegistry';
|
|
7
|
+
const RAD_TO_DEG = 180 / Math.PI;
|
|
8
|
+
/**
|
|
9
|
+
* Render the scene OFF-SCREEN at full resolution and return base64.
|
|
10
|
+
*
|
|
11
|
+
* Output = the (optionally cropped) image + annotations, scaled by `scene.scale`
|
|
12
|
+
* and rotated by `scene.rotation`, on a surface sized to the rotated content's
|
|
13
|
+
* bounding box (transparent corners for PNG). Because annotations live in image
|
|
14
|
+
* space, no per-annotation rescaling is needed — the exact preview geometry is
|
|
15
|
+
* drawn at native resolution.
|
|
16
|
+
*
|
|
17
|
+
* All Skia objects created here (surface + snapshot) are disposed before return.
|
|
18
|
+
*/
|
|
19
|
+
export async function exportImage(params) {
|
|
20
|
+
const {
|
|
21
|
+
image,
|
|
22
|
+
annotations,
|
|
23
|
+
scene,
|
|
24
|
+
imageWidth,
|
|
25
|
+
imageHeight,
|
|
26
|
+
options
|
|
27
|
+
} = params;
|
|
28
|
+
const format = options?.format ?? 'png';
|
|
29
|
+
const quality = options?.quality ?? 100;
|
|
30
|
+
const dataUri = options?.dataUri ?? true;
|
|
31
|
+
const src = scene.cropRect ?? {
|
|
32
|
+
x: 0,
|
|
33
|
+
y: 0,
|
|
34
|
+
width: imageWidth,
|
|
35
|
+
height: imageHeight
|
|
36
|
+
};
|
|
37
|
+
const contentW = src.width * scene.scale;
|
|
38
|
+
const contentH = src.height * scene.scale;
|
|
39
|
+
const absCos = Math.abs(Math.cos(scene.rotation));
|
|
40
|
+
const absSin = Math.abs(Math.sin(scene.rotation));
|
|
41
|
+
const rotatedW = contentW * absCos + contentH * absSin;
|
|
42
|
+
const rotatedH = contentW * absSin + contentH * absCos;
|
|
43
|
+
const clamped = clampSizeToMax(Math.max(1, Math.ceil(rotatedW)), Math.max(1, Math.ceil(rotatedH)), options?.maxExportSize);
|
|
44
|
+
// Reduce the drawing scale by the same factor the clamp shrank the surface.
|
|
45
|
+
const clampFactor = clamped.width / Math.max(1, Math.ceil(rotatedW));
|
|
46
|
+
const drawScale = scene.scale * clampFactor;
|
|
47
|
+
const surface = Skia.Surface.MakeOffscreen(clamped.width, clamped.height);
|
|
48
|
+
if (!surface) {
|
|
49
|
+
throw new Error('Skia.Surface.MakeOffscreen returned null — offscreen export unavailable on this device/version.');
|
|
50
|
+
}
|
|
51
|
+
let snapshot = null;
|
|
52
|
+
try {
|
|
53
|
+
const canvas = surface.getCanvas();
|
|
54
|
+
const srcCenter = {
|
|
55
|
+
x: src.x + src.width / 2,
|
|
56
|
+
y: src.y + src.height / 2
|
|
57
|
+
};
|
|
58
|
+
canvas.save();
|
|
59
|
+
canvas.translate(clamped.width / 2, clamped.height / 2);
|
|
60
|
+
if (scene.rotation) {
|
|
61
|
+
canvas.rotate(scene.rotation * RAD_TO_DEG, 0, 0);
|
|
62
|
+
}
|
|
63
|
+
canvas.scale(drawScale, drawScale);
|
|
64
|
+
canvas.translate(-srcCenter.x, -srcCenter.y);
|
|
65
|
+
// Clip to the crop region so only the selected area is drawn.
|
|
66
|
+
canvas.clipRect(Skia.XYWHRect(src.x, src.y, src.width, src.height), ClipOp.Intersect, true);
|
|
67
|
+
drawScene(canvas, image, annotations);
|
|
68
|
+
canvas.restore();
|
|
69
|
+
surface.flush();
|
|
70
|
+
snapshot = surface.makeImageSnapshot();
|
|
71
|
+
const skFormat = format === 'jpeg' ? ImageFormat.JPEG : ImageFormat.PNG;
|
|
72
|
+
const base64 = snapshot.encodeToBase64(skFormat, quality);
|
|
73
|
+
|
|
74
|
+
// File output: write the raw base64 via the caller-supplied writer.
|
|
75
|
+
if (options?.output === 'file') {
|
|
76
|
+
if (!options.filePath || !options.writeFile) {
|
|
77
|
+
throw new Error("exportImage: output:'file' requires both `filePath` and `writeFile`.");
|
|
78
|
+
}
|
|
79
|
+
await options.writeFile(options.filePath, base64);
|
|
80
|
+
return options.filePath;
|
|
81
|
+
}
|
|
82
|
+
return dataUri ? `data:image/${format};base64,${base64}` : base64;
|
|
83
|
+
} finally {
|
|
84
|
+
safeDispose(snapshot);
|
|
85
|
+
safeDispose(surface);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=exportImage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ClipOp","ImageFormat","Skia","clampSizeToMax","drawScene","safeDispose","RAD_TO_DEG","Math","PI","exportImage","params","image","annotations","scene","imageWidth","imageHeight","options","format","quality","dataUri","src","cropRect","x","y","width","height","contentW","scale","contentH","absCos","abs","cos","rotation","absSin","sin","rotatedW","rotatedH","clamped","max","ceil","maxExportSize","clampFactor","drawScale","surface","Surface","MakeOffscreen","Error","snapshot","canvas","getCanvas","srcCenter","save","translate","rotate","clipRect","XYWHRect","Intersect","restore","flush","makeImageSnapshot","skFormat","JPEG","PNG","base64","encodeToBase64","output","filePath","writeFile"],"sourceRoot":"..\\..\\..\\src","sources":["export/exportImage.ts"],"mappings":";;AAAA,SAASA,MAAM,EAAEC,WAAW,EAAEC,IAAI,QAAQ,4BAA4B;AAItE,SAASC,cAAc,QAAQ,eAAe;AAC9C,SAASC,SAAS,QAAQ,aAAa;AACvC,SAASC,WAAW,QAAQ,0BAA0B;AAEtD,MAAMC,UAAU,GAAG,GAAG,GAAGC,IAAI,CAACC,EAAE;AAWhC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,WAAWA,CAACC,MAAoB,EAAmB;EACvE,MAAM;IAAEC,KAAK;IAAEC,WAAW;IAAEC,KAAK;IAAEC,UAAU;IAAEC,WAAW;IAAEC;EAAQ,CAAC,GAAGN,MAAM;EAC9E,MAAMO,MAAM,GAAGD,OAAO,EAAEC,MAAM,IAAI,KAAK;EACvC,MAAMC,OAAO,GAAGF,OAAO,EAAEE,OAAO,IAAI,GAAG;EACvC,MAAMC,OAAO,GAAGH,OAAO,EAAEG,OAAO,IAAI,IAAI;EAExC,MAAMC,GAAS,GAAGP,KAAK,CAACQ,QAAQ,IAAI;IAClCC,CAAC,EAAE,CAAC;IACJC,CAAC,EAAE,CAAC;IACJC,KAAK,EAAEV,UAAU;IACjBW,MAAM,EAAEV;EACV,CAAC;EAED,MAAMW,QAAQ,GAAGN,GAAG,CAACI,KAAK,GAAGX,KAAK,CAACc,KAAK;EACxC,MAAMC,QAAQ,GAAGR,GAAG,CAACK,MAAM,GAAGZ,KAAK,CAACc,KAAK;EACzC,MAAME,MAAM,GAAGtB,IAAI,CAACuB,GAAG,CAACvB,IAAI,CAACwB,GAAG,CAAClB,KAAK,CAACmB,QAAQ,CAAC,CAAC;EACjD,MAAMC,MAAM,GAAG1B,IAAI,CAACuB,GAAG,CAACvB,IAAI,CAAC2B,GAAG,CAACrB,KAAK,CAACmB,QAAQ,CAAC,CAAC;EACjD,MAAMG,QAAQ,GAAGT,QAAQ,GAAGG,MAAM,GAAGD,QAAQ,GAAGK,MAAM;EACtD,MAAMG,QAAQ,GAAGV,QAAQ,GAAGO,MAAM,GAAGL,QAAQ,GAAGC,MAAM;EAEtD,MAAMQ,OAAO,GAAGlC,cAAc,CAC5BI,IAAI,CAAC+B,GAAG,CAAC,CAAC,EAAE/B,IAAI,CAACgC,IAAI,CAACJ,QAAQ,CAAC,CAAC,EAChC5B,IAAI,CAAC+B,GAAG,CAAC,CAAC,EAAE/B,IAAI,CAACgC,IAAI,CAACH,QAAQ,CAAC,CAAC,EAChCpB,OAAO,EAAEwB,aACX,CAAC;EACD;EACA,MAAMC,WAAW,GAAGJ,OAAO,CAACb,KAAK,GAAGjB,IAAI,CAAC+B,GAAG,CAAC,CAAC,EAAE/B,IAAI,CAACgC,IAAI,CAACJ,QAAQ,CAAC,CAAC;EACpE,MAAMO,SAAS,GAAG7B,KAAK,CAACc,KAAK,GAAGc,WAAW;EAE3C,MAAME,OAAO,GAAGzC,IAAI,CAAC0C,OAAO,CAACC,aAAa,CAACR,OAAO,CAACb,KAAK,EAAEa,OAAO,CAACZ,MAAM,CAAC;EACzE,IAAI,CAACkB,OAAO,EAAE;IACZ,MAAM,IAAIG,KAAK,CACb,iGACF,CAAC;EACH;EAEA,IAAIC,QAAwB,GAAG,IAAI;EACnC,IAAI;IACF,MAAMC,MAAM,GAAGL,OAAO,CAACM,SAAS,CAAC,CAAC;IAClC,MAAMC,SAAS,GAAG;MAChB5B,CAAC,EAAEF,GAAG,CAACE,CAAC,GAAGF,GAAG,CAACI,KAAK,GAAG,CAAC;MACxBD,CAAC,EAAEH,GAAG,CAACG,CAAC,GAAGH,GAAG,CAACK,MAAM,GAAG;IAC1B,CAAC;IACDuB,MAAM,CAACG,IAAI,CAAC,CAAC;IACbH,MAAM,CAACI,SAAS,CAACf,OAAO,CAACb,KAAK,GAAG,CAAC,EAAEa,OAAO,CAACZ,MAAM,GAAG,CAAC,CAAC;IACvD,IAAIZ,KAAK,CAACmB,QAAQ,EAAE;MAClBgB,MAAM,CAACK,MAAM,CAACxC,KAAK,CAACmB,QAAQ,GAAG1B,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAClD;IACA0C,MAAM,CAACrB,KAAK,CAACe,SAAS,EAAEA,SAAS,CAAC;IAClCM,MAAM,CAACI,SAAS,CAAC,CAACF,SAAS,CAAC5B,CAAC,EAAE,CAAC4B,SAAS,CAAC3B,CAAC,CAAC;IAC5C;IACAyB,MAAM,CAACM,QAAQ,CACbpD,IAAI,CAACqD,QAAQ,CAACnC,GAAG,CAACE,CAAC,EAAEF,GAAG,CAACG,CAAC,EAAEH,GAAG,CAACI,KAAK,EAAEJ,GAAG,CAACK,MAAM,CAAC,EAClDzB,MAAM,CAACwD,SAAS,EAChB,IACF,CAAC;IACDpD,SAAS,CAAC4C,MAAM,EAAErC,KAAK,EAAEC,WAAW,CAAC;IACrCoC,MAAM,CAACS,OAAO,CAAC,CAAC;IAEhBd,OAAO,CAACe,KAAK,CAAC,CAAC;IACfX,QAAQ,GAAGJ,OAAO,CAACgB,iBAAiB,CAAC,CAAC;IACtC,MAAMC,QAAQ,GAAG3C,MAAM,KAAK,MAAM,GAAGhB,WAAW,CAAC4D,IAAI,GAAG5D,WAAW,CAAC6D,GAAG;IACvE,MAAMC,MAAM,GAAGhB,QAAQ,CAACiB,cAAc,CAACJ,QAAQ,EAAE1C,OAAO,CAAC;;IAEzD;IACA,IAAIF,OAAO,EAAEiD,MAAM,KAAK,MAAM,EAAE;MAC9B,IAAI,CAACjD,OAAO,CAACkD,QAAQ,IAAI,CAAClD,OAAO,CAACmD,SAAS,EAAE;QAC3C,MAAM,IAAIrB,KAAK,CACb,sEACF,CAAC;MACH;MACA,MAAM9B,OAAO,CAACmD,SAAS,CAACnD,OAAO,CAACkD,QAAQ,EAAEH,MAAM,CAAC;MACjD,OAAO/C,OAAO,CAACkD,QAAQ;IACzB;IAEA,OAAO/C,OAAO,GAAG,cAAcF,MAAM,WAAW8C,MAAM,EAAE,GAAGA,MAAM;EACnE,CAAC,SAAS;IACR1D,WAAW,CAAC0C,QAAQ,CAAC;IACrB1C,WAAW,CAACsC,OAAO,CAAC;EACtB;AACF","ignoreList":[]}
|