js-draw 0.17.3 → 0.18.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 (516) hide show
  1. package/.github/workflows/firebase-hosting-merge.yml +2 -0
  2. package/.github/workflows/firebase-hosting-pull-request.yml +2 -0
  3. package/.github/workflows/github-pages.yml +2 -0
  4. package/CHANGELOG.md +10 -1
  5. package/README.md +17 -8
  6. package/build_tools/postDist.ts +71 -0
  7. package/dist/bundle.js +9 -1
  8. package/dist/cjs/build_tools/BundledFile.js +163 -0
  9. package/dist/cjs/build_tools/buildTranslationTemplate.js +119 -0
  10. package/dist/cjs/build_tools/bundle.js +10 -0
  11. package/dist/cjs/build_tools/postDist.js +72 -0
  12. package/dist/{src → cjs/src}/Color4.d.ts +1 -0
  13. package/dist/cjs/src/Color4.js +197 -0
  14. package/dist/{src → cjs/src}/Editor.d.ts +57 -1
  15. package/dist/cjs/src/Editor.js +904 -0
  16. package/dist/{src → cjs/src}/EditorImage.d.ts +4 -2
  17. package/dist/cjs/src/EditorImage.js +486 -0
  18. package/dist/cjs/src/EventDispatcher.js +57 -0
  19. package/dist/cjs/src/Pointer.js +84 -0
  20. package/dist/{src → cjs/src}/SVGLoader.d.ts +4 -0
  21. package/dist/cjs/src/SVGLoader.js +472 -0
  22. package/dist/cjs/src/UndoRedoHistory.js +93 -0
  23. package/dist/cjs/src/Viewport.js +264 -0
  24. package/dist/cjs/src/bundle/bundled.js +24 -0
  25. package/dist/cjs/src/commands/Command.js +34 -0
  26. package/dist/cjs/src/commands/Duplicate.js +39 -0
  27. package/dist/cjs/src/commands/Erase.js +63 -0
  28. package/dist/cjs/src/commands/SerializableCommand.js +42 -0
  29. package/dist/cjs/src/commands/UnresolvedCommand.js +28 -0
  30. package/dist/cjs/src/commands/invertCommand.js +49 -0
  31. package/dist/cjs/src/commands/lib.js +18 -0
  32. package/dist/cjs/src/commands/localization.js +24 -0
  33. package/dist/cjs/src/commands/uniteCommands.js +121 -0
  34. package/dist/cjs/src/components/AbstractComponent.js +258 -0
  35. package/dist/cjs/src/components/ImageBackground.js +146 -0
  36. package/dist/cjs/src/components/ImageComponent.js +152 -0
  37. package/dist/cjs/src/components/RestylableComponent.js +88 -0
  38. package/dist/cjs/src/components/SVGGlobalAttributesObject.js +65 -0
  39. package/dist/cjs/src/components/Stroke.js +191 -0
  40. package/dist/cjs/src/components/TextComponent.js +258 -0
  41. package/dist/cjs/src/components/UnknownSVGObject.js +50 -0
  42. package/dist/cjs/src/components/builders/ArrowBuilder.js +117 -0
  43. package/dist/cjs/src/components/builders/FreehandLineBuilder.js +173 -0
  44. package/dist/cjs/src/components/builders/LineBuilder.js +89 -0
  45. package/dist/cjs/src/components/builders/PressureSensitiveFreehandLineBuilder.js +347 -0
  46. package/dist/cjs/src/components/builders/RectangleBuilder.js +59 -0
  47. package/dist/cjs/src/components/builders/types.js +2 -0
  48. package/dist/cjs/src/components/lib.js +43 -0
  49. package/dist/cjs/src/components/localization.js +13 -0
  50. package/dist/cjs/src/components/util/StrokeSmoother.js +217 -0
  51. package/dist/cjs/src/components/util/describeComponentList.js +16 -0
  52. package/dist/{src → cjs/src}/lib.d.ts +2 -1
  53. package/dist/cjs/src/lib.js +63 -0
  54. package/dist/cjs/src/localization.js +13 -0
  55. package/dist/cjs/src/localizations/de.js +6 -0
  56. package/dist/cjs/src/localizations/en.js +6 -0
  57. package/dist/cjs/src/localizations/es.js +20 -0
  58. package/dist/cjs/src/localizations/getLocalizationTable.js +50 -0
  59. package/dist/cjs/src/math/LineSegment2.js +131 -0
  60. package/dist/cjs/src/math/Mat33.js +332 -0
  61. package/dist/cjs/src/math/Path.js +655 -0
  62. package/dist/cjs/src/math/Rect2.js +234 -0
  63. package/dist/cjs/src/math/Triangle.js +22 -0
  64. package/dist/cjs/src/math/Vec2.js +19 -0
  65. package/dist/cjs/src/math/Vec3.js +177 -0
  66. package/dist/cjs/src/math/lib.js +18 -0
  67. package/dist/cjs/src/math/rounding.js +135 -0
  68. package/dist/cjs/src/rendering/Display.js +214 -0
  69. package/dist/cjs/src/rendering/RenderingStyle.js +48 -0
  70. package/dist/cjs/src/rendering/TextRenderingStyle.js +29 -0
  71. package/dist/cjs/src/rendering/caching/CacheRecord.js +61 -0
  72. package/dist/cjs/src/rendering/caching/CacheRecordManager.js +50 -0
  73. package/dist/cjs/src/rendering/caching/RenderingCache.js +51 -0
  74. package/dist/cjs/src/rendering/caching/RenderingCacheNode.js +326 -0
  75. package/dist/cjs/src/rendering/caching/testUtils.js +27 -0
  76. package/dist/cjs/src/rendering/caching/types.js +2 -0
  77. package/dist/{src → cjs/src}/rendering/lib.d.ts +2 -0
  78. package/dist/cjs/src/rendering/lib.js +16 -0
  79. package/dist/cjs/src/rendering/localization.js +12 -0
  80. package/dist/cjs/src/rendering/renderers/AbstractRenderer.js +170 -0
  81. package/dist/{src → cjs/src}/rendering/renderers/CanvasRenderer.d.ts +25 -0
  82. package/dist/cjs/src/rendering/renderers/CanvasRenderer.js +236 -0
  83. package/dist/cjs/src/rendering/renderers/DummyRenderer.js +112 -0
  84. package/dist/{src → cjs/src}/rendering/renderers/SVGRenderer.d.ts +15 -0
  85. package/dist/cjs/src/rendering/renderers/SVGRenderer.js +311 -0
  86. package/dist/cjs/src/rendering/renderers/TextOnlyRenderer.js +63 -0
  87. package/dist/cjs/src/testing/beforeEachFile.js +12 -0
  88. package/dist/cjs/src/testing/createEditor.js +14 -0
  89. package/dist/cjs/src/testing/lib.d.ts +2 -0
  90. package/dist/cjs/src/testing/lib.js +10 -0
  91. package/dist/cjs/src/testing/loadExpectExtensions.js +28 -0
  92. package/dist/cjs/src/testing/sendPenEvent.d.ts +12 -0
  93. package/dist/cjs/src/testing/sendPenEvent.js +24 -0
  94. package/dist/cjs/src/testing/sendTouchEvent.d.ts +42 -0
  95. package/dist/cjs/src/testing/sendTouchEvent.js +87 -0
  96. package/dist/cjs/src/toolbar/HTMLToolbar.js +383 -0
  97. package/dist/cjs/src/toolbar/IconProvider.js +660 -0
  98. package/dist/cjs/src/toolbar/lib.js +24 -0
  99. package/dist/cjs/src/toolbar/localization.js +51 -0
  100. package/dist/cjs/src/toolbar/makeColorInput.js +120 -0
  101. package/dist/cjs/src/toolbar/types.js +2 -0
  102. package/dist/cjs/src/toolbar/widgets/ActionButtonWidget.js +31 -0
  103. package/dist/cjs/src/toolbar/widgets/BaseToolWidget.js +50 -0
  104. package/dist/cjs/src/toolbar/widgets/BaseWidget.js +313 -0
  105. package/dist/cjs/src/toolbar/widgets/DocumentPropertiesWidget.js +126 -0
  106. package/dist/cjs/src/toolbar/widgets/EraserToolWidget.js +63 -0
  107. package/dist/cjs/src/toolbar/widgets/HandToolWidget.js +201 -0
  108. package/dist/cjs/src/toolbar/widgets/InsertImageWidget.js +176 -0
  109. package/dist/cjs/src/toolbar/widgets/OverflowWidget.js +77 -0
  110. package/dist/cjs/src/toolbar/widgets/PenToolWidget.js +226 -0
  111. package/dist/cjs/src/toolbar/widgets/SelectionToolWidget.js +153 -0
  112. package/dist/cjs/src/toolbar/widgets/TextToolWidget.js +115 -0
  113. package/dist/cjs/src/toolbar/widgets/lib.js +26 -0
  114. package/dist/cjs/src/tools/BaseTool.js +66 -0
  115. package/dist/cjs/src/tools/Eraser.js +112 -0
  116. package/dist/cjs/src/tools/FindTool.js +121 -0
  117. package/dist/cjs/src/tools/PanZoom.js +421 -0
  118. package/dist/cjs/src/tools/PasteHandler.js +99 -0
  119. package/dist/cjs/src/tools/Pen.js +179 -0
  120. package/dist/cjs/src/tools/PipetteTool.js +45 -0
  121. package/dist/cjs/src/tools/SelectionTool/SelectAllShortcutHandler.js +28 -0
  122. package/dist/cjs/src/tools/SelectionTool/Selection.js +488 -0
  123. package/dist/cjs/src/tools/SelectionTool/SelectionHandle.js +85 -0
  124. package/dist/cjs/src/tools/SelectionTool/SelectionTool.js +405 -0
  125. package/dist/cjs/src/tools/SelectionTool/TransformMode.js +107 -0
  126. package/dist/cjs/src/tools/SelectionTool/types.js +14 -0
  127. package/dist/cjs/src/tools/TextTool.js +262 -0
  128. package/dist/cjs/src/tools/ToolController.js +187 -0
  129. package/dist/cjs/src/tools/ToolEnabledGroup.js +14 -0
  130. package/dist/cjs/src/tools/ToolSwitcherShortcut.js +38 -0
  131. package/dist/cjs/src/tools/ToolbarShortcutHandler.js +29 -0
  132. package/dist/cjs/src/tools/UndoRedoShortcut.js +28 -0
  133. package/dist/cjs/src/tools/lib.js +36 -0
  134. package/dist/cjs/src/tools/localization.js +30 -0
  135. package/dist/cjs/src/types.js +38 -0
  136. package/dist/cjs/src/util/assertions.js +51 -0
  137. package/dist/cjs/src/util/fileToBase64.js +15 -0
  138. package/dist/cjs/src/util/untilNextAnimationFrame.js +9 -0
  139. package/dist/cjs/src/util/waitForTimeout.js +9 -0
  140. package/dist/mjs/build_tools/BundledFile.d.ts +13 -0
  141. package/dist/{build_tools/buildTranslationTemplate.js → mjs/build_tools/buildTranslationTemplate.mjs} +1 -1
  142. package/dist/{build_tools/bundle.js → mjs/build_tools/bundle.mjs} +1 -1
  143. package/dist/mjs/build_tools/postDist.d.ts +1 -0
  144. package/dist/mjs/build_tools/postDist.mjs +67 -0
  145. package/dist/mjs/src/Color4.d.ts +61 -0
  146. package/dist/{src/Color4.js → mjs/src/Color4.mjs} +1 -0
  147. package/dist/mjs/src/Editor.d.ts +308 -0
  148. package/dist/{src/Editor.js → mjs/src/Editor.mjs} +86 -49
  149. package/dist/mjs/src/EditorImage.d.ts +97 -0
  150. package/dist/{src/EditorImage.js → mjs/src/EditorImage.mjs} +12 -10
  151. package/dist/mjs/src/EventDispatcher.d.ts +30 -0
  152. package/dist/mjs/src/Pointer.d.ts +24 -0
  153. package/dist/{src/Pointer.js → mjs/src/Pointer.mjs} +1 -1
  154. package/dist/mjs/src/SVGLoader.d.ts +48 -0
  155. package/dist/{src/SVGLoader.js → mjs/src/SVGLoader.mjs} +15 -11
  156. package/dist/mjs/src/UndoRedoHistory.d.ts +19 -0
  157. package/dist/{src/UndoRedoHistory.js → mjs/src/UndoRedoHistory.mjs} +1 -1
  158. package/dist/mjs/src/Viewport.d.ts +71 -0
  159. package/dist/{src/Viewport.js → mjs/src/Viewport.mjs} +5 -5
  160. package/dist/mjs/src/bundle/bundled.d.ts +4 -0
  161. package/dist/{src/bundle/bundled.js → mjs/src/bundle/bundled.mjs} +2 -2
  162. package/dist/mjs/src/commands/Command.d.ts +16 -0
  163. package/dist/mjs/src/commands/Duplicate.d.ts +14 -0
  164. package/dist/{src/commands/Duplicate.js → mjs/src/commands/Duplicate.mjs} +3 -3
  165. package/dist/mjs/src/commands/Erase.d.ts +14 -0
  166. package/dist/{src/commands/Erase.js → mjs/src/commands/Erase.mjs} +3 -3
  167. package/dist/mjs/src/commands/SerializableCommand.d.ts +12 -0
  168. package/dist/{src/commands/SerializableCommand.js → mjs/src/commands/SerializableCommand.mjs} +1 -1
  169. package/dist/mjs/src/commands/UnresolvedCommand.d.ts +14 -0
  170. package/dist/{src/commands/UnresolvedCommand.js → mjs/src/commands/UnresolvedCommand.mjs} +1 -1
  171. package/dist/mjs/src/commands/invertCommand.d.ts +4 -0
  172. package/dist/{src/commands/invertCommand.js → mjs/src/commands/invertCommand.mjs} +2 -2
  173. package/dist/mjs/src/commands/lib.mjs +7 -0
  174. package/dist/mjs/src/commands/localization.d.ts +23 -0
  175. package/dist/mjs/src/commands/uniteCommands.d.ts +4 -0
  176. package/dist/{src/commands/uniteCommands.js → mjs/src/commands/uniteCommands.mjs} +2 -2
  177. package/dist/mjs/src/components/AbstractComponent.d.ts +73 -0
  178. package/dist/{src/components/AbstractComponent.js → mjs/src/components/AbstractComponent.mjs} +4 -4
  179. package/dist/mjs/src/components/ImageBackground.d.ts +42 -0
  180. package/dist/{src/components/ImageBackground.js → mjs/src/components/ImageBackground.mjs} +5 -5
  181. package/dist/mjs/src/components/ImageComponent.d.ts +31 -0
  182. package/dist/{src/components/ImageComponent.js → mjs/src/components/ImageComponent.mjs} +3 -3
  183. package/dist/mjs/src/components/RestylableComponent.d.ts +24 -0
  184. package/dist/{src/components/RestylableComponent.js → mjs/src/components/RestylableComponent.mjs} +4 -4
  185. package/dist/mjs/src/components/SVGGlobalAttributesObject.d.ts +21 -0
  186. package/dist/{src/components/SVGGlobalAttributesObject.js → mjs/src/components/SVGGlobalAttributesObject.mjs} +3 -3
  187. package/dist/mjs/src/components/Stroke.d.ts +40 -0
  188. package/dist/{src/components/Stroke.js → mjs/src/components/Stroke.mjs} +5 -5
  189. package/dist/mjs/src/components/TextComponent.d.ts +53 -0
  190. package/dist/{src/components/TextComponent.js → mjs/src/components/TextComponent.mjs} +7 -7
  191. package/dist/mjs/src/components/UnknownSVGObject.d.ts +18 -0
  192. package/dist/{src/components/UnknownSVGObject.js → mjs/src/components/UnknownSVGObject.mjs} +3 -3
  193. package/dist/mjs/src/components/builders/ArrowBuilder.d.ts +19 -0
  194. package/dist/{src/components/builders/ArrowBuilder.js → mjs/src/components/builders/ArrowBuilder.mjs} +2 -2
  195. package/dist/mjs/src/components/builders/FreehandLineBuilder.d.ts +33 -0
  196. package/dist/{src/components/builders/FreehandLineBuilder.js → mjs/src/components/builders/FreehandLineBuilder.mjs} +7 -7
  197. package/dist/mjs/src/components/builders/LineBuilder.d.ts +18 -0
  198. package/dist/{src/components/builders/LineBuilder.js → mjs/src/components/builders/LineBuilder.mjs} +2 -2
  199. package/dist/mjs/src/components/builders/PressureSensitiveFreehandLineBuilder.d.ts +36 -0
  200. package/dist/{src/components/builders/PressureSensitiveFreehandLineBuilder.js → mjs/src/components/builders/PressureSensitiveFreehandLineBuilder.mjs} +6 -6
  201. package/dist/mjs/src/components/builders/RectangleBuilder.d.ts +20 -0
  202. package/dist/{src/components/builders/RectangleBuilder.js → mjs/src/components/builders/RectangleBuilder.mjs} +4 -4
  203. package/dist/mjs/src/components/builders/types.d.ts +12 -0
  204. package/dist/mjs/src/components/builders/types.mjs +1 -0
  205. package/dist/{src/components/lib.js → mjs/src/components/lib.d.ts} +3 -3
  206. package/dist/mjs/src/components/lib.mjs +12 -0
  207. package/dist/mjs/src/components/localization.d.ts +11 -0
  208. package/dist/mjs/src/components/util/StrokeSmoother.d.ts +35 -0
  209. package/dist/{src/components/util/StrokeSmoother.js → mjs/src/components/util/StrokeSmoother.mjs} +3 -3
  210. package/dist/mjs/src/components/util/describeComponentList.d.ts +4 -0
  211. package/dist/{src/lib.js → mjs/src/lib.d.ts} +4 -3
  212. package/dist/mjs/src/lib.mjs +34 -0
  213. package/dist/mjs/src/localization.d.ts +14 -0
  214. package/dist/{src/localization.js → mjs/src/localization.mjs} +5 -5
  215. package/dist/mjs/src/localizations/de.d.ts +3 -0
  216. package/dist/{src/localizations/de.js → mjs/src/localizations/de.mjs} +1 -1
  217. package/dist/mjs/src/localizations/en.d.ts +3 -0
  218. package/dist/{src/localizations/en.js → mjs/src/localizations/en.mjs} +1 -1
  219. package/dist/mjs/src/localizations/es.d.ts +3 -0
  220. package/dist/{src/localizations/es.js → mjs/src/localizations/es.mjs} +1 -1
  221. package/dist/mjs/src/localizations/getLocalizationTable.d.ts +3 -0
  222. package/dist/{src/localizations/getLocalizationTable.js → mjs/src/localizations/getLocalizationTable.mjs} +4 -4
  223. package/dist/mjs/src/math/LineSegment2.d.ts +24 -0
  224. package/dist/{src/math/LineSegment2.js → mjs/src/math/LineSegment2.mjs} +2 -2
  225. package/dist/mjs/src/math/Mat33.d.ts +118 -0
  226. package/dist/{src/math/Mat33.js → mjs/src/math/Mat33.mjs} +2 -2
  227. package/dist/mjs/src/math/Path.d.ts +71 -0
  228. package/dist/{src/math/Path.js → mjs/src/math/Path.mjs} +5 -5
  229. package/dist/mjs/src/math/Rect2.d.ts +52 -0
  230. package/dist/{src/math/Rect2.js → mjs/src/math/Rect2.mjs} +2 -2
  231. package/dist/mjs/src/math/Triangle.d.ts +11 -0
  232. package/dist/mjs/src/math/Vec2.d.ts +13 -0
  233. package/dist/{src/math/Vec2.js → mjs/src/math/Vec2.mjs} +1 -1
  234. package/dist/mjs/src/math/Vec3.d.ts +106 -0
  235. package/dist/mjs/src/math/lib.mjs +7 -0
  236. package/dist/mjs/src/math/rounding.d.ts +4 -0
  237. package/dist/mjs/src/rendering/Display.d.ts +75 -0
  238. package/dist/{src/rendering/Display.js → mjs/src/rendering/Display.mjs} +7 -7
  239. package/dist/mjs/src/rendering/RenderingStyle.d.ts +31 -0
  240. package/dist/{src/rendering/RenderingStyle.js → mjs/src/rendering/RenderingStyle.mjs} +1 -1
  241. package/dist/mjs/src/rendering/TextRenderingStyle.d.ts +36 -0
  242. package/dist/{src/rendering/TextRenderingStyle.js → mjs/src/rendering/TextRenderingStyle.mjs} +1 -1
  243. package/dist/mjs/src/rendering/caching/CacheRecord.d.ts +20 -0
  244. package/dist/{src/rendering/caching/CacheRecord.js → mjs/src/rendering/caching/CacheRecord.mjs} +1 -1
  245. package/dist/mjs/src/rendering/caching/CacheRecordManager.d.ts +12 -0
  246. package/dist/{src/rendering/caching/CacheRecordManager.js → mjs/src/rendering/caching/CacheRecordManager.mjs} +1 -1
  247. package/dist/mjs/src/rendering/caching/RenderingCache.d.ts +11 -0
  248. package/dist/{src/rendering/caching/RenderingCache.js → mjs/src/rendering/caching/RenderingCache.mjs} +3 -3
  249. package/dist/mjs/src/rendering/caching/RenderingCacheNode.d.ts +29 -0
  250. package/dist/{src/rendering/caching/RenderingCacheNode.js → mjs/src/rendering/caching/RenderingCacheNode.mjs} +3 -3
  251. package/dist/mjs/src/rendering/caching/testUtils.d.ts +9 -0
  252. package/dist/{src/rendering/caching/testUtils.js → mjs/src/rendering/caching/testUtils.mjs} +4 -4
  253. package/dist/mjs/src/rendering/caching/types.d.ts +19 -0
  254. package/dist/mjs/src/rendering/caching/types.mjs +1 -0
  255. package/dist/{src/rendering/lib.js → mjs/src/rendering/lib.d.ts} +2 -0
  256. package/dist/mjs/src/rendering/lib.mjs +5 -0
  257. package/dist/mjs/src/rendering/localization.d.ts +10 -0
  258. package/dist/mjs/src/rendering/renderers/AbstractRenderer.d.ts +68 -0
  259. package/dist/{src/rendering/renderers/AbstractRenderer.js → mjs/src/rendering/renderers/AbstractRenderer.mjs} +3 -3
  260. package/dist/mjs/src/rendering/renderers/CanvasRenderer.d.ts +63 -0
  261. package/dist/{src/rendering/renderers/CanvasRenderer.js → mjs/src/rendering/renderers/CanvasRenderer.mjs} +32 -5
  262. package/dist/mjs/src/rendering/renderers/DummyRenderer.d.ts +35 -0
  263. package/dist/{src/rendering/renderers/DummyRenderer.js → mjs/src/rendering/renderers/DummyRenderer.mjs} +2 -2
  264. package/dist/mjs/src/rendering/renderers/SVGRenderer.d.ts +57 -0
  265. package/dist/{src/rendering/renderers/SVGRenderer.js → mjs/src/rendering/renderers/SVGRenderer.mjs} +33 -7
  266. package/dist/mjs/src/rendering/renderers/TextOnlyRenderer.d.ts +29 -0
  267. package/dist/{src/rendering/renderers/TextOnlyRenderer.js → mjs/src/rendering/renderers/TextOnlyRenderer.mjs} +2 -2
  268. package/dist/mjs/src/testing/beforeEachFile.d.ts +1 -0
  269. package/dist/{src/testing/beforeEachFile.js → mjs/src/testing/beforeEachFile.mjs} +1 -1
  270. package/dist/mjs/src/testing/createEditor.d.ts +4 -0
  271. package/dist/{src/testing/createEditor.js → mjs/src/testing/createEditor.mjs} +2 -2
  272. package/dist/mjs/src/testing/lib.d.ts +2 -0
  273. package/dist/mjs/src/testing/lib.mjs +2 -0
  274. package/dist/mjs/src/testing/loadExpectExtensions.d.ts +2 -0
  275. package/dist/mjs/src/testing/sendPenEvent.d.ts +12 -0
  276. package/dist/mjs/src/testing/sendPenEvent.mjs +19 -0
  277. package/dist/mjs/src/testing/sendTouchEvent.d.ts +42 -0
  278. package/dist/mjs/src/testing/sendTouchEvent.mjs +62 -0
  279. package/dist/mjs/src/toolbar/HTMLToolbar.d.ts +103 -0
  280. package/dist/{src/toolbar/HTMLToolbar.js → mjs/src/toolbar/HTMLToolbar.mjs} +17 -17
  281. package/dist/mjs/src/toolbar/IconProvider.d.ts +62 -0
  282. package/dist/{src/toolbar/IconProvider.js → mjs/src/toolbar/IconProvider.mjs} +4 -4
  283. package/dist/mjs/src/toolbar/lib.mjs +3 -0
  284. package/dist/mjs/src/toolbar/localization.d.ts +49 -0
  285. package/dist/mjs/src/toolbar/makeColorInput.d.ts +6 -0
  286. package/dist/{src/toolbar/makeColorInput.js → mjs/src/toolbar/makeColorInput.mjs} +3 -3
  287. package/dist/mjs/src/toolbar/types.d.ts +4 -0
  288. package/dist/mjs/src/toolbar/types.mjs +1 -0
  289. package/dist/mjs/src/toolbar/widgets/ActionButtonWidget.d.ts +15 -0
  290. package/dist/{src/toolbar/widgets/ActionButtonWidget.js → mjs/src/toolbar/widgets/ActionButtonWidget.mjs} +1 -1
  291. package/dist/mjs/src/toolbar/widgets/BaseToolWidget.d.ts +11 -0
  292. package/dist/{src/toolbar/widgets/BaseToolWidget.js → mjs/src/toolbar/widgets/BaseToolWidget.mjs} +2 -2
  293. package/dist/mjs/src/toolbar/widgets/BaseWidget.d.ts +72 -0
  294. package/dist/{src/toolbar/widgets/BaseWidget.js → mjs/src/toolbar/widgets/BaseWidget.mjs} +3 -3
  295. package/dist/mjs/src/toolbar/widgets/DocumentPropertiesWidget.d.ts +18 -0
  296. package/dist/{src/toolbar/widgets/DocumentPropertiesWidget.js → mjs/src/toolbar/widgets/DocumentPropertiesWidget.mjs} +9 -7
  297. package/dist/mjs/src/toolbar/widgets/EraserToolWidget.d.ts +17 -0
  298. package/dist/{src/toolbar/widgets/EraserToolWidget.js → mjs/src/toolbar/widgets/EraserToolWidget.mjs} +3 -3
  299. package/dist/mjs/src/toolbar/widgets/HandToolWidget.d.ts +17 -0
  300. package/dist/{src/toolbar/widgets/HandToolWidget.js → mjs/src/toolbar/widgets/HandToolWidget.mjs} +7 -7
  301. package/dist/mjs/src/toolbar/widgets/InsertImageWidget.d.ts +19 -0
  302. package/dist/{src/toolbar/widgets/InsertImageWidget.js → mjs/src/toolbar/widgets/InsertImageWidget.mjs} +8 -8
  303. package/dist/mjs/src/toolbar/widgets/OverflowWidget.d.ts +25 -0
  304. package/dist/{src/toolbar/widgets/OverflowWidget.js → mjs/src/toolbar/widgets/OverflowWidget.mjs} +1 -1
  305. package/dist/mjs/src/toolbar/widgets/PenToolWidget.d.ts +27 -0
  306. package/dist/{src/toolbar/widgets/PenToolWidget.js → mjs/src/toolbar/widgets/PenToolWidget.mjs} +11 -10
  307. package/dist/mjs/src/toolbar/widgets/SelectionToolWidget.d.ts +13 -0
  308. package/dist/{src/toolbar/widgets/SelectionToolWidget.js → mjs/src/toolbar/widgets/SelectionToolWidget.mjs} +8 -8
  309. package/dist/mjs/src/toolbar/widgets/TextToolWidget.d.ts +16 -0
  310. package/dist/{src/toolbar/widgets/TextToolWidget.js → mjs/src/toolbar/widgets/TextToolWidget.mjs} +9 -6
  311. package/dist/mjs/src/toolbar/widgets/lib.mjs +10 -0
  312. package/dist/mjs/src/tools/BaseTool.d.ts +22 -0
  313. package/dist/{src/tools/BaseTool.js → mjs/src/tools/BaseTool.mjs} +1 -1
  314. package/dist/mjs/src/tools/Eraser.d.ts +23 -0
  315. package/dist/{src/tools/Eraser.js → mjs/src/tools/Eraser.mjs} +8 -8
  316. package/dist/mjs/src/tools/FindTool.d.ts +21 -0
  317. package/dist/{src/tools/FindTool.js → mjs/src/tools/FindTool.mjs} +2 -2
  318. package/dist/mjs/src/tools/PanZoom.d.ts +52 -0
  319. package/dist/{src/tools/PanZoom.js → mjs/src/tools/PanZoom.mjs} +8 -8
  320. package/dist/mjs/src/tools/PasteHandler.d.ts +23 -0
  321. package/dist/{src/tools/PasteHandler.js → mjs/src/tools/PasteHandler.mjs} +7 -7
  322. package/dist/mjs/src/tools/Pen.d.ts +39 -0
  323. package/dist/{src/tools/Pen.js → mjs/src/tools/Pen.mjs} +5 -5
  324. package/dist/mjs/src/tools/PipetteTool.d.ts +18 -0
  325. package/dist/{src/tools/PipetteTool.js → mjs/src/tools/PipetteTool.mjs} +1 -1
  326. package/dist/mjs/src/tools/SelectionTool/SelectAllShortcutHandler.d.ts +8 -0
  327. package/dist/{src/tools/SelectionTool/SelectAllShortcutHandler.js → mjs/src/tools/SelectionTool/SelectAllShortcutHandler.mjs} +2 -2
  328. package/dist/mjs/src/tools/SelectionTool/Selection.d.ts +64 -0
  329. package/dist/{src/tools/SelectionTool/Selection.js → mjs/src/tools/SelectionTool/Selection.mjs} +12 -12
  330. package/dist/mjs/src/tools/SelectionTool/SelectionHandle.d.ts +38 -0
  331. package/dist/{src/tools/SelectionTool/SelectionHandle.js → mjs/src/tools/SelectionTool/SelectionHandle.mjs} +3 -3
  332. package/dist/mjs/src/tools/SelectionTool/SelectionTool.d.ts +36 -0
  333. package/dist/{src/tools/SelectionTool/SelectionTool.js → mjs/src/tools/SelectionTool/SelectionTool.mjs} +13 -14
  334. package/dist/mjs/src/tools/SelectionTool/TransformMode.d.ts +34 -0
  335. package/dist/{src/tools/SelectionTool/TransformMode.js → mjs/src/tools/SelectionTool/TransformMode.mjs} +4 -4
  336. package/dist/mjs/src/tools/SelectionTool/types.d.ts +9 -0
  337. package/dist/mjs/src/tools/TextTool.d.ts +33 -0
  338. package/dist/{src/tools/TextTool.js → mjs/src/tools/TextTool.mjs} +11 -11
  339. package/dist/mjs/src/tools/ToolController.d.ts +18 -0
  340. package/dist/{src/tools/ToolController.js → mjs/src/tools/ToolController.mjs} +16 -16
  341. package/dist/mjs/src/tools/ToolEnabledGroup.d.ts +6 -0
  342. package/dist/mjs/src/tools/ToolSwitcherShortcut.d.ts +16 -0
  343. package/dist/{src/tools/ToolSwitcherShortcut.js → mjs/src/tools/ToolSwitcherShortcut.mjs} +1 -1
  344. package/dist/mjs/src/tools/ToolbarShortcutHandler.d.ts +12 -0
  345. package/dist/{src/tools/ToolbarShortcutHandler.js → mjs/src/tools/ToolbarShortcutHandler.mjs} +1 -1
  346. package/dist/mjs/src/tools/UndoRedoShortcut.d.ts +8 -0
  347. package/dist/{src/tools/UndoRedoShortcut.js → mjs/src/tools/UndoRedoShortcut.mjs} +1 -1
  348. package/dist/{src/tools/lib.js → mjs/src/tools/lib.d.ts} +1 -1
  349. package/dist/mjs/src/tools/lib.mjs +16 -0
  350. package/dist/mjs/src/tools/localization.d.ts +28 -0
  351. package/dist/mjs/src/types.d.ts +151 -0
  352. package/dist/mjs/src/util/assertions.d.ts +23 -0
  353. package/dist/mjs/src/util/fileToBase64.d.ts +3 -0
  354. package/dist/mjs/src/util/untilNextAnimationFrame.d.ts +3 -0
  355. package/dist/mjs/src/util/waitForTimeout.d.ts +2 -0
  356. package/package.json +34 -33
  357. package/src/Color4.ts +2 -0
  358. package/src/Editor.ts +62 -28
  359. package/src/EditorImage.ts +4 -2
  360. package/src/SVGLoader.ts +4 -0
  361. package/src/lib.ts +2 -1
  362. package/src/rendering/lib.ts +2 -0
  363. package/src/rendering/renderers/CanvasRenderer.ts +27 -0
  364. package/src/rendering/renderers/SVGRenderer.ts +32 -1
  365. package/src/testing/lib.ts +3 -0
  366. package/src/testing/sendPenEvent.ts +31 -0
  367. package/src/testing/sendTouchEvent.ts +36 -1
  368. package/src/toolbar/toolbar.css +5 -0
  369. package/src/toolbar/widgets/DocumentPropertiesWidget.ts +4 -2
  370. package/src/toolbar/widgets/PenToolWidget.ts +1 -0
  371. package/src/toolbar/widgets/TextToolWidget.ts +4 -1
  372. package/src/tools/Eraser.test.ts +11 -10
  373. package/src/tools/PanZoom.test.ts +1 -1
  374. package/src/tools/Pen.test.ts +63 -62
  375. package/src/tools/SelectionTool/SelectionTool.test.ts +15 -14
  376. package/src/tools/SelectionTool/SelectionTool.ts +5 -7
  377. package/tsconfig.json +3 -2
  378. package/tsconfig.mjs.json +9 -0
  379. package/dist/src/testing/sendTouchEvent.d.ts +0 -6
  380. package/dist/src/testing/sendTouchEvent.js +0 -26
  381. /package/dist/{build_tools → cjs/build_tools}/BundledFile.d.ts +0 -0
  382. /package/dist/{build_tools → cjs/build_tools}/buildTranslationTemplate.d.ts +0 -0
  383. /package/dist/{build_tools → cjs/build_tools}/bundle.d.ts +0 -0
  384. /package/dist/{src/components/builders/types.js → cjs/build_tools/postDist.d.ts} +0 -0
  385. /package/dist/{src → cjs/src}/EventDispatcher.d.ts +0 -0
  386. /package/dist/{src → cjs/src}/Pointer.d.ts +0 -0
  387. /package/dist/{src → cjs/src}/UndoRedoHistory.d.ts +0 -0
  388. /package/dist/{src → cjs/src}/Viewport.d.ts +0 -0
  389. /package/dist/{src → cjs/src}/bundle/bundled.d.ts +0 -0
  390. /package/dist/{src → cjs/src}/commands/Command.d.ts +0 -0
  391. /package/dist/{src → cjs/src}/commands/Duplicate.d.ts +0 -0
  392. /package/dist/{src → cjs/src}/commands/Erase.d.ts +0 -0
  393. /package/dist/{src → cjs/src}/commands/SerializableCommand.d.ts +0 -0
  394. /package/dist/{src → cjs/src}/commands/UnresolvedCommand.d.ts +0 -0
  395. /package/dist/{src → cjs/src}/commands/invertCommand.d.ts +0 -0
  396. /package/dist/{src → cjs/src}/commands/lib.d.ts +0 -0
  397. /package/dist/{src → cjs/src}/commands/localization.d.ts +0 -0
  398. /package/dist/{src → cjs/src}/commands/uniteCommands.d.ts +0 -0
  399. /package/dist/{src → cjs/src}/components/AbstractComponent.d.ts +0 -0
  400. /package/dist/{src → cjs/src}/components/ImageBackground.d.ts +0 -0
  401. /package/dist/{src → cjs/src}/components/ImageComponent.d.ts +0 -0
  402. /package/dist/{src → cjs/src}/components/RestylableComponent.d.ts +0 -0
  403. /package/dist/{src → cjs/src}/components/SVGGlobalAttributesObject.d.ts +0 -0
  404. /package/dist/{src → cjs/src}/components/Stroke.d.ts +0 -0
  405. /package/dist/{src → cjs/src}/components/TextComponent.d.ts +0 -0
  406. /package/dist/{src → cjs/src}/components/UnknownSVGObject.d.ts +0 -0
  407. /package/dist/{src → cjs/src}/components/builders/ArrowBuilder.d.ts +0 -0
  408. /package/dist/{src → cjs/src}/components/builders/FreehandLineBuilder.d.ts +0 -0
  409. /package/dist/{src → cjs/src}/components/builders/LineBuilder.d.ts +0 -0
  410. /package/dist/{src → cjs/src}/components/builders/PressureSensitiveFreehandLineBuilder.d.ts +0 -0
  411. /package/dist/{src → cjs/src}/components/builders/RectangleBuilder.d.ts +0 -0
  412. /package/dist/{src → cjs/src}/components/builders/types.d.ts +0 -0
  413. /package/dist/{src → cjs/src}/components/lib.d.ts +0 -0
  414. /package/dist/{src → cjs/src}/components/localization.d.ts +0 -0
  415. /package/dist/{src → cjs/src}/components/util/StrokeSmoother.d.ts +0 -0
  416. /package/dist/{src → cjs/src}/components/util/describeComponentList.d.ts +0 -0
  417. /package/dist/{src → cjs/src}/localization.d.ts +0 -0
  418. /package/dist/{src → cjs/src}/localizations/de.d.ts +0 -0
  419. /package/dist/{src → cjs/src}/localizations/en.d.ts +0 -0
  420. /package/dist/{src → cjs/src}/localizations/es.d.ts +0 -0
  421. /package/dist/{src → cjs/src}/localizations/getLocalizationTable.d.ts +0 -0
  422. /package/dist/{src → cjs/src}/math/LineSegment2.d.ts +0 -0
  423. /package/dist/{src → cjs/src}/math/Mat33.d.ts +0 -0
  424. /package/dist/{src → cjs/src}/math/Path.d.ts +0 -0
  425. /package/dist/{src → cjs/src}/math/Rect2.d.ts +0 -0
  426. /package/dist/{src → cjs/src}/math/Triangle.d.ts +0 -0
  427. /package/dist/{src → cjs/src}/math/Vec2.d.ts +0 -0
  428. /package/dist/{src → cjs/src}/math/Vec3.d.ts +0 -0
  429. /package/dist/{src → cjs/src}/math/lib.d.ts +0 -0
  430. /package/dist/{src → cjs/src}/math/rounding.d.ts +0 -0
  431. /package/dist/{src → cjs/src}/rendering/Display.d.ts +0 -0
  432. /package/dist/{src → cjs/src}/rendering/RenderingStyle.d.ts +0 -0
  433. /package/dist/{src → cjs/src}/rendering/TextRenderingStyle.d.ts +0 -0
  434. /package/dist/{src → cjs/src}/rendering/caching/CacheRecord.d.ts +0 -0
  435. /package/dist/{src → cjs/src}/rendering/caching/CacheRecordManager.d.ts +0 -0
  436. /package/dist/{src → cjs/src}/rendering/caching/RenderingCache.d.ts +0 -0
  437. /package/dist/{src → cjs/src}/rendering/caching/RenderingCacheNode.d.ts +0 -0
  438. /package/dist/{src → cjs/src}/rendering/caching/testUtils.d.ts +0 -0
  439. /package/dist/{src → cjs/src}/rendering/caching/types.d.ts +0 -0
  440. /package/dist/{src → cjs/src}/rendering/localization.d.ts +0 -0
  441. /package/dist/{src → cjs/src}/rendering/renderers/AbstractRenderer.d.ts +0 -0
  442. /package/dist/{src → cjs/src}/rendering/renderers/DummyRenderer.d.ts +0 -0
  443. /package/dist/{src → cjs/src}/rendering/renderers/TextOnlyRenderer.d.ts +0 -0
  444. /package/dist/{src → cjs/src}/testing/beforeEachFile.d.ts +0 -0
  445. /package/dist/{src → cjs/src}/testing/createEditor.d.ts +0 -0
  446. /package/dist/{src → cjs/src}/testing/loadExpectExtensions.d.ts +0 -0
  447. /package/dist/{src → cjs/src}/toolbar/HTMLToolbar.d.ts +0 -0
  448. /package/dist/{src → cjs/src}/toolbar/IconProvider.d.ts +0 -0
  449. /package/dist/{src → cjs/src}/toolbar/lib.d.ts +0 -0
  450. /package/dist/{src → cjs/src}/toolbar/localization.d.ts +0 -0
  451. /package/dist/{src → cjs/src}/toolbar/makeColorInput.d.ts +0 -0
  452. /package/dist/{src → cjs/src}/toolbar/types.d.ts +0 -0
  453. /package/dist/{src → cjs/src}/toolbar/widgets/ActionButtonWidget.d.ts +0 -0
  454. /package/dist/{src → cjs/src}/toolbar/widgets/BaseToolWidget.d.ts +0 -0
  455. /package/dist/{src → cjs/src}/toolbar/widgets/BaseWidget.d.ts +0 -0
  456. /package/dist/{src → cjs/src}/toolbar/widgets/DocumentPropertiesWidget.d.ts +0 -0
  457. /package/dist/{src → cjs/src}/toolbar/widgets/EraserToolWidget.d.ts +0 -0
  458. /package/dist/{src → cjs/src}/toolbar/widgets/HandToolWidget.d.ts +0 -0
  459. /package/dist/{src → cjs/src}/toolbar/widgets/InsertImageWidget.d.ts +0 -0
  460. /package/dist/{src → cjs/src}/toolbar/widgets/OverflowWidget.d.ts +0 -0
  461. /package/dist/{src → cjs/src}/toolbar/widgets/PenToolWidget.d.ts +0 -0
  462. /package/dist/{src → cjs/src}/toolbar/widgets/SelectionToolWidget.d.ts +0 -0
  463. /package/dist/{src → cjs/src}/toolbar/widgets/TextToolWidget.d.ts +0 -0
  464. /package/dist/{src → cjs/src}/toolbar/widgets/lib.d.ts +0 -0
  465. /package/dist/{src → cjs/src}/tools/BaseTool.d.ts +0 -0
  466. /package/dist/{src → cjs/src}/tools/Eraser.d.ts +0 -0
  467. /package/dist/{src → cjs/src}/tools/FindTool.d.ts +0 -0
  468. /package/dist/{src → cjs/src}/tools/PanZoom.d.ts +0 -0
  469. /package/dist/{src → cjs/src}/tools/PasteHandler.d.ts +0 -0
  470. /package/dist/{src → cjs/src}/tools/Pen.d.ts +0 -0
  471. /package/dist/{src → cjs/src}/tools/PipetteTool.d.ts +0 -0
  472. /package/dist/{src → cjs/src}/tools/SelectionTool/SelectAllShortcutHandler.d.ts +0 -0
  473. /package/dist/{src → cjs/src}/tools/SelectionTool/Selection.d.ts +0 -0
  474. /package/dist/{src → cjs/src}/tools/SelectionTool/SelectionHandle.d.ts +0 -0
  475. /package/dist/{src → cjs/src}/tools/SelectionTool/SelectionTool.d.ts +0 -0
  476. /package/dist/{src → cjs/src}/tools/SelectionTool/TransformMode.d.ts +0 -0
  477. /package/dist/{src → cjs/src}/tools/SelectionTool/types.d.ts +0 -0
  478. /package/dist/{src → cjs/src}/tools/TextTool.d.ts +0 -0
  479. /package/dist/{src → cjs/src}/tools/ToolController.d.ts +0 -0
  480. /package/dist/{src → cjs/src}/tools/ToolEnabledGroup.d.ts +0 -0
  481. /package/dist/{src → cjs/src}/tools/ToolSwitcherShortcut.d.ts +0 -0
  482. /package/dist/{src → cjs/src}/tools/ToolbarShortcutHandler.d.ts +0 -0
  483. /package/dist/{src → cjs/src}/tools/UndoRedoShortcut.d.ts +0 -0
  484. /package/dist/{src → cjs/src}/tools/lib.d.ts +0 -0
  485. /package/dist/{src → cjs/src}/tools/localization.d.ts +0 -0
  486. /package/dist/{src → cjs/src}/types.d.ts +0 -0
  487. /package/dist/{src → cjs/src}/util/assertions.d.ts +0 -0
  488. /package/dist/{src → cjs/src}/util/fileToBase64.d.ts +0 -0
  489. /package/dist/{src → cjs/src}/util/untilNextAnimationFrame.d.ts +0 -0
  490. /package/dist/{src → cjs/src}/util/waitForTimeout.d.ts +0 -0
  491. /package/dist/{build_tools/BundledFile.js → mjs/build_tools/BundledFile.mjs} +0 -0
  492. /package/dist/{src/rendering/caching/types.js → mjs/build_tools/buildTranslationTemplate.d.ts} +0 -0
  493. /package/dist/{src/toolbar/types.js → mjs/build_tools/bundle.d.ts} +0 -0
  494. /package/dist/{src/EventDispatcher.js → mjs/src/EventDispatcher.mjs} +0 -0
  495. /package/dist/{src/commands/Command.js → mjs/src/commands/Command.mjs} +0 -0
  496. /package/dist/{src/commands/lib.js → mjs/src/commands/lib.d.ts} +0 -0
  497. /package/dist/{src/commands/localization.js → mjs/src/commands/localization.mjs} +0 -0
  498. /package/dist/{src/components/localization.js → mjs/src/components/localization.mjs} +0 -0
  499. /package/dist/{src/components/util/describeComponentList.js → mjs/src/components/util/describeComponentList.mjs} +0 -0
  500. /package/dist/{src/math/Triangle.js → mjs/src/math/Triangle.mjs} +0 -0
  501. /package/dist/{src/math/Vec3.js → mjs/src/math/Vec3.mjs} +0 -0
  502. /package/dist/{src/math/lib.js → mjs/src/math/lib.d.ts} +0 -0
  503. /package/dist/{src/math/rounding.js → mjs/src/math/rounding.mjs} +0 -0
  504. /package/dist/{src/rendering/localization.js → mjs/src/rendering/localization.mjs} +0 -0
  505. /package/dist/{src/testing/loadExpectExtensions.js → mjs/src/testing/loadExpectExtensions.mjs} +0 -0
  506. /package/dist/{src/toolbar/lib.js → mjs/src/toolbar/lib.d.ts} +0 -0
  507. /package/dist/{src/toolbar/localization.js → mjs/src/toolbar/localization.mjs} +0 -0
  508. /package/dist/{src/toolbar/widgets/lib.js → mjs/src/toolbar/widgets/lib.d.ts} +0 -0
  509. /package/dist/{src/tools/SelectionTool/types.js → mjs/src/tools/SelectionTool/types.mjs} +0 -0
  510. /package/dist/{src/tools/ToolEnabledGroup.js → mjs/src/tools/ToolEnabledGroup.mjs} +0 -0
  511. /package/dist/{src/tools/localization.js → mjs/src/tools/localization.mjs} +0 -0
  512. /package/dist/{src/types.js → mjs/src/types.mjs} +0 -0
  513. /package/dist/{src/util/assertions.js → mjs/src/util/assertions.mjs} +0 -0
  514. /package/dist/{src/util/fileToBase64.js → mjs/src/util/fileToBase64.mjs} +0 -0
  515. /package/dist/{src/util/untilNextAnimationFrame.js → mjs/src/util/untilNextAnimationFrame.mjs} +0 -0
  516. /package/dist/{src/util/waitForTimeout.js → mjs/src/util/waitForTimeout.mjs} +0 -0
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Command_1 = __importDefault(require("./Command"));
7
+ const SerializableCommand_1 = __importDefault(require("./SerializableCommand"));
8
+ class NonSerializableUnion extends Command_1.default {
9
+ constructor(commands, applyChunkSize) {
10
+ super();
11
+ this.commands = commands;
12
+ this.applyChunkSize = applyChunkSize;
13
+ }
14
+ static waitForAll(commands) {
15
+ // If any are Promises...
16
+ if (commands.some(command => command && command['then'])) {
17
+ console.log('waiting...');
18
+ // Wait for all commands to finish.
19
+ return Promise.all(commands)
20
+ // Ensure we return a Promise<void> and not a Promise<void[]>
21
+ .then(() => { });
22
+ }
23
+ return;
24
+ }
25
+ apply(editor) {
26
+ if (this.applyChunkSize === undefined) {
27
+ const results = this.commands.map(cmd => cmd.apply(editor));
28
+ return NonSerializableUnion.waitForAll(results);
29
+ }
30
+ else {
31
+ return editor.asyncApplyCommands(this.commands, this.applyChunkSize);
32
+ }
33
+ }
34
+ unapply(editor) {
35
+ const commands = [...this.commands];
36
+ commands.reverse();
37
+ if (this.applyChunkSize === undefined) {
38
+ const results = commands.map(cmd => cmd.unapply(editor));
39
+ return NonSerializableUnion.waitForAll(results);
40
+ }
41
+ else {
42
+ return editor.asyncUnapplyCommands(commands, this.applyChunkSize, false);
43
+ }
44
+ }
45
+ description(editor, localizationTable) {
46
+ const descriptions = [];
47
+ let lastDescription = null;
48
+ let duplicateDescriptionCount = 0;
49
+ for (const part of this.commands) {
50
+ const description = part.description(editor, localizationTable);
51
+ if (description !== lastDescription && lastDescription !== null) {
52
+ descriptions.push(localizationTable.unionOf(lastDescription, duplicateDescriptionCount));
53
+ lastDescription = null;
54
+ duplicateDescriptionCount = 0;
55
+ }
56
+ duplicateDescriptionCount++;
57
+ lastDescription !== null && lastDescription !== void 0 ? lastDescription : (lastDescription = description);
58
+ }
59
+ if (duplicateDescriptionCount > 1) {
60
+ descriptions.push(localizationTable.unionOf(lastDescription, duplicateDescriptionCount));
61
+ }
62
+ else if (duplicateDescriptionCount === 1) {
63
+ descriptions.push(lastDescription);
64
+ }
65
+ return descriptions.join(', ');
66
+ }
67
+ }
68
+ class SerializableUnion extends SerializableCommand_1.default {
69
+ constructor(commands, applyChunkSize) {
70
+ super('union');
71
+ this.commands = commands;
72
+ this.applyChunkSize = applyChunkSize;
73
+ this.nonserializableCommand = new NonSerializableUnion(commands, applyChunkSize);
74
+ }
75
+ serializeToJSON() {
76
+ return {
77
+ applyChunkSize: this.applyChunkSize,
78
+ data: this.commands.map(command => command.serialize()),
79
+ };
80
+ }
81
+ apply(editor) {
82
+ return this.nonserializableCommand.apply(editor);
83
+ }
84
+ unapply(editor) {
85
+ return this.nonserializableCommand.unapply(editor);
86
+ }
87
+ description(editor, localizationTable) {
88
+ return this.nonserializableCommand.description(editor, localizationTable);
89
+ }
90
+ }
91
+ const uniteCommands = (commands, applyChunkSize) => {
92
+ let allSerializable = true;
93
+ for (const command of commands) {
94
+ if (!(command instanceof SerializableCommand_1.default)) {
95
+ allSerializable = false;
96
+ break;
97
+ }
98
+ }
99
+ if (!allSerializable) {
100
+ return new NonSerializableUnion(commands, applyChunkSize);
101
+ }
102
+ else {
103
+ const castedCommands = commands;
104
+ return new SerializableUnion(castedCommands, applyChunkSize);
105
+ }
106
+ };
107
+ SerializableCommand_1.default.register('union', (data, editor) => {
108
+ if (typeof data.data.length !== 'number') {
109
+ throw new Error('Unions of commands must serialize to lists of serialization data.');
110
+ }
111
+ const applyChunkSize = data.applyChunkSize;
112
+ if (typeof applyChunkSize !== 'number' && applyChunkSize !== undefined) {
113
+ throw new Error('serialized applyChunkSize is neither undefined nor a number.');
114
+ }
115
+ const commands = [];
116
+ for (const part of data.data) {
117
+ commands.push(SerializableCommand_1.default.deserialize(part, editor));
118
+ }
119
+ return uniteCommands(commands, applyChunkSize);
120
+ });
121
+ exports.default = uniteCommands;
@@ -0,0 +1,258 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ var _a;
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const SerializableCommand_1 = __importDefault(require("../commands/SerializableCommand"));
8
+ const EditorImage_1 = __importDefault(require("../EditorImage"));
9
+ const Mat33_1 = __importDefault(require("../math/Mat33"));
10
+ const UnresolvedCommand_1 = __importDefault(require("../commands/UnresolvedCommand"));
11
+ /**
12
+ * A base class for everything that can be added to an {@link EditorImage}.
13
+ */
14
+ class AbstractComponent {
15
+ constructor(
16
+ // A unique identifier for the type of component
17
+ componentKind, initialZIndex) {
18
+ this.componentKind = componentKind;
19
+ // Stores data attached by a loader.
20
+ this.loadSaveData = {};
21
+ this.lastChangedTime = (new Date()).getTime();
22
+ if (initialZIndex !== undefined) {
23
+ this.zIndex = initialZIndex;
24
+ }
25
+ else {
26
+ this.zIndex = AbstractComponent.zIndexCounter++;
27
+ }
28
+ // Create a unique ID.
29
+ this.id = `${new Date().getTime()}-${Math.random()}`;
30
+ if (AbstractComponent.deserializationCallbacks[componentKind] === undefined) {
31
+ throw new Error(`Component ${componentKind} has not been registered using AbstractComponent.registerComponent`);
32
+ }
33
+ }
34
+ // Returns a unique ID for this element.
35
+ // @see { @link lib!EditorImage.lookupElement }
36
+ getId() {
37
+ return this.id;
38
+ }
39
+ // Store the deserialization callback (or lack of it) for [componentKind].
40
+ // If components are registered multiple times (as may be done in automated tests),
41
+ // the most recent deserialization callback is used.
42
+ static registerComponent(componentKind, deserialize) {
43
+ this.deserializationCallbacks[componentKind] = deserialize !== null && deserialize !== void 0 ? deserialize : null;
44
+ }
45
+ /**
46
+ * Attach data that can be used while exporting the component (e.g. to SVG).
47
+ *
48
+ * This is intended for use by a {@link ImageLoader}.
49
+ */
50
+ attachLoadSaveData(key, data) {
51
+ if (!this.loadSaveData[key]) {
52
+ this.loadSaveData[key] = [];
53
+ }
54
+ this.loadSaveData[key].push(data);
55
+ }
56
+ /** See {@link attachLoadSaveData} */
57
+ getLoadSaveData() {
58
+ return this.loadSaveData;
59
+ }
60
+ getZIndex() {
61
+ return this.zIndex;
62
+ }
63
+ /** @returns the bounding box of */
64
+ getBBox() {
65
+ return this.contentBBox;
66
+ }
67
+ /** Called when this component is added to the given image. */
68
+ onAddToImage(_image) { }
69
+ onRemoveFromImage() { }
70
+ /**
71
+ * @returns true if this component intersects `rect` -- it is entirely contained
72
+ * within the rectangle or one of the rectangle's edges intersects this component.
73
+ */
74
+ intersectsRect(rect) {
75
+ // If this component intersects rect,
76
+ // it is either contained entirely within rect or intersects one of rect's edges.
77
+ // If contained within,
78
+ if (rect.containsRect(this.getBBox())) {
79
+ return true;
80
+ }
81
+ // Calculated bounding boxes can be slightly larger than their actual contents' bounding box.
82
+ // As such, test with more lines than just the rect's edges.
83
+ const testLines = [];
84
+ for (const subregion of rect.divideIntoGrid(2, 2)) {
85
+ testLines.push(...subregion.getEdges());
86
+ }
87
+ return testLines.some(edge => this.intersects(edge));
88
+ }
89
+ // Returns a command that, when applied, transforms this by [affineTransfm] and
90
+ // updates the editor.
91
+ transformBy(affineTransfm) {
92
+ return new AbstractComponent.TransformElementCommand(affineTransfm, this.getId(), this);
93
+ }
94
+ // Returns a command that updates this component's z-index.
95
+ setZIndex(newZIndex) {
96
+ return new AbstractComponent.TransformElementCommand(Mat33_1.default.identity, this.getId(), this, newZIndex, this.getZIndex());
97
+ }
98
+ // @returns true iff this component can be selected (e.g. by the selection tool.)
99
+ isSelectable() {
100
+ return true;
101
+ }
102
+ // @returns true iff this component should be added to the background, rather than the
103
+ // foreground of the image.
104
+ isBackground() {
105
+ return false;
106
+ }
107
+ // @returns an approximation of the proportional time it takes to render this component.
108
+ // This is intended to be a rough estimate, but, for example, a stroke with two points sould have
109
+ // a renderingWeight approximately twice that of a stroke with one point.
110
+ getProportionalRenderingTime() {
111
+ return 1;
112
+ }
113
+ // Returns a copy of this component.
114
+ clone() {
115
+ const clone = this.createClone();
116
+ for (const attachmentKey in this.loadSaveData) {
117
+ for (const val of this.loadSaveData[attachmentKey]) {
118
+ clone.attachLoadSaveData(attachmentKey, val);
119
+ }
120
+ }
121
+ return clone;
122
+ }
123
+ // Convert the component to an object that can be passed to
124
+ // `JSON.stringify`.
125
+ //
126
+ // Do not rely on the output of this function to take a particular form —
127
+ // this function's output can change form without a major version increase.
128
+ serialize() {
129
+ const data = this.serializeToJSON();
130
+ if (data === null) {
131
+ throw new Error(`${this} cannot be serialized.`);
132
+ }
133
+ return {
134
+ name: this.componentKind,
135
+ zIndex: this.zIndex,
136
+ id: this.id,
137
+ loadSaveData: this.loadSaveData,
138
+ data,
139
+ };
140
+ }
141
+ // Returns true if `data` is not deserializable. May return false even if [data]
142
+ // is not deserializable.
143
+ static isNotDeserializable(json) {
144
+ if (typeof json === 'string') {
145
+ json = JSON.parse(json);
146
+ }
147
+ if (typeof json !== 'object') {
148
+ return true;
149
+ }
150
+ if (!this.deserializationCallbacks[json === null || json === void 0 ? void 0 : json.name]) {
151
+ return true;
152
+ }
153
+ if (!json.data) {
154
+ return true;
155
+ }
156
+ return false;
157
+ }
158
+ // Convert a string or an object produced by `JSON.parse` into an `AbstractComponent`.
159
+ static deserialize(json) {
160
+ if (typeof json === 'string') {
161
+ json = JSON.parse(json);
162
+ }
163
+ if (AbstractComponent.isNotDeserializable(json)) {
164
+ throw new Error(`Element with data ${json} cannot be deserialized.`);
165
+ }
166
+ const instance = this.deserializationCallbacks[json.name](json.data);
167
+ instance.zIndex = json.zIndex;
168
+ instance.id = json.id;
169
+ // TODO: What should we do with json.loadSaveData?
170
+ // If we attach it to [instance], we create a potential security risk — loadSaveData
171
+ // is often used to store unrecognised attributes so they can be preserved on output.
172
+ // ...but what if we're deserializing data sent across the network?
173
+ return instance;
174
+ }
175
+ }
176
+ exports.default = AbstractComponent;
177
+ // Topmost z-index
178
+ AbstractComponent.zIndexCounter = 0;
179
+ AbstractComponent.deserializationCallbacks = {};
180
+ AbstractComponent.transformElementCommandId = 'transform-element';
181
+ AbstractComponent.TransformElementCommand = (_a = class extends UnresolvedCommand_1.default {
182
+ // Construct a new TransformElementCommand. `component`, while optional, should
183
+ // be provided if available. If not provided, it will be fetched from the editor's
184
+ // document when the command is applied.
185
+ constructor(affineTransfm, componentID, component, targetZIndex, origZIndex) {
186
+ super(AbstractComponent.transformElementCommandId, componentID, component);
187
+ this.affineTransfm = affineTransfm;
188
+ this.origZIndex = origZIndex;
189
+ this.targetZIndex = targetZIndex !== null && targetZIndex !== void 0 ? targetZIndex : AbstractComponent.zIndexCounter++;
190
+ // Ensure that we keep drawing on top even after changing the z-index.
191
+ if (this.targetZIndex >= AbstractComponent.zIndexCounter) {
192
+ AbstractComponent.zIndexCounter = this.targetZIndex + 1;
193
+ }
194
+ if (component && origZIndex === undefined) {
195
+ this.origZIndex = component.getZIndex();
196
+ }
197
+ }
198
+ resolveComponent(image) {
199
+ var _a;
200
+ if (this.component) {
201
+ return;
202
+ }
203
+ super.resolveComponent(image);
204
+ (_a = this.origZIndex) !== null && _a !== void 0 ? _a : (this.origZIndex = this.component.getZIndex());
205
+ }
206
+ updateTransform(editor, newTransfm) {
207
+ if (!this.component) {
208
+ throw new Error('this.component is undefined or null!');
209
+ }
210
+ // Any parent should have only one direct child.
211
+ const parent = editor.image.findParent(this.component);
212
+ let hadParent = false;
213
+ if (parent) {
214
+ parent.remove();
215
+ hadParent = true;
216
+ }
217
+ this.component.applyTransformation(newTransfm);
218
+ this.component.lastChangedTime = (new Date()).getTime();
219
+ // Add the element back to the document.
220
+ if (hadParent) {
221
+ EditorImage_1.default.addElement(this.component).apply(editor);
222
+ }
223
+ }
224
+ apply(editor) {
225
+ this.resolveComponent(editor.image);
226
+ this.component.zIndex = this.targetZIndex;
227
+ this.updateTransform(editor, this.affineTransfm);
228
+ editor.queueRerender();
229
+ }
230
+ unapply(editor) {
231
+ this.resolveComponent(editor.image);
232
+ this.component.zIndex = this.origZIndex;
233
+ this.updateTransform(editor, this.affineTransfm.inverse());
234
+ editor.queueRerender();
235
+ }
236
+ description(_editor, localizationTable) {
237
+ return localizationTable.transformedElements(1);
238
+ }
239
+ serializeToJSON() {
240
+ return {
241
+ id: this.componentID,
242
+ transfm: this.affineTransfm.toArray(),
243
+ targetZIndex: this.targetZIndex,
244
+ origZIndex: this.origZIndex,
245
+ };
246
+ }
247
+ },
248
+ (() => {
249
+ SerializableCommand_1.default.register(AbstractComponent.transformElementCommandId, (json, editor) => {
250
+ var _a, _b;
251
+ const elem = (_a = editor.image.lookupElement(json.id)) !== null && _a !== void 0 ? _a : undefined;
252
+ const transform = new Mat33_1.default(...json.transfm);
253
+ const targetZIndex = json.targetZIndex;
254
+ const origZIndex = (_b = json.origZIndex) !== null && _b !== void 0 ? _b : undefined;
255
+ return new AbstractComponent.TransformElementCommand(transform, json.id, elem, targetZIndex, origZIndex);
256
+ });
257
+ })(),
258
+ _a);
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.imageBackgroundCSSClassName = exports.BackgroundType = void 0;
7
+ const Color4_1 = __importDefault(require("../Color4"));
8
+ const EditorImage_1 = require("../EditorImage");
9
+ const Rect2_1 = __importDefault(require("../math/Rect2"));
10
+ const AbstractComponent_1 = __importDefault(require("./AbstractComponent"));
11
+ const RestylableComponent_1 = require("./RestylableComponent");
12
+ var BackgroundType;
13
+ (function (BackgroundType) {
14
+ BackgroundType[BackgroundType["SolidColor"] = 0] = "SolidColor";
15
+ BackgroundType[BackgroundType["None"] = 1] = "None";
16
+ })(BackgroundType = exports.BackgroundType || (exports.BackgroundType = {}));
17
+ exports.imageBackgroundCSSClassName = 'js-draw-image-background';
18
+ // Represents the background of an image in the editor.
19
+ class ImageBackground extends AbstractComponent_1.default {
20
+ constructor(backgroundType, mainColor) {
21
+ super('image-background', 0);
22
+ this.backgroundType = backgroundType;
23
+ this.mainColor = mainColor;
24
+ this.viewportSizeChangeListener = null;
25
+ // eslint-disable-next-line @typescript-eslint/prefer-as-const
26
+ this.isRestylableComponent = true;
27
+ this.contentBBox = Rect2_1.default.empty;
28
+ }
29
+ getStyle() {
30
+ let color = this.mainColor;
31
+ if (this.backgroundType === BackgroundType.None) {
32
+ color = undefined;
33
+ }
34
+ return {
35
+ color,
36
+ };
37
+ }
38
+ updateStyle(style) {
39
+ return (0, RestylableComponent_1.createRestyleComponentCommand)(this.getStyle(), style, this);
40
+ }
41
+ // @internal
42
+ forceStyle(style, editor) {
43
+ const fill = style.color;
44
+ if (!fill) {
45
+ return;
46
+ }
47
+ this.mainColor = fill;
48
+ if (fill.eq(Color4_1.default.transparent)) {
49
+ this.backgroundType = BackgroundType.None;
50
+ }
51
+ else {
52
+ this.backgroundType = BackgroundType.SolidColor;
53
+ }
54
+ if (editor) {
55
+ editor.image.queueRerenderOf(this);
56
+ editor.queueRerender();
57
+ }
58
+ }
59
+ onAddToImage(image) {
60
+ if (this.viewportSizeChangeListener) {
61
+ console.warn('onAddToImage called when background is already in an image');
62
+ this.onRemoveFromImage();
63
+ }
64
+ this.viewportSizeChangeListener = image.notifier.on(EditorImage_1.EditorImageEventType.ExportViewportChanged, () => {
65
+ this.recomputeBBox(image);
66
+ });
67
+ this.recomputeBBox(image);
68
+ }
69
+ onRemoveFromImage() {
70
+ var _a;
71
+ (_a = this.viewportSizeChangeListener) === null || _a === void 0 ? void 0 : _a.remove();
72
+ this.viewportSizeChangeListener = null;
73
+ }
74
+ recomputeBBox(image) {
75
+ const importExportRect = image.getImportExportViewport().visibleRect;
76
+ if (!this.contentBBox.eq(importExportRect)) {
77
+ this.contentBBox = importExportRect;
78
+ // Re-render this if already added to the EditorImage.
79
+ image.queueRerenderOf(this);
80
+ }
81
+ }
82
+ render(canvas, visibleRect) {
83
+ if (this.backgroundType === BackgroundType.None) {
84
+ return;
85
+ }
86
+ canvas.startObject(this.contentBBox);
87
+ if (this.backgroundType === BackgroundType.SolidColor) {
88
+ // If the rectangle for this region contains the visible rect,
89
+ // we can fill the entire visible rectangle (which may be more efficient than
90
+ // filling the entire region for this.)
91
+ if (visibleRect) {
92
+ const intersection = visibleRect.intersection(this.contentBBox);
93
+ if (intersection) {
94
+ canvas.fillRect(intersection, this.mainColor);
95
+ }
96
+ }
97
+ else {
98
+ canvas.fillRect(this.contentBBox, this.mainColor);
99
+ }
100
+ }
101
+ canvas.endObject(this.getLoadSaveData(), [exports.imageBackgroundCSSClassName]);
102
+ }
103
+ intersects(lineSegment) {
104
+ return this.contentBBox.getEdges().some(edge => edge.intersects(lineSegment));
105
+ }
106
+ isSelectable() {
107
+ return false;
108
+ }
109
+ isBackground() {
110
+ return true;
111
+ }
112
+ serializeToJSON() {
113
+ return {
114
+ mainColor: this.mainColor.toHexString(),
115
+ backgroundType: this.backgroundType,
116
+ };
117
+ }
118
+ applyTransformation(_affineTransfm) {
119
+ // Do nothing — it doesn't make sense to transform the background.
120
+ }
121
+ description(localizationTable) {
122
+ if (this.backgroundType === BackgroundType.SolidColor) {
123
+ return localizationTable.filledBackgroundWithColor(this.mainColor.toString());
124
+ }
125
+ else {
126
+ return localizationTable.emptyBackground;
127
+ }
128
+ }
129
+ createClone() {
130
+ return new ImageBackground(this.backgroundType, this.mainColor);
131
+ }
132
+ // @internal
133
+ static deserializeFromJSON(json) {
134
+ if (typeof json === 'string') {
135
+ json = JSON.parse(json);
136
+ }
137
+ if (typeof json.mainColor !== 'string') {
138
+ throw new Error('Error deserializing — mainColor must be of type string.');
139
+ }
140
+ const backgroundType = json.backgroundType === BackgroundType.SolidColor ? BackgroundType.SolidColor : BackgroundType.None;
141
+ const mainColor = Color4_1.default.fromHex(json.mainColor);
142
+ return new ImageBackground(backgroundType, mainColor);
143
+ }
144
+ }
145
+ exports.default = ImageBackground;
146
+ AbstractComponent_1.default.registerComponent('image-background', ImageBackground.deserializeFromJSON);
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const Mat33_1 = __importDefault(require("../math/Mat33"));
16
+ const Rect2_1 = __importDefault(require("../math/Rect2"));
17
+ const AbstractComponent_1 = __importDefault(require("./AbstractComponent"));
18
+ // Represents a raster image.
19
+ class ImageComponent extends AbstractComponent_1.default {
20
+ constructor(image) {
21
+ var _a, _b, _c;
22
+ super('image-component');
23
+ this.image = Object.assign(Object.assign({}, image), { label: (_c = (_b = (_a = image.label) !== null && _a !== void 0 ? _a : image.image.getAttribute('alt')) !== null && _b !== void 0 ? _b : image.image.getAttribute('aria-label')) !== null && _c !== void 0 ? _c : undefined });
24
+ const isHTMLImageElem = (elem) => {
25
+ return elem.getAttribute('src') !== undefined;
26
+ };
27
+ if (isHTMLImageElem(image.image) && !image.image.complete) {
28
+ image.image.onload = () => this.recomputeBBox();
29
+ }
30
+ this.recomputeBBox();
31
+ }
32
+ getImageRect() {
33
+ return new Rect2_1.default(0, 0, this.image.image.width, this.image.image.height);
34
+ }
35
+ recomputeBBox() {
36
+ this.contentBBox = this.getImageRect();
37
+ this.contentBBox = this.contentBBox.transformedBoundingBox(this.image.transform);
38
+ }
39
+ // Load from an image. Waits for the image to load if incomplete.
40
+ static fromImage(elem, transform) {
41
+ var _a, _b, _c;
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ if (!elem.complete) {
44
+ yield new Promise((resolve, reject) => {
45
+ elem.onload = resolve;
46
+ elem.onerror = reject;
47
+ elem.onabort = reject;
48
+ });
49
+ }
50
+ let width, height;
51
+ if (typeof elem.width === 'number' && typeof elem.height === 'number'
52
+ && elem.width !== 0 && elem.height !== 0) {
53
+ width = elem.width;
54
+ height = elem.height;
55
+ }
56
+ else {
57
+ width = elem.clientWidth;
58
+ height = elem.clientHeight;
59
+ }
60
+ let image;
61
+ let url = (_a = elem.src) !== null && _a !== void 0 ? _a : '';
62
+ if (!url.startsWith('data:image/')) {
63
+ // Convert to a data URL:
64
+ const canvas = document.createElement('canvas');
65
+ canvas.width = width;
66
+ canvas.height = height;
67
+ const ctx = canvas.getContext('2d');
68
+ ctx.drawImage(elem, 0, 0, canvas.width, canvas.height);
69
+ url = canvas.toDataURL();
70
+ image = canvas;
71
+ }
72
+ else {
73
+ image = new Image();
74
+ image.src = url;
75
+ image.width = width;
76
+ image.height = height;
77
+ }
78
+ image.setAttribute('alt', (_b = elem.getAttribute('alt')) !== null && _b !== void 0 ? _b : '');
79
+ image.setAttribute('aria-label', (_c = elem.getAttribute('aria-label')) !== null && _c !== void 0 ? _c : '');
80
+ return new ImageComponent({
81
+ image,
82
+ base64Url: url,
83
+ transform: transform,
84
+ });
85
+ });
86
+ }
87
+ render(canvas, _visibleRect) {
88
+ canvas.startObject(this.contentBBox);
89
+ canvas.drawImage(this.image);
90
+ canvas.endObject(this.getLoadSaveData());
91
+ }
92
+ getProportionalRenderingTime() {
93
+ // Estimate: Equivalent to a stroke with 10 segments.
94
+ return 10;
95
+ }
96
+ intersects(lineSegment) {
97
+ const rect = this.getImageRect();
98
+ const edges = rect.getEdges().map(edge => edge.transformedBy(this.image.transform));
99
+ for (const edge of edges) {
100
+ if (edge.intersects(lineSegment)) {
101
+ return true;
102
+ }
103
+ }
104
+ return false;
105
+ }
106
+ serializeToJSON() {
107
+ return {
108
+ src: this.image.base64Url,
109
+ label: this.image.label,
110
+ // Store the width and height for bounding box computations while the image is loading.
111
+ width: this.image.image.width,
112
+ height: this.image.image.height,
113
+ transform: this.image.transform.toArray(),
114
+ };
115
+ }
116
+ applyTransformation(affineTransfm) {
117
+ this.image.transform = affineTransfm.rightMul(this.image.transform);
118
+ this.recomputeBBox();
119
+ }
120
+ description(localizationTable) {
121
+ return this.image.label ? localizationTable.imageNode(this.image.label) : localizationTable.unlabeledImageNode;
122
+ }
123
+ getAltText() {
124
+ return this.image.label;
125
+ }
126
+ getURL() {
127
+ return this.image.base64Url;
128
+ }
129
+ getTransformation() {
130
+ return this.image.transform;
131
+ }
132
+ createClone() {
133
+ return new ImageComponent(Object.assign({}, this.image));
134
+ }
135
+ static deserializeFromJSON(data) {
136
+ if (!(typeof data.src === 'string')) {
137
+ throw new Error(`${data} has invalid format! Expected src property.`);
138
+ }
139
+ const image = new Image();
140
+ image.src = data.src;
141
+ image.width = data.width;
142
+ image.height = data.height;
143
+ return new ImageComponent({
144
+ image: image,
145
+ base64Url: image.src,
146
+ label: data.label,
147
+ transform: new Mat33_1.default(...data.transform),
148
+ });
149
+ }
150
+ }
151
+ exports.default = ImageComponent;
152
+ AbstractComponent_1.default.registerComponent('image-component', ImageComponent.deserializeFromJSON);