js-draw 1.21.3 → 1.23.1
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +104 -76
- package/build-config.json +2 -2
- package/dist/Editor.css +29 -16
- package/dist/bundle.js +2 -2
- package/dist/bundledStyles.js +1 -1
- package/dist/cjs/Editor.d.ts +1 -3
- package/dist/cjs/Editor.js +38 -26
- package/dist/cjs/EventDispatcher.js +1 -1
- package/dist/cjs/Pointer.js +3 -3
- package/dist/cjs/SVGLoader/SVGLoader.js +15 -6
- package/dist/cjs/UndoRedoHistory.js +1 -1
- package/dist/cjs/Viewport.d.ts +1 -1
- package/dist/cjs/Viewport.js +5 -3
- package/dist/cjs/commands/Command.js +7 -5
- package/dist/cjs/commands/Duplicate.js +2 -2
- package/dist/cjs/commands/Erase.js +3 -4
- package/dist/cjs/commands/invertCommand.js +4 -4
- package/dist/cjs/commands/lib.d.ts +1 -1
- package/dist/cjs/commands/uniteCommands.js +4 -4
- package/dist/cjs/components/AbstractComponent.d.ts +2 -2
- package/dist/cjs/components/AbstractComponent.js +4 -4
- package/dist/cjs/components/BackgroundComponent.js +8 -6
- package/dist/cjs/components/ImageComponent.js +12 -5
- package/dist/cjs/components/RestylableComponent.js +1 -1
- package/dist/cjs/components/SVGGlobalAttributesObject.js +1 -2
- package/dist/cjs/components/Stroke.js +37 -24
- package/dist/cjs/components/TextComponent.js +13 -10
- package/dist/cjs/components/UnknownSVGObject.js +2 -3
- package/dist/cjs/components/builders/ArrowBuilder.d.ts +6 -0
- package/dist/cjs/components/builders/ArrowBuilder.js +9 -3
- package/dist/cjs/components/builders/CircleBuilder.d.ts +6 -0
- package/dist/cjs/components/builders/CircleBuilder.js +11 -4
- package/dist/cjs/components/builders/FreehandLineBuilder.d.ts +6 -0
- package/dist/cjs/components/builders/FreehandLineBuilder.js +10 -4
- package/dist/cjs/components/builders/LineBuilder.d.ts +6 -0
- package/dist/cjs/components/builders/LineBuilder.js +8 -4
- package/dist/cjs/components/builders/PolylineBuilder.d.ts +4 -1
- package/dist/cjs/components/builders/PolylineBuilder.js +9 -5
- package/dist/cjs/components/builders/PressureSensitiveFreehandLineBuilder.js +16 -10
- package/dist/cjs/components/builders/RectangleBuilder.d.ts +12 -0
- package/dist/cjs/components/builders/RectangleBuilder.js +17 -3
- package/dist/cjs/components/builders/autocorrect/makeShapeFitAutocorrect.js +5 -8
- package/dist/cjs/components/builders/autocorrect/makeSnapToGridAutocorrect.js +1 -1
- package/dist/cjs/components/builders/lib.d.ts +7 -0
- package/dist/cjs/components/builders/lib.js +18 -0
- package/dist/cjs/components/lib.d.ts +1 -4
- package/dist/cjs/components/lib.js +2 -9
- package/dist/cjs/components/util/StrokeSmoother.js +5 -6
- package/dist/cjs/dialogs/makeAboutDialog.js +1 -1
- package/dist/cjs/dialogs/makeMessageDialog.js +2 -2
- package/dist/cjs/image/EditorImage.d.ts +30 -7
- package/dist/cjs/image/EditorImage.js +43 -22
- package/dist/cjs/image/export/editorImageToSVG.js +1 -1
- package/dist/cjs/inputEvents.js +3 -3
- package/dist/cjs/lib.d.ts +2 -2
- package/dist/cjs/localizations/de.js +2 -2
- package/dist/cjs/localizations/es.js +7 -3
- package/dist/cjs/rendering/Display.js +7 -3
- package/dist/cjs/rendering/RenderablePathSpec.js +26 -11
- package/dist/cjs/rendering/RenderingStyle.js +22 -15
- package/dist/cjs/rendering/TextRenderingStyle.js +1 -1
- package/dist/cjs/rendering/caching/CacheRecord.js +1 -1
- package/dist/cjs/rendering/caching/CacheRecordManager.js +1 -1
- package/dist/cjs/rendering/caching/RenderingCache.js +1 -1
- package/dist/cjs/rendering/caching/RenderingCacheNode.js +26 -15
- package/dist/cjs/rendering/caching/testUtils.js +2 -2
- package/dist/cjs/rendering/renderers/AbstractRenderer.js +3 -1
- package/dist/cjs/rendering/renderers/CanvasRenderer.d.ts +2 -25
- package/dist/cjs/rendering/renderers/CanvasRenderer.js +6 -28
- package/dist/cjs/rendering/renderers/DummyRenderer.js +1 -1
- package/dist/cjs/rendering/renderers/SVGRenderer.js +39 -21
- package/dist/cjs/rendering/renderers/TextOnlyRenderer.js +13 -15
- package/dist/cjs/shortcuts/KeyBinding.js +6 -12
- package/dist/cjs/shortcuts/KeyboardShortcutManager.js +2 -2
- package/dist/cjs/testing/createEditor.js +6 -1
- package/dist/cjs/testing/findNodeWithText.d.ts +4 -1
- package/dist/cjs/testing/findNodeWithText.js +12 -3
- package/dist/cjs/testing/getUniquePointerId.js +1 -1
- package/dist/cjs/testing/sendHtmlSwipe.js +7 -3
- package/dist/cjs/testing/sendPenEvent.js +1 -3
- package/dist/cjs/testing/sendTouchEvent.js +1 -4
- package/dist/cjs/testing/startPinchGesture.js +3 -1
- package/dist/cjs/toolbar/AbstractToolbar.d.ts +19 -0
- package/dist/cjs/toolbar/AbstractToolbar.js +26 -11
- package/dist/cjs/toolbar/EdgeToolbar.js +11 -15
- package/dist/cjs/toolbar/IconProvider.d.ts +5 -1
- package/dist/cjs/toolbar/IconProvider.js +117 -149
- package/dist/cjs/toolbar/localization.js +5 -5
- package/dist/cjs/toolbar/utils/HelpDisplay.js +8 -6
- package/dist/cjs/toolbar/utils/makeDraggable.js +4 -7
- package/dist/cjs/toolbar/widgets/BaseToolWidget.js +3 -2
- package/dist/cjs/toolbar/widgets/BaseWidget.d.ts +1 -1
- package/dist/cjs/toolbar/widgets/BaseWidget.js +8 -8
- package/dist/cjs/toolbar/widgets/DocumentPropertiesWidget.js +2 -2
- package/dist/cjs/toolbar/widgets/EraserToolWidget.js +5 -3
- package/dist/cjs/toolbar/widgets/HandToolWidget.js +8 -6
- package/dist/cjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.js +9 -10
- package/dist/cjs/toolbar/widgets/PenToolWidget.js +22 -13
- package/dist/cjs/toolbar/widgets/SelectionToolWidget.js +2 -2
- package/dist/cjs/toolbar/widgets/TextToolWidget.js +5 -5
- package/dist/cjs/toolbar/widgets/components/makeFileInput.js +7 -7
- package/dist/cjs/toolbar/widgets/components/makeGridSelector.js +5 -5
- package/dist/cjs/toolbar/widgets/components/makeSnappedList.js +9 -5
- package/dist/cjs/toolbar/widgets/keybindings.js +2 -2
- package/dist/cjs/toolbar/widgets/layout/DropdownLayoutManager.js +6 -6
- package/dist/cjs/tools/BaseTool.js +5 -3
- package/dist/cjs/tools/Eraser.js +25 -20
- package/dist/cjs/tools/FindTool.js +2 -2
- package/dist/cjs/tools/InputFilter/ContextMenuRecognizer.js +1 -3
- package/dist/cjs/tools/InputFilter/InputMapper.js +1 -1
- package/dist/cjs/tools/InputFilter/InputPipeline.js +1 -1
- package/dist/cjs/tools/InputFilter/InputStabilizer.js +12 -5
- package/dist/cjs/tools/InputFilter/StrokeKeyboardControl.js +7 -4
- package/dist/cjs/tools/PanZoom.d.ts +1 -1
- package/dist/cjs/tools/PanZoom.js +18 -13
- package/dist/cjs/tools/PasteHandler.js +8 -2
- package/dist/cjs/tools/Pen.d.ts +13 -0
- package/dist/cjs/tools/Pen.js +30 -9
- package/dist/cjs/tools/ScrollbarTool.js +8 -7
- package/dist/cjs/tools/SelectionTool/Selection.js +16 -12
- package/dist/cjs/tools/SelectionTool/SelectionHandle.js +5 -2
- package/dist/cjs/tools/SelectionTool/SelectionMenuShortcut.js +3 -1
- package/dist/cjs/tools/SelectionTool/SelectionTool.js +25 -16
- package/dist/cjs/tools/SelectionTool/ToPointerAutoscroller.js +1 -1
- package/dist/cjs/tools/SelectionTool/TransformMode.js +6 -7
- package/dist/cjs/tools/SelectionTool/util/makeClipboardErrorHandlers.js +23 -2
- package/dist/cjs/tools/SelectionTool/util/showSelectionContextMenu.js +29 -20
- package/dist/cjs/tools/SoundUITool.js +5 -3
- package/dist/cjs/tools/TextTool.js +8 -6
- package/dist/cjs/tools/ToolController.js +16 -10
- package/dist/cjs/tools/lib.d.ts +1 -0
- package/dist/cjs/tools/lib.js +3 -1
- package/dist/cjs/tools/localization.d.ts +2 -0
- package/dist/cjs/tools/localization.js +3 -1
- package/dist/cjs/tools/util/StationaryPenDetector.js +3 -3
- package/dist/cjs/tools/util/createMenuOverlay.js +2 -2
- package/dist/cjs/util/ClipboardHandler.d.ts +1 -1
- package/dist/cjs/util/ClipboardHandler.js +19 -18
- package/dist/cjs/util/ReactiveValue.js +16 -12
- package/dist/cjs/util/adjustEditorThemeForContrast.js +6 -2
- package/dist/cjs/util/cloneElementWithStyles.js +1 -1
- package/dist/cjs/util/createElement.d.ts +62 -0
- package/dist/cjs/util/createElement.js +53 -0
- package/dist/cjs/util/guessKeyCodeFromKey.js +1 -1
- package/dist/cjs/util/listenForKeyboardEventsFrom.js +8 -6
- package/dist/cjs/util/waitForAll.js +3 -3
- package/dist/cjs/util/waitForImageLoaded.js +3 -3
- package/dist/cjs/util/waitForTimeout.js +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/mjs/Editor.d.ts +1 -3
- package/dist/mjs/Editor.mjs +39 -27
- package/dist/mjs/EventDispatcher.mjs +1 -1
- package/dist/mjs/Pointer.mjs +3 -3
- package/dist/mjs/SVGLoader/SVGLoader.mjs +16 -7
- package/dist/mjs/UndoRedoHistory.mjs +1 -1
- package/dist/mjs/Viewport.d.ts +1 -1
- package/dist/mjs/Viewport.mjs +5 -3
- package/dist/mjs/commands/Command.mjs +7 -5
- package/dist/mjs/commands/Duplicate.mjs +2 -2
- package/dist/mjs/commands/Erase.mjs +3 -4
- package/dist/mjs/commands/invertCommand.mjs +4 -4
- package/dist/mjs/commands/lib.d.ts +1 -1
- package/dist/mjs/commands/lib.mjs +1 -1
- package/dist/mjs/commands/uniteCommands.mjs +4 -4
- package/dist/mjs/components/AbstractComponent.d.ts +2 -2
- package/dist/mjs/components/AbstractComponent.mjs +4 -4
- package/dist/mjs/components/BackgroundComponent.mjs +10 -8
- package/dist/mjs/components/ImageComponent.mjs +12 -5
- package/dist/mjs/components/RestylableComponent.mjs +2 -2
- package/dist/mjs/components/SVGGlobalAttributesObject.mjs +1 -2
- package/dist/mjs/components/Stroke.mjs +40 -27
- package/dist/mjs/components/TextComponent.mjs +15 -12
- package/dist/mjs/components/UnknownSVGObject.mjs +2 -3
- package/dist/mjs/components/builders/ArrowBuilder.d.ts +6 -0
- package/dist/mjs/components/builders/ArrowBuilder.mjs +9 -3
- package/dist/mjs/components/builders/CircleBuilder.d.ts +6 -0
- package/dist/mjs/components/builders/CircleBuilder.mjs +11 -4
- package/dist/mjs/components/builders/FreehandLineBuilder.d.ts +6 -0
- package/dist/mjs/components/builders/FreehandLineBuilder.mjs +10 -4
- package/dist/mjs/components/builders/LineBuilder.d.ts +6 -0
- package/dist/mjs/components/builders/LineBuilder.mjs +8 -4
- package/dist/mjs/components/builders/PolylineBuilder.d.ts +4 -1
- package/dist/mjs/components/builders/PolylineBuilder.mjs +10 -6
- package/dist/mjs/components/builders/PressureSensitiveFreehandLineBuilder.mjs +17 -11
- package/dist/mjs/components/builders/RectangleBuilder.d.ts +12 -0
- package/dist/mjs/components/builders/RectangleBuilder.mjs +17 -3
- package/dist/mjs/components/builders/autocorrect/makeShapeFitAutocorrect.mjs +5 -8
- package/dist/mjs/components/builders/autocorrect/makeSnapToGridAutocorrect.mjs +1 -1
- package/dist/mjs/components/builders/lib.d.ts +7 -0
- package/dist/mjs/components/builders/lib.mjs +7 -0
- package/dist/mjs/components/lib.d.ts +1 -4
- package/dist/mjs/components/lib.mjs +2 -5
- package/dist/mjs/components/util/StrokeSmoother.mjs +5 -6
- package/dist/mjs/dialogs/makeAboutDialog.mjs +1 -1
- package/dist/mjs/dialogs/makeMessageDialog.mjs +2 -2
- package/dist/mjs/image/EditorImage.d.ts +30 -7
- package/dist/mjs/image/EditorImage.mjs +43 -22
- package/dist/mjs/image/export/editorImageToSVG.mjs +1 -1
- package/dist/mjs/inputEvents.mjs +3 -3
- package/dist/mjs/lib.d.ts +2 -2
- package/dist/mjs/lib.mjs +2 -2
- package/dist/mjs/localization.mjs +2 -2
- package/dist/mjs/localizations/de.mjs +2 -2
- package/dist/mjs/localizations/es.mjs +7 -3
- package/dist/mjs/rendering/Display.mjs +7 -3
- package/dist/mjs/rendering/RenderablePathSpec.mjs +26 -11
- package/dist/mjs/rendering/RenderingStyle.mjs +22 -15
- package/dist/mjs/rendering/TextRenderingStyle.mjs +1 -1
- package/dist/mjs/rendering/caching/CacheRecord.mjs +1 -1
- package/dist/mjs/rendering/caching/CacheRecordManager.mjs +1 -1
- package/dist/mjs/rendering/caching/RenderingCache.mjs +1 -1
- package/dist/mjs/rendering/caching/RenderingCacheNode.mjs +26 -15
- package/dist/mjs/rendering/caching/testUtils.mjs +2 -2
- package/dist/mjs/rendering/renderers/AbstractRenderer.mjs +3 -1
- package/dist/mjs/rendering/renderers/CanvasRenderer.d.ts +2 -25
- package/dist/mjs/rendering/renderers/CanvasRenderer.mjs +6 -28
- package/dist/mjs/rendering/renderers/DummyRenderer.mjs +1 -1
- package/dist/mjs/rendering/renderers/SVGRenderer.mjs +40 -22
- package/dist/mjs/rendering/renderers/TextOnlyRenderer.mjs +13 -15
- package/dist/mjs/shortcuts/KeyBinding.mjs +6 -12
- package/dist/mjs/shortcuts/KeyboardShortcutManager.mjs +2 -2
- package/dist/mjs/testing/createEditor.mjs +6 -1
- package/dist/mjs/testing/findNodeWithText.d.ts +4 -1
- package/dist/mjs/testing/findNodeWithText.mjs +12 -3
- package/dist/mjs/testing/getUniquePointerId.mjs +1 -1
- package/dist/mjs/testing/sendHtmlSwipe.mjs +7 -3
- package/dist/mjs/testing/sendPenEvent.mjs +1 -3
- package/dist/mjs/testing/sendTouchEvent.mjs +1 -4
- package/dist/mjs/testing/startPinchGesture.mjs +3 -1
- package/dist/mjs/toolbar/AbstractToolbar.d.ts +19 -0
- package/dist/mjs/toolbar/AbstractToolbar.mjs +26 -11
- package/dist/mjs/toolbar/EdgeToolbar.mjs +11 -15
- package/dist/mjs/toolbar/IconProvider.d.ts +5 -1
- package/dist/mjs/toolbar/IconProvider.mjs +117 -149
- package/dist/mjs/toolbar/localization.mjs +5 -5
- package/dist/mjs/toolbar/utils/HelpDisplay.mjs +8 -6
- package/dist/mjs/toolbar/utils/makeDraggable.mjs +4 -7
- package/dist/mjs/toolbar/widgets/BaseToolWidget.mjs +3 -2
- package/dist/mjs/toolbar/widgets/BaseWidget.d.ts +1 -1
- package/dist/mjs/toolbar/widgets/BaseWidget.mjs +9 -9
- package/dist/mjs/toolbar/widgets/DocumentPropertiesWidget.mjs +2 -2
- package/dist/mjs/toolbar/widgets/EraserToolWidget.mjs +5 -3
- package/dist/mjs/toolbar/widgets/HandToolWidget.mjs +8 -6
- package/dist/mjs/toolbar/widgets/InsertImageWidget/InsertImageWidget.mjs +9 -10
- package/dist/mjs/toolbar/widgets/PenToolWidget.mjs +23 -14
- package/dist/mjs/toolbar/widgets/SelectionToolWidget.mjs +2 -2
- package/dist/mjs/toolbar/widgets/TextToolWidget.mjs +5 -5
- package/dist/mjs/toolbar/widgets/components/makeFileInput.mjs +7 -7
- package/dist/mjs/toolbar/widgets/components/makeGridSelector.mjs +5 -5
- package/dist/mjs/toolbar/widgets/components/makeSnappedList.mjs +9 -5
- package/dist/mjs/toolbar/widgets/keybindings.mjs +2 -2
- package/dist/mjs/toolbar/widgets/layout/DropdownLayoutManager.mjs +6 -6
- package/dist/mjs/tools/BaseTool.mjs +6 -4
- package/dist/mjs/tools/Eraser.mjs +25 -20
- package/dist/mjs/tools/FindTool.mjs +2 -2
- package/dist/mjs/tools/InputFilter/ContextMenuRecognizer.mjs +2 -4
- package/dist/mjs/tools/InputFilter/InputMapper.mjs +1 -1
- package/dist/mjs/tools/InputFilter/InputPipeline.mjs +1 -1
- package/dist/mjs/tools/InputFilter/InputStabilizer.mjs +13 -6
- package/dist/mjs/tools/InputFilter/StrokeKeyboardControl.mjs +7 -4
- package/dist/mjs/tools/PanZoom.d.ts +1 -1
- package/dist/mjs/tools/PanZoom.mjs +19 -14
- package/dist/mjs/tools/PasteHandler.mjs +8 -2
- package/dist/mjs/tools/Pen.d.ts +13 -0
- package/dist/mjs/tools/Pen.mjs +31 -10
- package/dist/mjs/tools/ScrollbarTool.mjs +8 -7
- package/dist/mjs/tools/SelectionTool/Selection.mjs +16 -12
- package/dist/mjs/tools/SelectionTool/SelectionHandle.mjs +5 -2
- package/dist/mjs/tools/SelectionTool/SelectionMenuShortcut.mjs +3 -1
- package/dist/mjs/tools/SelectionTool/SelectionTool.mjs +26 -17
- package/dist/mjs/tools/SelectionTool/ToPointerAutoscroller.mjs +1 -1
- package/dist/mjs/tools/SelectionTool/TransformMode.mjs +6 -7
- package/dist/mjs/tools/SelectionTool/util/makeClipboardErrorHandlers.mjs +23 -2
- package/dist/mjs/tools/SelectionTool/util/showSelectionContextMenu.mjs +29 -20
- package/dist/mjs/tools/SoundUITool.mjs +5 -3
- package/dist/mjs/tools/TextTool.mjs +8 -6
- package/dist/mjs/tools/ToolController.mjs +16 -10
- package/dist/mjs/tools/lib.d.ts +1 -0
- package/dist/mjs/tools/lib.mjs +1 -0
- package/dist/mjs/tools/localization.d.ts +2 -0
- package/dist/mjs/tools/localization.mjs +3 -1
- package/dist/mjs/tools/util/StationaryPenDetector.mjs +3 -3
- package/dist/mjs/tools/util/createMenuOverlay.mjs +2 -2
- package/dist/mjs/util/ClipboardHandler.d.ts +1 -1
- package/dist/mjs/util/ClipboardHandler.mjs +19 -18
- package/dist/mjs/util/ReactiveValue.mjs +16 -12
- package/dist/mjs/util/adjustEditorThemeForContrast.mjs +6 -2
- package/dist/mjs/util/cloneElementWithStyles.mjs +1 -1
- package/dist/mjs/util/createElement.d.ts +62 -0
- package/dist/mjs/util/createElement.mjs +47 -0
- package/dist/mjs/util/guessKeyCodeFromKey.mjs +1 -1
- package/dist/mjs/util/listenForKeyboardEventsFrom.mjs +8 -6
- package/dist/mjs/util/waitForAll.mjs +3 -3
- package/dist/mjs/util/waitForImageLoaded.mjs +3 -3
- package/dist/mjs/util/waitForTimeout.mjs +1 -1
- package/dist/mjs/version.mjs +1 -1
- package/package.json +88 -88
- package/src/Coloris.css +6 -6
- package/src/Editor.scss +7 -5
- package/src/dialogs/dialogs.scss +3 -4
- package/src/dialogs/makeAboutDialog.scss +2 -2
- package/src/dialogs/makeMessageDialog.scss +11 -7
- package/src/styles.js +1 -1
- package/src/toolbar/AbstractToolbar.scss +20 -12
- package/src/toolbar/DropdownToolbar.scss +5 -4
- package/src/toolbar/EdgeToolbar.scss +65 -31
- package/src/toolbar/toolbar.scss +5 -5
- package/src/toolbar/utils/HelpDisplay.scss +48 -25
- package/src/toolbar/utils/labelVisibleOnHover.scss +39 -16
- package/src/toolbar/widgets/DocumentPropertiesWidget.scss +0 -1
- package/src/toolbar/widgets/HandToolWidget.scss +0 -1
- package/src/toolbar/widgets/InsertImageWidget/InsertImageWidget.scss +2 -3
- package/src/toolbar/widgets/OverflowWidget.css +1 -2
- package/src/toolbar/widgets/PenToolWidget.scss +0 -2
- package/src/toolbar/widgets/SelectionToolWidget.scss +1 -2
- package/src/toolbar/widgets/components/components.scss +6 -6
- package/src/toolbar/widgets/components/makeColorInput.scss +0 -2
- package/src/toolbar/widgets/components/makeFileInput.scss +5 -7
- package/src/toolbar/widgets/components/makeGridSelector.scss +6 -9
- package/src/toolbar/widgets/components/makeSnappedList.scss +3 -4
- package/src/toolbar/widgets/components/makeThicknessSlider.scss +1 -2
- package/src/toolbar/widgets/widgets.scss +7 -7
- package/src/tools/FindTool.css +1 -2
- package/src/tools/ScrollbarTool.scss +9 -5
- package/src/tools/SelectionTool/SelectionTool.scss +15 -7
- package/src/tools/SelectionTool/util/makeClipboardErrorHandlers.scss +1 -2
- package/src/tools/SoundUITool.scss +4 -4
- package/src/tools/tools.scss +5 -6
- package/src/tools/util/createMenuOverlay.scss +10 -4
- package/tsconfig.json +1 -3
- package/typedoc.json +1 -1
@@ -45,7 +45,7 @@ export const editorImageToSVGSync = (image, options) => {
|
|
45
45
|
}, options);
|
46
46
|
};
|
47
47
|
export const editorImageToSVGAsync = (image, preRenderComponent, options) => {
|
48
|
-
return new Promise(resolve => {
|
48
|
+
return new Promise((resolve) => {
|
49
49
|
toSVGInternal(image, async (renderer, onComplete) => {
|
50
50
|
await image.renderAllAsync(renderer, preRenderComponent);
|
51
51
|
const result = onComplete();
|
package/dist/mjs/inputEvents.mjs
CHANGED
@@ -29,7 +29,7 @@ export const keyPressEventFromHTMLEvent = (event) => {
|
|
29
29
|
return keyEventFromHTMLEvent(InputEvtType.KeyPressEvent, event);
|
30
30
|
};
|
31
31
|
export const isPointerEvt = (event) => {
|
32
|
-
return event.kind === InputEvtType.PointerDownEvt
|
33
|
-
|
34
|
-
|
32
|
+
return (event.kind === InputEvtType.PointerDownEvt ||
|
33
|
+
event.kind === InputEvtType.PointerMoveEvt ||
|
34
|
+
event.kind === InputEvtType.PointerUpEvt);
|
35
35
|
};
|
package/dist/mjs/lib.d.ts
CHANGED
@@ -18,7 +18,7 @@ import Editor, { EditorSettings } from './Editor';
|
|
18
18
|
export * from './image/lib';
|
19
19
|
export * from './types';
|
20
20
|
export * from './inputEvents';
|
21
|
-
export { default as getLocalizationTable, matchingLocalizationTable } from './localizations/getLocalizationTable';
|
21
|
+
export { default as getLocalizationTable, matchingLocalizationTable, } from './localizations/getLocalizationTable';
|
22
22
|
export * from './localization';
|
23
23
|
export { default as SVGLoader } from './SVGLoader/SVGLoader';
|
24
24
|
export { default as Viewport } from './Viewport';
|
@@ -36,7 +36,7 @@ export { default as UndoRedoHistory } from './UndoRedoHistory';
|
|
36
36
|
export * from './util/lib';
|
37
37
|
export { default as __js_draw__version } from './version';
|
38
38
|
import AbstractToolbar from './toolbar/AbstractToolbar';
|
39
|
-
export { Editor, EditorSettings, AbstractToolbar
|
39
|
+
export { Editor, EditorSettings, AbstractToolbar };
|
40
40
|
/**
|
41
41
|
* Using the HTMLToolbar alias is deprecated. Use
|
42
42
|
* `AbstractToolbar` instead.
|
package/dist/mjs/lib.mjs
CHANGED
@@ -18,7 +18,7 @@ import Editor from './Editor.mjs';
|
|
18
18
|
export * from './image/lib.mjs';
|
19
19
|
export * from './types.mjs';
|
20
20
|
export * from './inputEvents.mjs';
|
21
|
-
export { default as getLocalizationTable, matchingLocalizationTable } from './localizations/getLocalizationTable.mjs';
|
21
|
+
export { default as getLocalizationTable, matchingLocalizationTable, } from './localizations/getLocalizationTable.mjs';
|
22
22
|
export * from './localization.mjs';
|
23
23
|
export { default as SVGLoader } from './SVGLoader/SVGLoader.mjs';
|
24
24
|
export { default as Viewport } from './Viewport.mjs';
|
@@ -37,7 +37,7 @@ export * from './util/lib.mjs';
|
|
37
37
|
// @internal
|
38
38
|
export { default as __js_draw__version } from './version.mjs';
|
39
39
|
import AbstractToolbar from './toolbar/AbstractToolbar.mjs';
|
40
|
-
export { Editor, AbstractToolbar
|
40
|
+
export { Editor, AbstractToolbar };
|
41
41
|
/**
|
42
42
|
* Using the HTMLToolbar alias is deprecated. Use
|
43
43
|
* `AbstractToolbar` instead.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { defaultCommandLocalization } from './commands/localization.mjs';
|
2
|
-
import { defaultComponentLocalization } from './components/localization.mjs';
|
3
|
-
import { defaultTextRendererLocalization } from './rendering/localization.mjs';
|
2
|
+
import { defaultComponentLocalization, } from './components/localization.mjs';
|
3
|
+
import { defaultTextRendererLocalization, } from './rendering/localization.mjs';
|
4
4
|
import { defaultToolbarLocalization } from './toolbar/localization.mjs';
|
5
5
|
import { defaultToolLocalization } from './tools/localization.mjs';
|
6
6
|
export const defaultEditorLocalization = {
|
@@ -89,11 +89,11 @@ const localization = {
|
|
89
89
|
textNodeCount: (count) => `Es gibt ${count} sichtbare Text-Knotenpunkte.`,
|
90
90
|
textNode: (content) => `Text: ${content}`,
|
91
91
|
imageNodeCount: (nodeCount) => `Es gibt ${nodeCount} sichtbare Bild-Knoten.`,
|
92
|
-
imageNode: label => `Bild: ${label}`,
|
92
|
+
imageNode: (label) => `Bild: ${label}`,
|
93
93
|
unlabeledImageNode: 'Bild ohne Label',
|
94
94
|
rerenderAsText: 'Als Text darstellen',
|
95
95
|
accessibilityInputInstructions: 'Drücke ‚t‘, um den Inhalt des Ansichtsfensters als Text zu lesen. Verwende die Pfeiltasten, um die Ansicht zu verschieben, und klicke und ziehe, um Striche zu zeichnen. Drücke ‚w‘ zum Vergrößern und ‚s‘ zum Verkleinern der Ansicht.',
|
96
|
-
loading: percentage => `Laden ${percentage}%...`,
|
96
|
+
loading: (percentage) => `Laden ${percentage}%...`,
|
97
97
|
doneLoading: 'Laden fertig',
|
98
98
|
imageEditor: 'Bild-Editor',
|
99
99
|
undoAnnouncement: (commandDescription) => `${commandDescription} rückgängig gemacht`,
|
@@ -46,9 +46,13 @@ const localization = {
|
|
46
46
|
selectionMenu__duplicate: 'Duplicar',
|
47
47
|
closeSidebar: (toolName) => `Close sidebar for ${toolName}`,
|
48
48
|
dropdownShown: (toolName) => `Menú por ${toolName} es visible`,
|
49
|
-
dropdownHidden: (toolName) => {
|
49
|
+
dropdownHidden: (toolName) => {
|
50
|
+
return `Menú por ${toolName} fue ocultado`;
|
51
|
+
},
|
50
52
|
zoomLevel: (zoomPercent) => `Zoom: ${zoomPercent}%`,
|
51
|
-
colorChangedAnnouncement: (color) => {
|
53
|
+
colorChangedAnnouncement: (color) => {
|
54
|
+
return `Color fue cambiado a ${color}`;
|
55
|
+
},
|
52
56
|
imageSize: (size, units) => `Tamaño del imagen: ${size} ${units}`,
|
53
57
|
imageLoadError: (message) => `Error cargando imagen: ${message}`,
|
54
58
|
penTool: (penId) => `Lapiz ${penId}`,
|
@@ -65,7 +69,7 @@ const localization = {
|
|
65
69
|
closeDialog: 'Cerrar',
|
66
70
|
anyDevicePanning: 'Mover la pantalla con todo dispotivo',
|
67
71
|
copied: (count) => `${count} cosas fueron copiados`,
|
68
|
-
pasted: (count) => count === 1 ? 'Pegado' : `${count} cosas fueron pegados
|
72
|
+
pasted: (count) => (count === 1 ? 'Pegado' : `${count} cosas fueron pegados`),
|
69
73
|
toolEnabledAnnouncement: (toolName) => `${toolName} fue activado`,
|
70
74
|
toolDisabledAnnouncement: (toolName) => `${toolName} fue desactivado`,
|
71
75
|
resizeOutputCommand: (newSize) => `Tamaño de imagen fue cambiado a ${newSize.w}x${newSize.h}`,
|
@@ -79,7 +79,7 @@ export default class Display {
|
|
79
79
|
// Require about 105 strokes with 4 parts each to use the cache at all.
|
80
80
|
minProportionalRenderTimeToUseCache: 105 * 4,
|
81
81
|
});
|
82
|
-
this.editor.notifier.on(EditorEventType.DisplayResized, event => {
|
82
|
+
this.editor.notifier.on(EditorEventType.DisplayResized, (event) => {
|
83
83
|
if (event.kind !== EditorEventType.DisplayResized) {
|
84
84
|
throw new Error('Mismatched event.kinds!');
|
85
85
|
}
|
@@ -117,10 +117,14 @@ export default class Display {
|
|
117
117
|
}
|
118
118
|
this.resizeSurfacesCallback = () => {
|
119
119
|
const expectedWidth = (canvas) => {
|
120
|
-
|
120
|
+
const widthInPixels = Math.ceil(canvas.clientWidth * this.devicePixelRatio);
|
121
|
+
// Avoid setting the canvas width to zero -- doing so can cause errors when attempting
|
122
|
+
// to use the canvas:
|
123
|
+
return widthInPixels || canvas.width;
|
121
124
|
};
|
122
125
|
const expectedHeight = (canvas) => {
|
123
|
-
|
126
|
+
const heightInPixels = Math.ceil(canvas.clientHeight * this.devicePixelRatio);
|
127
|
+
return heightInPixels || canvas.height; // Zero-size canvases can cause errors.
|
124
128
|
};
|
125
129
|
const hasSizeMismatch = (canvas) => {
|
126
130
|
return expectedHeight(canvas) !== canvas.height || expectedWidth(canvas) !== canvas.width;
|
@@ -37,15 +37,18 @@ const pathIncluded = (renderablePath, path) => {
|
|
37
37
|
*
|
38
38
|
* @internal
|
39
39
|
*/
|
40
|
-
export const simplifyPathToFullScreenOrEmpty = (renderablePath, visibleRect, options = {
|
40
|
+
export const simplifyPathToFullScreenOrEmpty = (renderablePath, visibleRect, options = {
|
41
|
+
fastCheck: true,
|
42
|
+
expensiveCheck: true,
|
43
|
+
}) => {
|
41
44
|
const path = pathFromRenderable(renderablePath);
|
42
45
|
const strokeWidth = renderablePath.style.stroke?.width ?? 0;
|
43
46
|
const onlyStroked = strokeWidth > 0 && renderablePath.style.fill.a === 0;
|
44
47
|
const styledPathBBox = path.bbox.grownBy(strokeWidth);
|
45
48
|
// Are we close enough to the path that it fills the entire screen?
|
46
|
-
const isOnlyStrokedAndCouldFillScreen =
|
47
|
-
|
48
|
-
|
49
|
+
const isOnlyStrokedAndCouldFillScreen = onlyStroked &&
|
50
|
+
strokeWidth > visibleRect.maxDimension &&
|
51
|
+
styledPathBBox.containsRect(visibleRect);
|
49
52
|
if (options.fastCheck && isOnlyStrokedAndCouldFillScreen && renderablePath.style.stroke) {
|
50
53
|
const strokeRadius = strokeWidth / 2;
|
51
54
|
// Are we completely within the stroke?
|
@@ -55,7 +58,9 @@ export const simplifyPathToFullScreenOrEmpty = (renderablePath, visibleRect, opt
|
|
55
58
|
if (visibleRect.isWithinRadiusOf(strokeRadius, point)) {
|
56
59
|
return {
|
57
60
|
rectangle: visibleRect,
|
58
|
-
path: pathToRenderable(Path.fromRect(visibleRect), {
|
61
|
+
path: pathToRenderable(Path.fromRect(visibleRect), {
|
62
|
+
fill: renderablePath.style.stroke.color,
|
63
|
+
}),
|
59
64
|
fullScreen: true,
|
60
65
|
};
|
61
66
|
}
|
@@ -63,13 +68,16 @@ export const simplifyPathToFullScreenOrEmpty = (renderablePath, visibleRect, opt
|
|
63
68
|
}
|
64
69
|
// Try filtering again, but with slightly more expensive checks
|
65
70
|
if (options.expensiveCheck &&
|
66
|
-
isOnlyStrokedAndCouldFillScreen &&
|
67
|
-
|
71
|
+
isOnlyStrokedAndCouldFillScreen &&
|
72
|
+
renderablePath.style.stroke &&
|
73
|
+
strokeWidth > visibleRect.maxDimension * 3) {
|
68
74
|
const signedDist = path.signedDistance(visibleRect.center, strokeWidth / 2);
|
69
75
|
const margin = strokeWidth / 6;
|
70
76
|
if (signedDist < -visibleRect.maxDimension / 2 - margin) {
|
71
77
|
return {
|
72
|
-
path: pathToRenderable(Path.fromRect(visibleRect), {
|
78
|
+
path: pathToRenderable(Path.fromRect(visibleRect), {
|
79
|
+
fill: renderablePath.style.stroke.color,
|
80
|
+
}),
|
73
81
|
rectangle: visibleRect,
|
74
82
|
fullScreen: true,
|
75
83
|
};
|
@@ -92,12 +100,16 @@ export const visualEquivalent = (renderablePath, visibleRect) => {
|
|
92
100
|
const strokeWidth = renderablePath.style.stroke?.width ?? 0;
|
93
101
|
const onlyStroked = strokeWidth > 0 && renderablePath.style.fill.a === 0;
|
94
102
|
const styledPathBBox = path.bbox.grownBy(strokeWidth);
|
95
|
-
let rectangleSimplification = simplifyPathToFullScreenOrEmpty(renderablePath, visibleRect, {
|
103
|
+
let rectangleSimplification = simplifyPathToFullScreenOrEmpty(renderablePath, visibleRect, {
|
104
|
+
fastCheck: true,
|
105
|
+
expensiveCheck: false,
|
106
|
+
});
|
96
107
|
if (rectangleSimplification) {
|
97
108
|
return rectangleSimplification.path;
|
98
109
|
}
|
99
110
|
// Scale the expanded rect --- the visual equivalent is only close for huge strokes.
|
100
|
-
const expandedRect = visibleRect
|
111
|
+
const expandedRect = visibleRect
|
112
|
+
.grownBy(strokeWidth)
|
101
113
|
.transformedBoundingBox(Mat33.scaling2D(4, visibleRect.center));
|
102
114
|
// TODO: Handle simplifying very small paths.
|
103
115
|
if (expandedRect.containsRect(styledPathBBox)) {
|
@@ -138,7 +150,10 @@ export const visualEquivalent = (renderablePath, visibleRect) => {
|
|
138
150
|
}
|
139
151
|
const newPath = new Path(path.startPoint, parts);
|
140
152
|
const newStyle = renderablePath.style;
|
141
|
-
rectangleSimplification = simplifyPathToFullScreenOrEmpty(renderablePath, visibleRect, {
|
153
|
+
rectangleSimplification = simplifyPathToFullScreenOrEmpty(renderablePath, visibleRect, {
|
154
|
+
fastCheck: false,
|
155
|
+
expensiveCheck: true,
|
156
|
+
});
|
142
157
|
if (rectangleSimplification) {
|
143
158
|
return rectangleSimplification.path;
|
144
159
|
}
|
@@ -2,36 +2,43 @@ import { Color4 } from '@js-draw/math';
|
|
2
2
|
export const cloneStyle = (style) => {
|
3
3
|
return {
|
4
4
|
fill: style.fill,
|
5
|
-
stroke: style.stroke
|
6
|
-
|
7
|
-
|
5
|
+
stroke: style.stroke
|
6
|
+
? {
|
7
|
+
...style.stroke,
|
8
|
+
}
|
9
|
+
: undefined,
|
8
10
|
};
|
9
11
|
};
|
10
12
|
export const stylesEqual = (a, b) => {
|
11
|
-
const result = a === b ||
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
const result = a === b ||
|
14
|
+
(a.fill.eq(b.fill) &&
|
15
|
+
(a.stroke == undefined) === (b.stroke == undefined) &&
|
16
|
+
(a.stroke?.color?.eq(b.stroke?.color) ?? true) &&
|
17
|
+
a.stroke?.width === b.stroke?.width);
|
15
18
|
// Map undefined/null -> false
|
16
19
|
return result ?? false;
|
17
20
|
};
|
18
21
|
// Returns an object that can be converted to a JSON string with
|
19
22
|
// JSON.stringify.
|
20
23
|
export const styleToJSON = (style) => {
|
21
|
-
const stroke = !style.stroke
|
22
|
-
|
23
|
-
|
24
|
-
|
24
|
+
const stroke = !style.stroke
|
25
|
+
? undefined
|
26
|
+
: {
|
27
|
+
color: style.stroke.color.toHexString(),
|
28
|
+
width: style.stroke.width,
|
29
|
+
};
|
25
30
|
return {
|
26
31
|
fill: style.fill.toHexString(),
|
27
32
|
stroke,
|
28
33
|
};
|
29
34
|
};
|
30
35
|
export const styleFromJSON = (json) => {
|
31
|
-
const stroke = json.stroke
|
32
|
-
|
33
|
-
|
34
|
-
|
36
|
+
const stroke = json.stroke
|
37
|
+
? {
|
38
|
+
color: Color4.fromHex(json.stroke.color),
|
39
|
+
width: json.stroke.width,
|
40
|
+
}
|
41
|
+
: undefined;
|
35
42
|
return {
|
36
43
|
fill: Color4.fromHex(json.fill),
|
37
44
|
stroke,
|
@@ -10,7 +10,7 @@ export const textStyleFromJSON = (json) => {
|
|
10
10
|
if (typeof json === 'string') {
|
11
11
|
json = JSON.parse(json);
|
12
12
|
}
|
13
|
-
if (typeof
|
13
|
+
if (typeof json.fontFamily !== 'string') {
|
14
14
|
throw new Error('Serialized textStyle missing string fontFamily attribute!');
|
15
15
|
}
|
16
16
|
const style = {
|
@@ -15,7 +15,7 @@ export default class CacheRecord {
|
|
15
15
|
startRender() {
|
16
16
|
this.lastUsedCycle = this.cacheState.currentRenderingCycle;
|
17
17
|
if (!this.allocd) {
|
18
|
-
throw new Error(
|
18
|
+
throw new Error("Only alloc'd canvases can be rendered to");
|
19
19
|
}
|
20
20
|
return this.renderer;
|
21
21
|
}
|
@@ -28,7 +28,7 @@ export class CacheRecordManager {
|
|
28
28
|
lru.realloc(onDealloc);
|
29
29
|
lru.setRenderingRegion(drawTo);
|
30
30
|
if (this.cacheState.debugMode) {
|
31
|
-
console.log(
|
31
|
+
console.log("[Cache] Now re-alloc'd. Last used cycle: ", lru.getLastUsedCycle());
|
32
32
|
console.assert(lru['cacheState'] === this.cacheState, '[Cache] Unequal cache states! cacheState should be a shared object!');
|
33
33
|
}
|
34
34
|
return lru;
|
@@ -30,7 +30,7 @@ export default class RenderingCache {
|
|
30
30
|
this.rootNode = this.rootNode.generateParent();
|
31
31
|
}
|
32
32
|
this.rootNode = this.rootNode.smallestChildContaining(visibleRect) ?? this.rootNode;
|
33
|
-
const visibleLeaves = image.getLeavesIntersectingRegion(viewport.visibleRect, rect => screenRenderer.isTooSmallToRender(rect));
|
33
|
+
const visibleLeaves = image.getLeavesIntersectingRegion(viewport.visibleRect, (rect) => screenRenderer.isTooSmallToRender(rect));
|
34
34
|
let approxVisibleRenderTime = 0;
|
35
35
|
for (const leaf of visibleLeaves) {
|
36
36
|
approxVisibleRenderTime += leaf.getContent().getProportionalRenderingTime();
|
@@ -30,7 +30,7 @@ export default class RenderingCacheNode {
|
|
30
30
|
const middleChildIdx = (parent.instantiatedChildren.length - 1) / 2;
|
31
31
|
if (!parent.instantiatedChildren[middleChildIdx].region.eq(this.region, checkTolerance)) {
|
32
32
|
console.error(parent.instantiatedChildren[middleChildIdx].region, '≠', this.region);
|
33
|
-
throw new Error(
|
33
|
+
throw new Error("Logic error: [this] is not contained within its parent's center child");
|
34
34
|
}
|
35
35
|
// Replace the middle child
|
36
36
|
parent.instantiatedChildren[middleChildIdx] = this;
|
@@ -40,7 +40,8 @@ export default class RenderingCacheNode {
|
|
40
40
|
// Generates children, if missing.
|
41
41
|
generateChildren() {
|
42
42
|
if (this.instantiatedChildren.length === 0) {
|
43
|
-
if (this.region.size.x / cacheDivisionSize === 0 ||
|
43
|
+
if (this.region.size.x / cacheDivisionSize === 0 ||
|
44
|
+
this.region.size.y / cacheDivisionSize === 0) {
|
44
45
|
console.warn('Cache element has zero size! Not generating children.');
|
45
46
|
return;
|
46
47
|
}
|
@@ -135,8 +136,7 @@ export default class RenderingCacheNode {
|
|
135
136
|
}
|
136
137
|
// Render all [items] within [viewport]
|
137
138
|
renderItems(screenRenderer, items, viewport) {
|
138
|
-
if (!viewport.visibleRect.intersects(this.region)
|
139
|
-
|| items.length === 0) {
|
139
|
+
if (!viewport.visibleRect.intersects(this.region) || items.length === 0) {
|
140
140
|
return;
|
141
141
|
}
|
142
142
|
// Divide [items] until nodes are smaller than this, or are leaves.
|
@@ -165,13 +165,15 @@ export default class RenderingCacheNode {
|
|
165
165
|
return;
|
166
166
|
}
|
167
167
|
if (this.cacheState.debugMode) {
|
168
|
-
screenRenderer.drawRect(this.region, viewport.getSizeOfPixelOnCanvas(), {
|
168
|
+
screenRenderer.drawRect(this.region, viewport.getSizeOfPixelOnCanvas(), {
|
169
|
+
fill: Color4.yellow,
|
170
|
+
});
|
169
171
|
}
|
170
172
|
// Could we render direclty from [this] or do we need to recurse?
|
171
173
|
const couldRender = this.renderingWouldBeHighEnoughResolution(viewport);
|
172
174
|
if (!couldRender) {
|
173
175
|
for (const child of this.getChildren()) {
|
174
|
-
child.renderItems(screenRenderer, items.filter(item => {
|
176
|
+
child.renderItems(screenRenderer, items.filter((item) => {
|
175
177
|
return item.getBBox().intersects(child.region);
|
176
178
|
}), viewport);
|
177
179
|
}
|
@@ -189,7 +191,7 @@ export default class RenderingCacheNode {
|
|
189
191
|
if (leavesByIds.length === 0) {
|
190
192
|
return;
|
191
193
|
}
|
192
|
-
const leafIds = leavesByIds.map(leaf => leaf.getId());
|
194
|
+
const leafIds = leavesByIds.map((leaf) => leaf.getId());
|
193
195
|
let thisRenderer;
|
194
196
|
if (!this.renderingIsUpToDate(leafIds)) {
|
195
197
|
if (this.allChildrenCanRender(viewport, leavesByIds)) {
|
@@ -210,7 +212,9 @@ export default class RenderingCacheNode {
|
|
210
212
|
if (!this.cachedRenderer) {
|
211
213
|
this.cachedRenderer = this.cacheState.recordManager.allocCanvas(this.region, () => this.onRegionDealloc());
|
212
214
|
}
|
213
|
-
else if (leavesByIds.length > this.renderedIds.length &&
|
215
|
+
else if (leavesByIds.length > this.renderedIds.length &&
|
216
|
+
this.allRenderedIdsIn(leafIds) &&
|
217
|
+
this.renderedMaxZIndex !== null) {
|
214
218
|
// We often don't need to do a full re-render even if something's changed.
|
215
219
|
// Check whether we can just draw on top of the existing cache.
|
216
220
|
const newLeaves = [];
|
@@ -240,7 +244,9 @@ export default class RenderingCacheNode {
|
|
240
244
|
}
|
241
245
|
if (this.cacheState.debugMode) {
|
242
246
|
// Clay for adding new elements
|
243
|
-
screenRenderer.drawRect(this.region, 2 * viewport.getSizeOfPixelOnCanvas(), {
|
247
|
+
screenRenderer.drawRect(this.region, 2 * viewport.getSizeOfPixelOnCanvas(), {
|
248
|
+
fill: Color4.clay,
|
249
|
+
});
|
244
250
|
}
|
245
251
|
}
|
246
252
|
}
|
@@ -261,7 +267,9 @@ export default class RenderingCacheNode {
|
|
261
267
|
}
|
262
268
|
if (this.cacheState.debugMode) {
|
263
269
|
// Red for full rerender
|
264
|
-
screenRenderer.drawRect(this.region, 3 * viewport.getSizeOfPixelOnCanvas(), {
|
270
|
+
screenRenderer.drawRect(this.region, 3 * viewport.getSizeOfPixelOnCanvas(), {
|
271
|
+
fill: Color4.red,
|
272
|
+
});
|
265
273
|
}
|
266
274
|
}
|
267
275
|
this.renderedIds = leafIds;
|
@@ -280,7 +288,9 @@ export default class RenderingCacheNode {
|
|
280
288
|
screenRenderer.endObject();
|
281
289
|
if (this.cacheState.debugMode) {
|
282
290
|
// Green for no cache needed render
|
283
|
-
screenRenderer.drawRect(this.region, 2 * viewport.getSizeOfPixelOnCanvas(), {
|
291
|
+
screenRenderer.drawRect(this.region, 2 * viewport.getSizeOfPixelOnCanvas(), {
|
292
|
+
fill: Color4.green,
|
293
|
+
});
|
284
294
|
}
|
285
295
|
}
|
286
296
|
}
|
@@ -292,7 +302,7 @@ export default class RenderingCacheNode {
|
|
292
302
|
screenRenderer.renderFromOtherOfSameType(transformMat, thisRenderer);
|
293
303
|
}
|
294
304
|
// Can we clean up this' children? (Are they unused?)
|
295
|
-
if (this.instantiatedChildren.every(child => child.isEmpty())) {
|
305
|
+
if (this.instantiatedChildren.every((child) => child.isEmpty())) {
|
296
306
|
this.instantiatedChildren = [];
|
297
307
|
}
|
298
308
|
}
|
@@ -303,7 +313,7 @@ export default class RenderingCacheNode {
|
|
303
313
|
if (this.cachedRenderer !== null) {
|
304
314
|
return false;
|
305
315
|
}
|
306
|
-
return this.instantiatedChildren.every(child => child.isEmpty());
|
316
|
+
return this.instantiatedChildren.every((child) => child.isEmpty());
|
307
317
|
}
|
308
318
|
onRegionDealloc() {
|
309
319
|
this.cachedRenderer = null;
|
@@ -312,7 +322,8 @@ export default class RenderingCacheNode {
|
|
312
322
|
}
|
313
323
|
}
|
314
324
|
checkRep() {
|
315
|
-
if (this.instantiatedChildren.length !== cacheDivisionSize * cacheDivisionSize &&
|
325
|
+
if (this.instantiatedChildren.length !== cacheDivisionSize * cacheDivisionSize &&
|
326
|
+
this.instantiatedChildren.length !== 0) {
|
316
327
|
throw new Error(`Repcheck: Wrong number of children. Got ${this.instantiatedChildren.length}`);
|
317
328
|
}
|
318
329
|
if (this.renderedIds[1] !== undefined && this.renderedIds[0] >= this.renderedIds[1]) {
|
@@ -325,7 +336,7 @@ export default class RenderingCacheNode {
|
|
325
336
|
}
|
326
337
|
}
|
327
338
|
if (this.cachedRenderer && !this.cachedRenderer.isAllocd()) {
|
328
|
-
throw new Error(
|
339
|
+
throw new Error("this' cachedRenderer != null, but is dealloc'd");
|
329
340
|
}
|
330
341
|
}
|
331
342
|
}
|
@@ -19,10 +19,10 @@ export const createCache = (onRenderAlloc, cacheOptions) => {
|
|
19
19
|
maxScale: 2,
|
20
20
|
minProportionalRenderTimePerCache: 0,
|
21
21
|
minProportionalRenderTimeToUseCache: 0,
|
22
|
-
...cacheOptions
|
22
|
+
...cacheOptions,
|
23
23
|
});
|
24
24
|
return {
|
25
25
|
cache,
|
26
|
-
editor
|
26
|
+
editor,
|
27
27
|
};
|
28
28
|
};
|
@@ -20,7 +20,9 @@ export default class AbstractRenderer {
|
|
20
20
|
* methods on `Viewport`, because the viewport may not accurately reflect
|
21
21
|
* what is rendered.
|
22
22
|
*/
|
23
|
-
getViewport() {
|
23
|
+
getViewport() {
|
24
|
+
return this.viewport;
|
25
|
+
}
|
24
26
|
setDraftMode(_draftMode) { }
|
25
27
|
flushPath() {
|
26
28
|
if (!this.currentPaths) {
|
@@ -7,31 +7,8 @@ import RenderablePathSpec from '../RenderablePathSpec';
|
|
7
7
|
/**
|
8
8
|
* Renders onto a `CanvasRenderingContext2D`.
|
9
9
|
*
|
10
|
-
*
|
11
|
-
*
|
12
|
-
* import {Editor,CanvasRenderer} from 'js-draw';
|
13
|
-
*
|
14
|
-
* // Create an editor and load initial data -- don't add to the body (hidden editor).
|
15
|
-
* const editor = new Editor(document.createElement('div'));
|
16
|
-
* await editor.loadFromSVG('<svg><path d="m0,0 l100,5 l-50,60 l30,20 z" fill="green"/></svg>');
|
17
|
-
* ---visible---
|
18
|
-
* // Given some editor.
|
19
|
-
* // Set up the canvas to be drawn onto.
|
20
|
-
* const canvas = document.createElement('canvas');
|
21
|
-
* const ctx = canvas.getContext('2d');
|
22
|
-
*
|
23
|
-
* // Ensure that the canvas can fit the entire rendering
|
24
|
-
* const viewport = editor.image.getImportExportViewport();
|
25
|
-
* canvas.width = viewport.getScreenRectSize().x;
|
26
|
-
* canvas.height = viewport.getScreenRectSize().y;
|
27
|
-
*
|
28
|
-
* // Render editor.image onto the renderer
|
29
|
-
* const renderer = new CanvasRenderer(ctx, viewport);
|
30
|
-
* editor.image.render(renderer, viewport);
|
31
|
-
*
|
32
|
-
* // Add the rendered canvas to the document.
|
33
|
-
* document.body.appendChild(canvas);
|
34
|
-
* ```
|
10
|
+
* **Example**:
|
11
|
+
* [[include:doc-pages/inline-examples/canvas-renderer.md]]
|
35
12
|
*/
|
36
13
|
export default class CanvasRenderer extends AbstractRenderer {
|
37
14
|
private ctx;
|
@@ -5,31 +5,8 @@ import { visualEquivalent } from '../RenderablePathSpec.mjs';
|
|
5
5
|
/**
|
6
6
|
* Renders onto a `CanvasRenderingContext2D`.
|
7
7
|
*
|
8
|
-
*
|
9
|
-
*
|
10
|
-
* import {Editor,CanvasRenderer} from 'js-draw';
|
11
|
-
*
|
12
|
-
* // Create an editor and load initial data -- don't add to the body (hidden editor).
|
13
|
-
* const editor = new Editor(document.createElement('div'));
|
14
|
-
* await editor.loadFromSVG('<svg><path d="m0,0 l100,5 l-50,60 l30,20 z" fill="green"/></svg>');
|
15
|
-
* ---visible---
|
16
|
-
* // Given some editor.
|
17
|
-
* // Set up the canvas to be drawn onto.
|
18
|
-
* const canvas = document.createElement('canvas');
|
19
|
-
* const ctx = canvas.getContext('2d');
|
20
|
-
*
|
21
|
-
* // Ensure that the canvas can fit the entire rendering
|
22
|
-
* const viewport = editor.image.getImportExportViewport();
|
23
|
-
* canvas.width = viewport.getScreenRectSize().x;
|
24
|
-
* canvas.height = viewport.getScreenRectSize().y;
|
25
|
-
*
|
26
|
-
* // Render editor.image onto the renderer
|
27
|
-
* const renderer = new CanvasRenderer(ctx, viewport);
|
28
|
-
* editor.image.render(renderer, viewport);
|
29
|
-
*
|
30
|
-
* // Add the rendered canvas to the document.
|
31
|
-
* document.body.appendChild(canvas);
|
32
|
-
* ```
|
8
|
+
* **Example**:
|
9
|
+
* [[include:doc-pages/inline-examples/canvas-renderer.md]]
|
33
10
|
*/
|
34
11
|
export default class CanvasRenderer extends AbstractRenderer {
|
35
12
|
/**
|
@@ -131,8 +108,8 @@ export default class CanvasRenderer extends AbstractRenderer {
|
|
131
108
|
// Approximate the curve if small enough.
|
132
109
|
const delta1 = p2.minus(p1);
|
133
110
|
const delta2 = p3.minus(p2);
|
134
|
-
if (delta1.magnitudeSquared() < this.minSquareCurveApproxDist
|
135
|
-
|
111
|
+
if (delta1.magnitudeSquared() < this.minSquareCurveApproxDist &&
|
112
|
+
delta2.magnitudeSquared() < this.minSquareCurveApproxDist) {
|
136
113
|
this.ctx.lineTo(p3.x, p3.y);
|
137
114
|
}
|
138
115
|
else {
|
@@ -225,7 +202,8 @@ export default class CanvasRenderer extends AbstractRenderer {
|
|
225
202
|
}
|
226
203
|
}
|
227
204
|
// If exiting an object with a too-small-to-draw bounding box,
|
228
|
-
if (this.ignoreObjectsAboveLevel !== null &&
|
205
|
+
if (this.ignoreObjectsAboveLevel !== null &&
|
206
|
+
this.getNestingLevel() <= this.ignoreObjectsAboveLevel) {
|
229
207
|
this.ignoreObjectsAboveLevel = null;
|
230
208
|
this.ignoringObject = false;
|
231
209
|
}
|
@@ -99,7 +99,7 @@ export default class DummyRenderer extends AbstractRenderer {
|
|
99
99
|
this.renderedPathCount += other.renderedPathCount;
|
100
100
|
this.lastFillStyle = other.lastFillStyle;
|
101
101
|
this.lastPoint = other.lastPoint;
|
102
|
-
this.pointBuffer.push(...other.pointBuffer.map(point => {
|
102
|
+
this.pointBuffer.push(...other.pointBuffer.map((point) => {
|
103
103
|
return transform.transformVec2(point);
|
104
104
|
}));
|
105
105
|
}
|