js-draw 0.18.1 → 0.19.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 (485) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/bundle.js +2 -2
  3. package/dist/bundledStyles.js +1 -0
  4. package/dist/cjs/src/Color4.d.ts +69 -0
  5. package/dist/cjs/src/Color4.js +264 -0
  6. package/dist/cjs/src/Editor.d.ts +308 -0
  7. package/dist/cjs/src/Editor.js +904 -0
  8. package/dist/cjs/src/EditorImage.d.ts +97 -0
  9. package/dist/cjs/src/EditorImage.js +486 -0
  10. package/dist/cjs/src/EventDispatcher.d.ts +30 -0
  11. package/dist/cjs/src/EventDispatcher.js +57 -0
  12. package/dist/cjs/src/Pointer.d.ts +24 -0
  13. package/dist/cjs/src/Pointer.js +84 -0
  14. package/dist/cjs/src/SVGLoader.d.ts +48 -0
  15. package/dist/cjs/src/SVGLoader.js +475 -0
  16. package/dist/cjs/src/UndoRedoHistory.d.ts +19 -0
  17. package/dist/cjs/src/UndoRedoHistory.js +93 -0
  18. package/dist/cjs/src/Viewport.d.ts +71 -0
  19. package/dist/cjs/src/Viewport.js +264 -0
  20. package/dist/cjs/src/bundle/bundled.d.ts +4 -0
  21. package/dist/cjs/src/bundle/bundled.js +24 -0
  22. package/dist/cjs/src/commands/Command.d.ts +16 -0
  23. package/dist/cjs/src/commands/Command.js +34 -0
  24. package/dist/cjs/src/commands/Duplicate.d.ts +14 -0
  25. package/dist/cjs/src/commands/Duplicate.js +39 -0
  26. package/dist/cjs/src/commands/Erase.d.ts +14 -0
  27. package/dist/cjs/src/commands/Erase.js +63 -0
  28. package/dist/cjs/src/commands/SerializableCommand.d.ts +12 -0
  29. package/dist/cjs/src/commands/SerializableCommand.js +42 -0
  30. package/dist/cjs/src/commands/UnresolvedCommand.d.ts +14 -0
  31. package/dist/cjs/src/commands/UnresolvedCommand.js +28 -0
  32. package/dist/cjs/src/commands/invertCommand.d.ts +4 -0
  33. package/dist/cjs/src/commands/invertCommand.js +49 -0
  34. package/dist/cjs/src/commands/lib.d.ts +7 -0
  35. package/dist/cjs/src/commands/lib.js +18 -0
  36. package/dist/cjs/src/commands/localization.d.ts +23 -0
  37. package/dist/cjs/src/commands/localization.js +24 -0
  38. package/dist/cjs/src/commands/uniteCommands.d.ts +4 -0
  39. package/dist/cjs/src/commands/uniteCommands.js +121 -0
  40. package/dist/cjs/src/components/AbstractComponent.d.ts +73 -0
  41. package/dist/cjs/src/components/AbstractComponent.js +258 -0
  42. package/dist/cjs/src/components/ImageBackground.d.ts +42 -0
  43. package/dist/cjs/src/components/ImageBackground.js +146 -0
  44. package/dist/cjs/src/components/ImageComponent.d.ts +31 -0
  45. package/dist/cjs/src/components/ImageComponent.js +152 -0
  46. package/dist/cjs/src/components/RestylableComponent.d.ts +43 -0
  47. package/dist/cjs/src/components/RestylableComponent.js +88 -0
  48. package/dist/cjs/src/components/SVGGlobalAttributesObject.d.ts +21 -0
  49. package/dist/cjs/src/components/SVGGlobalAttributesObject.js +65 -0
  50. package/dist/cjs/src/components/Stroke.d.ts +75 -0
  51. package/dist/cjs/src/components/Stroke.js +225 -0
  52. package/dist/cjs/src/components/TextComponent.d.ts +75 -0
  53. package/dist/cjs/src/components/TextComponent.js +280 -0
  54. package/dist/cjs/src/components/UnknownSVGObject.d.ts +18 -0
  55. package/dist/cjs/src/components/UnknownSVGObject.js +50 -0
  56. package/dist/cjs/src/components/builders/ArrowBuilder.d.ts +19 -0
  57. package/dist/cjs/src/components/builders/ArrowBuilder.js +117 -0
  58. package/dist/cjs/src/components/builders/FreehandLineBuilder.d.ts +33 -0
  59. package/dist/cjs/src/components/builders/FreehandLineBuilder.js +173 -0
  60. package/dist/cjs/src/components/builders/LineBuilder.d.ts +18 -0
  61. package/dist/cjs/src/components/builders/LineBuilder.js +89 -0
  62. package/dist/cjs/src/components/builders/PressureSensitiveFreehandLineBuilder.d.ts +36 -0
  63. package/dist/cjs/src/components/builders/PressureSensitiveFreehandLineBuilder.js +347 -0
  64. package/dist/cjs/src/components/builders/RectangleBuilder.d.ts +20 -0
  65. package/dist/cjs/src/components/builders/RectangleBuilder.js +59 -0
  66. package/dist/cjs/src/components/builders/types.d.ts +12 -0
  67. package/dist/cjs/src/components/builders/types.js +2 -0
  68. package/dist/cjs/src/components/lib.d.ts +13 -0
  69. package/dist/cjs/src/components/lib.js +43 -0
  70. package/dist/cjs/src/components/localization.d.ts +11 -0
  71. package/dist/cjs/src/components/localization.js +13 -0
  72. package/dist/cjs/src/components/util/StrokeSmoother.d.ts +35 -0
  73. package/dist/cjs/src/components/util/StrokeSmoother.js +217 -0
  74. package/dist/cjs/src/components/util/describeComponentList.d.ts +4 -0
  75. package/dist/cjs/src/components/util/describeComponentList.js +16 -0
  76. package/dist/cjs/src/lib.d.ts +64 -0
  77. package/dist/cjs/src/lib.js +93 -0
  78. package/dist/cjs/src/localization.d.ts +14 -0
  79. package/dist/cjs/src/localization.js +13 -0
  80. package/dist/cjs/src/localizations/de.d.ts +3 -0
  81. package/dist/cjs/src/localizations/de.js +6 -0
  82. package/dist/cjs/src/localizations/en.d.ts +3 -0
  83. package/dist/cjs/src/localizations/en.js +6 -0
  84. package/dist/cjs/src/localizations/es.d.ts +3 -0
  85. package/dist/cjs/src/localizations/es.js +20 -0
  86. package/dist/cjs/src/localizations/getLocalizationTable.d.ts +3 -0
  87. package/dist/cjs/src/localizations/getLocalizationTable.js +50 -0
  88. package/dist/cjs/src/math/LineSegment2.d.ts +24 -0
  89. package/dist/cjs/src/math/LineSegment2.js +131 -0
  90. package/dist/cjs/src/math/Mat33.d.ts +118 -0
  91. package/dist/cjs/src/math/Mat33.js +332 -0
  92. package/dist/cjs/src/math/Path.d.ts +71 -0
  93. package/dist/cjs/src/math/Path.js +655 -0
  94. package/dist/cjs/src/math/Rect2.d.ts +52 -0
  95. package/dist/cjs/src/math/Rect2.js +234 -0
  96. package/dist/cjs/src/math/Triangle.d.ts +11 -0
  97. package/dist/cjs/src/math/Triangle.js +22 -0
  98. package/dist/cjs/src/math/Vec2.d.ts +13 -0
  99. package/dist/cjs/src/math/Vec2.js +19 -0
  100. package/dist/cjs/src/math/Vec3.d.ts +106 -0
  101. package/dist/cjs/src/math/Vec3.js +177 -0
  102. package/dist/cjs/src/math/lib.d.ts +7 -0
  103. package/dist/cjs/src/math/lib.js +18 -0
  104. package/dist/cjs/src/math/rounding.d.ts +4 -0
  105. package/dist/cjs/src/math/rounding.js +135 -0
  106. package/dist/cjs/src/rendering/Display.d.ts +75 -0
  107. package/dist/cjs/src/rendering/Display.js +214 -0
  108. package/dist/cjs/src/rendering/RenderingStyle.d.ts +31 -0
  109. package/dist/cjs/src/rendering/RenderingStyle.js +48 -0
  110. package/dist/cjs/src/rendering/TextRenderingStyle.d.ts +36 -0
  111. package/dist/cjs/src/rendering/TextRenderingStyle.js +29 -0
  112. package/dist/cjs/src/rendering/caching/CacheRecord.d.ts +20 -0
  113. package/dist/cjs/src/rendering/caching/CacheRecord.js +61 -0
  114. package/dist/cjs/src/rendering/caching/CacheRecordManager.d.ts +12 -0
  115. package/dist/cjs/src/rendering/caching/CacheRecordManager.js +50 -0
  116. package/dist/cjs/src/rendering/caching/RenderingCache.d.ts +11 -0
  117. package/dist/cjs/src/rendering/caching/RenderingCache.js +51 -0
  118. package/dist/cjs/src/rendering/caching/RenderingCacheNode.d.ts +29 -0
  119. package/dist/cjs/src/rendering/caching/RenderingCacheNode.js +326 -0
  120. package/dist/cjs/src/rendering/caching/testUtils.d.ts +9 -0
  121. package/dist/cjs/src/rendering/caching/testUtils.js +27 -0
  122. package/dist/cjs/src/rendering/caching/types.d.ts +19 -0
  123. package/dist/cjs/src/rendering/caching/types.js +2 -0
  124. package/dist/cjs/src/rendering/lib.d.ts +7 -0
  125. package/dist/cjs/src/rendering/lib.js +17 -0
  126. package/dist/cjs/src/rendering/localization.d.ts +10 -0
  127. package/dist/cjs/src/rendering/localization.js +12 -0
  128. package/dist/cjs/src/rendering/renderers/AbstractRenderer.d.ts +68 -0
  129. package/dist/cjs/src/rendering/renderers/AbstractRenderer.js +170 -0
  130. package/dist/cjs/src/rendering/renderers/CanvasRenderer.d.ts +63 -0
  131. package/dist/cjs/src/rendering/renderers/CanvasRenderer.js +236 -0
  132. package/dist/cjs/src/rendering/renderers/DummyRenderer.d.ts +35 -0
  133. package/dist/cjs/src/rendering/renderers/DummyRenderer.js +112 -0
  134. package/dist/cjs/src/rendering/renderers/SVGRenderer.d.ts +57 -0
  135. package/dist/cjs/src/rendering/renderers/SVGRenderer.js +311 -0
  136. package/dist/cjs/src/rendering/renderers/TextOnlyRenderer.d.ts +29 -0
  137. package/dist/cjs/src/rendering/renderers/TextOnlyRenderer.js +63 -0
  138. package/dist/cjs/src/testing/beforeEachFile.d.ts +1 -0
  139. package/dist/cjs/src/testing/beforeEachFile.js +12 -0
  140. package/dist/cjs/src/testing/createEditor.d.ts +4 -0
  141. package/dist/cjs/src/testing/createEditor.js +14 -0
  142. package/dist/cjs/src/testing/lib.d.ts +2 -0
  143. package/dist/cjs/src/testing/lib.js +10 -0
  144. package/dist/cjs/src/testing/loadExpectExtensions.d.ts +2 -0
  145. package/dist/cjs/src/testing/loadExpectExtensions.js +28 -0
  146. package/dist/cjs/src/testing/sendPenEvent.d.ts +12 -0
  147. package/dist/cjs/src/testing/sendPenEvent.js +24 -0
  148. package/dist/cjs/src/testing/sendTouchEvent.d.ts +42 -0
  149. package/dist/cjs/src/testing/sendTouchEvent.js +87 -0
  150. package/dist/cjs/src/toolbar/HTMLToolbar.d.ts +103 -0
  151. package/dist/cjs/src/toolbar/HTMLToolbar.js +383 -0
  152. package/dist/cjs/src/toolbar/IconProvider.d.ts +62 -0
  153. package/dist/cjs/src/toolbar/IconProvider.js +660 -0
  154. package/dist/cjs/src/toolbar/lib.d.ts +3 -0
  155. package/dist/cjs/src/toolbar/lib.js +24 -0
  156. package/dist/cjs/src/toolbar/localization.d.ts +49 -0
  157. package/dist/cjs/src/toolbar/localization.js +51 -0
  158. package/dist/cjs/src/toolbar/makeColorInput.d.ts +6 -0
  159. package/dist/cjs/src/toolbar/makeColorInput.js +120 -0
  160. package/dist/cjs/src/toolbar/types.d.ts +4 -0
  161. package/dist/cjs/src/toolbar/types.js +2 -0
  162. package/dist/cjs/src/toolbar/widgets/ActionButtonWidget.d.ts +15 -0
  163. package/dist/cjs/src/toolbar/widgets/ActionButtonWidget.js +31 -0
  164. package/dist/cjs/src/toolbar/widgets/BaseToolWidget.d.ts +11 -0
  165. package/dist/cjs/src/toolbar/widgets/BaseToolWidget.js +50 -0
  166. package/dist/cjs/src/toolbar/widgets/BaseWidget.d.ts +72 -0
  167. package/dist/cjs/src/toolbar/widgets/BaseWidget.js +313 -0
  168. package/dist/cjs/src/toolbar/widgets/DocumentPropertiesWidget.d.ts +18 -0
  169. package/dist/cjs/src/toolbar/widgets/DocumentPropertiesWidget.js +126 -0
  170. package/dist/cjs/src/toolbar/widgets/EraserToolWidget.d.ts +17 -0
  171. package/dist/cjs/src/toolbar/widgets/EraserToolWidget.js +63 -0
  172. package/dist/cjs/src/toolbar/widgets/HandToolWidget.d.ts +17 -0
  173. package/dist/cjs/src/toolbar/widgets/HandToolWidget.js +201 -0
  174. package/dist/cjs/src/toolbar/widgets/InsertImageWidget.d.ts +19 -0
  175. package/dist/cjs/src/toolbar/widgets/InsertImageWidget.js +176 -0
  176. package/dist/cjs/src/toolbar/widgets/OverflowWidget.d.ts +25 -0
  177. package/dist/cjs/src/toolbar/widgets/OverflowWidget.js +77 -0
  178. package/dist/cjs/src/toolbar/widgets/PenToolWidget.d.ts +27 -0
  179. package/dist/cjs/src/toolbar/widgets/PenToolWidget.js +226 -0
  180. package/dist/cjs/src/toolbar/widgets/SelectionToolWidget.d.ts +13 -0
  181. package/dist/cjs/src/toolbar/widgets/SelectionToolWidget.js +153 -0
  182. package/dist/cjs/src/toolbar/widgets/TextToolWidget.d.ts +16 -0
  183. package/dist/cjs/src/toolbar/widgets/TextToolWidget.js +115 -0
  184. package/dist/cjs/src/toolbar/widgets/lib.d.ts +10 -0
  185. package/dist/cjs/src/toolbar/widgets/lib.js +26 -0
  186. package/dist/cjs/src/tools/BaseTool.d.ts +22 -0
  187. package/dist/cjs/src/tools/BaseTool.js +66 -0
  188. package/dist/cjs/src/tools/Eraser.d.ts +23 -0
  189. package/dist/cjs/src/tools/Eraser.js +112 -0
  190. package/dist/cjs/src/tools/FindTool.d.ts +21 -0
  191. package/dist/cjs/src/tools/FindTool.js +121 -0
  192. package/dist/cjs/src/tools/PanZoom.d.ts +52 -0
  193. package/dist/cjs/src/tools/PanZoom.js +421 -0
  194. package/dist/cjs/src/tools/PasteHandler.d.ts +23 -0
  195. package/dist/cjs/src/tools/PasteHandler.js +99 -0
  196. package/dist/cjs/src/tools/Pen.d.ts +39 -0
  197. package/dist/cjs/src/tools/Pen.js +179 -0
  198. package/dist/cjs/src/tools/PipetteTool.d.ts +18 -0
  199. package/dist/cjs/src/tools/PipetteTool.js +45 -0
  200. package/dist/cjs/src/tools/SelectionTool/SelectAllShortcutHandler.d.ts +8 -0
  201. package/dist/cjs/src/tools/SelectionTool/SelectAllShortcutHandler.js +28 -0
  202. package/dist/cjs/src/tools/SelectionTool/Selection.d.ts +64 -0
  203. package/dist/cjs/src/tools/SelectionTool/Selection.js +488 -0
  204. package/dist/cjs/src/tools/SelectionTool/SelectionHandle.d.ts +38 -0
  205. package/dist/cjs/src/tools/SelectionTool/SelectionHandle.js +85 -0
  206. package/dist/cjs/src/tools/SelectionTool/SelectionTool.d.ts +36 -0
  207. package/dist/cjs/src/tools/SelectionTool/SelectionTool.js +405 -0
  208. package/dist/cjs/src/tools/SelectionTool/TransformMode.d.ts +34 -0
  209. package/dist/cjs/src/tools/SelectionTool/TransformMode.js +107 -0
  210. package/dist/cjs/src/tools/SelectionTool/types.d.ts +9 -0
  211. package/dist/cjs/src/tools/SelectionTool/types.js +14 -0
  212. package/dist/cjs/src/tools/SoundUITool.d.ts +24 -0
  213. package/dist/cjs/src/tools/SoundUITool.js +164 -0
  214. package/dist/cjs/src/tools/TextTool.d.ts +33 -0
  215. package/dist/cjs/src/tools/TextTool.js +262 -0
  216. package/dist/cjs/src/tools/ToolController.d.ts +18 -0
  217. package/dist/cjs/src/tools/ToolController.js +192 -0
  218. package/dist/cjs/src/tools/ToolEnabledGroup.d.ts +6 -0
  219. package/dist/cjs/src/tools/ToolEnabledGroup.js +14 -0
  220. package/dist/cjs/src/tools/ToolSwitcherShortcut.d.ts +16 -0
  221. package/dist/cjs/src/tools/ToolSwitcherShortcut.js +38 -0
  222. package/dist/cjs/src/tools/ToolbarShortcutHandler.d.ts +12 -0
  223. package/dist/cjs/src/tools/ToolbarShortcutHandler.js +29 -0
  224. package/dist/cjs/src/tools/UndoRedoShortcut.d.ts +8 -0
  225. package/dist/cjs/src/tools/UndoRedoShortcut.js +28 -0
  226. package/dist/cjs/src/tools/lib.d.ts +17 -0
  227. package/dist/cjs/src/tools/lib.js +38 -0
  228. package/dist/cjs/src/tools/localization.d.ts +31 -0
  229. package/dist/cjs/src/tools/localization.js +33 -0
  230. package/dist/cjs/src/types.d.ts +151 -0
  231. package/dist/cjs/src/types.js +38 -0
  232. package/dist/cjs/src/util/assertions.d.ts +23 -0
  233. package/dist/cjs/src/util/assertions.js +51 -0
  234. package/dist/cjs/src/util/fileToBase64.d.ts +3 -0
  235. package/dist/cjs/src/util/fileToBase64.js +15 -0
  236. package/dist/cjs/src/util/untilNextAnimationFrame.d.ts +3 -0
  237. package/dist/cjs/src/util/untilNextAnimationFrame.js +9 -0
  238. package/dist/cjs/src/util/waitForTimeout.d.ts +2 -0
  239. package/dist/cjs/src/util/waitForTimeout.js +9 -0
  240. package/dist/mjs/src/Color4.d.ts +69 -0
  241. package/dist/mjs/src/Color4.mjs +257 -0
  242. package/dist/mjs/src/Editor.d.ts +308 -0
  243. package/dist/mjs/src/Editor.mjs +874 -0
  244. package/dist/mjs/src/EditorImage.d.ts +97 -0
  245. package/dist/mjs/src/EditorImage.mjs +477 -0
  246. package/dist/mjs/src/EventDispatcher.d.ts +30 -0
  247. package/dist/mjs/src/EventDispatcher.mjs +54 -0
  248. package/dist/mjs/src/Pointer.d.ts +24 -0
  249. package/dist/mjs/src/Pointer.mjs +80 -0
  250. package/dist/mjs/src/SVGLoader.d.ts +48 -0
  251. package/dist/mjs/src/SVGLoader.mjs +445 -0
  252. package/dist/mjs/src/UndoRedoHistory.d.ts +19 -0
  253. package/dist/mjs/src/UndoRedoHistory.mjs +91 -0
  254. package/dist/mjs/src/Viewport.d.ts +71 -0
  255. package/dist/mjs/src/Viewport.mjs +256 -0
  256. package/dist/mjs/src/bundle/bundled.d.ts +4 -0
  257. package/dist/mjs/src/bundle/bundled.mjs +5 -0
  258. package/dist/mjs/src/commands/Command.d.ts +16 -0
  259. package/dist/mjs/src/commands/Command.mjs +30 -0
  260. package/dist/mjs/src/commands/Duplicate.d.ts +14 -0
  261. package/dist/mjs/src/commands/Duplicate.mjs +33 -0
  262. package/dist/mjs/src/commands/Erase.d.ts +14 -0
  263. package/dist/mjs/src/commands/Erase.mjs +57 -0
  264. package/dist/mjs/src/commands/SerializableCommand.d.ts +12 -0
  265. package/dist/mjs/src/commands/SerializableCommand.mjs +36 -0
  266. package/dist/mjs/src/commands/UnresolvedCommand.d.ts +14 -0
  267. package/dist/mjs/src/commands/UnresolvedCommand.mjs +22 -0
  268. package/dist/mjs/src/commands/invertCommand.d.ts +4 -0
  269. package/dist/mjs/src/commands/invertCommand.mjs +44 -0
  270. package/dist/mjs/src/commands/lib.d.ts +7 -0
  271. package/dist/mjs/src/commands/lib.mjs +7 -0
  272. package/dist/mjs/src/commands/localization.d.ts +23 -0
  273. package/dist/mjs/src/commands/localization.mjs +21 -0
  274. package/dist/mjs/src/commands/uniteCommands.d.ts +4 -0
  275. package/dist/mjs/src/commands/uniteCommands.mjs +116 -0
  276. package/dist/mjs/src/components/AbstractComponent.d.ts +73 -0
  277. package/dist/mjs/src/components/AbstractComponent.mjs +252 -0
  278. package/dist/mjs/src/components/ImageBackground.d.ts +42 -0
  279. package/dist/mjs/src/components/ImageBackground.mjs +139 -0
  280. package/dist/mjs/src/components/ImageComponent.d.ts +31 -0
  281. package/dist/mjs/src/components/ImageComponent.mjs +146 -0
  282. package/dist/mjs/src/components/RestylableComponent.d.ts +43 -0
  283. package/dist/mjs/src/components/RestylableComponent.mjs +80 -0
  284. package/dist/mjs/src/components/SVGGlobalAttributesObject.d.ts +21 -0
  285. package/dist/mjs/src/components/SVGGlobalAttributesObject.mjs +59 -0
  286. package/dist/mjs/src/components/Stroke.d.ts +75 -0
  287. package/dist/mjs/src/components/Stroke.mjs +219 -0
  288. package/dist/mjs/src/components/TextComponent.d.ts +75 -0
  289. package/dist/mjs/src/components/TextComponent.mjs +274 -0
  290. package/dist/mjs/src/components/UnknownSVGObject.d.ts +18 -0
  291. package/dist/mjs/src/components/UnknownSVGObject.mjs +44 -0
  292. package/dist/mjs/src/components/builders/ArrowBuilder.d.ts +19 -0
  293. package/dist/mjs/src/components/builders/ArrowBuilder.mjs +86 -0
  294. package/dist/mjs/src/components/builders/FreehandLineBuilder.d.ts +33 -0
  295. package/dist/mjs/src/components/builders/FreehandLineBuilder.mjs +165 -0
  296. package/dist/mjs/src/components/builders/LineBuilder.d.ts +18 -0
  297. package/dist/mjs/src/components/builders/LineBuilder.mjs +58 -0
  298. package/dist/mjs/src/components/builders/PressureSensitiveFreehandLineBuilder.d.ts +36 -0
  299. package/dist/mjs/src/components/builders/PressureSensitiveFreehandLineBuilder.mjs +339 -0
  300. package/dist/mjs/src/components/builders/RectangleBuilder.d.ts +20 -0
  301. package/dist/mjs/src/components/builders/RectangleBuilder.mjs +50 -0
  302. package/dist/mjs/src/components/builders/types.d.ts +12 -0
  303. package/dist/mjs/src/components/builders/types.mjs +1 -0
  304. package/dist/mjs/src/components/lib.d.ts +13 -0
  305. package/dist/mjs/src/components/lib.mjs +12 -0
  306. package/dist/mjs/src/components/localization.d.ts +11 -0
  307. package/dist/mjs/src/components/localization.mjs +10 -0
  308. package/dist/mjs/src/components/util/StrokeSmoother.d.ts +35 -0
  309. package/dist/mjs/src/components/util/StrokeSmoother.mjs +210 -0
  310. package/dist/mjs/src/components/util/describeComponentList.d.ts +4 -0
  311. package/dist/mjs/src/components/util/describeComponentList.mjs +14 -0
  312. package/dist/mjs/src/lib.d.ts +64 -0
  313. package/dist/mjs/src/lib.mjs +64 -0
  314. package/dist/mjs/src/localization.d.ts +14 -0
  315. package/dist/mjs/src/localization.mjs +10 -0
  316. package/dist/mjs/src/localizations/de.d.ts +3 -0
  317. package/dist/mjs/src/localizations/de.mjs +4 -0
  318. package/dist/mjs/src/localizations/en.d.ts +3 -0
  319. package/dist/mjs/src/localizations/en.mjs +4 -0
  320. package/dist/mjs/src/localizations/es.d.ts +3 -0
  321. package/dist/mjs/src/localizations/es.mjs +18 -0
  322. package/dist/mjs/src/localizations/getLocalizationTable.d.ts +3 -0
  323. package/dist/mjs/src/localizations/getLocalizationTable.mjs +45 -0
  324. package/dist/mjs/src/math/LineSegment2.d.ts +24 -0
  325. package/dist/mjs/src/math/LineSegment2.mjs +125 -0
  326. package/dist/mjs/src/math/Mat33.d.ts +118 -0
  327. package/dist/mjs/src/math/Mat33.mjs +326 -0
  328. package/dist/mjs/src/math/Path.d.ts +71 -0
  329. package/dist/mjs/src/math/Path.mjs +648 -0
  330. package/dist/mjs/src/math/Rect2.d.ts +52 -0
  331. package/dist/mjs/src/math/Rect2.mjs +228 -0
  332. package/dist/mjs/src/math/Triangle.d.ts +11 -0
  333. package/dist/mjs/src/math/Triangle.mjs +19 -0
  334. package/dist/mjs/src/math/Vec2.d.ts +13 -0
  335. package/dist/mjs/src/math/Vec2.mjs +13 -0
  336. package/dist/mjs/src/math/Vec3.d.ts +106 -0
  337. package/dist/mjs/src/math/Vec3.mjs +174 -0
  338. package/dist/mjs/src/math/lib.d.ts +7 -0
  339. package/dist/mjs/src/math/lib.mjs +7 -0
  340. package/dist/mjs/src/math/rounding.d.ts +4 -0
  341. package/dist/mjs/src/math/rounding.mjs +128 -0
  342. package/dist/mjs/src/rendering/Display.d.ts +75 -0
  343. package/dist/mjs/src/rendering/Display.mjs +207 -0
  344. package/dist/mjs/src/rendering/RenderingStyle.d.ts +31 -0
  345. package/dist/mjs/src/rendering/RenderingStyle.mjs +38 -0
  346. package/dist/mjs/src/rendering/TextRenderingStyle.d.ts +36 -0
  347. package/dist/mjs/src/rendering/TextRenderingStyle.mjs +23 -0
  348. package/dist/mjs/src/rendering/caching/CacheRecord.d.ts +20 -0
  349. package/dist/mjs/src/rendering/caching/CacheRecord.mjs +55 -0
  350. package/dist/mjs/src/rendering/caching/CacheRecordManager.d.ts +12 -0
  351. package/dist/mjs/src/rendering/caching/CacheRecordManager.mjs +43 -0
  352. package/dist/mjs/src/rendering/caching/RenderingCache.d.ts +11 -0
  353. package/dist/mjs/src/rendering/caching/RenderingCache.mjs +45 -0
  354. package/dist/mjs/src/rendering/caching/RenderingCacheNode.d.ts +29 -0
  355. package/dist/mjs/src/rendering/caching/RenderingCacheNode.mjs +320 -0
  356. package/dist/mjs/src/rendering/caching/testUtils.d.ts +9 -0
  357. package/dist/mjs/src/rendering/caching/testUtils.mjs +20 -0
  358. package/dist/mjs/src/rendering/caching/types.d.ts +19 -0
  359. package/dist/mjs/src/rendering/caching/types.mjs +1 -0
  360. package/dist/mjs/src/rendering/lib.d.ts +7 -0
  361. package/dist/mjs/src/rendering/lib.mjs +5 -0
  362. package/dist/mjs/src/rendering/localization.d.ts +10 -0
  363. package/dist/mjs/src/rendering/localization.mjs +9 -0
  364. package/dist/mjs/src/rendering/renderers/AbstractRenderer.d.ts +68 -0
  365. package/dist/mjs/src/rendering/renderers/AbstractRenderer.mjs +144 -0
  366. package/dist/mjs/src/rendering/renderers/CanvasRenderer.d.ts +63 -0
  367. package/dist/mjs/src/rendering/renderers/CanvasRenderer.mjs +230 -0
  368. package/dist/mjs/src/rendering/renderers/DummyRenderer.d.ts +35 -0
  369. package/dist/mjs/src/rendering/renderers/DummyRenderer.mjs +106 -0
  370. package/dist/mjs/src/rendering/renderers/SVGRenderer.d.ts +57 -0
  371. package/dist/mjs/src/rendering/renderers/SVGRenderer.mjs +304 -0
  372. package/dist/mjs/src/rendering/renderers/TextOnlyRenderer.d.ts +29 -0
  373. package/dist/mjs/src/rendering/renderers/TextOnlyRenderer.mjs +57 -0
  374. package/dist/mjs/src/testing/beforeEachFile.d.ts +1 -0
  375. package/dist/mjs/src/testing/beforeEachFile.mjs +7 -0
  376. package/dist/mjs/src/testing/createEditor.d.ts +4 -0
  377. package/dist/mjs/src/testing/createEditor.mjs +9 -0
  378. package/dist/mjs/src/testing/lib.d.ts +2 -0
  379. package/dist/mjs/src/testing/lib.mjs +2 -0
  380. package/dist/mjs/src/testing/loadExpectExtensions.d.ts +2 -0
  381. package/dist/mjs/src/testing/loadExpectExtensions.mjs +24 -0
  382. package/dist/mjs/src/testing/sendPenEvent.d.ts +12 -0
  383. package/dist/mjs/src/testing/sendPenEvent.mjs +19 -0
  384. package/dist/mjs/src/testing/sendTouchEvent.d.ts +42 -0
  385. package/dist/mjs/src/testing/sendTouchEvent.mjs +62 -0
  386. package/dist/mjs/src/toolbar/HTMLToolbar.d.ts +103 -0
  387. package/dist/mjs/src/toolbar/HTMLToolbar.mjs +376 -0
  388. package/dist/mjs/src/toolbar/IconProvider.d.ts +62 -0
  389. package/dist/mjs/src/toolbar/IconProvider.mjs +654 -0
  390. package/dist/mjs/src/toolbar/lib.d.ts +3 -0
  391. package/dist/mjs/src/toolbar/lib.mjs +3 -0
  392. package/dist/mjs/src/toolbar/localization.d.ts +49 -0
  393. package/dist/mjs/src/toolbar/localization.mjs +48 -0
  394. package/dist/mjs/src/toolbar/makeColorInput.d.ts +6 -0
  395. package/dist/mjs/src/toolbar/makeColorInput.mjs +113 -0
  396. package/dist/mjs/src/toolbar/types.d.ts +4 -0
  397. package/dist/mjs/src/toolbar/types.mjs +1 -0
  398. package/dist/mjs/src/toolbar/widgets/ActionButtonWidget.d.ts +15 -0
  399. package/dist/mjs/src/toolbar/widgets/ActionButtonWidget.mjs +25 -0
  400. package/dist/mjs/src/toolbar/widgets/BaseToolWidget.d.ts +11 -0
  401. package/dist/mjs/src/toolbar/widgets/BaseToolWidget.mjs +44 -0
  402. package/dist/mjs/src/toolbar/widgets/BaseWidget.d.ts +72 -0
  403. package/dist/mjs/src/toolbar/widgets/BaseWidget.mjs +307 -0
  404. package/dist/mjs/src/toolbar/widgets/DocumentPropertiesWidget.d.ts +18 -0
  405. package/dist/mjs/src/toolbar/widgets/DocumentPropertiesWidget.mjs +120 -0
  406. package/dist/mjs/src/toolbar/widgets/EraserToolWidget.d.ts +17 -0
  407. package/dist/mjs/src/toolbar/widgets/EraserToolWidget.mjs +57 -0
  408. package/dist/mjs/src/toolbar/widgets/HandToolWidget.d.ts +17 -0
  409. package/dist/mjs/src/toolbar/widgets/HandToolWidget.mjs +172 -0
  410. package/dist/mjs/src/toolbar/widgets/InsertImageWidget.d.ts +19 -0
  411. package/dist/mjs/src/toolbar/widgets/InsertImageWidget.mjs +170 -0
  412. package/dist/mjs/src/toolbar/widgets/OverflowWidget.d.ts +25 -0
  413. package/dist/mjs/src/toolbar/widgets/OverflowWidget.mjs +71 -0
  414. package/dist/mjs/src/toolbar/widgets/PenToolWidget.d.ts +27 -0
  415. package/dist/mjs/src/toolbar/widgets/PenToolWidget.mjs +220 -0
  416. package/dist/mjs/src/toolbar/widgets/SelectionToolWidget.d.ts +13 -0
  417. package/dist/mjs/src/toolbar/widgets/SelectionToolWidget.mjs +147 -0
  418. package/dist/mjs/src/toolbar/widgets/TextToolWidget.d.ts +16 -0
  419. package/dist/mjs/src/toolbar/widgets/TextToolWidget.mjs +109 -0
  420. package/dist/mjs/src/toolbar/widgets/lib.d.ts +10 -0
  421. package/dist/mjs/src/toolbar/widgets/lib.mjs +10 -0
  422. package/dist/mjs/src/tools/BaseTool.d.ts +22 -0
  423. package/dist/mjs/src/tools/BaseTool.mjs +63 -0
  424. package/dist/mjs/src/tools/Eraser.d.ts +23 -0
  425. package/dist/mjs/src/tools/Eraser.mjs +106 -0
  426. package/dist/mjs/src/tools/FindTool.d.ts +21 -0
  427. package/dist/mjs/src/tools/FindTool.mjs +114 -0
  428. package/dist/mjs/src/tools/PanZoom.d.ts +52 -0
  429. package/dist/mjs/src/tools/PanZoom.mjs +414 -0
  430. package/dist/mjs/src/tools/PasteHandler.d.ts +23 -0
  431. package/dist/mjs/src/tools/PasteHandler.mjs +93 -0
  432. package/dist/mjs/src/tools/Pen.d.ts +39 -0
  433. package/dist/mjs/src/tools/Pen.mjs +173 -0
  434. package/dist/mjs/src/tools/PipetteTool.d.ts +18 -0
  435. package/dist/mjs/src/tools/PipetteTool.mjs +39 -0
  436. package/dist/mjs/src/tools/SelectionTool/SelectAllShortcutHandler.d.ts +8 -0
  437. package/dist/mjs/src/tools/SelectionTool/SelectAllShortcutHandler.mjs +22 -0
  438. package/dist/mjs/src/tools/SelectionTool/Selection.d.ts +64 -0
  439. package/dist/mjs/src/tools/SelectionTool/Selection.mjs +459 -0
  440. package/dist/mjs/src/tools/SelectionTool/SelectionHandle.d.ts +38 -0
  441. package/dist/mjs/src/tools/SelectionTool/SelectionHandle.mjs +81 -0
  442. package/dist/mjs/src/tools/SelectionTool/SelectionTool.d.ts +36 -0
  443. package/dist/mjs/src/tools/SelectionTool/SelectionTool.mjs +398 -0
  444. package/dist/mjs/src/tools/SelectionTool/TransformMode.d.ts +34 -0
  445. package/dist/mjs/src/tools/SelectionTool/TransformMode.mjs +98 -0
  446. package/dist/mjs/src/tools/SelectionTool/types.d.ts +9 -0
  447. package/dist/mjs/src/tools/SelectionTool/types.mjs +11 -0
  448. package/dist/mjs/src/tools/SoundUITool.d.ts +24 -0
  449. package/dist/mjs/src/tools/SoundUITool.mjs +158 -0
  450. package/dist/mjs/src/tools/TextTool.d.ts +33 -0
  451. package/dist/mjs/src/tools/TextTool.mjs +256 -0
  452. package/dist/mjs/src/tools/ToolController.d.ts +18 -0
  453. package/dist/mjs/src/tools/ToolController.mjs +163 -0
  454. package/dist/mjs/src/tools/ToolEnabledGroup.d.ts +6 -0
  455. package/dist/mjs/src/tools/ToolEnabledGroup.mjs +11 -0
  456. package/dist/mjs/src/tools/ToolSwitcherShortcut.d.ts +16 -0
  457. package/dist/mjs/src/tools/ToolSwitcherShortcut.mjs +32 -0
  458. package/dist/mjs/src/tools/ToolbarShortcutHandler.d.ts +12 -0
  459. package/dist/mjs/src/tools/ToolbarShortcutHandler.mjs +23 -0
  460. package/dist/mjs/src/tools/UndoRedoShortcut.d.ts +8 -0
  461. package/dist/mjs/src/tools/UndoRedoShortcut.mjs +22 -0
  462. package/dist/mjs/src/tools/lib.d.ts +17 -0
  463. package/dist/mjs/src/tools/lib.mjs +17 -0
  464. package/dist/mjs/src/tools/localization.d.ts +31 -0
  465. package/dist/mjs/src/tools/localization.mjs +30 -0
  466. package/dist/mjs/src/types.d.ts +151 -0
  467. package/dist/mjs/src/types.mjs +35 -0
  468. package/dist/mjs/src/util/assertions.d.ts +23 -0
  469. package/dist/mjs/src/util/assertions.mjs +45 -0
  470. package/dist/mjs/src/util/fileToBase64.d.ts +3 -0
  471. package/dist/mjs/src/util/fileToBase64.mjs +13 -0
  472. package/dist/mjs/src/util/untilNextAnimationFrame.d.ts +3 -0
  473. package/dist/mjs/src/util/untilNextAnimationFrame.mjs +7 -0
  474. package/dist/mjs/src/util/waitForTimeout.d.ts +2 -0
  475. package/dist/mjs/src/util/waitForTimeout.mjs +7 -0
  476. package/package.json +6 -4
  477. package/src/Editor.css +86 -0
  478. package/src/styles.js +7 -0
  479. package/src/toolbar/toolbar.css +213 -0
  480. package/src/toolbar/widgets/InsertImageWidget.css +44 -0
  481. package/src/toolbar/widgets/OverflowWidget.css +27 -0
  482. package/src/tools/FindTool.css +7 -0
  483. package/src/tools/SelectionTool/SelectionTool.css +23 -0
  484. package/src/tools/SoundUITool.css +15 -0
  485. package/src/tools/tools.css +4 -0
@@ -0,0 +1,144 @@
1
+ import Path, { PathCommandType } from '../../math/Path.mjs';
2
+ import { Vec2 } from '../../math/Vec2.mjs';
3
+ import { stylesEqual } from '../RenderingStyle.mjs';
4
+ export default class AbstractRenderer {
5
+ constructor(viewport) {
6
+ this.viewport = viewport;
7
+ // If null, this' transformation is linked to the Viewport
8
+ this.selfTransform = null;
9
+ this.transformStack = [];
10
+ this.objectLevel = 0;
11
+ this.currentPaths = null;
12
+ }
13
+ // this.canvasToScreen, etc. should be used instead of the corresponding
14
+ // methods on Viewport.
15
+ getViewport() { return this.viewport; }
16
+ setDraftMode(_draftMode) { }
17
+ flushPath() {
18
+ if (!this.currentPaths) {
19
+ return;
20
+ }
21
+ let lastStyle = null;
22
+ for (const path of this.currentPaths) {
23
+ const { startPoint, commands, style } = path;
24
+ if (!lastStyle || !stylesEqual(lastStyle, style)) {
25
+ if (lastStyle) {
26
+ this.endPath(lastStyle);
27
+ }
28
+ this.beginPath(startPoint);
29
+ lastStyle = style;
30
+ }
31
+ else {
32
+ this.moveTo(startPoint);
33
+ }
34
+ for (const command of commands) {
35
+ if (command.kind === PathCommandType.LineTo) {
36
+ this.lineTo(command.point);
37
+ }
38
+ else if (command.kind === PathCommandType.MoveTo) {
39
+ this.moveTo(command.point);
40
+ }
41
+ else if (command.kind === PathCommandType.CubicBezierTo) {
42
+ this.traceCubicBezierCurve(command.controlPoint1, command.controlPoint2, command.endPoint);
43
+ }
44
+ else if (command.kind === PathCommandType.QuadraticBezierTo) {
45
+ this.traceQuadraticBezierCurve(command.controlPoint, command.endPoint);
46
+ }
47
+ }
48
+ }
49
+ if (lastStyle) {
50
+ this.endPath(lastStyle);
51
+ }
52
+ }
53
+ drawPath(path) {
54
+ // If we're being called outside of an object,
55
+ // we can't delay rendering
56
+ if (this.objectLevel === 0) {
57
+ this.currentPaths = [path];
58
+ this.flushPath();
59
+ this.currentPaths = null;
60
+ }
61
+ else {
62
+ // Otherwise, don't render paths all at once. This prevents faint lines between
63
+ // segments of the same stroke from being visible.
64
+ this.currentPaths.push(path);
65
+ }
66
+ }
67
+ // Strokes a rectangle. Boundary lines have width [lineWidth] and are filled with [lineFill].
68
+ // This is equivalent to `drawPath(Path.fromRect(...).toRenderable(...))`.
69
+ drawRect(rect, lineWidth, lineFill) {
70
+ const path = Path.fromRect(rect, lineWidth);
71
+ this.drawPath(path.toRenderable(lineFill));
72
+ }
73
+ // Fills a rectangle.
74
+ fillRect(rect, fill) {
75
+ const path = Path.fromRect(rect);
76
+ this.drawPath(path.toRenderable({ fill }));
77
+ }
78
+ // Note the start of an object with the given bounding box.
79
+ // Renderers are not required to support [clip]
80
+ startObject(_boundingBox, _clip) {
81
+ this.currentPaths = [];
82
+ this.objectLevel++;
83
+ }
84
+ /**
85
+ * Notes the end of an object.
86
+ * @param _loaderData - a map from strings to JSON-ifyable objects
87
+ * and contains properties attached to the object by whatever loader loaded the image. This
88
+ * is used to preserve attributes not supported by js-draw when loading/saving an image.
89
+ * Renderers may ignore this.
90
+ *
91
+ * @param _objectTags - a list of labels (e.g. `className`s) to be attached to the object.
92
+ * Renderers may ignore this.
93
+ */
94
+ endObject(_loaderData, _objectTags) {
95
+ // Render the paths all at once
96
+ this.flushPath();
97
+ this.currentPaths = null;
98
+ this.objectLevel--;
99
+ if (this.objectLevel < 0) {
100
+ throw new Error('More objects have ended than have been started (negative object nesting level)!');
101
+ }
102
+ }
103
+ getNestingLevel() {
104
+ return this.objectLevel;
105
+ }
106
+ // Returns true iff other can be rendered onto this without data loss.
107
+ canRenderFromWithoutDataLoss(_other) {
108
+ return false;
109
+ }
110
+ // MUST throw if other and this are not of the same base class.
111
+ renderFromOtherOfSameType(_renderTo, other) {
112
+ throw new Error(`Unable to render from ${other}: Not implemented`);
113
+ }
114
+ // Set a transformation to apply to things before rendering,
115
+ // replacing the viewport's transform.
116
+ setTransform(transform) {
117
+ this.selfTransform = transform;
118
+ }
119
+ pushTransform(transform) {
120
+ this.transformStack.push(this.selfTransform);
121
+ this.setTransform(this.getCanvasToScreenTransform().rightMul(transform));
122
+ }
123
+ popTransform() {
124
+ var _a;
125
+ if (this.transformStack.length === 0) {
126
+ throw new Error('Unable to pop more transforms than have been pushed!');
127
+ }
128
+ this.setTransform((_a = this.transformStack.pop()) !== null && _a !== void 0 ? _a : null);
129
+ }
130
+ // Get the matrix that transforms a vector on the canvas to a vector on this'
131
+ // rendering target.
132
+ getCanvasToScreenTransform() {
133
+ if (this.selfTransform) {
134
+ return this.selfTransform;
135
+ }
136
+ return this.viewport.canvasToScreenTransform;
137
+ }
138
+ canvasToScreen(vec) {
139
+ return this.getCanvasToScreenTransform().transformVec2(vec);
140
+ }
141
+ getSizeOfCanvasPixelOnScreen() {
142
+ return this.getCanvasToScreenTransform().transformVec3(Vec2.unitX).length();
143
+ }
144
+ }
@@ -0,0 +1,63 @@
1
+ import Mat33 from '../../math/Mat33';
2
+ import Rect2 from '../../math/Rect2';
3
+ import { Point2, Vec2 } from '../../math/Vec2';
4
+ import Vec3 from '../../math/Vec3';
5
+ import Viewport from '../../Viewport';
6
+ import RenderingStyle from '../RenderingStyle';
7
+ import TextRenderingStyle from '../TextRenderingStyle';
8
+ import AbstractRenderer, { RenderableImage, RenderablePathSpec } from './AbstractRenderer';
9
+ /**
10
+ * Renders onto a `CanvasRenderingContext2D`.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const editor = new Editor(document.body);
15
+ *
16
+ * const canvas = document.createElement('canvas');
17
+ * const ctx = canvas.getContext('2d');
18
+ *
19
+ * // Ensure that the canvas can fit the entire rendering
20
+ * const viewport = editor.image.getImportExportViewport();
21
+ * canvas.width = viewport.getScreenRectSize().x;
22
+ * canvas.height = viewport.getScreenRectSize().y;
23
+ *
24
+ * // Render editor.image onto the renderer
25
+ * const renderer = new CanvasRenderer(ctx, viewport);
26
+ * editor.image.render(renderer, viewport);
27
+ * ```
28
+ */
29
+ export default class CanvasRenderer extends AbstractRenderer {
30
+ private ctx;
31
+ private ignoreObjectsAboveLevel;
32
+ private ignoringObject;
33
+ private currentObjectBBox;
34
+ private minSquareCurveApproxDist;
35
+ private minRenderSizeAnyDimen;
36
+ private minRenderSizeBothDimens;
37
+ /**
38
+ * Creates a new `CanvasRenderer` that renders to the given rendering context.
39
+ * The `viewport` is used to determine the translation/rotation/scaling of the content
40
+ * to draw.
41
+ */
42
+ constructor(ctx: CanvasRenderingContext2D, viewport: Viewport);
43
+ private transformBy;
44
+ canRenderFromWithoutDataLoss(other: AbstractRenderer): boolean;
45
+ renderFromOtherOfSameType(transformBy: Mat33, other: AbstractRenderer): void;
46
+ setDraftMode(draftMode: boolean): void;
47
+ displaySize(): Vec2;
48
+ clear(): void;
49
+ protected beginPath(startPoint: Point2): void;
50
+ protected endPath(style: RenderingStyle): void;
51
+ protected lineTo(point: Point2): void;
52
+ protected moveTo(point: Point2): void;
53
+ protected traceCubicBezierCurve(p1: Point2, p2: Point2, p3: Point2): void;
54
+ protected traceQuadraticBezierCurve(controlPoint: Vec3, endPoint: Vec3): void;
55
+ drawPath(path: RenderablePathSpec): void;
56
+ drawText(text: string, transform: Mat33, style: TextRenderingStyle): void;
57
+ drawImage(image: RenderableImage): void;
58
+ private clipLevels;
59
+ startObject(boundingBox: Rect2, clip?: boolean): void;
60
+ endObject(): void;
61
+ drawPoints(...points: Point2[]): void;
62
+ isTooSmallToRender(rect: Rect2): boolean;
63
+ }
@@ -0,0 +1,230 @@
1
+ import Color4 from '../../Color4.mjs';
2
+ import TextComponent from '../../components/TextComponent.mjs';
3
+ import Path from '../../math/Path.mjs';
4
+ import { Vec2 } from '../../math/Vec2.mjs';
5
+ import AbstractRenderer from './AbstractRenderer.mjs';
6
+ /**
7
+ * Renders onto a `CanvasRenderingContext2D`.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const editor = new Editor(document.body);
12
+ *
13
+ * const canvas = document.createElement('canvas');
14
+ * const ctx = canvas.getContext('2d');
15
+ *
16
+ * // Ensure that the canvas can fit the entire rendering
17
+ * const viewport = editor.image.getImportExportViewport();
18
+ * canvas.width = viewport.getScreenRectSize().x;
19
+ * canvas.height = viewport.getScreenRectSize().y;
20
+ *
21
+ * // Render editor.image onto the renderer
22
+ * const renderer = new CanvasRenderer(ctx, viewport);
23
+ * editor.image.render(renderer, viewport);
24
+ * ```
25
+ */
26
+ export default class CanvasRenderer extends AbstractRenderer {
27
+ /**
28
+ * Creates a new `CanvasRenderer` that renders to the given rendering context.
29
+ * The `viewport` is used to determine the translation/rotation/scaling of the content
30
+ * to draw.
31
+ */
32
+ constructor(ctx, viewport) {
33
+ super(viewport);
34
+ this.ctx = ctx;
35
+ this.ignoreObjectsAboveLevel = null;
36
+ this.ignoringObject = false;
37
+ this.currentObjectBBox = null;
38
+ this.clipLevels = [];
39
+ this.setDraftMode(false);
40
+ }
41
+ transformBy(transformBy) {
42
+ // From MDN, transform(a,b,c,d,e,f)
43
+ // takes input such that
44
+ // ⎡ a c e ⎤
45
+ // ⎢ b d f ⎥ transforms content drawn to [ctx].
46
+ // ⎣ 0 0 1 ⎦
47
+ this.ctx.transform(transformBy.a1, transformBy.b1, // a, b
48
+ transformBy.a2, transformBy.b2, // c, d
49
+ transformBy.a3, transformBy.b3);
50
+ }
51
+ canRenderFromWithoutDataLoss(other) {
52
+ return other instanceof CanvasRenderer;
53
+ }
54
+ renderFromOtherOfSameType(transformBy, other) {
55
+ if (!(other instanceof CanvasRenderer)) {
56
+ throw new Error(`${other} cannot be rendered onto ${this}`);
57
+ }
58
+ transformBy = this.getCanvasToScreenTransform().rightMul(transformBy);
59
+ this.ctx.save();
60
+ this.transformBy(transformBy);
61
+ this.ctx.drawImage(other.ctx.canvas, 0, 0);
62
+ this.ctx.restore();
63
+ }
64
+ // Set parameters for lower/higher quality rendering
65
+ setDraftMode(draftMode) {
66
+ if (draftMode) {
67
+ this.minSquareCurveApproxDist = 9;
68
+ this.minRenderSizeBothDimens = 2;
69
+ this.minRenderSizeAnyDimen = 0.5;
70
+ }
71
+ else {
72
+ this.minSquareCurveApproxDist = 0.5;
73
+ this.minRenderSizeBothDimens = 0.2;
74
+ this.minRenderSizeAnyDimen = 1e-6;
75
+ }
76
+ }
77
+ displaySize() {
78
+ return Vec2.of(this.ctx.canvas.clientWidth, this.ctx.canvas.clientHeight);
79
+ }
80
+ clear() {
81
+ this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
82
+ }
83
+ beginPath(startPoint) {
84
+ startPoint = this.canvasToScreen(startPoint);
85
+ this.ctx.beginPath();
86
+ this.ctx.moveTo(startPoint.x, startPoint.y);
87
+ }
88
+ endPath(style) {
89
+ this.ctx.fillStyle = style.fill.toHexString();
90
+ this.ctx.fill();
91
+ if (style.stroke) {
92
+ this.ctx.strokeStyle = style.stroke.color.toHexString();
93
+ this.ctx.lineWidth = this.getSizeOfCanvasPixelOnScreen() * style.stroke.width;
94
+ this.ctx.lineCap = 'round';
95
+ this.ctx.lineJoin = 'round';
96
+ this.ctx.stroke();
97
+ }
98
+ this.ctx.closePath();
99
+ }
100
+ lineTo(point) {
101
+ point = this.canvasToScreen(point);
102
+ this.ctx.lineTo(point.x, point.y);
103
+ }
104
+ moveTo(point) {
105
+ point = this.canvasToScreen(point);
106
+ this.ctx.moveTo(point.x, point.y);
107
+ }
108
+ traceCubicBezierCurve(p1, p2, p3) {
109
+ p1 = this.canvasToScreen(p1);
110
+ p2 = this.canvasToScreen(p2);
111
+ p3 = this.canvasToScreen(p3);
112
+ // Approximate the curve if small enough.
113
+ const delta1 = p2.minus(p1);
114
+ const delta2 = p3.minus(p2);
115
+ if (delta1.magnitudeSquared() < this.minSquareCurveApproxDist
116
+ && delta2.magnitudeSquared() < this.minSquareCurveApproxDist) {
117
+ this.ctx.lineTo(p3.x, p3.y);
118
+ }
119
+ else {
120
+ this.ctx.bezierCurveTo(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y);
121
+ }
122
+ }
123
+ traceQuadraticBezierCurve(controlPoint, endPoint) {
124
+ controlPoint = this.canvasToScreen(controlPoint);
125
+ endPoint = this.canvasToScreen(endPoint);
126
+ // Approximate the curve with a line if small enough
127
+ const delta = controlPoint.minus(endPoint);
128
+ if (delta.magnitudeSquared() < this.minSquareCurveApproxDist) {
129
+ this.ctx.lineTo(endPoint.x, endPoint.y);
130
+ }
131
+ else {
132
+ this.ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, endPoint.x, endPoint.y);
133
+ }
134
+ }
135
+ drawPath(path) {
136
+ var _a;
137
+ if (this.ignoringObject) {
138
+ return;
139
+ }
140
+ // If part of a huge object, it might be worth trimming the path
141
+ if ((_a = this.currentObjectBBox) === null || _a === void 0 ? void 0 : _a.containsRect(this.getViewport().visibleRect)) {
142
+ // Try to trim/remove parts of the path outside of the bounding box.
143
+ path = Path.visualEquivalent(path, this.getViewport().visibleRect);
144
+ }
145
+ super.drawPath(path);
146
+ }
147
+ drawText(text, transform, style) {
148
+ this.ctx.save();
149
+ transform = this.getCanvasToScreenTransform().rightMul(transform);
150
+ this.transformBy(transform);
151
+ TextComponent.applyTextStyles(this.ctx, style);
152
+ if (style.renderingStyle.fill.a !== 0) {
153
+ this.ctx.fillStyle = style.renderingStyle.fill.toHexString();
154
+ this.ctx.fillText(text, 0, 0);
155
+ }
156
+ if (style.renderingStyle.stroke) {
157
+ this.ctx.strokeStyle = style.renderingStyle.stroke.color.toHexString();
158
+ this.ctx.lineWidth = style.renderingStyle.stroke.width;
159
+ this.ctx.strokeText(text, 0, 0);
160
+ }
161
+ this.ctx.restore();
162
+ }
163
+ drawImage(image) {
164
+ this.ctx.save();
165
+ const transform = this.getCanvasToScreenTransform().rightMul(image.transform);
166
+ this.transformBy(transform);
167
+ this.ctx.drawImage(image.image, 0, 0);
168
+ this.ctx.restore();
169
+ }
170
+ startObject(boundingBox, clip) {
171
+ if (this.isTooSmallToRender(boundingBox)) {
172
+ this.ignoreObjectsAboveLevel = this.getNestingLevel();
173
+ this.ignoringObject = true;
174
+ }
175
+ super.startObject(boundingBox);
176
+ this.currentObjectBBox = boundingBox;
177
+ if (!this.ignoringObject && clip) {
178
+ this.clipLevels.push(this.objectLevel);
179
+ this.ctx.save();
180
+ this.ctx.beginPath();
181
+ for (const corner of boundingBox.corners) {
182
+ const screenCorner = this.canvasToScreen(corner);
183
+ this.ctx.lineTo(screenCorner.x, screenCorner.y);
184
+ }
185
+ this.ctx.clip();
186
+ }
187
+ }
188
+ endObject() {
189
+ if (!this.ignoringObject && this.clipLevels.length > 0) {
190
+ if (this.clipLevels[this.clipLevels.length - 1] === this.objectLevel) {
191
+ this.ctx.restore();
192
+ this.clipLevels.pop();
193
+ }
194
+ }
195
+ this.currentObjectBBox = null;
196
+ super.endObject();
197
+ // If exiting an object with a too-small-to-draw bounding box,
198
+ if (this.ignoreObjectsAboveLevel !== null && this.getNestingLevel() <= this.ignoreObjectsAboveLevel) {
199
+ this.ignoreObjectsAboveLevel = null;
200
+ this.ignoringObject = false;
201
+ }
202
+ }
203
+ // @internal
204
+ drawPoints(...points) {
205
+ const pointRadius = 10;
206
+ for (let i = 0; i < points.length; i++) {
207
+ const point = this.canvasToScreen(points[i]);
208
+ this.ctx.beginPath();
209
+ this.ctx.arc(point.x, point.y, pointRadius, 0, Math.PI * 2);
210
+ this.ctx.fillStyle = Color4.ofRGBA(0.5 + Math.sin(i) / 2, 1.0, 0.5 + Math.cos(i * 0.2) / 4, 0.5).toHexString();
211
+ this.ctx.fill();
212
+ this.ctx.stroke();
213
+ this.ctx.closePath();
214
+ this.ctx.textAlign = 'center';
215
+ this.ctx.textBaseline = 'middle';
216
+ this.ctx.fillStyle = 'black';
217
+ this.ctx.fillText(`${i}`, point.x, point.y, pointRadius * 2);
218
+ }
219
+ }
220
+ // @internal
221
+ isTooSmallToRender(rect) {
222
+ // Should we ignore all objects within this object's bbox?
223
+ const diagonal = this.getCanvasToScreenTransform().transformVec3(rect.size);
224
+ const bothDimenMinSize = this.minRenderSizeBothDimens;
225
+ const bothTooSmall = Math.abs(diagonal.x) < bothDimenMinSize && Math.abs(diagonal.y) < bothDimenMinSize;
226
+ const anyDimenMinSize = this.minRenderSizeAnyDimen;
227
+ const anyTooSmall = Math.abs(diagonal.x) < anyDimenMinSize || Math.abs(diagonal.y) < anyDimenMinSize;
228
+ return bothTooSmall || anyTooSmall;
229
+ }
230
+ }
@@ -0,0 +1,35 @@
1
+ import Mat33 from '../../math/Mat33';
2
+ import Rect2 from '../../math/Rect2';
3
+ import { Point2, Vec2 } from '../../math/Vec2';
4
+ import Vec3 from '../../math/Vec3';
5
+ import Viewport from '../../Viewport';
6
+ import RenderingStyle from '../RenderingStyle';
7
+ import TextRenderingStyle from '../TextRenderingStyle';
8
+ import AbstractRenderer, { RenderableImage } from './AbstractRenderer';
9
+ export default class DummyRenderer extends AbstractRenderer {
10
+ clearedCount: number;
11
+ renderedPathCount: number;
12
+ lastFillStyle: RenderingStyle | null;
13
+ lastPoint: Point2 | null;
14
+ objectNestingLevel: number;
15
+ lastText: string | null;
16
+ lastImage: RenderableImage | null;
17
+ pointBuffer: Point2[];
18
+ constructor(viewport: Viewport);
19
+ displaySize(): Vec2;
20
+ clear(): void;
21
+ protected beginPath(startPoint: Vec3): void;
22
+ protected endPath(style: RenderingStyle): void;
23
+ protected lineTo(point: Vec3): void;
24
+ protected moveTo(point: Point2): void;
25
+ protected traceCubicBezierCurve(p1: Vec3, p2: Vec3, p3: Vec3): void;
26
+ protected traceQuadraticBezierCurve(controlPoint: Vec3, endPoint: Vec3): void;
27
+ drawPoints(..._points: Vec3[]): void;
28
+ drawText(text: string, _transform: Mat33, _style: TextRenderingStyle): void;
29
+ drawImage(image: RenderableImage): void;
30
+ startObject(boundingBox: Rect2, _clip: boolean): void;
31
+ endObject(): void;
32
+ isTooSmallToRender(_rect: Rect2): boolean;
33
+ canRenderFromWithoutDataLoss(other: AbstractRenderer): boolean;
34
+ renderFromOtherOfSameType(transform: Mat33, other: AbstractRenderer): void;
35
+ }
@@ -0,0 +1,106 @@
1
+ import { Vec2 } from '../../math/Vec2.mjs';
2
+ import AbstractRenderer from './AbstractRenderer.mjs';
3
+ // Renderer that outputs almost nothing. Useful for automated tests.
4
+ export default class DummyRenderer extends AbstractRenderer {
5
+ constructor(viewport) {
6
+ super(viewport);
7
+ // Variables that track the state of what's been rendered
8
+ this.clearedCount = 0;
9
+ this.renderedPathCount = 0;
10
+ this.lastFillStyle = null;
11
+ this.lastPoint = null;
12
+ this.objectNestingLevel = 0;
13
+ this.lastText = null;
14
+ this.lastImage = null;
15
+ // List of points drawn since the last clear.
16
+ this.pointBuffer = [];
17
+ }
18
+ displaySize() {
19
+ // Do we have a stored viewport size?
20
+ const viewportSize = this.getViewport().getScreenRectSize();
21
+ // Don't use a 0x0 viewport — DummyRenderer is often used
22
+ // for tests that run without a display, so pretend we have a
23
+ // reasonable-sized display.
24
+ if (viewportSize.x === 0 || viewportSize.y === 0) {
25
+ return Vec2.of(640, 480);
26
+ }
27
+ return viewportSize;
28
+ }
29
+ clear() {
30
+ this.clearedCount++;
31
+ this.renderedPathCount = 0;
32
+ this.pointBuffer = [];
33
+ this.lastText = null;
34
+ this.lastImage = null;
35
+ // Ensure all objects finished rendering
36
+ if (this.objectNestingLevel > 0) {
37
+ throw new Error(`Within an object while clearing! Nesting level: ${this.objectNestingLevel}`);
38
+ }
39
+ }
40
+ beginPath(startPoint) {
41
+ this.lastPoint = startPoint;
42
+ this.pointBuffer.push(startPoint);
43
+ }
44
+ endPath(style) {
45
+ this.renderedPathCount++;
46
+ this.lastFillStyle = style;
47
+ }
48
+ lineTo(point) {
49
+ point = this.canvasToScreen(point);
50
+ this.lastPoint = point;
51
+ this.pointBuffer.push(point);
52
+ }
53
+ moveTo(point) {
54
+ point = this.canvasToScreen(point);
55
+ this.lastPoint = point;
56
+ this.pointBuffer.push(point);
57
+ }
58
+ traceCubicBezierCurve(p1, p2, p3) {
59
+ p1 = this.canvasToScreen(p1);
60
+ p2 = this.canvasToScreen(p2);
61
+ p3 = this.canvasToScreen(p3);
62
+ this.lastPoint = p3;
63
+ this.pointBuffer.push(p1, p2, p3);
64
+ }
65
+ traceQuadraticBezierCurve(controlPoint, endPoint) {
66
+ controlPoint = this.canvasToScreen(controlPoint);
67
+ endPoint = this.canvasToScreen(endPoint);
68
+ this.lastPoint = endPoint;
69
+ this.pointBuffer.push(controlPoint, endPoint);
70
+ }
71
+ drawPoints(..._points) {
72
+ // drawPoints is intended for debugging.
73
+ // As such, it is unlikely to be the target of automated tests.
74
+ }
75
+ drawText(text, _transform, _style) {
76
+ this.lastText = text;
77
+ }
78
+ drawImage(image) {
79
+ this.lastImage = image;
80
+ }
81
+ startObject(boundingBox, _clip) {
82
+ super.startObject(boundingBox);
83
+ this.objectNestingLevel += 1;
84
+ }
85
+ endObject() {
86
+ super.endObject();
87
+ this.objectNestingLevel -= 1;
88
+ }
89
+ isTooSmallToRender(_rect) {
90
+ return false;
91
+ }
92
+ canRenderFromWithoutDataLoss(other) {
93
+ return other instanceof DummyRenderer;
94
+ }
95
+ renderFromOtherOfSameType(transform, other) {
96
+ if (!(other instanceof DummyRenderer)) {
97
+ throw new Error(`${other} cannot be rendered onto ${this}`);
98
+ }
99
+ this.renderedPathCount += other.renderedPathCount;
100
+ this.lastFillStyle = other.lastFillStyle;
101
+ this.lastPoint = other.lastPoint;
102
+ this.pointBuffer.push(...other.pointBuffer.map(point => {
103
+ return transform.transformVec2(point);
104
+ }));
105
+ }
106
+ }
@@ -0,0 +1,57 @@
1
+ import { LoadSaveDataTable } from '../../components/AbstractComponent';
2
+ import Mat33 from '../../math/Mat33';
3
+ import Rect2 from '../../math/Rect2';
4
+ import { Point2, Vec2 } from '../../math/Vec2';
5
+ import Viewport from '../../Viewport';
6
+ import RenderingStyle from '../RenderingStyle';
7
+ import TextRenderingStyle from '../TextRenderingStyle';
8
+ import AbstractRenderer, { RenderableImage, RenderablePathSpec } from './AbstractRenderer';
9
+ export declare const renderedStylesheetId = "js-draw-style-sheet";
10
+ /**
11
+ * Renders onto an `SVGElement`.
12
+ *
13
+ * @see {@link Editor.toSVG}
14
+ */
15
+ export default class SVGRenderer extends AbstractRenderer {
16
+ private elem;
17
+ private sanitize;
18
+ private lastPathStyle;
19
+ private lastPathString;
20
+ private objectElems;
21
+ private overwrittenAttrs;
22
+ /**
23
+ * Creates a renderer that renders onto `elem`. If `sanitize`, don't render potentially untrusted data.
24
+ *
25
+ * `viewport` is used to determine the translation/rotation/scaling/output size of the rendered
26
+ * data.
27
+ */
28
+ constructor(elem: SVGSVGElement, viewport: Viewport, sanitize?: boolean);
29
+ private addStyleSheet;
30
+ setRootSVGAttribute(name: string, value: string | null): void;
31
+ displaySize(): Vec2;
32
+ clear(): void;
33
+ private addPathToSVG;
34
+ drawPath(pathSpec: RenderablePathSpec): void;
35
+ private transformFrom;
36
+ private textContainer;
37
+ private textContainerTransform;
38
+ private textParentStyle;
39
+ drawText(text: string, transform: Mat33, style: TextRenderingStyle): void;
40
+ drawImage(image: RenderableImage): void;
41
+ startObject(boundingBox: Rect2): void;
42
+ endObject(loaderData?: LoadSaveDataTable, elemClassNames?: string[]): void;
43
+ private unimplementedMessage;
44
+ protected beginPath(_startPoint: Point2): void;
45
+ protected endPath(_style: RenderingStyle): void;
46
+ protected lineTo(_point: Point2): void;
47
+ protected moveTo(_point: Point2): void;
48
+ protected traceCubicBezierCurve(_controlPoint1: Point2, _controlPoint2: Point2, _endPoint: Point2): void;
49
+ protected traceQuadraticBezierCurve(_controlPoint: Point2, _endPoint: Point2): void;
50
+ drawPoints(...points: Point2[]): void;
51
+ drawSVGElem(elem: SVGElement): void;
52
+ isTooSmallToRender(_rect: Rect2): boolean;
53
+ static fromViewport(viewport: Viewport, sanitize?: boolean): {
54
+ element: SVGSVGElement;
55
+ renderer: SVGRenderer;
56
+ };
57
+ }