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,75 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Bake a live move/resize/rotate transform into an annotation's stored geometry.
5
+ * This MUST match the on-screen preview (AnnotationLayer applies, in order:
6
+ * translate → rotate(about origin) → scale(about origin)). Rotation is folded
7
+ * into the annotation's `rotation` field (also about its center), so only scale
8
+ * and translate touch geometry here.
9
+ */
10
+ export function applyTransformToAnnotation(a, live) {
11
+ const {
12
+ scale: s,
13
+ origin: o,
14
+ tx,
15
+ ty,
16
+ rotate
17
+ } = live;
18
+ const map = p => ({
19
+ x: o.x + (p.x - o.x) * s + tx,
20
+ y: o.y + (p.y - o.y) * s + ty
21
+ });
22
+ const rotation = a.rotation + rotate;
23
+ switch (a.type) {
24
+ case 'circle':
25
+ return {
26
+ ...a,
27
+ center: map(a.center),
28
+ radius: a.radius * s,
29
+ strokeWidth: a.strokeWidth * s,
30
+ rotation
31
+ };
32
+ case 'arrow':
33
+ return {
34
+ ...a,
35
+ start: map(a.start),
36
+ end: map(a.end),
37
+ headSize: a.headSize * s,
38
+ strokeWidth: a.strokeWidth * s,
39
+ rotation
40
+ };
41
+ case 'marker':
42
+ {
43
+ const tl = map({
44
+ x: a.rect.x,
45
+ y: a.rect.y
46
+ });
47
+ return {
48
+ ...a,
49
+ rect: {
50
+ x: tl.x,
51
+ y: tl.y,
52
+ width: a.rect.width * s,
53
+ height: a.rect.height * s
54
+ },
55
+ rotation
56
+ };
57
+ }
58
+ case 'freehand':
59
+ return {
60
+ ...a,
61
+ points: a.points.map(map),
62
+ strokeWidth: a.strokeWidth * s,
63
+ rotation
64
+ };
65
+ case 'text':
66
+ return {
67
+ ...a,
68
+ origin: map(a.origin),
69
+ fontSize: a.fontSize * s,
70
+ width: a.width * s,
71
+ rotation
72
+ };
73
+ }
74
+ }
75
+ //# sourceMappingURL=applyTransform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["applyTransformToAnnotation","a","live","scale","s","origin","o","tx","ty","rotate","map","p","x","y","rotation","type","center","radius","strokeWidth","start","end","headSize","tl","rect","width","height","points","fontSize"],"sourceRoot":"..\\..\\..\\src","sources":["gestures/applyTransform.ts"],"mappings":";;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,0BAA0BA,CACxCC,CAAa,EACbC,IAAgB,EACJ;EACZ,MAAM;IAAEC,KAAK,EAAEC,CAAC;IAAEC,MAAM,EAAEC,CAAC;IAAEC,EAAE;IAAEC,EAAE;IAAEC;EAAO,CAAC,GAAGP,IAAI;EACpD,MAAMQ,GAAG,GAAIC,CAAO,KAAY;IAC9BC,CAAC,EAAEN,CAAC,CAACM,CAAC,GAAG,CAACD,CAAC,CAACC,CAAC,GAAGN,CAAC,CAACM,CAAC,IAAIR,CAAC,GAAGG,EAAE;IAC7BM,CAAC,EAAEP,CAAC,CAACO,CAAC,GAAG,CAACF,CAAC,CAACE,CAAC,GAAGP,CAAC,CAACO,CAAC,IAAIT,CAAC,GAAGI;EAC7B,CAAC,CAAC;EACF,MAAMM,QAAQ,GAAGb,CAAC,CAACa,QAAQ,GAAGL,MAAM;EAEpC,QAAQR,CAAC,CAACc,IAAI;IACZ,KAAK,QAAQ;MACX,OAAO;QACL,GAAGd,CAAC;QACJe,MAAM,EAAEN,GAAG,CAACT,CAAC,CAACe,MAAM,CAAC;QACrBC,MAAM,EAAEhB,CAAC,CAACgB,MAAM,GAAGb,CAAC;QACpBc,WAAW,EAAEjB,CAAC,CAACiB,WAAW,GAAGd,CAAC;QAC9BU;MACF,CAAC;IACH,KAAK,OAAO;MACV,OAAO;QACL,GAAGb,CAAC;QACJkB,KAAK,EAAET,GAAG,CAACT,CAAC,CAACkB,KAAK,CAAC;QACnBC,GAAG,EAAEV,GAAG,CAACT,CAAC,CAACmB,GAAG,CAAC;QACfC,QAAQ,EAAEpB,CAAC,CAACoB,QAAQ,GAAGjB,CAAC;QACxBc,WAAW,EAAEjB,CAAC,CAACiB,WAAW,GAAGd,CAAC;QAC9BU;MACF,CAAC;IACH,KAAK,QAAQ;MAAE;QACb,MAAMQ,EAAE,GAAGZ,GAAG,CAAC;UAAEE,CAAC,EAAEX,CAAC,CAACsB,IAAI,CAACX,CAAC;UAAEC,CAAC,EAAEZ,CAAC,CAACsB,IAAI,CAACV;QAAE,CAAC,CAAC;QAC5C,OAAO;UACL,GAAGZ,CAAC;UACJsB,IAAI,EAAE;YACJX,CAAC,EAAEU,EAAE,CAACV,CAAC;YACPC,CAAC,EAAES,EAAE,CAACT,CAAC;YACPW,KAAK,EAAEvB,CAAC,CAACsB,IAAI,CAACC,KAAK,GAAGpB,CAAC;YACvBqB,MAAM,EAAExB,CAAC,CAACsB,IAAI,CAACE,MAAM,GAAGrB;UAC1B,CAAC;UACDU;QACF,CAAC;MACH;IACA,KAAK,UAAU;MACb,OAAO;QACL,GAAGb,CAAC;QACJyB,MAAM,EAAEzB,CAAC,CAACyB,MAAM,CAAChB,GAAG,CAACA,GAAG,CAAC;QACzBQ,WAAW,EAAEjB,CAAC,CAACiB,WAAW,GAAGd,CAAC;QAC9BU;MACF,CAAC;IACH,KAAK,MAAM;MACT,OAAO;QACL,GAAGb,CAAC;QACJI,MAAM,EAAEK,GAAG,CAACT,CAAC,CAACI,MAAM,CAAC;QACrBsB,QAAQ,EAAE1B,CAAC,CAAC0B,QAAQ,GAAGvB,CAAC;QACxBoB,KAAK,EAAEvB,CAAC,CAACuB,KAAK,GAAGpB,CAAC;QAClBU;MACF,CAAC;EACL;AACF","ignoreList":[]}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+
3
+ import { ARROW_HEAD_RATIO, DEFAULT_FONT_SIZE, DEFAULT_TEXT_WIDTH, MARKER_OPACITY } from '../constants';
4
+ import { genId } from '../utils/id';
5
+ export function makeCircle(center, radius, style) {
6
+ return {
7
+ id: genId('circle'),
8
+ type: 'circle',
9
+ rotation: 0,
10
+ z: 0,
11
+ center,
12
+ radius,
13
+ strokeColor: style.strokeColor,
14
+ strokeWidth: style.strokeWidth
15
+ };
16
+ }
17
+ export function makeArrow(start, end, style) {
18
+ return {
19
+ id: genId('arrow'),
20
+ type: 'arrow',
21
+ rotation: 0,
22
+ z: 0,
23
+ start,
24
+ end,
25
+ headSize: style.strokeWidth * ARROW_HEAD_RATIO,
26
+ strokeColor: style.strokeColor,
27
+ strokeWidth: style.strokeWidth
28
+ };
29
+ }
30
+ export function makeMarker(rect, color) {
31
+ return {
32
+ id: genId('marker'),
33
+ type: 'marker',
34
+ rotation: 0,
35
+ z: 0,
36
+ rect,
37
+ color,
38
+ opacity: MARKER_OPACITY
39
+ };
40
+ }
41
+ export function makeFreehand(points, style) {
42
+ return {
43
+ id: genId('freehand'),
44
+ type: 'freehand',
45
+ rotation: 0,
46
+ z: 0,
47
+ points,
48
+ strokeColor: style.strokeColor,
49
+ strokeWidth: style.strokeWidth
50
+ };
51
+ }
52
+ export function makeText(origin, color, fontSize = DEFAULT_FONT_SIZE) {
53
+ return {
54
+ id: genId('text'),
55
+ type: 'text',
56
+ rotation: 0,
57
+ z: 0,
58
+ origin,
59
+ text: '',
60
+ color,
61
+ fontSize,
62
+ width: DEFAULT_TEXT_WIDTH
63
+ };
64
+ }
65
+ //# sourceMappingURL=createAnnotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ARROW_HEAD_RATIO","DEFAULT_FONT_SIZE","DEFAULT_TEXT_WIDTH","MARKER_OPACITY","genId","makeCircle","center","radius","style","id","type","rotation","z","strokeColor","strokeWidth","makeArrow","start","end","headSize","makeMarker","rect","color","opacity","makeFreehand","points","makeText","origin","fontSize","text","width"],"sourceRoot":"..\\..\\..\\src","sources":["gestures/createAnnotation.ts"],"mappings":";;AAOA,SACEA,gBAAgB,EAChBC,iBAAiB,EACjBC,kBAAkB,EAClBC,cAAc,QACT,cAAc;AACrB,SAASC,KAAK,QAAQ,aAAa;AAOnC,OAAO,SAASC,UAAUA,CACxBC,MAAY,EACZC,MAAc,EACdC,KAAgB,EACJ;EACZ,OAAO;IACLC,EAAE,EAAEL,KAAK,CAAC,QAAQ,CAAC;IACnBM,IAAI,EAAE,QAAQ;IACdC,QAAQ,EAAE,CAAC;IACXC,CAAC,EAAE,CAAC;IACJN,MAAM;IACNC,MAAM;IACNM,WAAW,EAAEL,KAAK,CAACK,WAAW;IAC9BC,WAAW,EAAEN,KAAK,CAACM;EACrB,CAAC;AACH;AAEA,OAAO,SAASC,SAASA,CAACC,KAAW,EAAEC,GAAS,EAAET,KAAgB,EAAc;EAC9E,OAAO;IACLC,EAAE,EAAEL,KAAK,CAAC,OAAO,CAAC;IAClBM,IAAI,EAAE,OAAO;IACbC,QAAQ,EAAE,CAAC;IACXC,CAAC,EAAE,CAAC;IACJI,KAAK;IACLC,GAAG;IACHC,QAAQ,EAAEV,KAAK,CAACM,WAAW,GAAGd,gBAAgB;IAC9Ca,WAAW,EAAEL,KAAK,CAACK,WAAW;IAC9BC,WAAW,EAAEN,KAAK,CAACM;EACrB,CAAC;AACH;AAEA,OAAO,SAASK,UAAUA,CAACC,IAAU,EAAEC,KAAkB,EAAc;EACrE,OAAO;IACLZ,EAAE,EAAEL,KAAK,CAAC,QAAQ,CAAC;IACnBM,IAAI,EAAE,QAAQ;IACdC,QAAQ,EAAE,CAAC;IACXC,CAAC,EAAE,CAAC;IACJQ,IAAI;IACJC,KAAK;IACLC,OAAO,EAAEnB;EACX,CAAC;AACH;AAEA,OAAO,SAASoB,YAAYA,CAACC,MAAc,EAAEhB,KAAgB,EAAc;EACzE,OAAO;IACLC,EAAE,EAAEL,KAAK,CAAC,UAAU,CAAC;IACrBM,IAAI,EAAE,UAAU;IAChBC,QAAQ,EAAE,CAAC;IACXC,CAAC,EAAE,CAAC;IACJY,MAAM;IACNX,WAAW,EAAEL,KAAK,CAACK,WAAW;IAC9BC,WAAW,EAAEN,KAAK,CAACM;EACrB,CAAC;AACH;AAEA,OAAO,SAASW,QAAQA,CACtBC,MAAY,EACZL,KAAkB,EAClBM,QAAQ,GAAG1B,iBAAiB,EACZ;EAChB,OAAO;IACLQ,EAAE,EAAEL,KAAK,CAAC,MAAM,CAAC;IACjBM,IAAI,EAAE,MAAM;IACZC,QAAQ,EAAE,CAAC;IACXC,CAAC,EAAE,CAAC;IACJc,MAAM;IACNE,IAAI,EAAE,EAAE;IACRP,KAAK;IACLM,QAAQ;IACRE,KAAK,EAAE3B;EACT,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ import { annotationBounds, annotationCenter } from '../annotations/geometryPure';
4
+ import { ROTATE_HANDLE_OFFSET } from '../constants';
5
+ import { applyToPoint, rotatePoint } from '../utils/math';
6
+ /**
7
+ * Compute selection-box handle positions in SCREEN space for annotation `a`,
8
+ * accounting for its rotation and the current image→screen matrix. Worklet-safe
9
+ * (used by the transform gesture) and also callable from JS (SelectionOverlay).
10
+ */
11
+ export function selectionHandles(a, matrix) {
12
+ 'worklet';
13
+
14
+ const b = annotationBounds(a);
15
+ const center = annotationCenter(a);
16
+ const localCorners = [{
17
+ x: b.x,
18
+ y: b.y
19
+ }, {
20
+ x: b.x + b.width,
21
+ y: b.y
22
+ }, {
23
+ x: b.x + b.width,
24
+ y: b.y + b.height
25
+ }, {
26
+ x: b.x,
27
+ y: b.y + b.height
28
+ }];
29
+ const screenCorners = localCorners.map(c => applyToPoint(matrix, rotatePoint(c, center, a.rotation)));
30
+ const centerScreen = applyToPoint(matrix, center);
31
+ const topMid = {
32
+ x: (screenCorners[0].x + screenCorners[1].x) / 2,
33
+ y: (screenCorners[0].y + screenCorners[1].y) / 2
34
+ };
35
+ // Push the rotate handle outward from center along the top-edge direction.
36
+ const dx = topMid.x - centerScreen.x;
37
+ const dy = topMid.y - centerScreen.y;
38
+ const len = Math.hypot(dx, dy) || 1;
39
+ const rotate = {
40
+ x: topMid.x + dx / len * ROTATE_HANDLE_OFFSET,
41
+ y: topMid.y + dy / len * ROTATE_HANDLE_OFFSET
42
+ };
43
+ return {
44
+ corners: screenCorners,
45
+ rotate,
46
+ center: centerScreen
47
+ };
48
+ }
49
+ //# sourceMappingURL=handles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["annotationBounds","annotationCenter","ROTATE_HANDLE_OFFSET","applyToPoint","rotatePoint","selectionHandles","a","matrix","b","center","localCorners","x","y","width","height","screenCorners","map","c","rotation","centerScreen","topMid","dx","dy","len","Math","hypot","rotate","corners"],"sourceRoot":"..\\..\\..\\src","sources":["gestures/handles.ts"],"mappings":";;AACA,SAASA,gBAAgB,EAAEC,gBAAgB,QAAQ,6BAA6B;AAChF,SAASC,oBAAoB,QAAQ,cAAc;AACnD,SAASC,YAAY,EAAEC,WAAW,QAAQ,eAAe;AAYzD;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAACC,CAAa,EAAEC,MAAW,EAAoB;EAC7E,SAAS;;EACT,MAAMC,CAAC,GAAGR,gBAAgB,CAACM,CAAC,CAAC;EAC7B,MAAMG,MAAM,GAAGR,gBAAgB,CAACK,CAAC,CAAC;EAClC,MAAMI,YAAoB,GAAG,CAC3B;IAAEC,CAAC,EAAEH,CAAC,CAACG,CAAC;IAAEC,CAAC,EAAEJ,CAAC,CAACI;EAAE,CAAC,EAClB;IAAED,CAAC,EAAEH,CAAC,CAACG,CAAC,GAAGH,CAAC,CAACK,KAAK;IAAED,CAAC,EAAEJ,CAAC,CAACI;EAAE,CAAC,EAC5B;IAAED,CAAC,EAAEH,CAAC,CAACG,CAAC,GAAGH,CAAC,CAACK,KAAK;IAAED,CAAC,EAAEJ,CAAC,CAACI,CAAC,GAAGJ,CAAC,CAACM;EAAO,CAAC,EACvC;IAAEH,CAAC,EAAEH,CAAC,CAACG,CAAC;IAAEC,CAAC,EAAEJ,CAAC,CAACI,CAAC,GAAGJ,CAAC,CAACM;EAAO,CAAC,CAC9B;EACD,MAAMC,aAAa,GAAGL,YAAY,CAACM,GAAG,CAAEC,CAAC,IACvCd,YAAY,CAACI,MAAM,EAAEH,WAAW,CAACa,CAAC,EAAER,MAAM,EAAEH,CAAC,CAACY,QAAQ,CAAC,CACzD,CAA6B;EAE7B,MAAMC,YAAY,GAAGhB,YAAY,CAACI,MAAM,EAAEE,MAAM,CAAC;EACjD,MAAMW,MAAM,GAAG;IACbT,CAAC,EAAE,CAACI,aAAa,CAAC,CAAC,CAAC,CAACJ,CAAC,GAAGI,aAAa,CAAC,CAAC,CAAC,CAACJ,CAAC,IAAI,CAAC;IAChDC,CAAC,EAAE,CAACG,aAAa,CAAC,CAAC,CAAC,CAACH,CAAC,GAAGG,aAAa,CAAC,CAAC,CAAC,CAACH,CAAC,IAAI;EACjD,CAAC;EACD;EACA,MAAMS,EAAE,GAAGD,MAAM,CAACT,CAAC,GAAGQ,YAAY,CAACR,CAAC;EACpC,MAAMW,EAAE,GAAGF,MAAM,CAACR,CAAC,GAAGO,YAAY,CAACP,CAAC;EACpC,MAAMW,GAAG,GAAGC,IAAI,CAACC,KAAK,CAACJ,EAAE,EAAEC,EAAE,CAAC,IAAI,CAAC;EACnC,MAAMI,MAAM,GAAG;IACbf,CAAC,EAAES,MAAM,CAACT,CAAC,GAAIU,EAAE,GAAGE,GAAG,GAAIrB,oBAAoB;IAC/CU,CAAC,EAAEQ,MAAM,CAACR,CAAC,GAAIU,EAAE,GAAGC,GAAG,GAAIrB;EAC7B,CAAC;EAED,OAAO;IAAEyB,OAAO,EAAEZ,aAAa;IAAEW,MAAM;IAAEjB,MAAM,EAAEU;EAAa,CAAC;AACjE","ignoreList":[]}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ import { annotationBounds, annotationCenter } from '../annotations/geometryPure';
4
+ import { distanceToSegment, rotatePoint } from '../utils/math';
5
+
6
+ // NOTE: `hitOne` is declared BEFORE `hitTest`. The worklets Babel plugin rewrites
7
+ // `'worklet'` function declarations into `const`s (no hoisting), so a worklet that
8
+ // calls another must be defined after its callee.
9
+ function hitOne(a, p, slop) {
10
+ 'worklet';
11
+
12
+ switch (a.type) {
13
+ case 'circle':
14
+ {
15
+ const d = Math.hypot(p.x - a.center.x, p.y - a.center.y);
16
+ if (a.fill !== undefined) {
17
+ return d <= a.radius + slop;
18
+ }
19
+ // Outline: hit near the ring.
20
+ return Math.abs(d - a.radius) <= slop + a.strokeWidth / 2;
21
+ }
22
+ case 'arrow':
23
+ return distanceToSegment(p, a.start, a.end) <= slop + a.strokeWidth / 2;
24
+ case 'marker':
25
+ {
26
+ const r = a.rect;
27
+ return p.x >= r.x - slop && p.x <= r.x + r.width + slop && p.y >= r.y - slop && p.y <= r.y + r.height + slop;
28
+ }
29
+ case 'freehand':
30
+ {
31
+ const pts = a.points;
32
+ const tol = slop + a.strokeWidth / 2;
33
+ for (let i = 1; i < pts.length; i++) {
34
+ if (distanceToSegment(p, pts[i - 1], pts[i]) <= tol) {
35
+ return true;
36
+ }
37
+ }
38
+ return pts.length === 1 ? Math.hypot(p.x - pts[0].x, p.y - pts[0].y) <= tol : false;
39
+ }
40
+ case 'text':
41
+ {
42
+ const b = annotationBounds(a);
43
+ return p.x >= b.x - slop && p.x <= b.x + b.width + slop && p.y >= b.y - slop && p.y <= b.y + b.height + slop;
44
+ }
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Return the id of the top-most annotation hit by `point` (image space), or null.
50
+ * Worklet-safe so selection resolves on the UI thread during a tap.
51
+ *
52
+ * `slop` is an extra hit margin, in image pixels (screen slop / current scale).
53
+ */
54
+ export function hitTest(annotations, point, slop) {
55
+ 'worklet';
56
+
57
+ // Iterate from top (highest z) to bottom.
58
+ const ordered = [...annotations].sort((a, b) => b.z - a.z);
59
+ for (let i = 0; i < ordered.length; i++) {
60
+ const a = ordered[i];
61
+ // Transform the touch into the annotation's local (unrotated) frame.
62
+ const local = a.rotation ? rotatePoint(point, annotationCenter(a), -a.rotation) : point;
63
+ if (hitOne(a, local, slop)) {
64
+ return a.id;
65
+ }
66
+ }
67
+ return null;
68
+ }
69
+ //# sourceMappingURL=hitTest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["annotationBounds","annotationCenter","distanceToSegment","rotatePoint","hitOne","a","p","slop","type","d","Math","hypot","x","center","y","fill","undefined","radius","abs","strokeWidth","start","end","r","rect","width","height","pts","points","tol","i","length","b","hitTest","annotations","point","ordered","sort","z","local","rotation","id"],"sourceRoot":"..\\..\\..\\src","sources":["gestures/hitTest.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+
3
+ import { useMemo } from 'react';
4
+ import { Gesture } from 'react-native-gesture-handler';
5
+ import { useSharedValue } from 'react-native-reanimated';
6
+ import { useEditor } from '../context/EditorContext';
7
+ import { HANDLE_SIZE } from '../constants';
8
+ import { applyToPoint, distance, invert } from '../utils/math';
9
+ const MIN_CROP = 24; // minimum crop size, in image pixels
10
+
11
+ /**
12
+ * Pan gesture that edits `cropRectSV` (image space) while the crop tool is
13
+ * active. Grab a corner to resize, or the interior to move. All values stay
14
+ * clamped inside the image bounds.
15
+ */
16
+ export function useCropGesture() {
17
+ const {
18
+ tool,
19
+ matrix,
20
+ cropRectSV,
21
+ imageSize
22
+ } = useEditor();
23
+ const invMatrix = useMemo(() => invert(matrix), [matrix]);
24
+ const cropMode = useSharedValue('none');
25
+ const corner = useSharedValue(-1);
26
+ const startRect = useSharedValue({
27
+ x: 0,
28
+ y: 0,
29
+ width: 0,
30
+ height: 0
31
+ });
32
+ const startImg = useSharedValue({
33
+ x: 0,
34
+ y: 0
35
+ });
36
+ return useMemo(() => {
37
+ return Gesture.Pan().enabled(tool === 'crop').maxPointers(1).onBegin(e => {
38
+ 'worklet';
39
+
40
+ const screen = {
41
+ x: e.x,
42
+ y: e.y
43
+ };
44
+ const img = applyToPoint(invMatrix, screen);
45
+ const r = cropRectSV.value;
46
+ startRect.value = r;
47
+ startImg.value = img;
48
+ const corners = [{
49
+ x: r.x,
50
+ y: r.y
51
+ }, {
52
+ x: r.x + r.width,
53
+ y: r.y
54
+ }, {
55
+ x: r.x + r.width,
56
+ y: r.y + r.height
57
+ }, {
58
+ x: r.x,
59
+ y: r.y + r.height
60
+ }];
61
+ for (let i = 0; i < corners.length; i++) {
62
+ const cs = applyToPoint(matrix, corners[i]);
63
+ if (distance(screen, cs) <= HANDLE_SIZE * 1.5) {
64
+ cropMode.value = 'resize';
65
+ corner.value = i;
66
+ return;
67
+ }
68
+ }
69
+ if (img.x >= r.x && img.x <= r.x + r.width && img.y >= r.y && img.y <= r.y + r.height) {
70
+ cropMode.value = 'move';
71
+ } else {
72
+ cropMode.value = 'none';
73
+ }
74
+ }).onChange(e => {
75
+ 'worklet';
76
+
77
+ const img = applyToPoint(invMatrix, {
78
+ x: e.x,
79
+ y: e.y
80
+ });
81
+ const dx = img.x - startImg.value.x;
82
+ const dy = img.y - startImg.value.y;
83
+ const s = startRect.value;
84
+ if (cropMode.value === 'move') {
85
+ let nx = s.x + dx;
86
+ let ny = s.y + dy;
87
+ nx = Math.max(0, Math.min(nx, imageSize.width - s.width));
88
+ ny = Math.max(0, Math.min(ny, imageSize.height - s.height));
89
+ cropRectSV.value = {
90
+ x: nx,
91
+ y: ny,
92
+ width: s.width,
93
+ height: s.height
94
+ };
95
+ } else if (cropMode.value === 'resize') {
96
+ // Fixed corner = the one opposite the grabbed corner.
97
+ const left = s.x;
98
+ const top = s.y;
99
+ const right = s.x + s.width;
100
+ const bottom = s.y + s.height;
101
+ let x0 = left;
102
+ let y0 = top;
103
+ let x1 = right;
104
+ let y1 = bottom;
105
+ switch (corner.value) {
106
+ case 0:
107
+ // TL moves
108
+ x0 = Math.min(right - MIN_CROP, Math.max(0, left + dx));
109
+ y0 = Math.min(bottom - MIN_CROP, Math.max(0, top + dy));
110
+ break;
111
+ case 1:
112
+ // TR moves
113
+ x1 = Math.max(left + MIN_CROP, Math.min(imageSize.width, right + dx));
114
+ y0 = Math.min(bottom - MIN_CROP, Math.max(0, top + dy));
115
+ break;
116
+ case 2:
117
+ // BR moves
118
+ x1 = Math.max(left + MIN_CROP, Math.min(imageSize.width, right + dx));
119
+ y1 = Math.max(top + MIN_CROP, Math.min(imageSize.height, bottom + dy));
120
+ break;
121
+ case 3:
122
+ // BL moves
123
+ x0 = Math.min(right - MIN_CROP, Math.max(0, left + dx));
124
+ y1 = Math.max(top + MIN_CROP, Math.min(imageSize.height, bottom + dy));
125
+ break;
126
+ default:
127
+ break;
128
+ }
129
+ cropRectSV.value = {
130
+ x: x0,
131
+ y: y0,
132
+ width: x1 - x0,
133
+ height: y1 - y0
134
+ };
135
+ }
136
+ }).onEnd(() => {
137
+ 'worklet';
138
+
139
+ cropMode.value = 'none';
140
+ corner.value = -1;
141
+ });
142
+ // eslint-disable-next-line react-hooks/exhaustive-deps
143
+ }, [tool, matrix, imageSize]);
144
+ }
145
+ //# sourceMappingURL=useCropGesture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","Gesture","useSharedValue","useEditor","HANDLE_SIZE","applyToPoint","distance","invert","MIN_CROP","useCropGesture","tool","matrix","cropRectSV","imageSize","invMatrix","cropMode","corner","startRect","x","y","width","height","startImg","Pan","enabled","maxPointers","onBegin","e","screen","img","r","value","corners","i","length","cs","onChange","dx","dy","s","nx","ny","Math","max","min","left","top","right","bottom","x0","y0","x1","y1","onEnd"],"sourceRoot":"..\\..\\..\\src","sources":["gestures/useCropGesture.ts"],"mappings":"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","ignoreList":[]}