@archireport/react-native-drawing 0.2.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/README.md +181 -0
- package/lib/commonjs/DrawingEditor.js +815 -0
- package/lib/commonjs/DrawingEditor.js.map +1 -0
- package/lib/commonjs/assets/toolbar-icons/arrow-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/arrow-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/arrow.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/circle-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/circle-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/circle.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/freehand-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/freehand-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/freehand.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/line-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/line-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/line.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/measure-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/measure-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/measure.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/move-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/move-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/move.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/polygon-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/polygon-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/polygon.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/rectangle-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/rectangle-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/rectangle.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/text-disabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/text-enabled.png +0 -0
- package/lib/commonjs/assets/toolbar-icons/text.png +0 -0
- package/lib/commonjs/components/ColorPalette.js +379 -0
- package/lib/commonjs/components/ColorPalette.js.map +1 -0
- package/lib/commonjs/components/LineWidthSlider.js +70 -0
- package/lib/commonjs/components/LineWidthSlider.js.map +1 -0
- package/lib/commonjs/components/MeasurementEditModal.js +153 -0
- package/lib/commonjs/components/MeasurementEditModal.js.map +1 -0
- package/lib/commonjs/components/MiniMap.js +244 -0
- package/lib/commonjs/components/MiniMap.js.map +1 -0
- package/lib/commonjs/components/TextAnnotation.js +162 -0
- package/lib/commonjs/components/TextAnnotation.js.map +1 -0
- package/lib/commonjs/components/TextEditModal.js +133 -0
- package/lib/commonjs/components/TextEditModal.js.map +1 -0
- package/lib/commonjs/components/Toolbar.js +198 -0
- package/lib/commonjs/components/Toolbar.js.map +1 -0
- package/lib/commonjs/components/ZoomBadge.js +161 -0
- package/lib/commonjs/components/ZoomBadge.js.map +1 -0
- package/lib/commonjs/hooks/useFreehandGesture.js +173 -0
- package/lib/commonjs/hooks/useFreehandGesture.js.map +1 -0
- package/lib/commonjs/hooks/usePolygonGesture.js +109 -0
- package/lib/commonjs/hooks/usePolygonGesture.js.map +1 -0
- package/lib/commonjs/hooks/useSelectionGesture.js +236 -0
- package/lib/commonjs/hooks/useSelectionGesture.js.map +1 -0
- package/lib/commonjs/hooks/useShapeGesture.js +181 -0
- package/lib/commonjs/hooks/useShapeGesture.js.map +1 -0
- package/lib/commonjs/hooks/useViewportGesture.js +238 -0
- package/lib/commonjs/hooks/useViewportGesture.js.map +1 -0
- package/lib/commonjs/index.js +104 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/renderers/ArrowRenderer.js +118 -0
- package/lib/commonjs/renderers/ArrowRenderer.js.map +1 -0
- package/lib/commonjs/renderers/CircleRenderer.js +51 -0
- package/lib/commonjs/renderers/CircleRenderer.js.map +1 -0
- package/lib/commonjs/renderers/FreehandRenderer.js +31 -0
- package/lib/commonjs/renderers/FreehandRenderer.js.map +1 -0
- package/lib/commonjs/renderers/InProgressRenderer.js +174 -0
- package/lib/commonjs/renderers/InProgressRenderer.js.map +1 -0
- package/lib/commonjs/renderers/LineRenderer.js +27 -0
- package/lib/commonjs/renderers/LineRenderer.js.map +1 -0
- package/lib/commonjs/renderers/MeasurementRenderer.js +134 -0
- package/lib/commonjs/renderers/MeasurementRenderer.js.map +1 -0
- package/lib/commonjs/renderers/ObjectRenderer.js +65 -0
- package/lib/commonjs/renderers/ObjectRenderer.js.map +1 -0
- package/lib/commonjs/renderers/PolygonRenderer.js +46 -0
- package/lib/commonjs/renderers/PolygonRenderer.js.map +1 -0
- package/lib/commonjs/renderers/RectRenderer.js +51 -0
- package/lib/commonjs/renderers/RectRenderer.js.map +1 -0
- package/lib/commonjs/renderers/SelectedObjectRenderer.js +592 -0
- package/lib/commonjs/renderers/SelectedObjectRenderer.js.map +1 -0
- package/lib/commonjs/renderers/SelectionOverlay.js +120 -0
- package/lib/commonjs/renderers/SelectionOverlay.js.map +1 -0
- package/lib/commonjs/store/useDrawingStore.js +354 -0
- package/lib/commonjs/store/useDrawingStore.js.map +1 -0
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/utils/colors.js +44 -0
- package/lib/commonjs/utils/colors.js.map +1 -0
- package/lib/commonjs/utils/coordinates.js +81 -0
- package/lib/commonjs/utils/coordinates.js.map +1 -0
- package/lib/commonjs/utils/hitTesting.js +181 -0
- package/lib/commonjs/utils/hitTesting.js.map +1 -0
- package/lib/commonjs/utils/serialization.js +42 -0
- package/lib/commonjs/utils/serialization.js.map +1 -0
- package/lib/commonjs/utils/shapeDetection.js +151 -0
- package/lib/commonjs/utils/shapeDetection.js.map +1 -0
- package/lib/commonjs/utils/smoothing.js +85 -0
- package/lib/commonjs/utils/smoothing.js.map +1 -0
- package/lib/module/DrawingEditor.js +811 -0
- package/lib/module/DrawingEditor.js.map +1 -0
- package/lib/module/assets/toolbar-icons/arrow-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/arrow-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/arrow.png +0 -0
- package/lib/module/assets/toolbar-icons/circle-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/circle-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/circle.png +0 -0
- package/lib/module/assets/toolbar-icons/freehand-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/freehand-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/freehand.png +0 -0
- package/lib/module/assets/toolbar-icons/line-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/line-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/line.png +0 -0
- package/lib/module/assets/toolbar-icons/measure-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/measure-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/measure.png +0 -0
- package/lib/module/assets/toolbar-icons/move-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/move-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/move.png +0 -0
- package/lib/module/assets/toolbar-icons/polygon-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/polygon-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/polygon.png +0 -0
- package/lib/module/assets/toolbar-icons/rectangle-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/rectangle-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/rectangle.png +0 -0
- package/lib/module/assets/toolbar-icons/text-disabled.png +0 -0
- package/lib/module/assets/toolbar-icons/text-enabled.png +0 -0
- package/lib/module/assets/toolbar-icons/text.png +0 -0
- package/lib/module/components/ColorPalette.js +374 -0
- package/lib/module/components/ColorPalette.js.map +1 -0
- package/lib/module/components/LineWidthSlider.js +64 -0
- package/lib/module/components/LineWidthSlider.js.map +1 -0
- package/lib/module/components/MeasurementEditModal.js +148 -0
- package/lib/module/components/MeasurementEditModal.js.map +1 -0
- package/lib/module/components/MiniMap.js +239 -0
- package/lib/module/components/MiniMap.js.map +1 -0
- package/lib/module/components/TextAnnotation.js +157 -0
- package/lib/module/components/TextAnnotation.js.map +1 -0
- package/lib/module/components/TextEditModal.js +128 -0
- package/lib/module/components/TextEditModal.js.map +1 -0
- package/lib/module/components/Toolbar.js +193 -0
- package/lib/module/components/Toolbar.js.map +1 -0
- package/lib/module/components/ZoomBadge.js +155 -0
- package/lib/module/components/ZoomBadge.js.map +1 -0
- package/lib/module/hooks/useFreehandGesture.js +169 -0
- package/lib/module/hooks/useFreehandGesture.js.map +1 -0
- package/lib/module/hooks/usePolygonGesture.js +106 -0
- package/lib/module/hooks/usePolygonGesture.js.map +1 -0
- package/lib/module/hooks/useSelectionGesture.js +232 -0
- package/lib/module/hooks/useSelectionGesture.js.map +1 -0
- package/lib/module/hooks/useShapeGesture.js +177 -0
- package/lib/module/hooks/useShapeGesture.js.map +1 -0
- package/lib/module/hooks/useViewportGesture.js +234 -0
- package/lib/module/hooks/useViewportGesture.js.map +1 -0
- package/lib/module/index.js +20 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/renderers/ArrowRenderer.js +113 -0
- package/lib/module/renderers/ArrowRenderer.js.map +1 -0
- package/lib/module/renderers/CircleRenderer.js +46 -0
- package/lib/module/renderers/CircleRenderer.js.map +1 -0
- package/lib/module/renderers/FreehandRenderer.js +26 -0
- package/lib/module/renderers/FreehandRenderer.js.map +1 -0
- package/lib/module/renderers/InProgressRenderer.js +169 -0
- package/lib/module/renderers/InProgressRenderer.js.map +1 -0
- package/lib/module/renderers/LineRenderer.js +22 -0
- package/lib/module/renderers/LineRenderer.js.map +1 -0
- package/lib/module/renderers/MeasurementRenderer.js +129 -0
- package/lib/module/renderers/MeasurementRenderer.js.map +1 -0
- package/lib/module/renderers/ObjectRenderer.js +60 -0
- package/lib/module/renderers/ObjectRenderer.js.map +1 -0
- package/lib/module/renderers/PolygonRenderer.js +41 -0
- package/lib/module/renderers/PolygonRenderer.js.map +1 -0
- package/lib/module/renderers/RectRenderer.js +46 -0
- package/lib/module/renderers/RectRenderer.js.map +1 -0
- package/lib/module/renderers/SelectedObjectRenderer.js +587 -0
- package/lib/module/renderers/SelectedObjectRenderer.js.map +1 -0
- package/lib/module/renderers/SelectionOverlay.js +116 -0
- package/lib/module/renderers/SelectionOverlay.js.map +1 -0
- package/lib/module/store/useDrawingStore.js +350 -0
- package/lib/module/store/useDrawingStore.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/colors.js +40 -0
- package/lib/module/utils/colors.js.map +1 -0
- package/lib/module/utils/coordinates.js +71 -0
- package/lib/module/utils/coordinates.js.map +1 -0
- package/lib/module/utils/hitTesting.js +171 -0
- package/lib/module/utils/hitTesting.js.map +1 -0
- package/lib/module/utils/serialization.js +36 -0
- package/lib/module/utils/serialization.js.map +1 -0
- package/lib/module/utils/shapeDetection.js +147 -0
- package/lib/module/utils/shapeDetection.js.map +1 -0
- package/lib/module/utils/smoothing.js +80 -0
- package/lib/module/utils/smoothing.js.map +1 -0
- package/lib/typescript/DrawingEditor.d.ts +3 -0
- package/lib/typescript/DrawingEditor.d.ts.map +1 -0
- package/lib/typescript/components/ColorPalette.d.ts +9 -0
- package/lib/typescript/components/ColorPalette.d.ts.map +1 -0
- package/lib/typescript/components/LineWidthSlider.d.ts +11 -0
- package/lib/typescript/components/LineWidthSlider.d.ts.map +1 -0
- package/lib/typescript/components/MeasurementEditModal.d.ts +11 -0
- package/lib/typescript/components/MeasurementEditModal.d.ts.map +1 -0
- package/lib/typescript/components/MiniMap.d.ts +23 -0
- package/lib/typescript/components/MiniMap.d.ts.map +1 -0
- package/lib/typescript/components/TextAnnotation.d.ts +22 -0
- package/lib/typescript/components/TextAnnotation.d.ts.map +1 -0
- package/lib/typescript/components/TextEditModal.d.ts +10 -0
- package/lib/typescript/components/TextEditModal.d.ts.map +1 -0
- package/lib/typescript/components/Toolbar.d.ts +13 -0
- package/lib/typescript/components/Toolbar.d.ts.map +1 -0
- package/lib/typescript/components/ZoomBadge.d.ts +9 -0
- package/lib/typescript/components/ZoomBadge.d.ts.map +1 -0
- package/lib/typescript/hooks/useFreehandGesture.d.ts +47 -0
- package/lib/typescript/hooks/useFreehandGesture.d.ts.map +1 -0
- package/lib/typescript/hooks/usePolygonGesture.d.ts +47 -0
- package/lib/typescript/hooks/usePolygonGesture.d.ts.map +1 -0
- package/lib/typescript/hooks/useSelectionGesture.d.ts +32 -0
- package/lib/typescript/hooks/useSelectionGesture.d.ts.map +1 -0
- package/lib/typescript/hooks/useShapeGesture.d.ts +54 -0
- package/lib/typescript/hooks/useShapeGesture.d.ts.map +1 -0
- package/lib/typescript/hooks/useViewportGesture.d.ts +37 -0
- package/lib/typescript/hooks/useViewportGesture.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +11 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/renderers/ArrowRenderer.d.ts +9 -0
- package/lib/typescript/renderers/ArrowRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/CircleRenderer.d.ts +9 -0
- package/lib/typescript/renderers/CircleRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/FreehandRenderer.d.ts +9 -0
- package/lib/typescript/renderers/FreehandRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/InProgressRenderer.d.ts +32 -0
- package/lib/typescript/renderers/InProgressRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/LineRenderer.d.ts +9 -0
- package/lib/typescript/renderers/LineRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/MeasurementRenderer.d.ts +9 -0
- package/lib/typescript/renderers/MeasurementRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/ObjectRenderer.d.ts +12 -0
- package/lib/typescript/renderers/ObjectRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/PolygonRenderer.d.ts +13 -0
- package/lib/typescript/renderers/PolygonRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/RectRenderer.d.ts +9 -0
- package/lib/typescript/renderers/RectRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/SelectedObjectRenderer.d.ts +18 -0
- package/lib/typescript/renderers/SelectedObjectRenderer.d.ts.map +1 -0
- package/lib/typescript/renderers/SelectionOverlay.d.ts +21 -0
- package/lib/typescript/renderers/SelectionOverlay.d.ts.map +1 -0
- package/lib/typescript/store/useDrawingStore.d.ts +30 -0
- package/lib/typescript/store/useDrawingStore.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +130 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/lib/typescript/utils/colors.d.ts +11 -0
- package/lib/typescript/utils/colors.d.ts.map +1 -0
- package/lib/typescript/utils/coordinates.d.ts +34 -0
- package/lib/typescript/utils/coordinates.d.ts.map +1 -0
- package/lib/typescript/utils/hitTesting.d.ts +18 -0
- package/lib/typescript/utils/hitTesting.d.ts.map +1 -0
- package/lib/typescript/utils/serialization.d.ts +17 -0
- package/lib/typescript/utils/serialization.d.ts.map +1 -0
- package/lib/typescript/utils/shapeDetection.d.ts +22 -0
- package/lib/typescript/utils/shapeDetection.d.ts.map +1 -0
- package/lib/typescript/utils/smoothing.d.ts +16 -0
- package/lib/typescript/utils/smoothing.d.ts.map +1 -0
- package/package.json +108 -0
- package/src/DrawingEditor.tsx +1071 -0
- package/src/assets/toolbar-icons/arrow-disabled.png +0 -0
- package/src/assets/toolbar-icons/arrow-enabled.png +0 -0
- package/src/assets/toolbar-icons/arrow.png +0 -0
- package/src/assets/toolbar-icons/circle-disabled.png +0 -0
- package/src/assets/toolbar-icons/circle-enabled.png +0 -0
- package/src/assets/toolbar-icons/circle.png +0 -0
- package/src/assets/toolbar-icons/freehand-disabled.png +0 -0
- package/src/assets/toolbar-icons/freehand-enabled.png +0 -0
- package/src/assets/toolbar-icons/freehand.png +0 -0
- package/src/assets/toolbar-icons/line-disabled.png +0 -0
- package/src/assets/toolbar-icons/line-enabled.png +0 -0
- package/src/assets/toolbar-icons/line.png +0 -0
- package/src/assets/toolbar-icons/measure-disabled.png +0 -0
- package/src/assets/toolbar-icons/measure-enabled.png +0 -0
- package/src/assets/toolbar-icons/measure.png +0 -0
- package/src/assets/toolbar-icons/move-disabled.png +0 -0
- package/src/assets/toolbar-icons/move-enabled.png +0 -0
- package/src/assets/toolbar-icons/move.png +0 -0
- package/src/assets/toolbar-icons/polygon-disabled.png +0 -0
- package/src/assets/toolbar-icons/polygon-enabled.png +0 -0
- package/src/assets/toolbar-icons/polygon.png +0 -0
- package/src/assets/toolbar-icons/rectangle-disabled.png +0 -0
- package/src/assets/toolbar-icons/rectangle-enabled.png +0 -0
- package/src/assets/toolbar-icons/rectangle.png +0 -0
- package/src/assets/toolbar-icons/text-disabled.png +0 -0
- package/src/assets/toolbar-icons/text-enabled.png +0 -0
- package/src/assets/toolbar-icons/text.png +0 -0
- package/src/components/ColorPalette.tsx +497 -0
- package/src/components/LineWidthSlider.tsx +87 -0
- package/src/components/MeasurementEditModal.tsx +163 -0
- package/src/components/MiniMap.tsx +275 -0
- package/src/components/TextAnnotation.tsx +198 -0
- package/src/components/TextEditModal.tsx +139 -0
- package/src/components/Toolbar.tsx +254 -0
- package/src/components/ZoomBadge.tsx +166 -0
- package/src/hooks/useFreehandGesture.ts +249 -0
- package/src/hooks/usePolygonGesture.ts +162 -0
- package/src/hooks/useSelectionGesture.ts +293 -0
- package/src/hooks/useShapeGesture.ts +256 -0
- package/src/hooks/useViewportGesture.ts +337 -0
- package/src/index.tsx +51 -0
- package/src/renderers/ArrowRenderer.tsx +123 -0
- package/src/renderers/CircleRenderer.tsx +60 -0
- package/src/renderers/FreehandRenderer.tsx +33 -0
- package/src/renderers/InProgressRenderer.tsx +217 -0
- package/src/renderers/LineRenderer.tsx +34 -0
- package/src/renderers/MeasurementRenderer.tsx +179 -0
- package/src/renderers/ObjectRenderer.tsx +42 -0
- package/src/renderers/PolygonRenderer.tsx +66 -0
- package/src/renderers/RectRenderer.tsx +60 -0
- package/src/renderers/SelectedObjectRenderer.tsx +738 -0
- package/src/renderers/SelectionOverlay.tsx +170 -0
- package/src/store/useDrawingStore.ts +357 -0
- package/src/types.ts +186 -0
- package/src/utils/colors.ts +98 -0
- package/src/utils/coordinates.ts +75 -0
- package/src/utils/hitTesting.ts +242 -0
- package/src/utils/serialization.ts +45 -0
- package/src/utils/shapeDetection.ts +160 -0
- package/src/utils/smoothing.ts +84 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "buildSmoothedPath", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _smoothing.buildSmoothedPath;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
exports.distanceToSegment = distanceToSegment;
|
|
13
|
+
exports.hitTestObject = hitTestObject;
|
|
14
|
+
var _coordinates = require("./coordinates");
|
|
15
|
+
var _smoothing = require("./smoothing");
|
|
16
|
+
const HIT_PADDING = 20; // pixels tolerance for hit-testing lines/paths
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Test if a pixel-space tap point hits a drawing object.
|
|
20
|
+
* All object coordinates are normalized and must be denormalized with canvasSize.
|
|
21
|
+
*
|
|
22
|
+
* Returns true if the point is within hit range of the object.
|
|
23
|
+
*/
|
|
24
|
+
function hitTestObject(object, tapPoint, canvasSize) {
|
|
25
|
+
switch (object.type) {
|
|
26
|
+
case "freehand":
|
|
27
|
+
return hitTestFreehand(object, tapPoint, canvasSize);
|
|
28
|
+
case "line":
|
|
29
|
+
case "arrow":
|
|
30
|
+
case "measure":
|
|
31
|
+
return hitTestLine(object, tapPoint, canvasSize);
|
|
32
|
+
case "rectangle":
|
|
33
|
+
return hitTestRect(object, tapPoint, canvasSize);
|
|
34
|
+
case "circle":
|
|
35
|
+
return hitTestEllipse(object, tapPoint, canvasSize);
|
|
36
|
+
case "polygon":
|
|
37
|
+
return hitTestPolygon(object, tapPoint, canvasSize);
|
|
38
|
+
case "text":
|
|
39
|
+
return hitTestText(object, tapPoint, canvasSize);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function hitTestFreehand(object, tap, canvasSize) {
|
|
43
|
+
const points = (0, _coordinates.denormalizePoints)(object.points, canvasSize);
|
|
44
|
+
const padding = HIT_PADDING + object.lineWidth / 2;
|
|
45
|
+
|
|
46
|
+
// Check distance to each segment of the smoothed path
|
|
47
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
48
|
+
const a = points[i];
|
|
49
|
+
const b = points[i + 1];
|
|
50
|
+
if (distanceToSegment(tap, a, b) < padding) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
function hitTestLine(object, tap, canvasSize) {
|
|
57
|
+
const from = (0, _coordinates.denormalize)(object.from, canvasSize);
|
|
58
|
+
const to = (0, _coordinates.denormalize)(object.to, canvasSize);
|
|
59
|
+
const padding = HIT_PADDING + object.lineWidth / 2;
|
|
60
|
+
return distanceToSegment(tap, from, to) < padding;
|
|
61
|
+
}
|
|
62
|
+
function hitTestRect(object, tap, canvasSize) {
|
|
63
|
+
const from = (0, _coordinates.denormalize)(object.from, canvasSize);
|
|
64
|
+
const to = (0, _coordinates.denormalize)(object.to, canvasSize);
|
|
65
|
+
const padding = HIT_PADDING;
|
|
66
|
+
const minX = Math.min(from.x, to.x) - padding;
|
|
67
|
+
const maxX = Math.max(from.x, to.x) + padding;
|
|
68
|
+
const minY = Math.min(from.y, to.y) - padding;
|
|
69
|
+
const maxY = Math.max(from.y, to.y) + padding;
|
|
70
|
+
|
|
71
|
+
// If has fill, hit inside the rect
|
|
72
|
+
if ("backgroundColor" in object && object.backgroundColor) {
|
|
73
|
+
return tap.x >= minX && tap.x <= maxX && tap.y >= minY && tap.y <= maxY;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Otherwise, hit the border only
|
|
77
|
+
const innerMinX = Math.min(from.x, to.x) + padding;
|
|
78
|
+
const innerMaxX = Math.max(from.x, to.x) - padding;
|
|
79
|
+
const innerMinY = Math.min(from.y, to.y) + padding;
|
|
80
|
+
const innerMaxY = Math.max(from.y, to.y) - padding;
|
|
81
|
+
const inOuter = tap.x >= minX && tap.x <= maxX && tap.y >= minY && tap.y <= maxY;
|
|
82
|
+
const inInner = tap.x >= innerMinX && tap.x <= innerMaxX && tap.y >= innerMinY && tap.y <= innerMaxY;
|
|
83
|
+
return inOuter && !inInner;
|
|
84
|
+
}
|
|
85
|
+
function hitTestEllipse(object, tap, canvasSize) {
|
|
86
|
+
const from = (0, _coordinates.denormalize)(object.from, canvasSize);
|
|
87
|
+
const to = (0, _coordinates.denormalize)(object.to, canvasSize);
|
|
88
|
+
const cx = (from.x + to.x) / 2;
|
|
89
|
+
const cy = (from.y + to.y) / 2;
|
|
90
|
+
const rx = Math.abs(to.x - from.x) / 2;
|
|
91
|
+
const ry = Math.abs(to.y - from.y) / 2;
|
|
92
|
+
if (rx === 0 || ry === 0) return false;
|
|
93
|
+
const dx = tap.x - cx;
|
|
94
|
+
const dy = tap.y - cy;
|
|
95
|
+
|
|
96
|
+
// Normalized distance from center
|
|
97
|
+
// If has fill, hit inside the ellipse
|
|
98
|
+
if ("backgroundColor" in object && object.backgroundColor) {
|
|
99
|
+
const outerRx = rx + HIT_PADDING;
|
|
100
|
+
const outerRy = ry + HIT_PADDING;
|
|
101
|
+
return dx * dx / (outerRx * outerRx) + dy * dy / (outerRy * outerRy) <= 1;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Otherwise, hit the border ring
|
|
105
|
+
const padding = HIT_PADDING + ("lineWidth" in object ? object.lineWidth / 2 : 2);
|
|
106
|
+
const outerRx = rx + padding;
|
|
107
|
+
const outerRy = ry + padding;
|
|
108
|
+
const innerRx = Math.max(0, rx - padding);
|
|
109
|
+
const innerRy = Math.max(0, ry - padding);
|
|
110
|
+
const outerDist = dx * dx / (outerRx * outerRx) + dy * dy / (outerRy * outerRy);
|
|
111
|
+
const innerDist = innerRx > 0 && innerRy > 0 ? dx * dx / (innerRx * innerRx) + dy * dy / (innerRy * innerRy) : Infinity;
|
|
112
|
+
return outerDist <= 1 && innerDist >= 1;
|
|
113
|
+
}
|
|
114
|
+
function hitTestText(object, tap, canvasSize) {
|
|
115
|
+
const pos = (0, _coordinates.denormalize)(object.position, canvasSize);
|
|
116
|
+
const w = object.width * canvasSize.width;
|
|
117
|
+
const h = object.height * canvasSize.height;
|
|
118
|
+
return tap.x >= pos.x && tap.x <= pos.x + w && tap.y >= pos.y && tap.y <= pos.y + h;
|
|
119
|
+
}
|
|
120
|
+
function hitTestPolygon(object, tap, canvasSize) {
|
|
121
|
+
const points = (0, _coordinates.denormalizePoints)(object.points, canvasSize);
|
|
122
|
+
if (points.length < 2) return false;
|
|
123
|
+
const padding = HIT_PADDING + object.lineWidth / 2;
|
|
124
|
+
|
|
125
|
+
// If filled and closed, check if point is inside the polygon
|
|
126
|
+
if (object.closed && object.backgroundColor) {
|
|
127
|
+
if (pointInPolygon(tap, points)) return true;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Check distance to each segment (including closing segment if closed)
|
|
131
|
+
const len = points.length;
|
|
132
|
+
for (let i = 0; i < len - 1; i++) {
|
|
133
|
+
if (distanceToSegment(tap, points[i], points[i + 1]) < padding) {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Closing segment
|
|
138
|
+
if (object.closed && len >= 3) {
|
|
139
|
+
if (distanceToSegment(tap, points[len - 1], points[0]) < padding) {
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Ray-casting point-in-polygon test */
|
|
147
|
+
function pointInPolygon(p, polygon) {
|
|
148
|
+
let inside = false;
|
|
149
|
+
for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
|
|
150
|
+
const xi = polygon[i].x;
|
|
151
|
+
const yi = polygon[i].y;
|
|
152
|
+
const xj = polygon[j].x;
|
|
153
|
+
const yj = polygon[j].y;
|
|
154
|
+
const intersect = yi > p.y !== yj > p.y && p.x < (xj - xi) * (p.y - yi) / (yj - yi) + xi;
|
|
155
|
+
if (intersect) inside = !inside;
|
|
156
|
+
}
|
|
157
|
+
return inside;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Returns the minimum distance from point p to segment [a, b].
|
|
162
|
+
*/
|
|
163
|
+
function distanceToSegment(p, a, b) {
|
|
164
|
+
const dx = b.x - a.x;
|
|
165
|
+
const dy = b.y - a.y;
|
|
166
|
+
const lenSq = dx * dx + dy * dy;
|
|
167
|
+
if (lenSq === 0) {
|
|
168
|
+
// a and b are the same point
|
|
169
|
+
return Math.sqrt((p.x - a.x) ** 2 + (p.y - a.y) ** 2);
|
|
170
|
+
}
|
|
171
|
+
let t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / lenSq;
|
|
172
|
+
t = Math.max(0, Math.min(1, t));
|
|
173
|
+
const projX = a.x + t * dx;
|
|
174
|
+
const projY = a.y + t * dy;
|
|
175
|
+
return Math.sqrt((p.x - projX) ** 2 + (p.y - projY) ** 2);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Export for use in selection gesture calculations.
|
|
180
|
+
*/
|
|
181
|
+
//# sourceMappingURL=hitTesting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_coordinates","require","_smoothing","HIT_PADDING","hitTestObject","object","tapPoint","canvasSize","type","hitTestFreehand","hitTestLine","hitTestRect","hitTestEllipse","hitTestPolygon","hitTestText","tap","points","denormalizePoints","padding","lineWidth","i","length","a","b","distanceToSegment","from","denormalize","to","minX","Math","min","x","maxX","max","minY","y","maxY","backgroundColor","innerMinX","innerMaxX","innerMinY","innerMaxY","inOuter","inInner","cx","cy","rx","abs","ry","dx","dy","outerRx","outerRy","innerRx","innerRy","outerDist","innerDist","Infinity","pos","position","w","width","h","height","closed","pointInPolygon","len","p","polygon","inside","j","xi","yi","xj","yj","intersect","lenSq","sqrt","t","projX","projY"],"sourceRoot":"../../../src","sources":["utils/hitTesting.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.deserializeObjects = deserializeObjects;
|
|
7
|
+
exports.generateId = generateId;
|
|
8
|
+
exports.serializeObjects = serializeObjects;
|
|
9
|
+
/**
|
|
10
|
+
* Serialize drawing state to a JSON-compatible structure.
|
|
11
|
+
*/
|
|
12
|
+
function serializeObjects(objects, canvasSize) {
|
|
13
|
+
return JSON.stringify({
|
|
14
|
+
version: 1,
|
|
15
|
+
canvasSize,
|
|
16
|
+
objects
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Deserialize drawing state from JSON.
|
|
22
|
+
*/
|
|
23
|
+
function deserializeObjects(json) {
|
|
24
|
+
try {
|
|
25
|
+
const data = JSON.parse(json);
|
|
26
|
+
if (!data.objects || !data.canvasSize) return null;
|
|
27
|
+
return {
|
|
28
|
+
objects: data.objects,
|
|
29
|
+
canvasSize: data.canvasSize
|
|
30
|
+
};
|
|
31
|
+
} catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Generate a unique ID for drawing objects.
|
|
38
|
+
*/
|
|
39
|
+
function generateId() {
|
|
40
|
+
return Date.now().toString(36) + Math.random().toString(36).substring(2, 8);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=serialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["serializeObjects","objects","canvasSize","JSON","stringify","version","deserializeObjects","json","data","parse","generateId","Date","now","toString","Math","random","substring"],"sourceRoot":"../../../src","sources":["utils/serialization.ts"],"mappings":";;;;;;;;AAEA;AACA;AACA;AACO,SAASA,gBAAgBA,CAC9BC,OAAwB,EACxBC,UAAgB,EACR;EACR,OAAOC,IAAI,CAACC,SAAS,CAAC;IACpBC,OAAO,EAAE,CAAC;IACVH,UAAU;IACVD;EACF,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACO,SAASK,kBAAkBA,CAACC,IAAY,EAGtC;EACP,IAAI;IACF,MAAMC,IAAI,GAAGL,IAAI,CAACM,KAAK,CAACF,IAAI,CAI3B;IACD,IAAI,CAACC,IAAI,CAACP,OAAO,IAAI,CAACO,IAAI,CAACN,UAAU,EAAE,OAAO,IAAI;IAClD,OAAO;MACLD,OAAO,EAAEO,IAAI,CAACP,OAAO;MACrBC,UAAU,EAAEM,IAAI,CAACN;IACnB,CAAC;EACH,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;;AAEA;AACA;AACA;AACO,SAASQ,UAAUA,CAAA,EAAW;EACnC,OAAOC,IAAI,CAACC,GAAG,CAAC,CAAC,CAACC,QAAQ,CAAC,EAAE,CAAC,GAAGC,IAAI,CAACC,MAAM,CAAC,CAAC,CAACF,QAAQ,CAAC,EAAE,CAAC,CAACG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7E","ignoreList":[]}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.detectShape = detectShape;
|
|
7
|
+
/**
|
|
8
|
+
* Count the number of direction changes (inflections) in a series of points.
|
|
9
|
+
* An inflection is when the general direction of movement reverses or sharply changes.
|
|
10
|
+
*/
|
|
11
|
+
function countInflections(points, startIndex = 0) {
|
|
12
|
+
if (points.length < 3) return 0;
|
|
13
|
+
let inflections = 0;
|
|
14
|
+
for (let i = Math.max(startIndex, 1); i < points.length - 1; i++) {
|
|
15
|
+
const prev = points[i - 1];
|
|
16
|
+
const curr = points[i];
|
|
17
|
+
const next = points[i + 1];
|
|
18
|
+
const dx1 = curr.x - prev.x;
|
|
19
|
+
const dy1 = curr.y - prev.y;
|
|
20
|
+
const dx2 = next.x - curr.x;
|
|
21
|
+
const dy2 = next.y - curr.y;
|
|
22
|
+
|
|
23
|
+
// Cross product sign change indicates direction change
|
|
24
|
+
const cross = dx1 * dy2 - dy1 * dx2;
|
|
25
|
+
if (i > Math.max(startIndex, 1)) {
|
|
26
|
+
const prevPrev = points[i - 2];
|
|
27
|
+
const pdx1 = prev.x - prevPrev.x;
|
|
28
|
+
const pdy1 = prev.y - prevPrev.y;
|
|
29
|
+
const prevCross = pdx1 * dy1 - pdy1 * dx1;
|
|
30
|
+
if (prevCross * cross < 0) {
|
|
31
|
+
inflections++;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return inflections;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Compute total angle traversed by the path.
|
|
40
|
+
* Used for circle detection (should be ~2π for a full circle).
|
|
41
|
+
*/
|
|
42
|
+
function totalAngleTraversed(points) {
|
|
43
|
+
if (points.length < 3) return 0;
|
|
44
|
+
let totalAngle = 0;
|
|
45
|
+
for (let i = 1; i < points.length - 1; i++) {
|
|
46
|
+
const prev = points[i - 1];
|
|
47
|
+
const curr = points[i];
|
|
48
|
+
const next = points[i + 1];
|
|
49
|
+
const a1 = Math.atan2(curr.y - prev.y, curr.x - prev.x);
|
|
50
|
+
const a2 = Math.atan2(next.y - curr.y, next.x - curr.x);
|
|
51
|
+
let delta = a2 - a1;
|
|
52
|
+
|
|
53
|
+
// Normalize to [-π, π]
|
|
54
|
+
while (delta > Math.PI) delta -= 2 * Math.PI;
|
|
55
|
+
while (delta < -Math.PI) delta += 2 * Math.PI;
|
|
56
|
+
totalAngle += delta;
|
|
57
|
+
}
|
|
58
|
+
return totalAngle;
|
|
59
|
+
}
|
|
60
|
+
function dist(a, b) {
|
|
61
|
+
const dx = a.x - b.x;
|
|
62
|
+
const dy = a.y - b.y;
|
|
63
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
64
|
+
}
|
|
65
|
+
function boundingRect(points) {
|
|
66
|
+
let minX = Infinity;
|
|
67
|
+
let minY = Infinity;
|
|
68
|
+
let maxX = -Infinity;
|
|
69
|
+
let maxY = -Infinity;
|
|
70
|
+
for (const p of points) {
|
|
71
|
+
if (p.x < minX) minX = p.x;
|
|
72
|
+
if (p.y < minY) minY = p.y;
|
|
73
|
+
if (p.x > maxX) maxX = p.x;
|
|
74
|
+
if (p.y > maxY) maxY = p.y;
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
x: minX,
|
|
78
|
+
y: minY,
|
|
79
|
+
width: maxX - minX,
|
|
80
|
+
height: maxY - minY
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Attempt to detect a geometric shape from freehand points.
|
|
85
|
+
* Returns the detected shape or null if no shape is recognized.
|
|
86
|
+
*
|
|
87
|
+
* Points should be in pixel coordinates. Duration in milliseconds.
|
|
88
|
+
*/
|
|
89
|
+
function detectShape(points, durationMs) {
|
|
90
|
+
if (points.length < 5) return null;
|
|
91
|
+
const first = points[0];
|
|
92
|
+
const last = points[points.length - 1];
|
|
93
|
+
const startEndDist = dist(first, last);
|
|
94
|
+
const inflections = countInflections(points);
|
|
95
|
+
|
|
96
|
+
// ── Circle detection ──
|
|
97
|
+
// Duration < 1.5s, inflections ≤ 5, distance start↔end < threshold,
|
|
98
|
+
// total angle ≈ 2π (±45°)
|
|
99
|
+
if (durationMs < 1500 && inflections <= 5 && startEndDist < 150) {
|
|
100
|
+
const totalAngle = Math.abs(totalAngleTraversed(points));
|
|
101
|
+
const twoPi = 2 * Math.PI;
|
|
102
|
+
const tolerance = Math.PI / 4; // 45°
|
|
103
|
+
|
|
104
|
+
if (Math.abs(totalAngle - twoPi) < tolerance) {
|
|
105
|
+
const bbox = boundingRect(points);
|
|
106
|
+
return {
|
|
107
|
+
type: "circle",
|
|
108
|
+
from: {
|
|
109
|
+
x: bbox.x,
|
|
110
|
+
y: bbox.y
|
|
111
|
+
},
|
|
112
|
+
to: {
|
|
113
|
+
x: bbox.x + bbox.width,
|
|
114
|
+
y: bbox.y + bbox.height
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// ── Rectangle detection ──
|
|
121
|
+
// Duration < 12s, inflections ≤ 15, distance start↔end < threshold
|
|
122
|
+
if (durationMs < 12000 && inflections <= 15 && startEndDist < 30) {
|
|
123
|
+
const bbox = boundingRect(points);
|
|
124
|
+
return {
|
|
125
|
+
type: "rectangle",
|
|
126
|
+
from: {
|
|
127
|
+
x: bbox.x,
|
|
128
|
+
y: bbox.y
|
|
129
|
+
},
|
|
130
|
+
to: {
|
|
131
|
+
x: bbox.x + bbox.width,
|
|
132
|
+
y: bbox.y + bbox.height
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ── Line detection ──
|
|
138
|
+
// Duration < 4s, inflections ≤ 4 (checked from 11th point onward)
|
|
139
|
+
if (durationMs < 4000 && points.length >= 11) {
|
|
140
|
+
const lineInflections = countInflections(points, 10);
|
|
141
|
+
if (lineInflections <= 4) {
|
|
142
|
+
return {
|
|
143
|
+
type: "line",
|
|
144
|
+
from: first,
|
|
145
|
+
to: last
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=shapeDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["countInflections","points","startIndex","length","inflections","i","Math","max","prev","curr","next","dx1","x","dy1","y","dx2","dy2","cross","prevPrev","pdx1","pdy1","prevCross","totalAngleTraversed","totalAngle","a1","atan2","a2","delta","PI","dist","a","b","dx","dy","sqrt","boundingRect","minX","Infinity","minY","maxX","maxY","p","width","height","detectShape","durationMs","first","last","startEndDist","abs","twoPi","tolerance","bbox","type","from","to","lineInflections"],"sourceRoot":"../../../src","sources":["utils/shapeDetection.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.buildSmoothedPath = buildSmoothedPath;
|
|
7
|
+
exports.buildSmoothedPathFromFlat = buildSmoothedPathFromFlat;
|
|
8
|
+
/**
|
|
9
|
+
* Build a smoothed SVG path string from an array of pixel-space points
|
|
10
|
+
* using quadratic Bezier curves through midpoints.
|
|
11
|
+
*
|
|
12
|
+
* This is the standard "midpoint smoothing" algorithm for touch-based drawing:
|
|
13
|
+
* each raw point becomes a control point, and the curve passes through the
|
|
14
|
+
* midpoints between consecutive raw points.
|
|
15
|
+
*/
|
|
16
|
+
function buildSmoothedPath(points) {
|
|
17
|
+
const n = points.length;
|
|
18
|
+
if (n === 0) return "";
|
|
19
|
+
if (n === 1) return `M ${points[0].x} ${points[0].y}`;
|
|
20
|
+
const first = points[0];
|
|
21
|
+
if (n === 2) {
|
|
22
|
+
const second = points[1];
|
|
23
|
+
return `M ${first.x} ${first.y} L ${second.x} ${second.y}`;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Start at first point
|
|
27
|
+
const parts = [`M ${first.x} ${first.y}`];
|
|
28
|
+
|
|
29
|
+
// Line to first midpoint
|
|
30
|
+
const p1 = points[1];
|
|
31
|
+
const m0x = (first.x + p1.x) / 2;
|
|
32
|
+
const m0y = (first.y + p1.y) / 2;
|
|
33
|
+
parts.push(`L ${m0x} ${m0y}`);
|
|
34
|
+
|
|
35
|
+
// Quadratic curves through midpoints
|
|
36
|
+
for (let i = 1; i < n - 1; i++) {
|
|
37
|
+
const cp = points[i];
|
|
38
|
+
const next = points[i + 1];
|
|
39
|
+
const mx = (cp.x + next.x) / 2;
|
|
40
|
+
const my = (cp.y + next.y) / 2;
|
|
41
|
+
parts.push(`Q ${cp.x} ${cp.y} ${mx} ${my}`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Line to last point
|
|
45
|
+
const last = points[n - 1];
|
|
46
|
+
parts.push(`L ${last.x} ${last.y}`);
|
|
47
|
+
return parts.join(" ");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Build a smoothed SVG path from a flat array [x0, y0, x1, y1, ...].
|
|
52
|
+
* Used in worklets where Point objects aren't available.
|
|
53
|
+
*/
|
|
54
|
+
function buildSmoothedPathFromFlat(coords) {
|
|
55
|
+
"worklet";
|
|
56
|
+
|
|
57
|
+
const n = coords.length / 2;
|
|
58
|
+
if (n < 1) return "";
|
|
59
|
+
if (n === 1) return `M ${coords[0]} ${coords[1]}`;
|
|
60
|
+
if (n === 2) {
|
|
61
|
+
return `M ${coords[0]} ${coords[1]} L ${coords[2]} ${coords[3]}`;
|
|
62
|
+
}
|
|
63
|
+
let svg = `M ${coords[0]} ${coords[1]}`;
|
|
64
|
+
|
|
65
|
+
// Line to first midpoint
|
|
66
|
+
const m0x = (coords[0] + coords[2]) / 2;
|
|
67
|
+
const m0y = (coords[1] + coords[3]) / 2;
|
|
68
|
+
svg += ` L ${m0x} ${m0y}`;
|
|
69
|
+
|
|
70
|
+
// Quadratic curves through midpoints
|
|
71
|
+
for (let i = 1; i < n - 1; i++) {
|
|
72
|
+
const cx = coords[i * 2];
|
|
73
|
+
const cy = coords[i * 2 + 1];
|
|
74
|
+
const nx = coords[(i + 1) * 2];
|
|
75
|
+
const ny = coords[(i + 1) * 2 + 1];
|
|
76
|
+
const mx = (cx + nx) / 2;
|
|
77
|
+
const my = (cy + ny) / 2;
|
|
78
|
+
svg += ` Q ${cx} ${cy} ${mx} ${my}`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Line to last point
|
|
82
|
+
svg += ` L ${coords[(n - 1) * 2]} ${coords[(n - 1) * 2 + 1]}`;
|
|
83
|
+
return svg;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=smoothing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["buildSmoothedPath","points","n","length","x","y","first","second","parts","p1","m0x","m0y","push","i","cp","next","mx","my","last","join","buildSmoothedPathFromFlat","coords","svg","cx","cy","nx","ny"],"sourceRoot":"../../../src","sources":["utils/smoothing.ts"],"mappings":"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","ignoreList":[]}
|