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.
Files changed (299) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -0
  3. package/lib/commonjs/ImageEditor.js +141 -0
  4. package/lib/commonjs/ImageEditor.js.map +1 -0
  5. package/lib/commonjs/annotations/AnnotationView.js +42 -0
  6. package/lib/commonjs/annotations/AnnotationView.js.map +1 -0
  7. package/lib/commonjs/annotations/ArrowAnnotation.js +29 -0
  8. package/lib/commonjs/annotations/ArrowAnnotation.js.map +1 -0
  9. package/lib/commonjs/annotations/CircleAnnotation.js +31 -0
  10. package/lib/commonjs/annotations/CircleAnnotation.js.map +1 -0
  11. package/lib/commonjs/annotations/FreehandAnnotation.js +29 -0
  12. package/lib/commonjs/annotations/FreehandAnnotation.js.map +1 -0
  13. package/lib/commonjs/annotations/MarkerAnnotation.js +27 -0
  14. package/lib/commonjs/annotations/MarkerAnnotation.js.map +1 -0
  15. package/lib/commonjs/annotations/RotatedGroup.js +34 -0
  16. package/lib/commonjs/annotations/RotatedGroup.js.map +1 -0
  17. package/lib/commonjs/annotations/TextAnnotation.js +40 -0
  18. package/lib/commonjs/annotations/TextAnnotation.js.map +1 -0
  19. package/lib/commonjs/annotations/geometry.js +73 -0
  20. package/lib/commonjs/annotations/geometry.js.map +1 -0
  21. package/lib/commonjs/annotations/geometryPure.js +104 -0
  22. package/lib/commonjs/annotations/geometryPure.js.map +1 -0
  23. package/lib/commonjs/canvas/AnnotationLayer.js +58 -0
  24. package/lib/commonjs/canvas/AnnotationLayer.js.map +1 -0
  25. package/lib/commonjs/canvas/BaseImageLayer.js +27 -0
  26. package/lib/commonjs/canvas/BaseImageLayer.js.map +1 -0
  27. package/lib/commonjs/canvas/CropOverlay.js +135 -0
  28. package/lib/commonjs/canvas/CropOverlay.js.map +1 -0
  29. package/lib/commonjs/canvas/EditorCanvas.js +91 -0
  30. package/lib/commonjs/canvas/EditorCanvas.js.map +1 -0
  31. package/lib/commonjs/canvas/InFlightLayer.js +152 -0
  32. package/lib/commonjs/canvas/InFlightLayer.js.map +1 -0
  33. package/lib/commonjs/canvas/SelectionOverlay.js +90 -0
  34. package/lib/commonjs/canvas/SelectionOverlay.js.map +1 -0
  35. package/lib/commonjs/constants.js +56 -0
  36. package/lib/commonjs/constants.js.map +1 -0
  37. package/lib/commonjs/context/EditorContext.js +132 -0
  38. package/lib/commonjs/context/EditorContext.js.map +1 -0
  39. package/lib/commonjs/export/drawScene.js +97 -0
  40. package/lib/commonjs/export/drawScene.js.map +1 -0
  41. package/lib/commonjs/export/exportImage.js +92 -0
  42. package/lib/commonjs/export/exportImage.js.map +1 -0
  43. package/lib/commonjs/gestures/applyTransform.js +79 -0
  44. package/lib/commonjs/gestures/applyTransform.js.map +1 -0
  45. package/lib/commonjs/gestures/createAnnotation.js +73 -0
  46. package/lib/commonjs/gestures/createAnnotation.js.map +1 -0
  47. package/lib/commonjs/gestures/handles.js +53 -0
  48. package/lib/commonjs/gestures/handles.js.map +1 -0
  49. package/lib/commonjs/gestures/hitTest.js +72 -0
  50. package/lib/commonjs/gestures/hitTest.js.map +1 -0
  51. package/lib/commonjs/gestures/useCropGesture.js +149 -0
  52. package/lib/commonjs/gestures/useCropGesture.js.map +1 -0
  53. package/lib/commonjs/gestures/useEditorGestures.js +289 -0
  54. package/lib/commonjs/gestures/useEditorGestures.js.map +1 -0
  55. package/lib/commonjs/image/disposeRegistry.js +63 -0
  56. package/lib/commonjs/image/disposeRegistry.js.map +1 -0
  57. package/lib/commonjs/image/useLoadedImage.js +121 -0
  58. package/lib/commonjs/image/useLoadedImage.js.map +1 -0
  59. package/lib/commonjs/index.js +52 -0
  60. package/lib/commonjs/index.js.map +1 -0
  61. package/lib/commonjs/package.json +1 -0
  62. package/lib/commonjs/state/history.js +85 -0
  63. package/lib/commonjs/state/history.js.map +1 -0
  64. package/lib/commonjs/state/selectors.js +19 -0
  65. package/lib/commonjs/state/selectors.js.map +1 -0
  66. package/lib/commonjs/state/useEditorReducer.js +83 -0
  67. package/lib/commonjs/state/useEditorReducer.js.map +1 -0
  68. package/lib/commonjs/toolbar/ColorPicker.js +84 -0
  69. package/lib/commonjs/toolbar/ColorPicker.js.map +1 -0
  70. package/lib/commonjs/toolbar/CropControls.js +65 -0
  71. package/lib/commonjs/toolbar/CropControls.js.map +1 -0
  72. package/lib/commonjs/toolbar/RotationSlider.js +73 -0
  73. package/lib/commonjs/toolbar/RotationSlider.js.map +1 -0
  74. package/lib/commonjs/toolbar/TextInputOverlay.js +108 -0
  75. package/lib/commonjs/toolbar/TextInputOverlay.js.map +1 -0
  76. package/lib/commonjs/toolbar/ToolButton.js +56 -0
  77. package/lib/commonjs/toolbar/ToolButton.js.map +1 -0
  78. package/lib/commonjs/toolbar/Toolbar.js +137 -0
  79. package/lib/commonjs/toolbar/Toolbar.js.map +1 -0
  80. package/lib/commonjs/types.js +47 -0
  81. package/lib/commonjs/types.js.map +1 -0
  82. package/lib/commonjs/utils/color.js +37 -0
  83. package/lib/commonjs/utils/color.js.map +1 -0
  84. package/lib/commonjs/utils/id.js +14 -0
  85. package/lib/commonjs/utils/id.js.map +1 -0
  86. package/lib/commonjs/utils/math.js +277 -0
  87. package/lib/commonjs/utils/math.js.map +1 -0
  88. package/lib/module/ImageEditor.js +138 -0
  89. package/lib/module/ImageEditor.js.map +1 -0
  90. package/lib/module/annotations/AnnotationView.js +39 -0
  91. package/lib/module/annotations/AnnotationView.js.map +1 -0
  92. package/lib/module/annotations/ArrowAnnotation.js +26 -0
  93. package/lib/module/annotations/ArrowAnnotation.js.map +1 -0
  94. package/lib/module/annotations/CircleAnnotation.js +27 -0
  95. package/lib/module/annotations/CircleAnnotation.js.map +1 -0
  96. package/lib/module/annotations/FreehandAnnotation.js +25 -0
  97. package/lib/module/annotations/FreehandAnnotation.js.map +1 -0
  98. package/lib/module/annotations/MarkerAnnotation.js +23 -0
  99. package/lib/module/annotations/MarkerAnnotation.js.map +1 -0
  100. package/lib/module/annotations/RotatedGroup.js +29 -0
  101. package/lib/module/annotations/RotatedGroup.js.map +1 -0
  102. package/lib/module/annotations/TextAnnotation.js +37 -0
  103. package/lib/module/annotations/TextAnnotation.js.map +1 -0
  104. package/lib/module/annotations/geometry.js +56 -0
  105. package/lib/module/annotations/geometry.js.map +1 -0
  106. package/lib/module/annotations/geometryPure.js +100 -0
  107. package/lib/module/annotations/geometryPure.js.map +1 -0
  108. package/lib/module/canvas/AnnotationLayer.js +55 -0
  109. package/lib/module/canvas/AnnotationLayer.js.map +1 -0
  110. package/lib/module/canvas/BaseImageLayer.js +23 -0
  111. package/lib/module/canvas/BaseImageLayer.js.map +1 -0
  112. package/lib/module/canvas/CropOverlay.js +131 -0
  113. package/lib/module/canvas/CropOverlay.js.map +1 -0
  114. package/lib/module/canvas/EditorCanvas.js +88 -0
  115. package/lib/module/canvas/EditorCanvas.js.map +1 -0
  116. package/lib/module/canvas/InFlightLayer.js +149 -0
  117. package/lib/module/canvas/InFlightLayer.js.map +1 -0
  118. package/lib/module/canvas/SelectionOverlay.js +85 -0
  119. package/lib/module/canvas/SelectionOverlay.js.map +1 -0
  120. package/lib/module/constants.js +52 -0
  121. package/lib/module/constants.js.map +1 -0
  122. package/lib/module/context/EditorContext.js +126 -0
  123. package/lib/module/context/EditorContext.js.map +1 -0
  124. package/lib/module/export/drawScene.js +93 -0
  125. package/lib/module/export/drawScene.js.map +1 -0
  126. package/lib/module/export/exportImage.js +88 -0
  127. package/lib/module/export/exportImage.js.map +1 -0
  128. package/lib/module/gestures/applyTransform.js +75 -0
  129. package/lib/module/gestures/applyTransform.js.map +1 -0
  130. package/lib/module/gestures/createAnnotation.js +65 -0
  131. package/lib/module/gestures/createAnnotation.js.map +1 -0
  132. package/lib/module/gestures/handles.js +49 -0
  133. package/lib/module/gestures/handles.js.map +1 -0
  134. package/lib/module/gestures/hitTest.js +69 -0
  135. package/lib/module/gestures/hitTest.js.map +1 -0
  136. package/lib/module/gestures/useCropGesture.js +145 -0
  137. package/lib/module/gestures/useCropGesture.js.map +1 -0
  138. package/lib/module/gestures/useEditorGestures.js +285 -0
  139. package/lib/module/gestures/useEditorGestures.js.map +1 -0
  140. package/lib/module/image/disposeRegistry.js +57 -0
  141. package/lib/module/image/disposeRegistry.js.map +1 -0
  142. package/lib/module/image/useLoadedImage.js +117 -0
  143. package/lib/module/image/useLoadedImage.js.map +1 -0
  144. package/lib/module/index.js +8 -0
  145. package/lib/module/index.js.map +1 -0
  146. package/lib/module/package.json +1 -0
  147. package/lib/module/state/history.js +76 -0
  148. package/lib/module/state/history.js.map +1 -0
  149. package/lib/module/state/selectors.js +14 -0
  150. package/lib/module/state/selectors.js.map +1 -0
  151. package/lib/module/state/useEditorReducer.js +79 -0
  152. package/lib/module/state/useEditorReducer.js.map +1 -0
  153. package/lib/module/toolbar/ColorPicker.js +80 -0
  154. package/lib/module/toolbar/ColorPicker.js.map +1 -0
  155. package/lib/module/toolbar/CropControls.js +62 -0
  156. package/lib/module/toolbar/CropControls.js.map +1 -0
  157. package/lib/module/toolbar/RotationSlider.js +69 -0
  158. package/lib/module/toolbar/RotationSlider.js.map +1 -0
  159. package/lib/module/toolbar/TextInputOverlay.js +105 -0
  160. package/lib/module/toolbar/TextInputOverlay.js.map +1 -0
  161. package/lib/module/toolbar/ToolButton.js +52 -0
  162. package/lib/module/toolbar/ToolButton.js.map +1 -0
  163. package/lib/module/toolbar/Toolbar.js +133 -0
  164. package/lib/module/toolbar/Toolbar.js.map +1 -0
  165. package/lib/module/types.js +43 -0
  166. package/lib/module/types.js.map +1 -0
  167. package/lib/module/utils/color.js +33 -0
  168. package/lib/module/utils/color.js.map +1 -0
  169. package/lib/module/utils/id.js +10 -0
  170. package/lib/module/utils/id.js.map +1 -0
  171. package/lib/module/utils/math.js +258 -0
  172. package/lib/module/utils/math.js.map +1 -0
  173. package/lib/typescript/src/ImageEditor.d.ts +9 -0
  174. package/lib/typescript/src/ImageEditor.d.ts.map +1 -0
  175. package/lib/typescript/src/annotations/AnnotationView.d.ts +6 -0
  176. package/lib/typescript/src/annotations/AnnotationView.d.ts.map +1 -0
  177. package/lib/typescript/src/annotations/ArrowAnnotation.d.ts +5 -0
  178. package/lib/typescript/src/annotations/ArrowAnnotation.d.ts.map +1 -0
  179. package/lib/typescript/src/annotations/CircleAnnotation.d.ts +5 -0
  180. package/lib/typescript/src/annotations/CircleAnnotation.d.ts.map +1 -0
  181. package/lib/typescript/src/annotations/FreehandAnnotation.d.ts +5 -0
  182. package/lib/typescript/src/annotations/FreehandAnnotation.d.ts.map +1 -0
  183. package/lib/typescript/src/annotations/MarkerAnnotation.d.ts +5 -0
  184. package/lib/typescript/src/annotations/MarkerAnnotation.d.ts.map +1 -0
  185. package/lib/typescript/src/annotations/RotatedGroup.d.ts +13 -0
  186. package/lib/typescript/src/annotations/RotatedGroup.d.ts.map +1 -0
  187. package/lib/typescript/src/annotations/TextAnnotation.d.ts +10 -0
  188. package/lib/typescript/src/annotations/TextAnnotation.d.ts.map +1 -0
  189. package/lib/typescript/src/annotations/geometry.d.ts +11 -0
  190. package/lib/typescript/src/annotations/geometry.d.ts.map +1 -0
  191. package/lib/typescript/src/annotations/geometryPure.d.ts +14 -0
  192. package/lib/typescript/src/annotations/geometryPure.d.ts.map +1 -0
  193. package/lib/typescript/src/canvas/AnnotationLayer.d.ts +11 -0
  194. package/lib/typescript/src/canvas/AnnotationLayer.d.ts.map +1 -0
  195. package/lib/typescript/src/canvas/BaseImageLayer.d.ts +12 -0
  196. package/lib/typescript/src/canvas/BaseImageLayer.d.ts.map +1 -0
  197. package/lib/typescript/src/canvas/CropOverlay.d.ts +10 -0
  198. package/lib/typescript/src/canvas/CropOverlay.d.ts.map +1 -0
  199. package/lib/typescript/src/canvas/EditorCanvas.d.ts +18 -0
  200. package/lib/typescript/src/canvas/EditorCanvas.d.ts.map +1 -0
  201. package/lib/typescript/src/canvas/InFlightLayer.d.ts +12 -0
  202. package/lib/typescript/src/canvas/InFlightLayer.d.ts.map +1 -0
  203. package/lib/typescript/src/canvas/SelectionOverlay.d.ts +11 -0
  204. package/lib/typescript/src/canvas/SelectionOverlay.d.ts.map +1 -0
  205. package/lib/typescript/src/constants.d.ts +25 -0
  206. package/lib/typescript/src/constants.d.ts.map +1 -0
  207. package/lib/typescript/src/context/EditorContext.d.ts +66 -0
  208. package/lib/typescript/src/context/EditorContext.d.ts.map +1 -0
  209. package/lib/typescript/src/export/drawScene.d.ts +10 -0
  210. package/lib/typescript/src/export/drawScene.d.ts.map +1 -0
  211. package/lib/typescript/src/export/exportImage.d.ts +23 -0
  212. package/lib/typescript/src/export/exportImage.d.ts.map +1 -0
  213. package/lib/typescript/src/gestures/applyTransform.d.ts +17 -0
  214. package/lib/typescript/src/gestures/applyTransform.d.ts.map +1 -0
  215. package/lib/typescript/src/gestures/createAnnotation.d.ts +11 -0
  216. package/lib/typescript/src/gestures/createAnnotation.d.ts.map +1 -0
  217. package/lib/typescript/src/gestures/handles.d.ts +17 -0
  218. package/lib/typescript/src/gestures/handles.d.ts.map +1 -0
  219. package/lib/typescript/src/gestures/hitTest.d.ts +9 -0
  220. package/lib/typescript/src/gestures/hitTest.d.ts.map +1 -0
  221. package/lib/typescript/src/gestures/useCropGesture.d.ts +7 -0
  222. package/lib/typescript/src/gestures/useCropGesture.d.ts.map +1 -0
  223. package/lib/typescript/src/gestures/useEditorGestures.d.ts +8 -0
  224. package/lib/typescript/src/gestures/useEditorGestures.d.ts.map +1 -0
  225. package/lib/typescript/src/image/disposeRegistry.d.ts +25 -0
  226. package/lib/typescript/src/image/disposeRegistry.d.ts.map +1 -0
  227. package/lib/typescript/src/image/useLoadedImage.d.ts +23 -0
  228. package/lib/typescript/src/image/useLoadedImage.d.ts.map +1 -0
  229. package/lib/typescript/src/index.d.ts +6 -0
  230. package/lib/typescript/src/index.d.ts.map +1 -0
  231. package/lib/typescript/src/state/history.d.ts +23 -0
  232. package/lib/typescript/src/state/history.d.ts.map +1 -0
  233. package/lib/typescript/src/state/selectors.d.ts +5 -0
  234. package/lib/typescript/src/state/selectors.d.ts.map +1 -0
  235. package/lib/typescript/src/state/useEditorReducer.d.ts +32 -0
  236. package/lib/typescript/src/state/useEditorReducer.d.ts.map +1 -0
  237. package/lib/typescript/src/toolbar/ColorPicker.d.ts +7 -0
  238. package/lib/typescript/src/toolbar/ColorPicker.d.ts.map +1 -0
  239. package/lib/typescript/src/toolbar/CropControls.d.ts +3 -0
  240. package/lib/typescript/src/toolbar/CropControls.d.ts.map +1 -0
  241. package/lib/typescript/src/toolbar/RotationSlider.d.ts +8 -0
  242. package/lib/typescript/src/toolbar/RotationSlider.d.ts.map +1 -0
  243. package/lib/typescript/src/toolbar/TextInputOverlay.d.ts +9 -0
  244. package/lib/typescript/src/toolbar/TextInputOverlay.d.ts.map +1 -0
  245. package/lib/typescript/src/toolbar/ToolButton.d.ts +7 -0
  246. package/lib/typescript/src/toolbar/ToolButton.d.ts.map +1 -0
  247. package/lib/typescript/src/toolbar/Toolbar.d.ts +4 -0
  248. package/lib/typescript/src/toolbar/Toolbar.d.ts.map +1 -0
  249. package/lib/typescript/src/types.d.ts +170 -0
  250. package/lib/typescript/src/types.d.ts.map +1 -0
  251. package/lib/typescript/src/utils/color.d.ts +8 -0
  252. package/lib/typescript/src/utils/color.d.ts.map +1 -0
  253. package/lib/typescript/src/utils/id.d.ts +3 -0
  254. package/lib/typescript/src/utils/id.d.ts.map +1 -0
  255. package/lib/typescript/src/utils/math.d.ts +68 -0
  256. package/lib/typescript/src/utils/math.d.ts.map +1 -0
  257. package/package.json +90 -0
  258. package/src/ImageEditor.tsx +133 -0
  259. package/src/annotations/AnnotationView.tsx +24 -0
  260. package/src/annotations/ArrowAnnotation.tsx +26 -0
  261. package/src/annotations/CircleAnnotation.tsx +22 -0
  262. package/src/annotations/FreehandAnnotation.tsx +22 -0
  263. package/src/annotations/MarkerAnnotation.tsx +20 -0
  264. package/src/annotations/RotatedGroup.tsx +28 -0
  265. package/src/annotations/TextAnnotation.tsx +42 -0
  266. package/src/annotations/geometry.ts +62 -0
  267. package/src/annotations/geometryPure.ts +73 -0
  268. package/src/canvas/AnnotationLayer.tsx +43 -0
  269. package/src/canvas/BaseImageLayer.tsx +28 -0
  270. package/src/canvas/CropOverlay.tsx +92 -0
  271. package/src/canvas/EditorCanvas.tsx +70 -0
  272. package/src/canvas/InFlightLayer.tsx +140 -0
  273. package/src/canvas/SelectionOverlay.tsx +92 -0
  274. package/src/constants.ts +46 -0
  275. package/src/context/EditorContext.tsx +229 -0
  276. package/src/export/drawScene.ts +120 -0
  277. package/src/export/exportImage.ts +111 -0
  278. package/src/gestures/applyTransform.ts +76 -0
  279. package/src/gestures/createAnnotation.ts +92 -0
  280. package/src/gestures/handles.ts +50 -0
  281. package/src/gestures/hitTest.ts +79 -0
  282. package/src/gestures/useCropGesture.ts +123 -0
  283. package/src/gestures/useEditorGestures.ts +308 -0
  284. package/src/image/disposeRegistry.ts +59 -0
  285. package/src/image/useLoadedImage.ts +131 -0
  286. package/src/index.ts +32 -0
  287. package/src/state/history.ts +71 -0
  288. package/src/state/selectors.ts +16 -0
  289. package/src/state/useEditorReducer.ts +93 -0
  290. package/src/toolbar/ColorPicker.tsx +72 -0
  291. package/src/toolbar/CropControls.tsx +46 -0
  292. package/src/toolbar/RotationSlider.tsx +56 -0
  293. package/src/toolbar/TextInputOverlay.tsx +104 -0
  294. package/src/toolbar/ToolButton.tsx +46 -0
  295. package/src/toolbar/Toolbar.tsx +110 -0
  296. package/src/types.ts +203 -0
  297. package/src/utils/color.ts +34 -0
  298. package/src/utils/id.ts +7 -0
  299. package/src/utils/math.ts +222 -0
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ import { useMemo } from 'react';
4
+ import { Path } from '@shopify/react-native-skia';
5
+ import { annotationCenter, buildFreehandPath } from './geometry';
6
+ import { RotatedGroup } from './RotatedGroup';
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ export function FreehandAnnotationView({
9
+ a
10
+ }) {
11
+ const path = useMemo(() => buildFreehandPath(a.points), [a.points]);
12
+ return /*#__PURE__*/_jsx(RotatedGroup, {
13
+ center: annotationCenter(a),
14
+ rotation: a.rotation,
15
+ children: /*#__PURE__*/_jsx(Path, {
16
+ path: path,
17
+ color: a.strokeColor,
18
+ style: "stroke",
19
+ strokeWidth: a.strokeWidth,
20
+ strokeCap: "round",
21
+ strokeJoin: "round"
22
+ })
23
+ });
24
+ }
25
+ //# sourceMappingURL=FreehandAnnotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","Path","annotationCenter","buildFreehandPath","RotatedGroup","jsx","_jsx","FreehandAnnotationView","a","path","points","center","rotation","children","color","strokeColor","style","strokeWidth","strokeCap","strokeJoin"],"sourceRoot":"..\\..\\..\\src","sources":["annotations/FreehandAnnotation.tsx"],"mappings":";;AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,IAAI,QAAQ,4BAA4B;AAGjD,SAASC,gBAAgB,EAAEC,iBAAiB,QAAQ,YAAY;AAChE,SAASC,YAAY,QAAQ,gBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAE9C,OAAO,SAASC,sBAAsBA,CAAC;EAAEC;AAAiC,CAAC,EAAE;EAC3E,MAAMC,IAAI,GAAGT,OAAO,CAAC,MAAMG,iBAAiB,CAACK,CAAC,CAACE,MAAM,CAAC,EAAE,CAACF,CAAC,CAACE,MAAM,CAAC,CAAC;EACnE,oBACEJ,IAAA,CAACF,YAAY;IAACO,MAAM,EAAET,gBAAgB,CAACM,CAAC,CAAE;IAACI,QAAQ,EAAEJ,CAAC,CAACI,QAAS;IAAAC,QAAA,eAC9DP,IAAA,CAACL,IAAI;MACHQ,IAAI,EAAEA,IAAK;MACXK,KAAK,EAAEN,CAAC,CAACO,WAAY;MACrBC,KAAK,EAAC,QAAQ;MACdC,WAAW,EAAET,CAAC,CAACS,WAAY;MAC3BC,SAAS,EAAC,OAAO;MACjBC,UAAU,EAAC;IAAO,CACnB;EAAC,CACU,CAAC;AAEnB","ignoreList":[]}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ import { Rect } from '@shopify/react-native-skia';
4
+ import { annotationCenter } from './geometry';
5
+ import { RotatedGroup } from './RotatedGroup';
6
+ import { withOpacity } from '../utils/color';
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ export function MarkerAnnotationView({
9
+ a
10
+ }) {
11
+ return /*#__PURE__*/_jsx(RotatedGroup, {
12
+ center: annotationCenter(a),
13
+ rotation: a.rotation,
14
+ children: /*#__PURE__*/_jsx(Rect, {
15
+ x: a.rect.x,
16
+ y: a.rect.y,
17
+ width: a.rect.width,
18
+ height: a.rect.height,
19
+ color: withOpacity(a.color, a.opacity)
20
+ })
21
+ });
22
+ }
23
+ //# sourceMappingURL=MarkerAnnotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Rect","annotationCenter","RotatedGroup","withOpacity","jsx","_jsx","MarkerAnnotationView","a","center","rotation","children","x","rect","y","width","height","color","opacity"],"sourceRoot":"..\\..\\..\\src","sources":["annotations/MarkerAnnotation.tsx"],"mappings":";;AAAA,SAASA,IAAI,QAAQ,4BAA4B;AAGjD,SAASC,gBAAgB,QAAQ,YAAY;AAC7C,SAASC,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,WAAW,QAAQ,gBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAE7C,OAAO,SAASC,oBAAoBA,CAAC;EAAEC;AAA+B,CAAC,EAAE;EACvE,oBACEF,IAAA,CAACH,YAAY;IAACM,MAAM,EAAEP,gBAAgB,CAACM,CAAC,CAAE;IAACE,QAAQ,EAAEF,CAAC,CAACE,QAAS;IAAAC,QAAA,eAC9DL,IAAA,CAACL,IAAI;MACHW,CAAC,EAAEJ,CAAC,CAACK,IAAI,CAACD,CAAE;MACZE,CAAC,EAAEN,CAAC,CAACK,IAAI,CAACC,CAAE;MACZC,KAAK,EAAEP,CAAC,CAACK,IAAI,CAACE,KAAM;MACpBC,MAAM,EAAER,CAAC,CAACK,IAAI,CAACG,MAAO;MACtBC,KAAK,EAAEb,WAAW,CAACI,CAAC,CAACS,KAAK,EAAET,CAAC,CAACU,OAAO;IAAE,CACxC;EAAC,CACU,CAAC;AAEnB","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ import React from 'react';
4
+ import { Group } from '@shopify/react-native-skia';
5
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
6
+ /**
7
+ * Wraps children in a Skia Group rotated by `rotation` radians about `center`.
8
+ * Every annotation renderer uses this so its stored `rotation` is applied
9
+ * consistently (and identically in the off-screen export path).
10
+ */
11
+ export function RotatedGroup({
12
+ center,
13
+ rotation,
14
+ children
15
+ }) {
16
+ if (!rotation) {
17
+ return /*#__PURE__*/_jsx(_Fragment, {
18
+ children: children
19
+ });
20
+ }
21
+ return /*#__PURE__*/_jsx(Group, {
22
+ origin: center,
23
+ transform: [{
24
+ rotate: rotation
25
+ }],
26
+ children: children
27
+ });
28
+ }
29
+ //# sourceMappingURL=RotatedGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","Group","Fragment","_Fragment","jsx","_jsx","RotatedGroup","center","rotation","children","origin","transform","rotate"],"sourceRoot":"..\\..\\..\\src","sources":["annotations/RotatedGroup.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,KAAK,QAAQ,4BAA4B;AAAC,SAAAC,QAAA,IAAAC,SAAA,EAAAC,GAAA,IAAAC,IAAA;AAInD;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAC;EAC3BC,MAAM;EACNC,QAAQ;EACRC;AAKF,CAAC,EAAE;EACD,IAAI,CAACD,QAAQ,EAAE;IACb,oBAAOH,IAAA,CAAAF,SAAA;MAAAM,QAAA,EAAGA;IAAQ,CAAG,CAAC;EACxB;EACA,oBACEJ,IAAA,CAACJ,KAAK;IAACS,MAAM,EAAEH,MAAO;IAACI,SAAS,EAAE,CAAC;MAAEC,MAAM,EAAEJ;IAAS,CAAC,CAAE;IAAAC,QAAA,EACtDA;EAAQ,CACJ,CAAC;AAEZ","ignoreList":[]}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ import { useMemo } from 'react';
4
+ import { Text, matchFont } from '@shopify/react-native-skia';
5
+ import { annotationCenter } from './geometry';
6
+ import { RotatedGroup } from './RotatedGroup';
7
+
8
+ /**
9
+ * Renders text using a system font via `matchFont` (no bundled font file
10
+ * required). Honors explicit newlines; automatic width-wrapping is intentionally
11
+ * out of scope for v1 (would require SkParagraph + a shared FontMgr).
12
+ */
13
+ import { jsx as _jsx } from "react/jsx-runtime";
14
+ export function TextAnnotationView({
15
+ a
16
+ }) {
17
+ const font = useMemo(() => matchFont({
18
+ fontFamily: 'sans-serif',
19
+ fontSize: a.fontSize,
20
+ fontStyle: 'normal',
21
+ fontWeight: 'normal'
22
+ }), [a.fontSize]);
23
+ const lines = a.text.split('\n');
24
+ const lineHeight = a.fontSize * 1.2;
25
+ return /*#__PURE__*/_jsx(RotatedGroup, {
26
+ center: annotationCenter(a),
27
+ rotation: a.rotation,
28
+ children: lines.map((line, i) => /*#__PURE__*/_jsx(Text, {
29
+ x: a.origin.x,
30
+ y: a.origin.y + a.fontSize + i * lineHeight,
31
+ text: line,
32
+ font: font,
33
+ color: a.color
34
+ }, i))
35
+ });
36
+ }
37
+ //# sourceMappingURL=TextAnnotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","Text","matchFont","annotationCenter","RotatedGroup","jsx","_jsx","TextAnnotationView","a","font","fontFamily","fontSize","fontStyle","fontWeight","lines","text","split","lineHeight","center","rotation","children","map","line","i","x","origin","y","color"],"sourceRoot":"..\\..\\..\\src","sources":["annotations/TextAnnotation.tsx"],"mappings":";;AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,IAAI,EAAEC,SAAS,QAAQ,4BAA4B;AAG5D,SAASC,gBAAgB,QAAQ,YAAY;AAC7C,SAASC,YAAY,QAAQ,gBAAgB;;AAE7C;AACA;AACA;AACA;AACA;AAJA,SAAAC,GAAA,IAAAC,IAAA;AAKA,OAAO,SAASC,kBAAkBA,CAAC;EAAEC;AAA6B,CAAC,EAAE;EACnE,MAAMC,IAAI,GAAGT,OAAO,CAClB,MACEE,SAAS,CAAC;IACRQ,UAAU,EAAE,YAAY;IACxBC,QAAQ,EAAEH,CAAC,CAACG,QAAQ;IACpBC,SAAS,EAAE,QAAQ;IACnBC,UAAU,EAAE;EACd,CAAC,CAAC,EACJ,CAACL,CAAC,CAACG,QAAQ,CACb,CAAC;EAED,MAAMG,KAAK,GAAGN,CAAC,CAACO,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC;EAChC,MAAMC,UAAU,GAAGT,CAAC,CAACG,QAAQ,GAAG,GAAG;EAEnC,oBACEL,IAAA,CAACF,YAAY;IAACc,MAAM,EAAEf,gBAAgB,CAACK,CAAC,CAAE;IAACW,QAAQ,EAAEX,CAAC,CAACW,QAAS;IAAAC,QAAA,EAC7DN,KAAK,CAACO,GAAG,CAAC,CAACC,IAAI,EAAEC,CAAC,kBACjBjB,IAAA,CAACL,IAAI;MAEHuB,CAAC,EAAEhB,CAAC,CAACiB,MAAM,CAACD,CAAE;MACdE,CAAC,EAAElB,CAAC,CAACiB,MAAM,CAACC,CAAC,GAAGlB,CAAC,CAACG,QAAQ,GAAGY,CAAC,GAAGN,UAAW;MAC5CF,IAAI,EAAEO,IAAK;MACXb,IAAI,EAAEA,IAAK;MACXkB,KAAK,EAAEnB,CAAC,CAACmB;IAAM,GALVJ,CAMN,CACF;EAAC,CACU,CAAC;AAEnB","ignoreList":[]}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ import { Skia } from '@shopify/react-native-skia';
4
+ // Re-export the pure helpers so existing imports from './geometry' keep working.
5
+ // (Worklet/test-safe versions with no Skia dependency live in ./geometryPure.)
6
+ export { annotationCenter, annotationBounds } from './geometryPure';
7
+
8
+ /**
9
+ * Build a Skia path for an arrow (shaft + two arrowhead barbs).
10
+ * Not a worklet — it allocates an `SkPath` (a Skia object) on the JS thread.
11
+ */
12
+ export function buildArrowPath(start, end, headSize) {
13
+ const path = Skia.Path.Make();
14
+ path.moveTo(start.x, start.y);
15
+ path.lineTo(end.x, end.y);
16
+ const angle = Math.atan2(end.y - start.y, end.x - start.x);
17
+ const barb = Math.PI * 5 / 6; // 150° from the shaft direction
18
+ const b1 = {
19
+ x: end.x + headSize * Math.cos(angle + barb),
20
+ y: end.y + headSize * Math.sin(angle + barb)
21
+ };
22
+ const b2 = {
23
+ x: end.x + headSize * Math.cos(angle - barb),
24
+ y: end.y + headSize * Math.sin(angle - barb)
25
+ };
26
+ path.moveTo(end.x, end.y);
27
+ path.lineTo(b1.x, b1.y);
28
+ path.moveTo(end.x, end.y);
29
+ path.lineTo(b2.x, b2.y);
30
+ return path;
31
+ }
32
+
33
+ /** Build a smoothed (quadratic) path through freehand points. */
34
+ export function buildFreehandPath(points) {
35
+ const path = Skia.Path.Make();
36
+ if (points.length === 0) {
37
+ return path;
38
+ }
39
+ path.moveTo(points[0].x, points[0].y);
40
+ if (points.length === 1) {
41
+ // Draw a dot.
42
+ path.lineTo(points[0].x + 0.01, points[0].y + 0.01);
43
+ return path;
44
+ }
45
+ for (let i = 1; i < points.length - 1; i++) {
46
+ const p = points[i];
47
+ const next = points[i + 1];
48
+ const midX = (p.x + next.x) / 2;
49
+ const midY = (p.y + next.y) / 2;
50
+ path.quadTo(p.x, p.y, midX, midY);
51
+ }
52
+ const last = points[points.length - 1];
53
+ path.lineTo(last.x, last.y);
54
+ return path;
55
+ }
56
+ //# sourceMappingURL=geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Skia","annotationCenter","annotationBounds","buildArrowPath","start","end","headSize","path","Path","Make","moveTo","x","y","lineTo","angle","Math","atan2","barb","PI","b1","cos","sin","b2","buildFreehandPath","points","length","i","p","next","midX","midY","quadTo","last"],"sourceRoot":"..\\..\\..\\src","sources":["annotations/geometry.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Pure annotation geometry (no Skia imports) so it is safe to use from worklets
5
+ * AND from plain unit tests without loading the native Skia module.
6
+ */
7
+
8
+ import { boundsOfPoints } from '../utils/math';
9
+
10
+ /** Center of an annotation in image space (used as rotation/scale origin). */
11
+ export function annotationCenter(a) {
12
+ 'worklet';
13
+
14
+ switch (a.type) {
15
+ case 'circle':
16
+ return {
17
+ x: a.center.x,
18
+ y: a.center.y
19
+ };
20
+ case 'arrow':
21
+ return {
22
+ x: (a.start.x + a.end.x) / 2,
23
+ y: (a.start.y + a.end.y) / 2
24
+ };
25
+ case 'marker':
26
+ return {
27
+ x: a.rect.x + a.rect.width / 2,
28
+ y: a.rect.y + a.rect.height / 2
29
+ };
30
+ case 'freehand':
31
+ {
32
+ const b = boundsOfPoints(a.points);
33
+ return {
34
+ x: b.x + b.width / 2,
35
+ y: b.y + b.height / 2
36
+ };
37
+ }
38
+ case 'text':
39
+ return {
40
+ x: a.origin.x + a.width / 2,
41
+ y: a.origin.y + a.fontSize * 1.2 / 2
42
+ };
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Axis-aligned bounding box of an annotation in its LOCAL (unrotated) frame.
48
+ * The selection overlay rotates this box by `annotation.rotation` about the
49
+ * center when drawing handles.
50
+ */
51
+ export function annotationBounds(a) {
52
+ 'worklet';
53
+
54
+ switch (a.type) {
55
+ case 'circle':
56
+ return {
57
+ x: a.center.x - a.radius,
58
+ y: a.center.y - a.radius,
59
+ width: a.radius * 2,
60
+ height: a.radius * 2
61
+ };
62
+ case 'arrow':
63
+ {
64
+ const pad = a.headSize + a.strokeWidth;
65
+ const minX = Math.min(a.start.x, a.end.x) - pad;
66
+ const minY = Math.min(a.start.y, a.end.y) - pad;
67
+ const maxX = Math.max(a.start.x, a.end.x) + pad;
68
+ const maxY = Math.max(a.start.y, a.end.y) + pad;
69
+ return {
70
+ x: minX,
71
+ y: minY,
72
+ width: maxX - minX,
73
+ height: maxY - minY
74
+ };
75
+ }
76
+ case 'marker':
77
+ return {
78
+ ...a.rect
79
+ };
80
+ case 'freehand':
81
+ {
82
+ const b = boundsOfPoints(a.points);
83
+ const pad = a.strokeWidth / 2;
84
+ return {
85
+ x: b.x - pad,
86
+ y: b.y - pad,
87
+ width: b.width + pad * 2,
88
+ height: b.height + pad * 2
89
+ };
90
+ }
91
+ case 'text':
92
+ return {
93
+ x: a.origin.x,
94
+ y: a.origin.y,
95
+ width: a.width,
96
+ height: a.fontSize * 1.2
97
+ };
98
+ }
99
+ }
100
+ //# sourceMappingURL=geometryPure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["boundsOfPoints","annotationCenter","a","type","x","center","y","start","end","rect","width","height","b","points","origin","fontSize","annotationBounds","radius","pad","headSize","strokeWidth","minX","Math","min","minY","maxX","max","maxY"],"sourceRoot":"..\\..\\..\\src","sources":["annotations/geometryPure.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ import { Group } from '@shopify/react-native-skia';
4
+ import { useDerivedValue } from 'react-native-reanimated';
5
+ import { sortedByZ } from '../state/selectors';
6
+ import { AnnotationView } from '../annotations/AnnotationView';
7
+
8
+ /**
9
+ * Renders all committed annotations in paint order. The selected annotation is
10
+ * wrapped in a Group whose transform is driven by the `live` shared values, so
11
+ * move/resize/rotate previews run on the UI thread with zero React re-renders.
12
+ * When idle the live transform is identity, so this is a no-op visually.
13
+ */
14
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
15
+ export function AnnotationLayer({
16
+ editor
17
+ }) {
18
+ const {
19
+ annotations,
20
+ selectedId,
21
+ live,
22
+ editingTextId
23
+ } = editor;
24
+ const liveTransform = useDerivedValue(() => [{
25
+ translateX: live.tx.value
26
+ }, {
27
+ translateY: live.ty.value
28
+ }, {
29
+ rotate: live.rotate.value
30
+ }, {
31
+ scale: live.scale.value
32
+ }]);
33
+ const liveOrigin = useDerivedValue(() => live.origin.value);
34
+ return /*#__PURE__*/_jsx(_Fragment, {
35
+ children: sortedByZ(annotations).map(a => {
36
+ // Hide the text annotation currently being edited in the native overlay.
37
+ if (a.type === 'text' && a.id === editingTextId) {
38
+ return null;
39
+ }
40
+ if (a.id === selectedId) {
41
+ return /*#__PURE__*/_jsx(Group, {
42
+ origin: liveOrigin,
43
+ transform: liveTransform,
44
+ children: /*#__PURE__*/_jsx(AnnotationView, {
45
+ a: a
46
+ })
47
+ }, a.id);
48
+ }
49
+ return /*#__PURE__*/_jsx(AnnotationView, {
50
+ a: a
51
+ }, a.id);
52
+ })
53
+ });
54
+ }
55
+ //# sourceMappingURL=AnnotationLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Group","useDerivedValue","sortedByZ","AnnotationView","jsx","_jsx","Fragment","_Fragment","AnnotationLayer","editor","annotations","selectedId","live","editingTextId","liveTransform","translateX","tx","value","translateY","ty","rotate","scale","liveOrigin","origin","children","map","a","type","id","transform"],"sourceRoot":"..\\..\\..\\src","sources":["canvas/AnnotationLayer.tsx"],"mappings":";;AAAA,SAASA,KAAK,QAAQ,4BAA4B;AAClD,SAASC,eAAe,QAAQ,yBAAyB;AAGzD,SAASC,SAAS,QAAQ,oBAAoB;AAC9C,SAASC,cAAc,QAAQ,+BAA+B;;AAE9D;AACA;AACA;AACA;AACA;AACA;AALA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,QAAA,IAAAC,SAAA;AAMA,OAAO,SAASC,eAAeA,CAAC;EAAEC;AAAuC,CAAC,EAAE;EAC1E,MAAM;IAAEC,WAAW;IAAEC,UAAU;IAAEC,IAAI;IAAEC;EAAc,CAAC,GAAGJ,MAAM;EAE/D,MAAMK,aAAa,GAAGb,eAAe,CAAC,MAAM,CAC1C;IAAEc,UAAU,EAAEH,IAAI,CAACI,EAAE,CAACC;EAAM,CAAC,EAC7B;IAAEC,UAAU,EAAEN,IAAI,CAACO,EAAE,CAACF;EAAM,CAAC,EAC7B;IAAEG,MAAM,EAAER,IAAI,CAACQ,MAAM,CAACH;EAAM,CAAC,EAC7B;IAAEI,KAAK,EAAET,IAAI,CAACS,KAAK,CAACJ;EAAM,CAAC,CAC5B,CAAC;EACF,MAAMK,UAAU,GAAGrB,eAAe,CAAC,MAAMW,IAAI,CAACW,MAAM,CAACN,KAAK,CAAC;EAE3D,oBACEZ,IAAA,CAAAE,SAAA;IAAAiB,QAAA,EACGtB,SAAS,CAACQ,WAAW,CAAC,CAACe,GAAG,CAAEC,CAAC,IAAK;MACjC;MACA,IAAIA,CAAC,CAACC,IAAI,KAAK,MAAM,IAAID,CAAC,CAACE,EAAE,KAAKf,aAAa,EAAE;QAC/C,OAAO,IAAI;MACb;MACA,IAAIa,CAAC,CAACE,EAAE,KAAKjB,UAAU,EAAE;QACvB,oBACEN,IAAA,CAACL,KAAK;UAAYuB,MAAM,EAAED,UAAW;UAACO,SAAS,EAAEf,aAAc;UAAAU,QAAA,eAC7DnB,IAAA,CAACF,cAAc;YAACuB,CAAC,EAAEA;UAAE,CAAE;QAAC,GADdA,CAAC,CAACE,EAEP,CAAC;MAEZ;MACA,oBAAOvB,IAAA,CAACF,cAAc;QAAYuB,CAAC,EAAEA;MAAE,GAAXA,CAAC,CAACE,EAAW,CAAC;IAC5C,CAAC;EAAC,CACF,CAAC;AAEP","ignoreList":[]}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ import { Image } from '@shopify/react-native-skia';
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ /**
6
+ * Draws the base image in IMAGE space (x=0,y=0, native width/height). The parent
7
+ * scene `<Group>` maps it onto the screen, so this same layer renders identically
8
+ * off-screen at full resolution during export.
9
+ */
10
+ export function BaseImageLayer({
11
+ image,
12
+ size
13
+ }) {
14
+ return /*#__PURE__*/_jsx(Image, {
15
+ image: image,
16
+ x: 0,
17
+ y: 0,
18
+ width: size.width,
19
+ height: size.height,
20
+ fit: "fill"
21
+ });
22
+ }
23
+ //# sourceMappingURL=BaseImageLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Image","jsx","_jsx","BaseImageLayer","image","size","x","y","width","height","fit"],"sourceRoot":"..\\..\\..\\src","sources":["canvas/BaseImageLayer.tsx"],"mappings":";;AAAA,SAASA,KAAK,QAAQ,4BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAKnD;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAAC;EAC7BC,KAAK;EACLC;AAIF,CAAC,EAAE;EACD,oBACEH,IAAA,CAACF,KAAK;IACJI,KAAK,EAAEA,KAAM;IACbE,CAAC,EAAE,CAAE;IACLC,CAAC,EAAE,CAAE;IACLC,KAAK,EAAEH,IAAI,CAACG,KAAM;IAClBC,MAAM,EAAEJ,IAAI,CAACI,MAAO;IACpBC,GAAG,EAAC;EAAM,CACX,CAAC;AAEN","ignoreList":[]}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+
3
+ import { useEffect } from 'react';
4
+ import { Circle, Group, Path, Rect, Skia } from '@shopify/react-native-skia';
5
+ import { useDerivedValue } from 'react-native-reanimated';
6
+ import { HANDLE_SIZE } from '../constants';
7
+ import { applyToPoint } from '../utils/math';
8
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
+ /**
10
+ * Crop UI drawn in screen space: a dimmed full-screen scrim plus the crop
11
+ * rectangle's border and corner handles, which follow `cropRectSV` on the UI
12
+ * thread (works even when the scene is rotated, since the border is a quad).
13
+ */
14
+ export function CropOverlay({
15
+ editor
16
+ }) {
17
+ const {
18
+ tool,
19
+ doc,
20
+ cropRectSV,
21
+ matrixSV,
22
+ imageSize,
23
+ layout
24
+ } = editor;
25
+
26
+ // When entering the crop tool, seed the crop rect from the current scene.
27
+ useEffect(() => {
28
+ if (tool === 'crop') {
29
+ cropRectSV.value = doc.scene.cropRect ?? {
30
+ x: 0,
31
+ y: 0,
32
+ width: imageSize.width,
33
+ height: imageSize.height
34
+ };
35
+ }
36
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37
+ }, [tool]);
38
+ const cropPath = useDerivedValue(() => {
39
+ const r = cropRectSV.value;
40
+ const m = matrixSV.value;
41
+ const p = Skia.Path.Make();
42
+ const c0 = applyToPoint(m, {
43
+ x: r.x,
44
+ y: r.y
45
+ });
46
+ const c1 = applyToPoint(m, {
47
+ x: r.x + r.width,
48
+ y: r.y
49
+ });
50
+ const c2 = applyToPoint(m, {
51
+ x: r.x + r.width,
52
+ y: r.y + r.height
53
+ });
54
+ const c3 = applyToPoint(m, {
55
+ x: r.x,
56
+ y: r.y + r.height
57
+ });
58
+ p.moveTo(c0.x, c0.y);
59
+ p.lineTo(c1.x, c1.y);
60
+ p.lineTo(c2.x, c2.y);
61
+ p.lineTo(c3.x, c3.y);
62
+ p.close();
63
+ return p;
64
+ });
65
+ const corners = useDerivedValue(() => {
66
+ const r = cropRectSV.value;
67
+ const m = matrixSV.value;
68
+ return [applyToPoint(m, {
69
+ x: r.x,
70
+ y: r.y
71
+ }), applyToPoint(m, {
72
+ x: r.x + r.width,
73
+ y: r.y
74
+ }), applyToPoint(m, {
75
+ x: r.x + r.width,
76
+ y: r.y + r.height
77
+ }), applyToPoint(m, {
78
+ x: r.x,
79
+ y: r.y + r.height
80
+ })];
81
+ });
82
+
83
+ // Per-corner x/y derived values (declared unconditionally — rules of hooks).
84
+ const c0x = useDerivedValue(() => corners.value[0].x);
85
+ const c0y = useDerivedValue(() => corners.value[0].y);
86
+ const c1x = useDerivedValue(() => corners.value[1].x);
87
+ const c1y = useDerivedValue(() => corners.value[1].y);
88
+ const c2x = useDerivedValue(() => corners.value[2].x);
89
+ const c2y = useDerivedValue(() => corners.value[2].y);
90
+ const c3x = useDerivedValue(() => corners.value[3].x);
91
+ const c3y = useDerivedValue(() => corners.value[3].y);
92
+ if (tool !== 'crop') {
93
+ return null;
94
+ }
95
+ const r = HANDLE_SIZE / 2;
96
+ return /*#__PURE__*/_jsxs(Group, {
97
+ children: [/*#__PURE__*/_jsx(Rect, {
98
+ x: 0,
99
+ y: 0,
100
+ width: layout.width,
101
+ height: layout.height,
102
+ color: "rgba(0,0,0,0.45)"
103
+ }), /*#__PURE__*/_jsx(Path, {
104
+ path: cropPath,
105
+ color: "#FFFFFF",
106
+ style: "stroke",
107
+ strokeWidth: 2
108
+ }), /*#__PURE__*/_jsx(Circle, {
109
+ cx: c0x,
110
+ cy: c0y,
111
+ r: r,
112
+ color: "#FFFFFF"
113
+ }), /*#__PURE__*/_jsx(Circle, {
114
+ cx: c1x,
115
+ cy: c1y,
116
+ r: r,
117
+ color: "#FFFFFF"
118
+ }), /*#__PURE__*/_jsx(Circle, {
119
+ cx: c2x,
120
+ cy: c2y,
121
+ r: r,
122
+ color: "#FFFFFF"
123
+ }), /*#__PURE__*/_jsx(Circle, {
124
+ cx: c3x,
125
+ cy: c3y,
126
+ r: r,
127
+ color: "#FFFFFF"
128
+ })]
129
+ });
130
+ }
131
+ //# sourceMappingURL=CropOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","Circle","Group","Path","Rect","Skia","useDerivedValue","HANDLE_SIZE","applyToPoint","jsx","_jsx","jsxs","_jsxs","CropOverlay","editor","tool","doc","cropRectSV","matrixSV","imageSize","layout","value","scene","cropRect","x","y","width","height","cropPath","r","m","p","Make","c0","c1","c2","c3","moveTo","lineTo","close","corners","c0x","c0y","c1x","c1y","c2x","c2y","c3x","c3y","children","color","path","style","strokeWidth","cx","cy"],"sourceRoot":"..\\..\\..\\src","sources":["canvas/CropOverlay.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ import { useMemo } from 'react';
4
+ import { StyleSheet, View } from 'react-native';
5
+ import { Canvas, Group } from '@shopify/react-native-skia';
6
+ import { GestureDetector, Gesture } from 'react-native-gesture-handler';
7
+ import { useEditor } from '../context/EditorContext';
8
+ import { sceneTransforms2d } from '../utils/math';
9
+ import { useEditorGestures } from '../gestures/useEditorGestures';
10
+ import { useCropGesture } from '../gestures/useCropGesture';
11
+ import { BaseImageLayer } from './BaseImageLayer';
12
+ import { AnnotationLayer } from './AnnotationLayer';
13
+ import { InFlightLayer } from './InFlightLayer';
14
+ import { SelectionOverlay } from './SelectionOverlay';
15
+ import { CropOverlay } from './CropOverlay';
16
+
17
+ /**
18
+ * The Skia canvas host. Layers, under one scene `<Group>` transform:
19
+ * base image → committed annotations → in-flight draft
20
+ * plus screen-space overlays (selection handles, crop UI). A single composed
21
+ * gesture drives all editing.
22
+ *
23
+ * IMPORTANT: React Context does NOT cross the Skia `<Canvas>` boundary — Skia
24
+ * renders Canvas children with its own reconciler, so a Provider mounted outside
25
+ * the Canvas is invisible inside it. Every Canvas child therefore receives the
26
+ * whole editor value via an `editor` PROP instead of calling `useEditor()`.
27
+ * Also, `<Canvas onLayout>` is unsupported on the New Architecture, so we measure
28
+ * on a wrapping `<View>`.
29
+ */
30
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
31
+ export function EditorCanvas({
32
+ image
33
+ }) {
34
+ const editor = useEditor();
35
+ const {
36
+ doc,
37
+ imageSize,
38
+ setLayout,
39
+ layout
40
+ } = editor;
41
+ const pan = useEditorGestures();
42
+ const cropPan = useCropGesture();
43
+ const gesture = useMemo(() => Gesture.Race(cropPan, pan), [cropPan, pan]);
44
+ const transform = useMemo(() => sceneTransforms2d(doc.scene, imageSize, layout), [doc.scene, imageSize, layout]);
45
+ const onLayout = e => {
46
+ const {
47
+ width,
48
+ height
49
+ } = e.nativeEvent.layout;
50
+ if (width > 0 && height > 0) {
51
+ setLayout({
52
+ width,
53
+ height
54
+ });
55
+ }
56
+ };
57
+ return /*#__PURE__*/_jsx(View, {
58
+ style: styles.fill,
59
+ onLayout: onLayout,
60
+ children: /*#__PURE__*/_jsx(GestureDetector, {
61
+ gesture: gesture,
62
+ children: /*#__PURE__*/_jsxs(Canvas, {
63
+ style: styles.fill,
64
+ children: [/*#__PURE__*/_jsxs(Group, {
65
+ transform: transform,
66
+ children: [/*#__PURE__*/_jsx(BaseImageLayer, {
67
+ image: image,
68
+ size: imageSize
69
+ }), /*#__PURE__*/_jsx(AnnotationLayer, {
70
+ editor: editor
71
+ }), /*#__PURE__*/_jsx(InFlightLayer, {
72
+ editor: editor
73
+ })]
74
+ }), /*#__PURE__*/_jsx(SelectionOverlay, {
75
+ editor: editor
76
+ }), /*#__PURE__*/_jsx(CropOverlay, {
77
+ editor: editor
78
+ })]
79
+ })
80
+ })
81
+ });
82
+ }
83
+ const styles = StyleSheet.create({
84
+ fill: {
85
+ flex: 1
86
+ }
87
+ });
88
+ //# sourceMappingURL=EditorCanvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","StyleSheet","View","Canvas","Group","GestureDetector","Gesture","useEditor","sceneTransforms2d","useEditorGestures","useCropGesture","BaseImageLayer","AnnotationLayer","InFlightLayer","SelectionOverlay","CropOverlay","jsx","_jsx","jsxs","_jsxs","EditorCanvas","image","editor","doc","imageSize","setLayout","layout","pan","cropPan","gesture","Race","transform","scene","onLayout","e","width","height","nativeEvent","style","styles","fill","children","size","create","flex"],"sourceRoot":"..\\..\\..\\src","sources":["canvas/EditorCanvas.tsx"],"mappings":";;AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAE/C,SAASC,MAAM,EAAEC,KAAK,QAAQ,4BAA4B;AAE1D,SAASC,eAAe,EAAEC,OAAO,QAAQ,8BAA8B;AAEvE,SAASC,SAAS,QAAQ,0BAA0B;AACpD,SAASC,iBAAiB,QAAQ,eAAe;AACjD,SAASC,iBAAiB,QAAQ,+BAA+B;AACjE,SAASC,cAAc,QAAQ,4BAA4B;AAC3D,SAASC,cAAc,QAAQ,kBAAkB;AACjD,SAASC,eAAe,QAAQ,mBAAmB;AACnD,SAASC,aAAa,QAAQ,iBAAiB;AAC/C,SAASC,gBAAgB,QAAQ,oBAAoB;AACrD,SAASC,WAAW,QAAQ,eAAe;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAZA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAaA,OAAO,SAASC,YAAYA,CAAC;EAAEC;AAA0B,CAAC,EAAE;EAC1D,MAAMC,MAAM,GAAGf,SAAS,CAAC,CAAC;EAC1B,MAAM;IAAEgB,GAAG;IAAEC,SAAS;IAAEC,SAAS;IAAEC;EAAO,CAAC,GAAGJ,MAAM;EAEpD,MAAMK,GAAG,GAAGlB,iBAAiB,CAAC,CAAC;EAC/B,MAAMmB,OAAO,GAAGlB,cAAc,CAAC,CAAC;EAChC,MAAMmB,OAAO,GAAG7B,OAAO,CAAC,MAAMM,OAAO,CAACwB,IAAI,CAACF,OAAO,EAAED,GAAG,CAAC,EAAE,CAACC,OAAO,EAAED,GAAG,CAAC,CAAC;EAEzE,MAAMI,SAAS,GAAG/B,OAAO,CACvB,MAAMQ,iBAAiB,CAACe,GAAG,CAACS,KAAK,EAAER,SAAS,EAAEE,MAAM,CAAC,EACrD,CAACH,GAAG,CAACS,KAAK,EAAER,SAAS,EAAEE,MAAM,CAC/B,CAAC;EAED,MAAMO,QAAQ,GAAIC,CAAoB,IAAK;IACzC,MAAM;MAAEC,KAAK;MAAEC;IAAO,CAAC,GAAGF,CAAC,CAACG,WAAW,CAACX,MAAM;IAC9C,IAAIS,KAAK,GAAG,CAAC,IAAIC,MAAM,GAAG,CAAC,EAAE;MAC3BX,SAAS,CAAC;QAAEU,KAAK;QAAEC;MAAO,CAAC,CAAC;IAC9B;EACF,CAAC;EAED,oBACEnB,IAAA,CAACf,IAAI;IAACoC,KAAK,EAAEC,MAAM,CAACC,IAAK;IAACP,QAAQ,EAAEA,QAAS;IAAAQ,QAAA,eAC3CxB,IAAA,CAACZ,eAAe;MAACwB,OAAO,EAAEA,OAAQ;MAAAY,QAAA,eAChCtB,KAAA,CAAChB,MAAM;QAACmC,KAAK,EAAEC,MAAM,CAACC,IAAK;QAAAC,QAAA,gBACzBtB,KAAA,CAACf,KAAK;UAAC2B,SAAS,EAAEA,SAAmB;UAAAU,QAAA,gBACnCxB,IAAA,CAACN,cAAc;YAACU,KAAK,EAAEA,KAAM;YAACqB,IAAI,EAAElB;UAAU,CAAE,CAAC,eACjDP,IAAA,CAACL,eAAe;YAACU,MAAM,EAAEA;UAAO,CAAE,CAAC,eACnCL,IAAA,CAACJ,aAAa;YAACS,MAAM,EAAEA;UAAO,CAAE,CAAC;QAAA,CAC5B,CAAC,eACRL,IAAA,CAACH,gBAAgB;UAACQ,MAAM,EAAEA;QAAO,CAAE,CAAC,eACpCL,IAAA,CAACF,WAAW;UAACO,MAAM,EAAEA;QAAO,CAAE,CAAC;MAAA,CACzB;IAAC,CACM;EAAC,CACd,CAAC;AAEX;AAEA,MAAMiB,MAAM,GAAGtC,UAAU,CAAC0C,MAAM,CAAC;EAC/BH,IAAI,EAAE;IAAEI,IAAI,EAAE;EAAE;AAClB,CAAC,CAAC","ignoreList":[]}