@searpent/react-image-annotate 2.0.0 → 2.0.3

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 (174) hide show
  1. package/Annotator/index.js +169 -0
  2. package/Annotator/reducers/combine-reducers.js +14 -0
  3. package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
  4. package/{src/Annotator → Annotator}/reducers/fix-twisted.js +3 -5
  5. package/Annotator/reducers/general-reducer.js +1058 -0
  6. package/Annotator/reducers/get-active-image.js +27 -0
  7. package/Annotator/reducers/get-implied-video-regions.js +180 -0
  8. package/Annotator/reducers/history-handler.js +38 -0
  9. package/Annotator/reducers/image-reducer.js +20 -0
  10. package/Annotator/reducers/video-reducer.js +88 -0
  11. package/ClassSelectionMenu/index.js +135 -0
  12. package/Crosshairs/index.js +53 -0
  13. package/DebugSidebarBox/index.js +20 -0
  14. package/DemoSite/Editor.js +194 -0
  15. package/DemoSite/ErrorBoundaryDialog.js +64 -0
  16. package/DemoSite/index.js +40 -0
  17. package/FullImageSegmentationAnnotator/index.js +7 -0
  18. package/GroupSelectorSidebarBox/index.js +63 -0
  19. package/HighlightBox/index.js +99 -0
  20. package/HistorySidebarBox/index.js +71 -0
  21. package/ImageCanvas/index.js +424 -0
  22. package/ImageCanvas/region-tools.js +165 -0
  23. package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
  24. package/ImageCanvas/use-mouse.js +180 -0
  25. package/ImageCanvas/use-project-box.js +27 -0
  26. package/ImageCanvas/use-wasd-mode.js +62 -0
  27. package/ImageMask/index.js +133 -0
  28. package/ImageMask/load-image.js +25 -0
  29. package/ImageSelectorSidebarBox/index.js +60 -0
  30. package/KeyframeTimeline/get-time-string.js +27 -0
  31. package/KeyframeTimeline/index.js +233 -0
  32. package/KeyframesSelectorSidebarBox/index.js +93 -0
  33. package/LandingPage/index.js +159 -0
  34. package/MainLayout/icon-dictionary.js +104 -0
  35. package/MainLayout/index.js +366 -0
  36. package/{src/MainLayout → MainLayout}/styles.js +6 -7
  37. package/MainLayout/types.js +0 -0
  38. package/MainLayout/use-implied-video-regions.js +13 -0
  39. package/PointDistances/index.js +73 -0
  40. package/PreventScrollToParents/index.js +51 -0
  41. package/RegionLabel/index.js +191 -0
  42. package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
  43. package/RegionSelectAndTransformBoxes/index.js +167 -0
  44. package/RegionSelectorSidebarBox/index.js +248 -0
  45. package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
  46. package/RegionShapes/index.js +274 -0
  47. package/RegionTags/index.js +138 -0
  48. package/SettingsDialog/index.js +52 -0
  49. package/SettingsProvider/index.js +53 -0
  50. package/Shortcuts/ShortcutField.js +46 -0
  51. package/Shortcuts/index.js +133 -0
  52. package/ShortcutsManager/index.js +155 -0
  53. package/Sidebar/index.js +69 -0
  54. package/SidebarBoxContainer/index.js +93 -0
  55. package/SmallToolButton/index.js +42 -0
  56. package/TagsSidebarBox/index.js +105 -0
  57. package/TaskDescriptionSidebarBox/index.js +58 -0
  58. package/Theme/index.js +30 -0
  59. package/VideoOrImageCanvasBackground/index.js +151 -0
  60. package/colors.js +14 -0
  61. package/hooks/use-event-callback.js +10 -0
  62. package/hooks/use-exclude-pattern.js +24 -0
  63. package/hooks/use-load-image.js +26 -0
  64. package/hooks/use-window-size.js +46 -0
  65. package/{src/hooks → hooks}/xpattern.js +1 -1
  66. package/index.js +3 -0
  67. package/lib.js +3 -0
  68. package/package.json +1 -1
  69. package/stories.js +5 -0
  70. package/utils/get-from-local-storage.js +7 -0
  71. package/utils/get-hotkey-help-text.js +9 -0
  72. package/utils/get-landmarks-with-transform.js +40 -0
  73. package/utils/set-in-local-storage.js +3 -0
  74. package/.babelrc +0 -6
  75. package/.env +0 -1
  76. package/.flowconfig +0 -2
  77. package/.github/workflows/release-on-master.yml +0 -32
  78. package/.github/workflows/test.yml +0 -16
  79. package/.prettierrc +0 -3
  80. package/.releaserc.js +0 -18
  81. package/.storybook/addons.js +0 -2
  82. package/.storybook/config.js +0 -16
  83. package/LICENSE +0 -21
  84. package/public/favicon.ico +0 -0
  85. package/public/index.html +0 -38
  86. package/src/Annotator/bike-pic.png +0 -0
  87. package/src/Annotator/bike-pic2.png +0 -0
  88. package/src/Annotator/dab-keyframes.story.json +0 -1
  89. package/src/Annotator/index.js +0 -206
  90. package/src/Annotator/index.story.js +0 -727
  91. package/src/Annotator/poses.story.js +0 -150
  92. package/src/Annotator/reducers/combine-reducers.js +0 -7
  93. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
  94. package/src/Annotator/reducers/general-reducer.js +0 -914
  95. package/src/Annotator/reducers/get-active-image.js +0 -21
  96. package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
  97. package/src/Annotator/reducers/history-handler.js +0 -60
  98. package/src/Annotator/reducers/image-reducer.js +0 -23
  99. package/src/Annotator/reducers/video-reducer.js +0 -85
  100. package/src/Annotator/video.story.js +0 -51
  101. package/src/ClassSelectionMenu/index.js +0 -108
  102. package/src/Crosshairs/index.js +0 -64
  103. package/src/DebugSidebarBox/index.js +0 -36
  104. package/src/DemoSite/Editor.js +0 -235
  105. package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
  106. package/src/DemoSite/index.js +0 -41
  107. package/src/DemoSite/index.story.js +0 -10
  108. package/src/DemoSite/simple-segmentation-example.json +0 -572
  109. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  110. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  111. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  112. package/src/FullImageSegmentationAnnotator/index.js +0 -7
  113. package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
  114. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  115. package/src/HighlightBox/index.js +0 -143
  116. package/src/HistorySidebarBox/index.js +0 -78
  117. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  118. package/src/ImageCanvas/index.js +0 -488
  119. package/src/ImageCanvas/index.story.js +0 -214
  120. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  121. package/src/ImageCanvas/region-tools.js +0 -171
  122. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  123. package/src/ImageCanvas/use-mouse.js +0 -168
  124. package/src/ImageCanvas/use-project-box.js +0 -23
  125. package/src/ImageCanvas/use-wasd-mode.js +0 -50
  126. package/src/ImageMask/index.js +0 -127
  127. package/src/ImageMask/load-image.js +0 -32
  128. package/src/ImageSelectorSidebarBox/index.js +0 -54
  129. package/src/KeyframeTimeline/get-time-string.js +0 -25
  130. package/src/KeyframeTimeline/index.js +0 -223
  131. package/src/KeyframesSelectorSidebarBox/index.js +0 -93
  132. package/src/LandingPage/content.md +0 -57
  133. package/src/LandingPage/github-markdown.css +0 -964
  134. package/src/LandingPage/index.js +0 -147
  135. package/src/MainLayout/icon-dictionary.js +0 -79
  136. package/src/MainLayout/index.js +0 -420
  137. package/src/MainLayout/index.story.js +0 -240
  138. package/src/MainLayout/types.js +0 -156
  139. package/src/MainLayout/use-implied-video-regions.js +0 -17
  140. package/src/PointDistances/index.js +0 -90
  141. package/src/PreventScrollToParents/index.js +0 -48
  142. package/src/PreventScrollToParents/index.story.js +0 -23
  143. package/src/RegionLabel/index.js +0 -201
  144. package/src/RegionSelectAndTransformBoxes/index.js +0 -234
  145. package/src/RegionSelectorSidebarBox/index.js +0 -216
  146. package/src/RegionShapes/index.js +0 -236
  147. package/src/RegionTags/index.js +0 -130
  148. package/src/SettingsDialog/index.js +0 -58
  149. package/src/SettingsProvider/index.js +0 -44
  150. package/src/Shortcuts/ShortcutField.js +0 -44
  151. package/src/Shortcuts/index.js +0 -129
  152. package/src/ShortcutsManager/index.js +0 -162
  153. package/src/Sidebar/index.js +0 -117
  154. package/src/SidebarBoxContainer/index.js +0 -93
  155. package/src/SmallToolButton/index.js +0 -57
  156. package/src/TagsSidebarBox/index.js +0 -93
  157. package/src/TaskDescriptionSidebarBox/index.js +0 -43
  158. package/src/Theme/index.js +0 -36
  159. package/src/VideoOrImageCanvasBackground/index.js +0 -170
  160. package/src/colors.js +0 -32
  161. package/src/hooks/use-event-callback.js +0 -11
  162. package/src/hooks/use-exclude-pattern.js +0 -27
  163. package/src/hooks/use-load-image.js +0 -21
  164. package/src/hooks/use-window-size.js +0 -46
  165. package/src/hooks/xpattern.png +0 -0
  166. package/src/index.js +0 -18
  167. package/src/lib.js +0 -7
  168. package/src/screenshot.png +0 -0
  169. package/src/site.css +0 -5
  170. package/src/stories.js +0 -2
  171. package/src/utils/get-from-local-storage.js +0 -7
  172. package/src/utils/get-hotkey-help-text.js +0 -11
  173. package/src/utils/get-landmarks-with-transform.js +0 -23
  174. package/src/utils/set-in-local-storage.js +0 -6
@@ -0,0 +1,424 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread";
2
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
4
+ import React, { useRef, useState, useLayoutEffect, useEffect, useMemo } from "react";
5
+ import { Matrix } from "transformation-matrix-js";
6
+ import Crosshairs from "../Crosshairs";
7
+ import { makeStyles } from "@mui/styles";
8
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
9
+ import styles from "./styles";
10
+ import PreventScrollToParents from "../PreventScrollToParents";
11
+ import useWindowSize from "../hooks/use-window-size.js";
12
+ import useMouse from "./use-mouse";
13
+ import useProjectRegionBox from "./use-project-box";
14
+ import useExcludePattern from "../hooks/use-exclude-pattern";
15
+ import { useRafState } from "react-use";
16
+ import PointDistances from "../PointDistances";
17
+ import RegionTags from "../RegionTags";
18
+ import RegionLabel from "../RegionLabel";
19
+ import ImageMask from "../ImageMask";
20
+ import RegionSelectAndTransformBoxes from "../RegionSelectAndTransformBoxes";
21
+ import VideoOrImageCanvasBackground from "../VideoOrImageCanvasBackground";
22
+ import useEventCallback from "use-event-callback";
23
+ import RegionShapes from "../RegionShapes";
24
+ import useWasdMode from "./use-wasd-mode";
25
+ var theme = createTheme();
26
+ var useStyles = makeStyles(function (theme) {
27
+ return styles;
28
+ });
29
+
30
+ var getDefaultMat = function getDefaultMat() {
31
+ var allowedArea = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
32
+
33
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
34
+ iw = _ref.iw,
35
+ ih = _ref.ih;
36
+
37
+ var mat = Matrix.from(1, 0, 0, 1, -10, -10);
38
+
39
+ if (allowedArea && iw) {
40
+ mat = mat.translate(allowedArea.x * iw, allowedArea.y * ih).scaleU(allowedArea.w + 0.05);
41
+ }
42
+
43
+ return mat;
44
+ };
45
+
46
+ export var ImageCanvas = function ImageCanvas(_ref2) {
47
+ var regions = _ref2.regions,
48
+ imageSrc = _ref2.imageSrc,
49
+ videoSrc = _ref2.videoSrc,
50
+ videoTime = _ref2.videoTime,
51
+ realSize = _ref2.realSize,
52
+ showTags = _ref2.showTags,
53
+ _ref2$onMouseMove = _ref2.onMouseMove,
54
+ onMouseMove = _ref2$onMouseMove === void 0 ? function (p) {
55
+ return null;
56
+ } : _ref2$onMouseMove,
57
+ _ref2$onMouseDown = _ref2.onMouseDown,
58
+ onMouseDown = _ref2$onMouseDown === void 0 ? function (p) {
59
+ return null;
60
+ } : _ref2$onMouseDown,
61
+ _ref2$onMouseUp = _ref2.onMouseUp,
62
+ onMouseUp = _ref2$onMouseUp === void 0 ? function (p) {
63
+ return null;
64
+ } : _ref2$onMouseUp,
65
+ _ref2$dragWithPrimary = _ref2.dragWithPrimary,
66
+ dragWithPrimary = _ref2$dragWithPrimary === void 0 ? false : _ref2$dragWithPrimary,
67
+ _ref2$zoomWithPrimary = _ref2.zoomWithPrimary,
68
+ zoomWithPrimary = _ref2$zoomWithPrimary === void 0 ? false : _ref2$zoomWithPrimary,
69
+ _ref2$createWithPrima = _ref2.createWithPrimary,
70
+ createWithPrimary = _ref2$createWithPrima === void 0 ? false : _ref2$createWithPrima,
71
+ _ref2$pointDistancePr = _ref2.pointDistancePrecision,
72
+ pointDistancePrecision = _ref2$pointDistancePr === void 0 ? 0 : _ref2$pointDistancePr,
73
+ regionClsList = _ref2.regionClsList,
74
+ regionTagList = _ref2.regionTagList,
75
+ showCrosshairs = _ref2.showCrosshairs,
76
+ _ref2$showHighlightBo = _ref2.showHighlightBox,
77
+ showHighlightBox = _ref2$showHighlightBo === void 0 ? true : _ref2$showHighlightBo,
78
+ showPointDistances = _ref2.showPointDistances,
79
+ allowedArea = _ref2.allowedArea,
80
+ _ref2$RegionEditLabel = _ref2.RegionEditLabel,
81
+ RegionEditLabel = _ref2$RegionEditLabel === void 0 ? null : _ref2$RegionEditLabel,
82
+ _ref2$videoPlaying = _ref2.videoPlaying,
83
+ videoPlaying = _ref2$videoPlaying === void 0 ? false : _ref2$videoPlaying,
84
+ _ref2$showMask = _ref2.showMask,
85
+ showMask = _ref2$showMask === void 0 ? true : _ref2$showMask,
86
+ fullImageSegmentationMode = _ref2.fullImageSegmentationMode,
87
+ autoSegmentationOptions = _ref2.autoSegmentationOptions,
88
+ onImageOrVideoLoaded = _ref2.onImageOrVideoLoaded,
89
+ onChangeRegion = _ref2.onChangeRegion,
90
+ onBeginRegionEdit = _ref2.onBeginRegionEdit,
91
+ onCloseRegionEdit = _ref2.onCloseRegionEdit,
92
+ onBeginBoxTransform = _ref2.onBeginBoxTransform,
93
+ onBeginMovePolygonPoint = _ref2.onBeginMovePolygonPoint,
94
+ onAddPolygonPoint = _ref2.onAddPolygonPoint,
95
+ onBeginMoveKeypoint = _ref2.onBeginMoveKeypoint,
96
+ onSelectRegion = _ref2.onSelectRegion,
97
+ onBeginMovePoint = _ref2.onBeginMovePoint,
98
+ onDeleteRegion = _ref2.onDeleteRegion,
99
+ onChangeVideoTime = _ref2.onChangeVideoTime,
100
+ onChangeVideoPlaying = _ref2.onChangeVideoPlaying,
101
+ onRegionClassAdded = _ref2.onRegionClassAdded,
102
+ _ref2$zoomOnAllowedAr = _ref2.zoomOnAllowedArea,
103
+ zoomOnAllowedArea = _ref2$zoomOnAllowedAr === void 0 ? true : _ref2$zoomOnAllowedAr,
104
+ _ref2$modifyingAllowe = _ref2.modifyingAllowedArea,
105
+ modifyingAllowedArea = _ref2$modifyingAllowe === void 0 ? false : _ref2$modifyingAllowe,
106
+ keypointDefinitions = _ref2.keypointDefinitions,
107
+ allowComments = _ref2.allowComments;
108
+ var classes = useStyles();
109
+ var canvasEl = useRef(null);
110
+ var layoutParams = useRef({});
111
+
112
+ var _useRafState = useRafState(false),
113
+ _useRafState2 = _slicedToArray(_useRafState, 2),
114
+ dragging = _useRafState2[0],
115
+ changeDragging = _useRafState2[1];
116
+
117
+ var _useRafState3 = useRafState(0),
118
+ _useRafState4 = _slicedToArray(_useRafState3, 2),
119
+ maskImagesLoaded = _useRafState4[0],
120
+ changeMaskImagesLoaded = _useRafState4[1];
121
+
122
+ var _useRafState5 = useRafState(null),
123
+ _useRafState6 = _slicedToArray(_useRafState5, 2),
124
+ zoomStart = _useRafState6[0],
125
+ changeZoomStart = _useRafState6[1];
126
+
127
+ var _useRafState7 = useRafState(null),
128
+ _useRafState8 = _slicedToArray(_useRafState7, 2),
129
+ zoomEnd = _useRafState8[0],
130
+ changeZoomEnd = _useRafState8[1];
131
+
132
+ var _useRafState9 = useRafState(getDefaultMat()),
133
+ _useRafState10 = _slicedToArray(_useRafState9, 2),
134
+ mat = _useRafState10[0],
135
+ changeMat = _useRafState10[1];
136
+
137
+ var maskImages = useRef({});
138
+ var windowSize = useWindowSize();
139
+ var getLatestMat = useEventCallback(function () {
140
+ return mat;
141
+ });
142
+ useWasdMode({
143
+ getLatestMat: getLatestMat,
144
+ changeMat: changeMat
145
+ });
146
+
147
+ var _useMouse = useMouse({
148
+ canvasEl: canvasEl,
149
+ dragging: dragging,
150
+ mat: mat,
151
+ layoutParams: layoutParams,
152
+ changeMat: changeMat,
153
+ zoomStart: zoomStart,
154
+ zoomEnd: zoomEnd,
155
+ changeZoomStart: changeZoomStart,
156
+ changeZoomEnd: changeZoomEnd,
157
+ changeDragging: changeDragging,
158
+ zoomWithPrimary: zoomWithPrimary,
159
+ dragWithPrimary: dragWithPrimary,
160
+ onMouseMove: onMouseMove,
161
+ onMouseDown: onMouseDown,
162
+ onMouseUp: onMouseUp
163
+ }),
164
+ mouseEvents = _useMouse.mouseEvents,
165
+ mousePosition = _useMouse.mousePosition;
166
+
167
+ useLayoutEffect(function () {
168
+ return changeMat(mat.clone());
169
+ }, [windowSize]);
170
+ var innerMousePos = mat.applyToPoint(mousePosition.current.x, mousePosition.current.y);
171
+ var projectRegionBox = useProjectRegionBox({
172
+ layoutParams: layoutParams,
173
+ mat: mat
174
+ });
175
+
176
+ var _useState = useState(),
177
+ _useState2 = _slicedToArray(_useState, 2),
178
+ imageDimensions = _useState2[0],
179
+ changeImageDimensions = _useState2[1];
180
+
181
+ var imageLoaded = Boolean(imageDimensions && imageDimensions.naturalWidth);
182
+ var onVideoOrImageLoaded = useEventCallback(function (_ref3) {
183
+ var naturalWidth = _ref3.naturalWidth,
184
+ naturalHeight = _ref3.naturalHeight,
185
+ duration = _ref3.duration;
186
+ var dims = {
187
+ naturalWidth: naturalWidth,
188
+ naturalHeight: naturalHeight,
189
+ duration: duration
190
+ };
191
+ if (onImageOrVideoLoaded) onImageOrVideoLoaded(dims);
192
+ changeImageDimensions(dims); // Redundant update to fix rerendering issues
193
+
194
+ setTimeout(function () {
195
+ return changeImageDimensions(dims);
196
+ }, 10);
197
+ });
198
+ var excludePattern = useExcludePattern();
199
+ var canvas = canvasEl.current;
200
+
201
+ if (canvas && imageLoaded) {
202
+ var clientWidth = canvas.clientWidth,
203
+ clientHeight = canvas.clientHeight;
204
+ var fitScale = Math.max(imageDimensions.naturalWidth / (clientWidth - 20), imageDimensions.naturalHeight / (clientHeight - 20));
205
+
206
+ var _iw = imageDimensions.naturalWidth / fitScale,
207
+ _ih = imageDimensions.naturalHeight / fitScale;
208
+
209
+ layoutParams.current = {
210
+ iw: _iw,
211
+ ih: _ih,
212
+ fitScale: fitScale,
213
+ canvasWidth: clientWidth,
214
+ canvasHeight: clientHeight
215
+ };
216
+ }
217
+
218
+ useEffect(function () {
219
+ if (!imageLoaded) return;
220
+ changeMat(getDefaultMat(zoomOnAllowedArea ? allowedArea : null, layoutParams.current)); // eslint-disable-next-line
221
+ }, [imageLoaded]);
222
+ useLayoutEffect(function () {
223
+ if (!imageDimensions) return;
224
+ var clientWidth = canvas.clientWidth,
225
+ clientHeight = canvas.clientHeight;
226
+ canvas.width = clientWidth;
227
+ canvas.height = clientHeight;
228
+ var context = canvas.getContext("2d");
229
+ context.save();
230
+ context.transform.apply(context, _toConsumableArray(mat.clone().inverse().toArray()));
231
+ var _layoutParams$current = layoutParams.current,
232
+ iw = _layoutParams$current.iw,
233
+ ih = _layoutParams$current.ih;
234
+
235
+ if (allowedArea) {
236
+ // Pattern to indicate the NOT allowed areas
237
+ var x = allowedArea.x,
238
+ y = allowedArea.y,
239
+ w = allowedArea.w,
240
+ h = allowedArea.h;
241
+ context.save();
242
+ context.globalAlpha = 1;
243
+ var outer = [[0, 0], [iw, 0], [iw, ih], [0, ih]];
244
+ var inner = [[x * iw, y * ih], [x * iw + w * iw, y * ih], [x * iw + w * iw, y * ih + h * ih], [x * iw, y * ih + h * ih]];
245
+ context.moveTo.apply(context, _toConsumableArray(outer[0]));
246
+ outer.forEach(function (p) {
247
+ return context.lineTo.apply(context, _toConsumableArray(p));
248
+ });
249
+ context.lineTo.apply(context, _toConsumableArray(outer[0]));
250
+ context.closePath();
251
+ inner.reverse();
252
+ context.moveTo.apply(context, _toConsumableArray(inner[0]));
253
+ inner.forEach(function (p) {
254
+ return context.lineTo.apply(context, _toConsumableArray(p));
255
+ });
256
+ context.lineTo.apply(context, _toConsumableArray(inner[0]));
257
+ context.fillStyle = excludePattern || "#f00";
258
+ context.fill();
259
+ context.restore();
260
+ }
261
+
262
+ context.restore();
263
+ });
264
+ var _layoutParams$current2 = layoutParams.current,
265
+ iw = _layoutParams$current2.iw,
266
+ ih = _layoutParams$current2.ih;
267
+ var zoomBox = !zoomStart || !zoomEnd ? null : _objectSpread({}, mat.clone().inverse().applyToPoint(zoomStart.x, zoomStart.y), {
268
+ w: (zoomEnd.x - zoomStart.x) / mat.a,
269
+ h: (zoomEnd.y - zoomStart.y) / mat.d
270
+ });
271
+
272
+ if (zoomBox) {
273
+ if (zoomBox.w < 0) {
274
+ zoomBox.x += zoomBox.w;
275
+ zoomBox.w *= -1;
276
+ }
277
+
278
+ if (zoomBox.h < 0) {
279
+ zoomBox.y += zoomBox.h;
280
+ zoomBox.h *= -1;
281
+ }
282
+ }
283
+
284
+ var imagePosition = {
285
+ topLeft: mat.clone().inverse().applyToPoint(0, 0),
286
+ bottomRight: mat.clone().inverse().applyToPoint(iw, ih)
287
+ };
288
+ var highlightedRegion = useMemo(function () {
289
+ var highlightedRegions = regions.filter(function (r) {
290
+ return r.highlighted;
291
+ });
292
+ if (highlightedRegions.length !== 1) return null;
293
+ return highlightedRegions[0];
294
+ }, [regions]);
295
+ return React.createElement(ThemeProvider, {
296
+ theme: theme
297
+ }, React.createElement("div", {
298
+ style: {
299
+ width: "100%",
300
+ height: "100%",
301
+ maxHeight: "calc(100vh - 68px)",
302
+ position: "relative",
303
+ overflow: "hidden",
304
+ cursor: createWithPrimary ? "crosshair" : dragging ? "grabbing" : dragWithPrimary ? "grab" : zoomWithPrimary ? mat.a < 1 ? "zoom-out" : "zoom-in" : undefined
305
+ }
306
+ }, showCrosshairs && React.createElement(Crosshairs, {
307
+ key: "crossHairs",
308
+ mousePosition: mousePosition
309
+ }), imageLoaded && !dragging && React.createElement(RegionSelectAndTransformBoxes, {
310
+ key: "regionSelectAndTransformBoxes",
311
+ regions: !modifyingAllowedArea || !allowedArea ? regions : [{
312
+ type: "box",
313
+ id: "$$allowed_area",
314
+ cls: "allowed_area",
315
+ highlighted: true,
316
+ x: allowedArea.x,
317
+ y: allowedArea.y,
318
+ w: allowedArea.w,
319
+ h: allowedArea.h,
320
+ visible: true,
321
+ color: "#ff0"
322
+ }],
323
+ mouseEvents: mouseEvents,
324
+ projectRegionBox: projectRegionBox,
325
+ dragWithPrimary: dragWithPrimary,
326
+ createWithPrimary: createWithPrimary,
327
+ zoomWithPrimary: zoomWithPrimary,
328
+ onBeginMovePoint: onBeginMovePoint,
329
+ onSelectRegion: onSelectRegion,
330
+ layoutParams: layoutParams,
331
+ mat: mat,
332
+ onBeginBoxTransform: onBeginBoxTransform,
333
+ onBeginMovePolygonPoint: onBeginMovePolygonPoint,
334
+ onBeginMoveKeypoint: onBeginMoveKeypoint,
335
+ onAddPolygonPoint: onAddPolygonPoint,
336
+ showHighlightBox: showHighlightBox
337
+ }), imageLoaded && showTags && !dragging && React.createElement(PreventScrollToParents, {
338
+ key: "regionTags"
339
+ }, React.createElement(RegionTags, {
340
+ regions: regions,
341
+ projectRegionBox: projectRegionBox,
342
+ mouseEvents: mouseEvents,
343
+ regionClsList: regionClsList,
344
+ regionTagList: regionTagList,
345
+ onBeginRegionEdit: onBeginRegionEdit,
346
+ onChangeRegion: onChangeRegion,
347
+ onCloseRegionEdit: onCloseRegionEdit,
348
+ onDeleteRegion: onDeleteRegion,
349
+ layoutParams: layoutParams,
350
+ imageSrc: imageSrc,
351
+ RegionEditLabel: RegionEditLabel,
352
+ onRegionClassAdded: onRegionClassAdded,
353
+ allowComments: allowComments
354
+ })), !showTags && highlightedRegion && React.createElement("div", {
355
+ key: "topLeftTag",
356
+ className: classes.fixedRegionLabel
357
+ }, React.createElement(RegionLabel, {
358
+ disableClose: true,
359
+ allowedClasses: regionClsList,
360
+ allowedTags: regionTagList,
361
+ onChange: onChangeRegion,
362
+ onDelete: onDeleteRegion,
363
+ editing: true,
364
+ region: highlightedRegion,
365
+ imageSrc: imageSrc,
366
+ allowComments: allowComments
367
+ })), zoomWithPrimary && zoomBox !== null && React.createElement("div", {
368
+ key: "zoomBox",
369
+ style: {
370
+ position: "absolute",
371
+ zIndex: 1,
372
+ border: "1px solid #fff",
373
+ pointerEvents: "none",
374
+ left: zoomBox.x,
375
+ top: zoomBox.y,
376
+ width: zoomBox.w,
377
+ height: zoomBox.h
378
+ }
379
+ }), showPointDistances && React.createElement(PointDistances, {
380
+ key: "pointDistances",
381
+ regions: regions,
382
+ realSize: realSize,
383
+ projectRegionBox: projectRegionBox,
384
+ pointDistancePrecision: pointDistancePrecision
385
+ }), React.createElement(PreventScrollToParents, Object.assign({
386
+ style: {
387
+ width: "100%",
388
+ height: "100%"
389
+ }
390
+ }, mouseEvents), React.createElement(React.Fragment, null, fullImageSegmentationMode && React.createElement(ImageMask, {
391
+ hide: !showMask,
392
+ autoSegmentationOptions: autoSegmentationOptions,
393
+ imagePosition: imagePosition,
394
+ regionClsList: regionClsList,
395
+ imageSrc: imageSrc,
396
+ regions: regions
397
+ }), React.createElement("canvas", {
398
+ style: {
399
+ opacity: 0.25
400
+ },
401
+ className: classes.canvas,
402
+ ref: canvasEl
403
+ }), React.createElement(RegionShapes, {
404
+ mat: mat,
405
+ keypointDefinitions: keypointDefinitions,
406
+ imagePosition: imagePosition,
407
+ regions: regions,
408
+ fullSegmentationMode: fullImageSegmentationMode
409
+ }), React.createElement(VideoOrImageCanvasBackground, {
410
+ videoPlaying: videoPlaying,
411
+ imagePosition: imagePosition,
412
+ mouseEvents: mouseEvents,
413
+ onLoad: onVideoOrImageLoaded,
414
+ videoTime: videoTime,
415
+ videoSrc: videoSrc,
416
+ imageSrc: imageSrc,
417
+ useCrossOrigin: fullImageSegmentationMode,
418
+ onChangeVideoTime: onChangeVideoTime,
419
+ onChangeVideoPlaying: onChangeVideoPlaying
420
+ }))), React.createElement("div", {
421
+ className: classes.zoomIndicator
422
+ }, (1 / mat.a * 100).toFixed(0), "%")));
423
+ };
424
+ export default ImageCanvas;
@@ -0,0 +1,165 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
4
+ export var getEnclosingBox = function getEnclosingBox(region) {
5
+ switch (region.type) {
6
+ case "polygon":
7
+ {
8
+ var box = {
9
+ x: Math.min.apply(Math, _toConsumableArray(region.points.map(function (_ref) {
10
+ var _ref2 = _slicedToArray(_ref, 2),
11
+ x = _ref2[0],
12
+ y = _ref2[1];
13
+
14
+ return x;
15
+ }))),
16
+ y: Math.min.apply(Math, _toConsumableArray(region.points.map(function (_ref3) {
17
+ var _ref4 = _slicedToArray(_ref3, 2),
18
+ x = _ref4[0],
19
+ y = _ref4[1];
20
+
21
+ return y;
22
+ }))),
23
+ w: 0,
24
+ h: 0
25
+ };
26
+ box.w = Math.max.apply(Math, _toConsumableArray(region.points.map(function (_ref5) {
27
+ var _ref6 = _slicedToArray(_ref5, 2),
28
+ x = _ref6[0],
29
+ y = _ref6[1];
30
+
31
+ return x;
32
+ }))) - box.x;
33
+ box.h = Math.max.apply(Math, _toConsumableArray(region.points.map(function (_ref7) {
34
+ var _ref8 = _slicedToArray(_ref7, 2),
35
+ x = _ref8[0],
36
+ y = _ref8[1];
37
+
38
+ return y;
39
+ }))) - box.y;
40
+ return box;
41
+ }
42
+
43
+ case "keypoints":
44
+ {
45
+ var minX = Math.min.apply(Math, _toConsumableArray(Object.values(region.points).map(function (_ref9) {
46
+ var x = _ref9.x,
47
+ y = _ref9.y;
48
+ return x;
49
+ })));
50
+ var minY = Math.min.apply(Math, _toConsumableArray(Object.values(region.points).map(function (_ref10) {
51
+ var x = _ref10.x,
52
+ y = _ref10.y;
53
+ return y;
54
+ })));
55
+ var maxX = Math.max.apply(Math, _toConsumableArray(Object.values(region.points).map(function (_ref11) {
56
+ var x = _ref11.x,
57
+ y = _ref11.y;
58
+ return x;
59
+ })));
60
+ var maxY = Math.max.apply(Math, _toConsumableArray(Object.values(region.points).map(function (_ref12) {
61
+ var x = _ref12.x,
62
+ y = _ref12.y;
63
+ return y;
64
+ })));
65
+ return {
66
+ x: minX,
67
+ y: minY,
68
+ w: maxX - minX,
69
+ h: maxY - minY
70
+ };
71
+ }
72
+
73
+ case "expanding-line":
74
+ {
75
+ var _box = {
76
+ x: Math.min.apply(Math, _toConsumableArray(region.points.map(function (_ref13) {
77
+ var x = _ref13.x,
78
+ y = _ref13.y;
79
+ return x;
80
+ }))),
81
+ y: Math.min.apply(Math, _toConsumableArray(region.points.map(function (_ref14) {
82
+ var x = _ref14.x,
83
+ y = _ref14.y;
84
+ return y;
85
+ }))),
86
+ w: 0,
87
+ h: 0
88
+ };
89
+ _box.w = Math.max.apply(Math, _toConsumableArray(region.points.map(function (_ref15) {
90
+ var x = _ref15.x,
91
+ y = _ref15.y;
92
+ return x;
93
+ }))) - _box.x;
94
+ _box.h = Math.max.apply(Math, _toConsumableArray(region.points.map(function (_ref16) {
95
+ var x = _ref16.x,
96
+ y = _ref16.y;
97
+ return y;
98
+ }))) - _box.y;
99
+ return _box;
100
+ }
101
+
102
+ case "line":
103
+ {
104
+ return {
105
+ x: region.x1,
106
+ y: region.y1,
107
+ w: 0,
108
+ h: 0
109
+ };
110
+ }
111
+
112
+ case "box":
113
+ {
114
+ return {
115
+ x: region.x,
116
+ y: region.y,
117
+ w: region.w,
118
+ h: region.h
119
+ };
120
+ }
121
+
122
+ case "point":
123
+ {
124
+ return {
125
+ x: region.x,
126
+ y: region.y,
127
+ w: 0,
128
+ h: 0
129
+ };
130
+ }
131
+
132
+ default:
133
+ {
134
+ return {
135
+ x: 0,
136
+ y: 0,
137
+ w: 0,
138
+ h: 0
139
+ };
140
+ }
141
+ }
142
+
143
+ throw new Error("unknown region");
144
+ };
145
+ export var moveRegion = function moveRegion(region, x, y) {
146
+ switch (region.type) {
147
+ case "point":
148
+ {
149
+ return _objectSpread({}, region, {
150
+ x: x,
151
+ y: y
152
+ });
153
+ }
154
+
155
+ case "box":
156
+ {
157
+ return _objectSpread({}, region, {
158
+ x: x - region.w / 2,
159
+ y: y - region.h / 2
160
+ });
161
+ }
162
+ }
163
+
164
+ return region;
165
+ };
@@ -1,7 +1,11 @@
1
- import { grey } from "@mui/material/colors"
2
-
1
+ import { grey } from "@mui/material/colors";
3
2
  export default {
4
- canvas: { width: "100%", height: "100%", position: "relative", zIndex: 1 },
3
+ canvas: {
4
+ width: "100%",
5
+ height: "100%",
6
+ position: "relative",
7
+ zIndex: 1
8
+ },
5
9
  zoomIndicator: {
6
10
  position: "absolute",
7
11
  bottom: 16,
@@ -11,7 +15,7 @@ export default {
11
15
  opacity: 0.5,
12
16
  fontWeight: "bolder",
13
17
  fontSize: 14,
14
- padding: 4,
18
+ padding: 4
15
19
  },
16
20
  fixedRegionLabel: {
17
21
  position: "absolute",
@@ -21,7 +25,7 @@ export default {
21
25
  opacity: 0.5,
22
26
  transition: "opacity 500ms",
23
27
  "&:hover": {
24
- opacity: 1,
25
- },
26
- },
27
- }
28
+ opacity: 1
29
+ }
30
+ }
31
+ };