@searpent/react-image-annotate 2.0.77 → 2.0.78

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