@yuzhouu/canvas-kit 0.1.2

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.
Files changed (263) hide show
  1. package/README.md +145 -0
  2. package/_vendor/canvas-core/bindings/BindingUtil.ts +92 -0
  3. package/_vendor/canvas-core/bindings/BindingUtilRegistry.ts +22 -0
  4. package/_vendor/canvas-core/bindings/arrow/arrowBindingHelpers.ts +52 -0
  5. package/_vendor/canvas-core/contextMenu.ts +85 -0
  6. package/_vendor/canvas-core/editor/Editor.ts +2614 -0
  7. package/_vendor/canvas-core/editor/HistoryManager.ts +83 -0
  8. package/_vendor/canvas-core/editor/StateNode.ts +162 -0
  9. package/_vendor/canvas-core/editor/camera.ts +6 -0
  10. package/_vendor/canvas-core/editor/clipboard.ts +478 -0
  11. package/_vendor/canvas-core/editor/commands.ts +833 -0
  12. package/_vendor/canvas-core/editor/edgeScroll.ts +37 -0
  13. package/_vendor/canvas-core/editor/editorComputedHelpers.ts +257 -0
  14. package/_vendor/canvas-core/editor/editorSelectionTransforms.ts +116 -0
  15. package/_vendor/canvas-core/editor/events.ts +93 -0
  16. package/_vendor/canvas-core/editor/index.ts +12 -0
  17. package/_vendor/canvas-core/editor/interactions.ts +101 -0
  18. package/_vendor/canvas-core/editor/internal.ts +22 -0
  19. package/_vendor/canvas-core/editor/managers/BindingManager.ts +262 -0
  20. package/_vendor/canvas-core/editor/managers/CameraManager.ts +147 -0
  21. package/_vendor/canvas-core/editor/managers/ClipboardManager.ts +32 -0
  22. package/_vendor/canvas-core/editor/managers/DocumentSnapshotManager.ts +256 -0
  23. package/_vendor/canvas-core/editor/managers/InputsManager.ts +319 -0
  24. package/_vendor/canvas-core/editor/managers/InteractionTransientManager.ts +218 -0
  25. package/_vendor/canvas-core/editor/managers/QueryManager.ts +837 -0
  26. package/_vendor/canvas-core/editor/managers/RenderWindowManager.ts +347 -0
  27. package/_vendor/canvas-core/editor/managers/SelectionLayoutManager.ts +196 -0
  28. package/_vendor/canvas-core/editor/managers/SelectionManager.ts +98 -0
  29. package/_vendor/canvas-core/editor/managers/SelectionOverlayManager.ts +308 -0
  30. package/_vendor/canvas-core/editor/managers/ShapeEditingManager.ts +226 -0
  31. package/_vendor/canvas-core/editor/managers/ShapeGeometryManager.ts +162 -0
  32. package/_vendor/canvas-core/editor/managers/ShapeHierarchyManager.ts +797 -0
  33. package/_vendor/canvas-core/editor/managers/SideEffectManager.ts +83 -0
  34. package/_vendor/canvas-core/editor/managers/SnapManager.ts +433 -0
  35. package/_vendor/canvas-core/editor/managers/SnapSnapshotBuilder.ts +430 -0
  36. package/_vendor/canvas-core/editor/managers/SpatialIndexManager.ts +354 -0
  37. package/_vendor/canvas-core/editor/managers/ToolManager.ts +81 -0
  38. package/_vendor/canvas-core/editor/managers/queryState.ts +583 -0
  39. package/_vendor/canvas-core/editor/managers/selectionGeometry.ts +287 -0
  40. package/_vendor/canvas-core/editor/managers/shapeOrder.ts +350 -0
  41. package/_vendor/canvas-core/editor/managers/shapeReparenting.ts +160 -0
  42. package/_vendor/canvas-core/editor/managers/snapCalculations.ts +412 -0
  43. package/_vendor/canvas-core/editor/managers/snapGeometry.ts +202 -0
  44. package/_vendor/canvas-core/editor/managers/snapIndicators.ts +403 -0
  45. package/_vendor/canvas-core/editor/managers/snapTypes.ts +122 -0
  46. package/_vendor/canvas-core/editor/queries/shapeTransforms.ts +171 -0
  47. package/_vendor/canvas-core/editor/renderWindow.ts +439 -0
  48. package/_vendor/canvas-core/editor/resizeGeometry.ts +654 -0
  49. package/_vendor/canvas-core/editor/selection.ts +489 -0
  50. package/_vendor/canvas-core/editor/selectionHandleInteractions.ts +43 -0
  51. package/_vendor/canvas-core/editor/selectionOverlay.ts +567 -0
  52. package/_vendor/canvas-core/exports/integrity.ts +174 -0
  53. package/_vendor/canvas-core/exports/svg.ts +494 -0
  54. package/_vendor/canvas-core/geometry/Box.ts +80 -0
  55. package/_vendor/canvas-core/geometry/Ellipse2d.ts +67 -0
  56. package/_vendor/canvas-core/geometry/Geometry2d.ts +52 -0
  57. package/_vendor/canvas-core/geometry/Mat.ts +92 -0
  58. package/_vendor/canvas-core/geometry/Polyline2d.ts +63 -0
  59. package/_vendor/canvas-core/geometry/Rectangle2d.ts +64 -0
  60. package/_vendor/canvas-core/geometry/Vec.ts +123 -0
  61. package/_vendor/canvas-core/geometry/index.ts +13 -0
  62. package/_vendor/canvas-core/geometry/segments.ts +65 -0
  63. package/_vendor/canvas-core/index.ts +391 -0
  64. package/_vendor/canvas-core/plugins/index.ts +5 -0
  65. package/_vendor/canvas-core/plugins/types.ts +53 -0
  66. package/_vendor/canvas-core/reactivity.ts +16 -0
  67. package/_vendor/canvas-core/schema/records.ts +221 -0
  68. package/_vendor/canvas-core/schema/snapshots.ts +527 -0
  69. package/_vendor/canvas-core/shapes/ShapeUtil.ts +516 -0
  70. package/_vendor/canvas-core/shapes/ShapeUtilRegistry.ts +26 -0
  71. package/_vendor/canvas-core/shapes/capabilities.ts +67 -0
  72. package/_vendor/canvas-core/shapes/types.ts +20 -0
  73. package/_vendor/canvas-core/toolbar.ts +148 -0
  74. package/_vendor/canvas-core/tools/hand/HandTool.ts +75 -0
  75. package/_vendor/canvas-core/tools/index.ts +2 -0
  76. package/_vendor/canvas-core/tools/select/SelectTool.ts +33 -0
  77. package/_vendor/canvas-core/tools/select/selectContainment.ts +104 -0
  78. package/_vendor/canvas-core/tools/select/selectToolHelpers.ts +801 -0
  79. package/_vendor/canvas-core/tools/select/states/BrushingState.ts +145 -0
  80. package/_vendor/canvas-core/tools/select/states/DraggingSelectionHandleInteractionState.ts +116 -0
  81. package/_vendor/canvas-core/tools/select/states/IdleState.ts +159 -0
  82. package/_vendor/canvas-core/tools/select/states/PointingCanvasState.ts +41 -0
  83. package/_vendor/canvas-core/tools/select/states/PointingResizeHandleState.ts +78 -0
  84. package/_vendor/canvas-core/tools/select/states/PointingRotateHandleState.ts +64 -0
  85. package/_vendor/canvas-core/tools/select/states/PointingSelectionHandleInteractionState.ts +34 -0
  86. package/_vendor/canvas-core/tools/select/states/PointingShapeState.ts +140 -0
  87. package/_vendor/canvas-core/tools/select/states/ResizingState.ts +171 -0
  88. package/_vendor/canvas-core/tools/select/states/RotatingState.ts +124 -0
  89. package/_vendor/canvas-core/tools/select/states/SelectStateNode.ts +128 -0
  90. package/_vendor/canvas-core/tools/select/states/TranslatingState.ts +139 -0
  91. package/_vendor/canvas-core/tools/select/states/index.ts +11 -0
  92. package/_vendor/canvas-plugin-api/feature.ts +204 -0
  93. package/_vendor/canvas-plugin-api/index.ts +142 -0
  94. package/_vendor/canvas-product-react/api/apiRegistry.ts +35 -0
  95. package/_vendor/canvas-product-react/api/canvasProductApi.ts +422 -0
  96. package/_vendor/canvas-product-react/api/index.ts +31 -0
  97. package/_vendor/canvas-product-react/capabilities/clipboard/clipboardService.ts +36 -0
  98. package/_vendor/canvas-product-react/capabilities/clipboard/systemClipboard.ts +245 -0
  99. package/_vendor/canvas-product-react/capabilities/context-menu/systemContextMenu.ts +396 -0
  100. package/_vendor/canvas-product-react/capabilities/context-menu/useContextMenuSurface.ts +59 -0
  101. package/_vendor/canvas-product-react/capabilities/export/useSvgExport.ts +156 -0
  102. package/_vendor/canvas-product-react/capabilities/history/useHistoryControls.ts +23 -0
  103. package/_vendor/canvas-product-react/capabilities/pages/usePageControls.ts +41 -0
  104. package/_vendor/canvas-product-react/capabilities/toolbar/systemToolbar.ts +490 -0
  105. package/_vendor/canvas-product-react/capabilities/toolbar/useToolbarSurfaces.ts +92 -0
  106. package/_vendor/canvas-product-react/capabilities/zoom/useZoomControls.ts +27 -0
  107. package/_vendor/canvas-product-react/index.ts +84 -0
  108. package/_vendor/canvas-product-react/persistence/index.ts +18 -0
  109. package/_vendor/canvas-product-react/persistence/localSnapshotPersistence.ts +294 -0
  110. package/_vendor/canvas-product-react/runtime/CanvasProductRoot.tsx +250 -0
  111. package/_vendor/canvas-product-react/runtime/productDefinition.ts +72 -0
  112. package/_vendor/canvas-product-react/runtime/productServices.ts +96 -0
  113. package/_vendor/canvas-react/components/CanvasView.tsx +796 -0
  114. package/_vendor/canvas-react/components/OverlayLayer.tsx +879 -0
  115. package/_vendor/canvas-react/components/PageSpace.tsx +34 -0
  116. package/_vendor/canvas-react/components/ShapeLayer.tsx +428 -0
  117. package/_vendor/canvas-react/components/index.ts +4 -0
  118. package/_vendor/canvas-react/hooks/useEditor.ts +11 -0
  119. package/_vendor/canvas-react/hooks/useValue.ts +14 -0
  120. package/_vendor/canvas-react/host/CanvasRendererRegistryContext.tsx +14 -0
  121. package/_vendor/canvas-react/host/contextMenuRegistry.ts +61 -0
  122. package/_vendor/canvas-react/host/domEventGuards.ts +61 -0
  123. package/_vendor/canvas-react/host/index.ts +38 -0
  124. package/_vendor/canvas-react/host/pluginHost.ts +635 -0
  125. package/_vendor/canvas-react/host/rendererRegistry.tsx +58 -0
  126. package/_vendor/canvas-react/host/toolbarRegistry.ts +100 -0
  127. package/_vendor/canvas-react/index.ts +3 -0
  128. package/_vendor/plugin-arrow/ArrowBindingUtil.ts +239 -0
  129. package/_vendor/plugin-arrow/ArrowShapeUtil.ts +311 -0
  130. package/_vendor/plugin-arrow/ArrowTool.ts +208 -0
  131. package/_vendor/plugin-arrow/arrowGeometry.ts +441 -0
  132. package/_vendor/plugin-arrow/arrowTerminalBindingResolver.ts +253 -0
  133. package/_vendor/plugin-arrow/arrowTerminalCommands.ts +230 -0
  134. package/_vendor/plugin-arrow/canvas.tsx +92 -0
  135. package/_vendor/plugin-arrow/core.ts +409 -0
  136. package/_vendor/plugin-arrow/feature.ts +20 -0
  137. package/_vendor/plugin-arrow/index.ts +28 -0
  138. package/_vendor/plugin-arrow/selectionHandleInteractions.ts +154 -0
  139. package/_vendor/plugin-arrow/types.ts +63 -0
  140. package/_vendor/plugin-draw/DrawShapeRenderer.tsx +60 -0
  141. package/_vendor/plugin-draw/DrawShapeUtil.ts +372 -0
  142. package/_vendor/plugin-draw/DrawTool.ts +444 -0
  143. package/_vendor/plugin-draw/canvas.tsx +24 -0
  144. package/_vendor/plugin-draw/core.ts +515 -0
  145. package/_vendor/plugin-draw/drawGeometry.ts +491 -0
  146. package/_vendor/plugin-draw/drawHitTest.ts +271 -0
  147. package/_vendor/plugin-draw/drawInterpolation.ts +250 -0
  148. package/_vendor/plugin-draw/drawPath.ts +550 -0
  149. package/_vendor/plugin-draw/drawSegments.ts +106 -0
  150. package/_vendor/plugin-draw/drawSelectionTransform.ts +67 -0
  151. package/_vendor/plugin-draw/drawShapeGeometry.ts +307 -0
  152. package/_vendor/plugin-draw/drawStrokeGeometry.ts +454 -0
  153. package/_vendor/plugin-draw/feature.ts +20 -0
  154. package/_vendor/plugin-draw/index.ts +31 -0
  155. package/_vendor/plugin-draw/types.ts +36 -0
  156. package/_vendor/plugin-eraser/EraserTool.ts +297 -0
  157. package/_vendor/plugin-eraser/canvas.tsx +616 -0
  158. package/_vendor/plugin-eraser/core.ts +49 -0
  159. package/_vendor/plugin-eraser/feature.ts +20 -0
  160. package/_vendor/plugin-eraser/index.ts +4 -0
  161. package/_vendor/plugin-frame/FrameShapeUtil.ts +173 -0
  162. package/_vendor/plugin-frame/FrameTool.ts +225 -0
  163. package/_vendor/plugin-frame/canvas.tsx +75 -0
  164. package/_vendor/plugin-frame/core.ts +534 -0
  165. package/_vendor/plugin-frame/feature.ts +20 -0
  166. package/_vendor/plugin-frame/index.ts +6 -0
  167. package/_vendor/plugin-geo/GeoShapeUtil.ts +463 -0
  168. package/_vendor/plugin-geo/GeoTools.ts +247 -0
  169. package/_vendor/plugin-geo/canvas.tsx +90 -0
  170. package/_vendor/plugin-geo/core.ts +495 -0
  171. package/_vendor/plugin-geo/feature.ts +20 -0
  172. package/_vendor/plugin-geo/index.ts +7 -0
  173. package/_vendor/plugin-geo/types.ts +27 -0
  174. package/_vendor/plugin-group/GroupShapeUtil.ts +59 -0
  175. package/_vendor/plugin-group/canvas.tsx +59 -0
  176. package/_vendor/plugin-group/core.ts +40 -0
  177. package/_vendor/plugin-group/feature.ts +20 -0
  178. package/_vendor/plugin-group/index.ts +5 -0
  179. package/_vendor/plugin-image/ImageShapeUtil.ts +95 -0
  180. package/_vendor/plugin-image/canvas.tsx +212 -0
  181. package/_vendor/plugin-image/core.ts +542 -0
  182. package/_vendor/plugin-image/crop.ts +770 -0
  183. package/_vendor/plugin-image/cropInteractions.ts +350 -0
  184. package/_vendor/plugin-image/cropSession.ts +38 -0
  185. package/_vendor/plugin-image/feature.ts +20 -0
  186. package/_vendor/plugin-image/index.ts +29 -0
  187. package/_vendor/plugin-image/types.ts +55 -0
  188. package/_vendor/plugin-image-product-react/ImageImportController.tsx +143 -0
  189. package/_vendor/plugin-image-product-react/imageAssetService.ts +52 -0
  190. package/_vendor/plugin-image-product-react/imageBlobStore.ts +315 -0
  191. package/_vendor/plugin-image-product-react/imageHostActions.ts +438 -0
  192. package/_vendor/plugin-image-product-react/imageProductApi.ts +88 -0
  193. package/_vendor/plugin-image-product-react/imageToolbarHostBridge.ts +48 -0
  194. package/_vendor/plugin-image-product-react/imageToolbarRuntime.ts +21 -0
  195. package/_vendor/plugin-image-product-react/index.ts +60 -0
  196. package/_vendor/plugin-image-product-react/snapshotGuards.ts +33 -0
  197. package/_vendor/plugin-image-product-react/svgImageAssetInliner.ts +54 -0
  198. package/_vendor/plugin-image-product-react/useImageImport.ts +64 -0
  199. package/_vendor/plugin-laser/LaserTool.ts +154 -0
  200. package/_vendor/plugin-laser/canvas.tsx +645 -0
  201. package/_vendor/plugin-laser/core.ts +49 -0
  202. package/_vendor/plugin-laser/feature.ts +20 -0
  203. package/_vendor/plugin-laser/index.ts +4 -0
  204. package/_vendor/plugin-text/ArrowLabelBindingUtil.ts +336 -0
  205. package/_vendor/plugin-text/GeoLabelBindingUtil.ts +391 -0
  206. package/_vendor/plugin-text/TextShapeSvgExporter.ts +101 -0
  207. package/_vendor/plugin-text/TextShapeUtil.ts +284 -0
  208. package/_vendor/plugin-text/TextTool.ts +228 -0
  209. package/_vendor/plugin-text/canvas.tsx +115 -0
  210. package/_vendor/plugin-text/core.ts +422 -0
  211. package/_vendor/plugin-text/feature.ts +20 -0
  212. package/_vendor/plugin-text/host/RichTextEditingBox.tsx +144 -0
  213. package/_vendor/plugin-text/host/RichTextToolbar.tsx +266 -0
  214. package/_vendor/plugin-text/host/TiptapTextEditor.tsx +191 -0
  215. package/_vendor/plugin-text/host/richTextRendering.tsx +49 -0
  216. package/_vendor/plugin-text/host/textDomSelection.ts +93 -0
  217. package/_vendor/plugin-text/host/textEditingBoxStyle.ts +36 -0
  218. package/_vendor/plugin-text/host/textEntryFocus.ts +307 -0
  219. package/_vendor/plugin-text/host/textFontLoader.ts +149 -0
  220. package/_vendor/plugin-text/host/textMeasurement.ts +258 -0
  221. package/_vendor/plugin-text/host/textMeasurementSync.ts +77 -0
  222. package/_vendor/plugin-text/host/textRangeSelection.ts +134 -0
  223. package/_vendor/plugin-text/host/textShapeRendererRuntime.tsx +89 -0
  224. package/_vendor/plugin-text/host/textShapeSync.ts +173 -0
  225. package/_vendor/plugin-text/host/tiptapTextEditorController.ts +148 -0
  226. package/_vendor/plugin-text/index.ts +18 -0
  227. package/_vendor/plugin-text/richTextUtils.ts +259 -0
  228. package/_vendor/plugin-text/textInteractions.ts +366 -0
  229. package/_vendor/plugin-text/textLabelHelpers.ts +235 -0
  230. package/_vendor/plugin-text/textShapeHelpers.ts +123 -0
  231. package/_vendor/plugin-text/textStyle.ts +96 -0
  232. package/_vendor/plugin-text/textTypes.ts +48 -0
  233. package/_vendor/signals/atom.ts +74 -0
  234. package/_vendor/signals/computed.ts +132 -0
  235. package/_vendor/signals/core.ts +130 -0
  236. package/_vendor/signals/effect.ts +117 -0
  237. package/_vendor/signals/index.ts +9 -0
  238. package/_vendor/signals/types.ts +17 -0
  239. package/_vendor/store/Store.ts +171 -0
  240. package/_vendor/store/diff.ts +229 -0
  241. package/_vendor/store/history.ts +177 -0
  242. package/_vendor/store/index.ts +32 -0
  243. package/_vendor/store/types.ts +37 -0
  244. package/api/canvasKitApi.d.ts +29 -0
  245. package/index.css +3 -0
  246. package/index.d.ts +16 -0
  247. package/index.mjs +1 -0
  248. package/internal-modules.d.ts +187 -0
  249. package/package.json +48 -0
  250. package/product/Shell.d.ts +19 -0
  251. package/product/chromeContext.d.ts +70 -0
  252. package/product/createCanvasKitEditor.d.ts +6 -0
  253. package/product/index.d.ts +7 -0
  254. package/product/persistence.d.ts +3 -0
  255. package/product/product.d.ts +22 -0
  256. package/product/useCanvasClipboardShortcuts.d.ts +6 -0
  257. package/product-iyBbEPIs.mjs +4 -0
  258. package/product.mjs +1 -0
  259. package/standard/extensions.d.ts +1 -0
  260. package/standard/index.d.ts +3 -0
  261. package/standard/standardApi.d.ts +91 -0
  262. package/standard-BmrxwqpJ.mjs +44 -0
  263. package/standard.mjs +1 -0
@@ -0,0 +1,491 @@
1
+ import { Box, Vec } from "@land/canvas-core";
2
+ import {
3
+ getDrawSegmentsFromPoints,
4
+ getFlattenedDrawSegmentPoints,
5
+ } from "./drawPath";
6
+ import {
7
+ cloneDrawSegments,
8
+ mapDrawSegmentCoordinates,
9
+ mapDrawShapeSegmentsToBounds,
10
+ translateDrawSegments,
11
+ } from "./drawSegments";
12
+ import {
13
+ mapPageDrawSegmentsToSelectionLocal,
14
+ mapSelectionLocalDrawSegmentsToPage,
15
+ mirrorSelectionLocalDrawSegments,
16
+ type DrawSelectionFlipInput,
17
+ type DrawSelectionResizeInput,
18
+ } from "./drawSelectionTransform";
19
+ import {
20
+ createDrawGeometryFromDerivedData,
21
+ createTranslatedDrawGeometry,
22
+ getDrawPointGeometry,
23
+ getDrawSegmentGeometry,
24
+ type DrawShapeGeometry,
25
+ type DrawShapeSamplingStats,
26
+ } from "./drawShapeGeometry";
27
+ import type {
28
+ DrawShapePoint,
29
+ DrawShapeProps,
30
+ DrawShapeRecord,
31
+ DrawShapeSegment,
32
+ } from "./types";
33
+
34
+ export { getDrawPointGeometry, getDrawSegmentGeometry };
35
+ export type {
36
+ DrawShapeGeometry,
37
+ DrawShapeSamplingStats,
38
+ } from "./drawShapeGeometry";
39
+
40
+ type DrawLocalGeometryCacheKey = Pick<DrawShapeRecord, "props">;
41
+ type DrawPositionedGeometryCacheKey = Pick<DrawShapeRecord, "x" | "y" | "props">;
42
+ type DrawPageGeometryCacheKey = Pick<
43
+ DrawShapeRecord,
44
+ "x" | "y" | "rotation" | "scaleX" | "scaleY" | "props"
45
+ >;
46
+
47
+ export interface DrawShapeDiagnostics extends DrawShapeSamplingStats {
48
+ hasPath: boolean;
49
+ hasSelectionPath: boolean;
50
+ outlineVertexCount: number;
51
+ }
52
+
53
+ const drawLocalGeometryCache = new WeakMap<object, DrawShapeGeometry>();
54
+ const drawPositionedGeometryCache = new WeakMap<object, DrawShapeGeometry>();
55
+ const drawPageGeometryCache = new WeakMap<object, DrawShapeGeometry>();
56
+
57
+ function getDrawShapeSourceSegments(
58
+ props: Pick<DrawShapeProps, "segments">,
59
+ ): readonly DrawShapeSegment[] {
60
+ return props.segments;
61
+ }
62
+
63
+ function getInsetBounds(
64
+ bounds: Box,
65
+ padding: { left: number; right: number; top: number; bottom: number },
66
+ ): Box {
67
+ const width = Math.max(0, bounds.w - padding.left - padding.right);
68
+ const height = Math.max(0, bounds.h - padding.top - padding.bottom);
69
+
70
+ return new Box(bounds.x + padding.left, bounds.y + padding.top, width, height);
71
+ }
72
+
73
+ function getTargetPointBoundsFromSelectionBounds(
74
+ currentPointBounds: Box,
75
+ currentStrokeBounds: Box,
76
+ nextSelectionBounds: Box,
77
+ ): Box {
78
+ return getInsetBounds(nextSelectionBounds, {
79
+ left: currentPointBounds.minX - currentStrokeBounds.minX,
80
+ right: currentStrokeBounds.maxX - currentPointBounds.maxX,
81
+ top: currentPointBounds.minY - currentStrokeBounds.minY,
82
+ bottom: currentStrokeBounds.maxY - currentPointBounds.maxY,
83
+ });
84
+ }
85
+
86
+ function fitDrawSegmentsToSelectionStrokeBounds({
87
+ segments,
88
+ strokeWidth,
89
+ isPen,
90
+ isClosed,
91
+ targetSelectionStrokeBounds,
92
+ }: {
93
+ segments: readonly DrawShapeSegment[];
94
+ strokeWidth: number;
95
+ isPen: boolean;
96
+ isClosed: boolean;
97
+ targetSelectionStrokeBounds: Box;
98
+ }): DrawShapeSegment[] {
99
+ let fittedSegments = cloneDrawSegments(segments);
100
+
101
+ for (let pass = 0; pass < 2; pass += 1) {
102
+ const geometry = getDrawSegmentGeometry(
103
+ fittedSegments,
104
+ strokeWidth,
105
+ isPen,
106
+ isClosed,
107
+ );
108
+ const targetPointBounds = getTargetPointBoundsFromSelectionBounds(
109
+ geometry.pointBounds,
110
+ geometry.localBounds,
111
+ targetSelectionStrokeBounds,
112
+ );
113
+ fittedSegments = mapDrawShapeSegmentsToBounds(
114
+ fittedSegments,
115
+ geometry.pointBounds,
116
+ targetPointBounds,
117
+ );
118
+ }
119
+
120
+ return fittedSegments;
121
+ }
122
+
123
+ function getDrawShapePageCenter(
124
+ shape: DrawPageGeometryCacheKey,
125
+ localGeometry: Pick<DrawShapeGeometry, "localBounds">,
126
+ ): Vec {
127
+ return new Vec(
128
+ shape.x + localGeometry.localBounds.center.x,
129
+ shape.y + localGeometry.localBounds.center.y,
130
+ );
131
+ }
132
+
133
+ function positionedDrawPointToPagePoint(
134
+ shape: DrawPageGeometryCacheKey,
135
+ point: Vec,
136
+ center: Vec,
137
+ ): Vec {
138
+ if (shape.rotation === 0 && shape.scaleX === 1 && shape.scaleY === 1) {
139
+ return point;
140
+ }
141
+ const offset = point.sub(center);
142
+
143
+ return center.add(
144
+ new Vec(offset.x * shape.scaleX, offset.y * shape.scaleY).rot(
145
+ shape.rotation,
146
+ ),
147
+ );
148
+ }
149
+
150
+ export interface NormalizedDrawShape {
151
+ x: number;
152
+ y: number;
153
+ segments: DrawShapeSegment[];
154
+ pointBounds: Box;
155
+ localBounds: Box;
156
+ renderBounds: Box;
157
+ path: string | null;
158
+ selectionPath: string | null;
159
+ fillPath: string | null;
160
+ outlineVertices: Vec[];
161
+ outlinePolygons: Vec[][];
162
+ sampling: DrawShapeSamplingStats;
163
+ }
164
+
165
+ export function getDrawShapeLocalGeometry(
166
+ shape: DrawLocalGeometryCacheKey,
167
+ ): DrawShapeGeometry {
168
+ const cacheKey = shape as object;
169
+ const cached = drawLocalGeometryCache.get(cacheKey);
170
+ if (cached) {
171
+ return cached;
172
+ }
173
+
174
+ const geometry = getDrawSegmentGeometry(
175
+ getDrawShapeSourceSegments(shape.props),
176
+ shape.props.strokeWidth,
177
+ shape.props.isPen ?? false,
178
+ shape.props.isClosed,
179
+ );
180
+ drawLocalGeometryCache.set(cacheKey, geometry);
181
+ return geometry;
182
+ }
183
+
184
+ export function normalizeDrawShapeFromSegmentSet(
185
+ segments: readonly DrawShapeSegment[],
186
+ strokeWidth: number,
187
+ isPen = false,
188
+ isClosed = false,
189
+ ): NormalizedDrawShape {
190
+ const geometry = getDrawSegmentGeometry(segments, strokeWidth, isPen, isClosed);
191
+ const pointBounds = geometry.pointBounds;
192
+ const normalizedSegments = mapDrawSegmentCoordinates(
193
+ geometry.normalizedSegments,
194
+ (point) => new Vec(point.x - pointBounds.x, point.y - pointBounds.y),
195
+ );
196
+ const normalizedGeometry = getDrawSegmentGeometry(
197
+ normalizedSegments,
198
+ strokeWidth,
199
+ isPen,
200
+ isClosed,
201
+ );
202
+
203
+ return {
204
+ x: pointBounds.x,
205
+ y: pointBounds.y,
206
+ segments: normalizedGeometry.normalizedSegments,
207
+ pointBounds: normalizedGeometry.pointBounds,
208
+ localBounds: normalizedGeometry.localBounds,
209
+ renderBounds: normalizedGeometry.renderBounds,
210
+ path: normalizedGeometry.path,
211
+ selectionPath: normalizedGeometry.selectionPath,
212
+ fillPath: normalizedGeometry.fillPath,
213
+ outlineVertices: normalizedGeometry.outlineVertices,
214
+ outlinePolygons: normalizedGeometry.outlinePolygons,
215
+ sampling: normalizedGeometry.sampling,
216
+ };
217
+ }
218
+
219
+ export function normalizeDrawShapeFromPointSet(
220
+ points: readonly DrawShapePoint[],
221
+ strokeWidth: number,
222
+ isPen = false,
223
+ isClosed = false,
224
+ ): NormalizedDrawShape {
225
+ return normalizeDrawShapeFromSegmentSet(
226
+ getDrawSegmentsFromPoints(points),
227
+ strokeWidth,
228
+ isPen,
229
+ isClosed,
230
+ );
231
+ }
232
+
233
+ export function normalizeDrawShapeFromPagePoints(
234
+ pagePoints: readonly DrawShapePoint[],
235
+ strokeWidth: number,
236
+ isPen = false,
237
+ isClosed = false,
238
+ ): NormalizedDrawShape {
239
+ return normalizeDrawShapeFromPointSet(pagePoints, strokeWidth, isPen, isClosed);
240
+ }
241
+
242
+ export function normalizeDrawShapeFromPageSegments(
243
+ pageSegments: readonly DrawShapeSegment[],
244
+ strokeWidth: number,
245
+ isPen = false,
246
+ isClosed = false,
247
+ ): NormalizedDrawShape {
248
+ return normalizeDrawShapeFromSegmentSet(
249
+ pageSegments,
250
+ strokeWidth,
251
+ isPen,
252
+ isClosed,
253
+ );
254
+ }
255
+
256
+ export function getDrawShapePositionedSegments(
257
+ shape: Pick<DrawShapeRecord, "x" | "y" | "props">,
258
+ ): DrawShapeSegment[] {
259
+ return translateDrawSegments(
260
+ getDrawShapeSourceSegments(shape.props),
261
+ shape.x,
262
+ shape.y,
263
+ );
264
+ }
265
+
266
+ export function getDrawShapePositionedPoints(
267
+ shape: Pick<DrawShapeRecord, "x" | "y" | "props">,
268
+ ): DrawShapePoint[] {
269
+ return getFlattenedDrawSegmentPoints(getDrawShapePositionedSegments(shape));
270
+ }
271
+
272
+ export function getDrawShapePositionedGeometry(
273
+ shape: DrawPositionedGeometryCacheKey,
274
+ ): DrawShapeGeometry {
275
+ const cacheKey = shape as object;
276
+ const cached = drawPositionedGeometryCache.get(cacheKey);
277
+ if (cached) {
278
+ return cached;
279
+ }
280
+
281
+ const geometry = createTranslatedDrawGeometry(
282
+ getDrawShapeLocalGeometry(shape),
283
+ shape.props.strokeWidth,
284
+ shape.x,
285
+ shape.y,
286
+ shape.props.isClosed,
287
+ );
288
+ drawPositionedGeometryCache.set(cacheKey, geometry);
289
+ return geometry;
290
+ }
291
+
292
+ export function getDrawShapePagePoints(shape: DrawShapeRecord): DrawShapePoint[] {
293
+ return getFlattenedDrawSegmentPoints(getDrawShapePageSegments(shape));
294
+ }
295
+
296
+ export function getDrawShapePageSegments(shape: DrawShapeRecord): DrawShapeSegment[] {
297
+ const localGeometry = getDrawShapeLocalGeometry(shape);
298
+ const center = getDrawShapePageCenter(shape, localGeometry);
299
+ return mapDrawSegmentCoordinates(
300
+ getDrawShapePositionedSegments(shape),
301
+ (point) => positionedDrawPointToPagePoint(shape, point, center),
302
+ );
303
+ }
304
+
305
+ export function normalizeTransformedDrawShape(
306
+ shape: DrawShapeRecord,
307
+ ): NormalizedDrawShape {
308
+ return normalizeDrawShapeFromPageSegments(
309
+ getDrawShapePageSegments(shape),
310
+ shape.props.strokeWidth,
311
+ shape.props.isPen ?? false,
312
+ shape.props.isClosed,
313
+ );
314
+ }
315
+
316
+ export function getDrawShapePageGeometry(
317
+ shape: DrawPageGeometryCacheKey,
318
+ ): DrawShapeGeometry {
319
+ const cacheKey = shape as object;
320
+ const cached = drawPageGeometryCache.get(cacheKey);
321
+ if (cached) {
322
+ return cached;
323
+ }
324
+
325
+ if (shape.rotation === 0 && shape.scaleX === 1 && shape.scaleY === 1) {
326
+ const geometry = getDrawShapePositionedGeometry(shape);
327
+ drawPageGeometryCache.set(cacheKey, geometry);
328
+ return geometry;
329
+ }
330
+
331
+ const localGeometry = getDrawShapeLocalGeometry(shape);
332
+ const center = getDrawShapePageCenter(shape, localGeometry);
333
+ const pageSegments = mapDrawSegmentCoordinates(
334
+ localGeometry.normalizedSegments,
335
+ (point) =>
336
+ positionedDrawPointToPagePoint(
337
+ shape,
338
+ new Vec(point.x + shape.x, point.y + shape.y),
339
+ center,
340
+ ),
341
+ );
342
+ const outlineVertices = localGeometry.outlineVertices.map((point) =>
343
+ positionedDrawPointToPagePoint(
344
+ shape,
345
+ new Vec(point.x + shape.x, point.y + shape.y),
346
+ center,
347
+ ),
348
+ );
349
+ const outlinePolygons = localGeometry.outlinePolygons.map((polygon) =>
350
+ polygon.map((point) =>
351
+ positionedDrawPointToPagePoint(
352
+ shape,
353
+ new Vec(point.x + shape.x, point.y + shape.y),
354
+ center,
355
+ ),
356
+ ),
357
+ );
358
+ const geometry = createDrawGeometryFromDerivedData({
359
+ segments: pageSegments,
360
+ outlineVertices,
361
+ outlinePolygons,
362
+ strokeWidth: shape.props.strokeWidth,
363
+ sampling: localGeometry.sampling,
364
+ isClosed: shape.props.isClosed,
365
+ });
366
+ drawPageGeometryCache.set(cacheKey, geometry);
367
+ return geometry;
368
+ }
369
+
370
+ export function resizeDrawShapeToSelectionBounds(
371
+ shape: DrawShapeRecord,
372
+ input: DrawSelectionResizeInput,
373
+ ): NormalizedDrawShape {
374
+ const selectionLocalSegments = mapPageDrawSegmentsToSelectionLocal(
375
+ getDrawShapePageSegments(shape),
376
+ input,
377
+ );
378
+ const resizedSelectionLocalSegments = fitDrawSegmentsToSelectionStrokeBounds({
379
+ segments: selectionLocalSegments,
380
+ strokeWidth: shape.props.strokeWidth,
381
+ isPen: shape.props.isPen ?? false,
382
+ isClosed: shape.props.isClosed,
383
+ targetSelectionStrokeBounds: input.targetSelectionStrokeBounds,
384
+ });
385
+ let transformedSelectionLocalSegments = resizedSelectionLocalSegments;
386
+ if (input.scaleX < 0) {
387
+ transformedSelectionLocalSegments = mirrorSelectionLocalDrawSegments(
388
+ transformedSelectionLocalSegments,
389
+ {
390
+ axis: "horizontal",
391
+ selectionMirrorBounds: input.targetSelectionStrokeBounds,
392
+ selectionRotation: input.selectionRotation,
393
+ selectionRotationCenter: input.selectionRotationCenter,
394
+ },
395
+ );
396
+ }
397
+ if (input.scaleY < 0) {
398
+ transformedSelectionLocalSegments = mirrorSelectionLocalDrawSegments(
399
+ transformedSelectionLocalSegments,
400
+ {
401
+ axis: "vertical",
402
+ selectionMirrorBounds: input.targetSelectionStrokeBounds,
403
+ selectionRotation: input.selectionRotation,
404
+ selectionRotationCenter: input.selectionRotationCenter,
405
+ },
406
+ );
407
+ }
408
+ const resizedPageSegments = mapSelectionLocalDrawSegmentsToPage(
409
+ transformedSelectionLocalSegments,
410
+ input,
411
+ );
412
+
413
+ return normalizeDrawShapeFromPageSegments(
414
+ resizedPageSegments,
415
+ shape.props.strokeWidth,
416
+ shape.props.isPen ?? false,
417
+ shape.props.isClosed,
418
+ );
419
+ }
420
+
421
+ export function flipDrawShapeInSelectionBounds(
422
+ shape: DrawShapeRecord,
423
+ input: DrawSelectionFlipInput,
424
+ ): NormalizedDrawShape {
425
+ const selectionLocalSegments = mapPageDrawSegmentsToSelectionLocal(
426
+ getDrawShapePageSegments(shape),
427
+ input,
428
+ );
429
+ const flippedSelectionLocalSegments = mirrorSelectionLocalDrawSegments(
430
+ selectionLocalSegments,
431
+ input,
432
+ );
433
+ const flippedPageSegments = mapSelectionLocalDrawSegmentsToPage(
434
+ flippedSelectionLocalSegments,
435
+ input,
436
+ );
437
+
438
+ return normalizeDrawShapeFromPageSegments(
439
+ flippedPageSegments,
440
+ shape.props.strokeWidth,
441
+ shape.props.isPen ?? false,
442
+ shape.props.isClosed,
443
+ );
444
+ }
445
+
446
+ export function resizeDrawShapeToPageBounds(
447
+ shape: Pick<DrawShapeRecord, "x" | "y" | "props">,
448
+ nextPageBounds: Box,
449
+ ): NormalizedDrawShape {
450
+ const positionedSegments = getDrawShapePositionedSegments(shape);
451
+ const currentGeometry = getDrawShapePositionedGeometry(shape);
452
+ const currentPointBounds = currentGeometry.pointBounds;
453
+ const currentStrokeBounds = currentGeometry.localBounds;
454
+ const targetPointBounds = getInsetBounds(nextPageBounds, {
455
+ left: currentPointBounds.minX - currentStrokeBounds.minX,
456
+ right: currentStrokeBounds.maxX - currentPointBounds.maxX,
457
+ top: currentPointBounds.minY - currentStrokeBounds.minY,
458
+ bottom: currentStrokeBounds.maxY - currentPointBounds.maxY,
459
+ });
460
+ const resizedPositionedSegments = mapDrawShapeSegmentsToBounds(
461
+ positionedSegments,
462
+ currentPointBounds,
463
+ targetPointBounds,
464
+ );
465
+
466
+ return normalizeDrawShapeFromPageSegments(
467
+ resizedPositionedSegments,
468
+ shape.props.strokeWidth,
469
+ shape.props.isPen ?? false,
470
+ shape.props.isClosed,
471
+ );
472
+ }
473
+
474
+ export function cloneDrawShapeSegmentsForUpdate(
475
+ segments: readonly DrawShapeSegment[],
476
+ ): DrawShapeSegment[] {
477
+ return cloneDrawSegments(segments);
478
+ }
479
+
480
+ export function getDrawShapeDiagnostics(
481
+ shape: DrawLocalGeometryCacheKey,
482
+ ): DrawShapeDiagnostics {
483
+ const geometry = getDrawShapeLocalGeometry(shape);
484
+
485
+ return {
486
+ ...geometry.sampling,
487
+ hasPath: geometry.path !== null,
488
+ hasSelectionPath: geometry.selectionPath !== null,
489
+ outlineVertexCount: geometry.outlineVertices.length,
490
+ };
491
+ }