js-draw 1.21.3 → 1.22.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +103 -75
- 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.js +36 -22
- package/dist/cjs/EventDispatcher.js +1 -1
- package/dist/cjs/Pointer.js +3 -3
- package/dist/cjs/SVGLoader/SVGLoader.js +13 -6
- package/dist/cjs/UndoRedoHistory.js +1 -1
- package/dist/cjs/Viewport.js +4 -2
- 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 +1 -1
- package/dist/cjs/components/AbstractComponent.js +3 -3
- 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.js +13 -15
- 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.js +4 -3
- package/dist/cjs/rendering/renderers/DummyRenderer.js +1 -1
- package/dist/cjs/rendering/renderers/SVGRenderer.js +37 -19
- 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.js +7 -11
- package/dist/cjs/toolbar/EdgeToolbar.js +11 -15
- package/dist/cjs/toolbar/IconProvider.js +5 -3
- package/dist/cjs/toolbar/localization.js +3 -3
- 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.js +7 -7
- 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 +17 -12
- package/dist/cjs/tools/PasteHandler.js +8 -2
- package/dist/cjs/tools/Pen.js +17 -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/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/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.mjs +37 -23
- package/dist/mjs/EventDispatcher.mjs +1 -1
- package/dist/mjs/Pointer.mjs +3 -3
- package/dist/mjs/SVGLoader/SVGLoader.mjs +14 -7
- package/dist/mjs/UndoRedoHistory.mjs +1 -1
- package/dist/mjs/Viewport.mjs +4 -2
- 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 +1 -1
- package/dist/mjs/components/AbstractComponent.mjs +3 -3
- 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.mjs +13 -15
- 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.mjs +4 -3
- package/dist/mjs/rendering/renderers/DummyRenderer.mjs +1 -1
- package/dist/mjs/rendering/renderers/SVGRenderer.mjs +38 -20
- 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.mjs +7 -11
- package/dist/mjs/toolbar/EdgeToolbar.mjs +11 -15
- package/dist/mjs/toolbar/IconProvider.mjs +5 -3
- package/dist/mjs/toolbar/localization.mjs +3 -3
- 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.mjs +8 -8
- 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 +18 -13
- package/dist/mjs/tools/PasteHandler.mjs +8 -2
- package/dist/mjs/tools/Pen.mjs +18 -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/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/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
@@ -9,6 +9,12 @@ const Stroke_1 = __importDefault(require("../Stroke"));
|
|
9
9
|
const Viewport_1 = __importDefault(require("../../Viewport"));
|
10
10
|
const StrokeSmoother_1 = require("../util/StrokeSmoother");
|
11
11
|
const makeShapeFitAutocorrect_1 = __importDefault(require("./autocorrect/makeShapeFitAutocorrect"));
|
12
|
+
/**
|
13
|
+
* Creates a stroke builder that draws freehand lines.
|
14
|
+
*
|
15
|
+
* Example:
|
16
|
+
* [[include:doc-pages/inline-examples/changing-pen-types.md]]
|
17
|
+
*/
|
12
18
|
exports.makeFreehandLineBuilder = (0, makeShapeFitAutocorrect_1.default)((initialPoint, viewport) => {
|
13
19
|
// Don't smooth if input is more than ± 3 pixels from the true curve, do smooth if
|
14
20
|
// less than ±1 px from the curve.
|
@@ -38,7 +44,7 @@ class FreehandLineBuilder {
|
|
38
44
|
stroke: {
|
39
45
|
color: this.startPoint.color,
|
40
46
|
width: this.roundDistance(this.averageWidth),
|
41
|
-
}
|
47
|
+
},
|
42
48
|
};
|
43
49
|
}
|
44
50
|
previewCurrentPath() {
|
@@ -135,7 +141,7 @@ class FreehandLineBuilder {
|
|
135
141
|
kind: math_1.PathCommandType.QuadraticBezierTo,
|
136
142
|
controlPoint: center.plus(math_1.Vec2.of(width, -width)),
|
137
143
|
endPoint: center.plus(math_1.Vec2.of(width, 0)),
|
138
|
-
}
|
144
|
+
},
|
139
145
|
];
|
140
146
|
}
|
141
147
|
const result = [];
|
@@ -163,8 +169,8 @@ class FreehandLineBuilder {
|
|
163
169
|
this.curveFitter.addPoint(newPoint);
|
164
170
|
this.widthAverageNumSamples++;
|
165
171
|
this.averageWidth =
|
166
|
-
this.averageWidth * (this.widthAverageNumSamples - 1) / this.widthAverageNumSamples
|
167
|
-
|
172
|
+
(this.averageWidth * (this.widthAverageNumSamples - 1)) / this.widthAverageNumSamples +
|
173
|
+
newPoint.width / this.widthAverageNumSamples;
|
168
174
|
}
|
169
175
|
}
|
170
176
|
exports.default = FreehandLineBuilder;
|
@@ -4,6 +4,12 @@ import { StrokeDataPoint } from '../../types';
|
|
4
4
|
import Viewport from '../../Viewport';
|
5
5
|
import AbstractComponent from '../AbstractComponent';
|
6
6
|
import { ComponentBuilder, ComponentBuilderFactory } from './types';
|
7
|
+
/**
|
8
|
+
* Creates a stroke builder that generates filled lines.
|
9
|
+
*
|
10
|
+
* Example:
|
11
|
+
* [[include:doc-pages/inline-examples/changing-pen-types.md]]
|
12
|
+
*/
|
7
13
|
export declare const makeLineBuilder: ComponentBuilderFactory;
|
8
14
|
export default class LineBuilder implements ComponentBuilder {
|
9
15
|
private readonly startPoint;
|
@@ -8,6 +8,12 @@ const math_1 = require("@js-draw/math");
|
|
8
8
|
const RenderablePathSpec_1 = require("../../rendering/RenderablePathSpec");
|
9
9
|
const Stroke_1 = __importDefault(require("../Stroke"));
|
10
10
|
const makeSnapToGridAutocorrect_1 = __importDefault(require("./autocorrect/makeSnapToGridAutocorrect"));
|
11
|
+
/**
|
12
|
+
* Creates a stroke builder that generates filled lines.
|
13
|
+
*
|
14
|
+
* Example:
|
15
|
+
* [[include:doc-pages/inline-examples/changing-pen-types.md]]
|
16
|
+
*/
|
11
17
|
exports.makeLineBuilder = (0, makeSnapToGridAutocorrect_1.default)((initialPoint, viewport) => {
|
12
18
|
return new LineBuilder(initialPoint, viewport);
|
13
19
|
});
|
@@ -48,10 +54,8 @@ class LineBuilder {
|
|
48
54
|
kind: math_1.PathCommandType.LineTo,
|
49
55
|
point: startPoint.minus(scaledStartNormal),
|
50
56
|
},
|
51
|
-
]).mapPoints(point => this.viewport.roundPoint(point));
|
52
|
-
const preview = new Stroke_1.default([
|
53
|
-
(0, RenderablePathSpec_1.pathToRenderable)(path, { fill: this.startPoint.color })
|
54
|
-
]);
|
57
|
+
]).mapPoints((point) => this.viewport.roundPoint(point));
|
58
|
+
const preview = new Stroke_1.default([(0, RenderablePathSpec_1.pathToRenderable)(path, { fill: this.startPoint.color })]);
|
55
59
|
return preview;
|
56
60
|
}
|
57
61
|
build() {
|
@@ -7,8 +7,11 @@ import { StrokeDataPoint } from '../../types';
|
|
7
7
|
import { ComponentBuilder, ComponentBuilderFactory } from './types';
|
8
8
|
import RenderingStyle from '../../rendering/RenderingStyle';
|
9
9
|
/**
|
10
|
-
* Creates
|
10
|
+
* Creates a freehand line builder that creates strokes from line segments
|
11
|
+
* rather than Bézier curves.
|
11
12
|
*
|
13
|
+
* Example:
|
14
|
+
* [[include:doc-pages/inline-examples/changing-pen-types.md]]
|
12
15
|
*/
|
13
16
|
export declare const makePolylineBuilder: ComponentBuilderFactory;
|
14
17
|
export default class PolylineBuilder implements ComponentBuilder {
|
@@ -9,8 +9,11 @@ const Stroke_1 = __importDefault(require("../Stroke"));
|
|
9
9
|
const Viewport_1 = __importDefault(require("../../Viewport"));
|
10
10
|
const makeShapeFitAutocorrect_1 = __importDefault(require("./autocorrect/makeShapeFitAutocorrect"));
|
11
11
|
/**
|
12
|
-
* Creates
|
12
|
+
* Creates a freehand line builder that creates strokes from line segments
|
13
|
+
* rather than Bézier curves.
|
13
14
|
*
|
15
|
+
* Example:
|
16
|
+
* [[include:doc-pages/inline-examples/changing-pen-types.md]]
|
14
17
|
*/
|
15
18
|
exports.makePolylineBuilder = (0, makeShapeFitAutocorrect_1.default)((initialPoint, viewport) => {
|
16
19
|
// Fit to a value slightly smaller than the pixel size. A larger value can
|
@@ -48,7 +51,7 @@ class PolylineBuilder {
|
|
48
51
|
stroke: {
|
49
52
|
color: this.startPoint.color,
|
50
53
|
width: this.roundDistance(this.averageWidth),
|
51
|
-
}
|
54
|
+
},
|
52
55
|
};
|
53
56
|
}
|
54
57
|
previewCurrentPath() {
|
@@ -102,12 +105,13 @@ class PolylineBuilder {
|
|
102
105
|
addPoint(newPoint) {
|
103
106
|
this.widthAverageNumSamples++;
|
104
107
|
this.averageWidth =
|
105
|
-
this.averageWidth * (this.widthAverageNumSamples - 1) / this.widthAverageNumSamples
|
106
|
-
|
108
|
+
(this.averageWidth * (this.widthAverageNumSamples - 1)) / this.widthAverageNumSamples +
|
109
|
+
newPoint.width / this.widthAverageNumSamples;
|
107
110
|
const roundedPoint = this.roundPoint(newPoint.pos);
|
108
111
|
if (!roundedPoint.eq(this.lastPoint)) {
|
109
112
|
// If almost exactly in the same line as the previous
|
110
|
-
if (this.lastLineSegment &&
|
113
|
+
if (this.lastLineSegment &&
|
114
|
+
this.lastLineSegment.direction.dot(roundedPoint.minus(this.lastPoint).normalized()) > 0.997) {
|
111
115
|
this.parts.pop();
|
112
116
|
this.lastPoint = this.lastLineSegment.p1;
|
113
117
|
}
|
@@ -36,7 +36,7 @@ class PressureSensitiveFreehandLineBuilder {
|
|
36
36
|
this.parts = [];
|
37
37
|
this.upperSegments = [];
|
38
38
|
this.lowerSegments = [];
|
39
|
-
this.curveFitter = new StrokeSmoother_1.StrokeSmoother(startPoint, minFitAllowed, maxFitAllowed, curve => this.addCurve(curve));
|
39
|
+
this.curveFitter = new StrokeSmoother_1.StrokeSmoother(startPoint, minFitAllowed, maxFitAllowed, (curve) => this.addCurve(curve));
|
40
40
|
this.curveStartWidth = startPoint.width;
|
41
41
|
this.bbox = new math_1.Rect2(this.startPoint.pos.x, this.startPoint.pos.y, 0, 0);
|
42
42
|
}
|
@@ -70,7 +70,8 @@ class PressureSensitiveFreehandLineBuilder {
|
|
70
70
|
}
|
71
71
|
let startPoint;
|
72
72
|
const lastLowerSegment = lowerPath[lowerPath.length - 1];
|
73
|
-
if (lastLowerSegment.kind === math_1.PathCommandType.LineTo ||
|
73
|
+
if (lastLowerSegment.kind === math_1.PathCommandType.LineTo ||
|
74
|
+
lastLowerSegment.kind === math_1.PathCommandType.MoveTo) {
|
74
75
|
startPoint = lastLowerSegment.point;
|
75
76
|
}
|
76
77
|
else {
|
@@ -169,11 +170,11 @@ class PressureSensitiveFreehandLineBuilder {
|
|
169
170
|
// where the next stroke and the previous stroke are in different directions.
|
170
171
|
//
|
171
172
|
// Are the exit/enter directions of the previous and current curves in different enough directions?
|
172
|
-
if (getEnterDirection(upperCurve).dot(getExitDirection(this.lastUpperBezier)) < 0.35
|
173
|
-
|
173
|
+
if (getEnterDirection(upperCurve).dot(getExitDirection(this.lastUpperBezier)) < 0.35 ||
|
174
|
+
getEnterDirection(lowerCurve).dot(getExitDirection(this.lastLowerBezier)) < 0.35 ||
|
174
175
|
// Also handle if the curves exit/enter directions differ
|
175
|
-
|
176
|
-
|
176
|
+
getEnterDirection(upperCurve).dot(getExitDirection(upperCurve)) < 0 ||
|
177
|
+
getEnterDirection(lowerCurve).dot(getExitDirection(lowerCurve)) < 0) {
|
177
178
|
return true;
|
178
179
|
}
|
179
180
|
// Check whether the lower curve intersects the other wall:
|
@@ -280,8 +281,9 @@ class PressureSensitiveFreehandLineBuilder {
|
|
280
281
|
// Approximate the normal at the location of the control point
|
281
282
|
const projectionT = bezier.nearestPointTo(controlPoint).parameterValue;
|
282
283
|
const halfVecT = projectionT;
|
283
|
-
const halfVec = bezier
|
284
|
-
|
284
|
+
const halfVec = bezier
|
285
|
+
.normal(halfVecT)
|
286
|
+
.times((curve.startWidth / 2) * halfVecT + (curve.endWidth / 2) * (1 - halfVecT));
|
285
287
|
// Each starts at startPt ± startVec
|
286
288
|
const lowerCurveStartPoint = this.roundPoint(startPt.plus(startVec));
|
287
289
|
const lowerCurveControlPoint = this.roundPoint(controlPoint.plus(halfVec));
|
@@ -324,8 +326,12 @@ class PressureSensitiveFreehandLineBuilder {
|
|
324
326
|
const upperCurve = new math_1.QuadraticBezier(upperCurveStartPoint, upperCurveControlPoint, upperCurveEndPoint);
|
325
327
|
const lowerCurve = new math_1.QuadraticBezier(lowerCurveStartPoint, lowerCurveControlPoint, lowerCurveEndPoint);
|
326
328
|
return {
|
327
|
-
upperCurveCommand,
|
328
|
-
|
329
|
+
upperCurveCommand,
|
330
|
+
upperToLowerConnector,
|
331
|
+
lowerToUpperConnector,
|
332
|
+
lowerCurveCommand,
|
333
|
+
upperCurve,
|
334
|
+
lowerCurve,
|
329
335
|
nextCurveStartConnector,
|
330
336
|
};
|
331
337
|
}
|
@@ -4,7 +4,19 @@ import { StrokeDataPoint } from '../../types';
|
|
4
4
|
import Viewport from '../../Viewport';
|
5
5
|
import AbstractComponent from '../AbstractComponent';
|
6
6
|
import { ComponentBuilder, ComponentBuilderFactory } from './types';
|
7
|
+
/**
|
8
|
+
* Creates filled rectangles with sharp corners.
|
9
|
+
*
|
10
|
+
* Example:
|
11
|
+
* [[include:doc-pages/inline-examples/changing-pen-types.md]]
|
12
|
+
*/
|
7
13
|
export declare const makeFilledRectangleBuilder: ComponentBuilderFactory;
|
14
|
+
/**
|
15
|
+
* Creates outlined rectangles with sharp corners.
|
16
|
+
*
|
17
|
+
* Example:
|
18
|
+
* [[include:doc-pages/inline-examples/changing-pen-types.md]]
|
19
|
+
*/
|
8
20
|
export declare const makeOutlinedRectangleBuilder: ComponentBuilderFactory;
|
9
21
|
export default class RectangleBuilder implements ComponentBuilder {
|
10
22
|
private readonly startPoint;
|
@@ -8,9 +8,21 @@ const math_1 = require("@js-draw/math");
|
|
8
8
|
const RenderablePathSpec_1 = require("../../rendering/RenderablePathSpec");
|
9
9
|
const Stroke_1 = __importDefault(require("../Stroke"));
|
10
10
|
const makeSnapToGridAutocorrect_1 = __importDefault(require("./autocorrect/makeSnapToGridAutocorrect"));
|
11
|
+
/**
|
12
|
+
* Creates filled rectangles with sharp corners.
|
13
|
+
*
|
14
|
+
* Example:
|
15
|
+
* [[include:doc-pages/inline-examples/changing-pen-types.md]]
|
16
|
+
*/
|
11
17
|
exports.makeFilledRectangleBuilder = (0, makeSnapToGridAutocorrect_1.default)((initialPoint, viewport) => {
|
12
18
|
return new RectangleBuilder(initialPoint, true, viewport);
|
13
19
|
});
|
20
|
+
/**
|
21
|
+
* Creates outlined rectangles with sharp corners.
|
22
|
+
*
|
23
|
+
* Example:
|
24
|
+
* [[include:doc-pages/inline-examples/changing-pen-types.md]]
|
25
|
+
*/
|
14
26
|
exports.makeOutlinedRectangleBuilder = (0, makeSnapToGridAutocorrect_1.default)((initialPoint, viewport) => {
|
15
27
|
return new RectangleBuilder(initialPoint, false, viewport);
|
16
28
|
});
|
@@ -34,12 +46,14 @@ class RectangleBuilder {
|
|
34
46
|
const startPoint = rotationMat.inverse().transformVec2(this.startPoint.pos);
|
35
47
|
const endPoint = rotationMat.inverse().transformVec2(this.endPoint.pos);
|
36
48
|
const rect = math_1.Rect2.fromCorners(startPoint, endPoint);
|
37
|
-
const path = math_1.Path.fromRect(rect, this.filled ? null : this.endPoint.width)
|
49
|
+
const path = math_1.Path.fromRect(rect, this.filled ? null : this.endPoint.width)
|
50
|
+
.transformedBy(
|
38
51
|
// Rotate the canvas rectangle so that its rotation matches the screen
|
39
|
-
rotationMat)
|
52
|
+
rotationMat)
|
53
|
+
.mapPoints((point) => this.viewport.roundPoint(point));
|
40
54
|
const preview = new Stroke_1.default([
|
41
55
|
(0, RenderablePathSpec_1.pathToRenderable)(path, {
|
42
|
-
fill: this.endPoint.color
|
56
|
+
fill: this.endPoint.color,
|
43
57
|
}),
|
44
58
|
]);
|
45
59
|
return preview;
|
@@ -8,14 +8,11 @@ const makeShapeFitAutocorrect = (sourceFactory) => {
|
|
8
8
|
};
|
9
9
|
exports.default = makeShapeFitAutocorrect;
|
10
10
|
const makeLineTemplate = (startPoint, points, _bbox) => {
|
11
|
-
const templatePoints = [
|
12
|
-
|
13
|
-
points[points.length - 1],
|
14
|
-
];
|
15
|
-
return { points: templatePoints, };
|
11
|
+
const templatePoints = [startPoint, points[points.length - 1]];
|
12
|
+
return { points: templatePoints };
|
16
13
|
};
|
17
14
|
const makeRectangleTemplate = (_startPoint, _points, bbox) => {
|
18
|
-
return { points: [...bbox.corners, bbox.corners[0]]
|
15
|
+
return { points: [...bbox.corners, bbox.corners[0]] };
|
19
16
|
};
|
20
17
|
class ShapeFitBuilder {
|
21
18
|
constructor(sourceFactory, startPoint, viewport) {
|
@@ -41,10 +38,10 @@ class ShapeFitBuilder {
|
|
41
38
|
async autocorrectShape() {
|
42
39
|
// Use screen points so that autocorrected shapes rotate with the screen.
|
43
40
|
const startPoint = this.viewport.canvasToScreen(this.startPoint.pos);
|
44
|
-
const points = this.points.map(point => this.viewport.canvasToScreen(point.pos));
|
41
|
+
const points = this.points.map((point) => this.viewport.canvasToScreen(point.pos));
|
45
42
|
const bbox = math_1.Rect2.bboxOf(points);
|
46
43
|
const snappedStartPoint = this.viewport.canvasToScreen(this.viewport.snapToGrid(this.startPoint.pos));
|
47
|
-
const snappedPoints = this.points.map(point => this.viewport.canvasToScreen(this.viewport.snapToGrid(point.pos)));
|
44
|
+
const snappedPoints = this.points.map((point) => this.viewport.canvasToScreen(this.viewport.snapToGrid(point.pos)));
|
48
45
|
const snappedBBox = math_1.Rect2.bboxOf(snappedPoints);
|
49
46
|
// Only fit larger shapes
|
50
47
|
if (bbox.maxDimension < 32) {
|
@@ -37,7 +37,7 @@ class SnapToGridAutocompleteBuilder {
|
|
37
37
|
// Use screen points so that snapped shapes rotate with the screen.
|
38
38
|
const startPoint = snapToGrid(this.startPoint);
|
39
39
|
const builder = this.sourceFactory(startPoint, this.viewport);
|
40
|
-
const points = this.points.map(point => snapToGrid(point));
|
40
|
+
const points = this.points.map((point) => snapToGrid(point));
|
41
41
|
for (const point of points) {
|
42
42
|
builder.addPoint(point);
|
43
43
|
}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
export { makeFreehandLineBuilder } from './FreehandLineBuilder';
|
2
|
+
export { makePolylineBuilder } from './PolylineBuilder';
|
3
|
+
export { makePressureSensitiveFreehandLineBuilder } from './PressureSensitiveFreehandLineBuilder';
|
4
|
+
export { makeOutlinedCircleBuilder } from './CircleBuilder';
|
5
|
+
export { makeArrowBuilder } from './ArrowBuilder';
|
6
|
+
export { makeLineBuilder } from './LineBuilder';
|
7
|
+
export { makeFilledRectangleBuilder, makeOutlinedRectangleBuilder } from './RectangleBuilder';
|
@@ -0,0 +1,18 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.makeOutlinedRectangleBuilder = exports.makeFilledRectangleBuilder = exports.makeLineBuilder = exports.makeArrowBuilder = exports.makeOutlinedCircleBuilder = exports.makePressureSensitiveFreehandLineBuilder = exports.makePolylineBuilder = exports.makeFreehandLineBuilder = void 0;
|
4
|
+
var FreehandLineBuilder_1 = require("./FreehandLineBuilder");
|
5
|
+
Object.defineProperty(exports, "makeFreehandLineBuilder", { enumerable: true, get: function () { return FreehandLineBuilder_1.makeFreehandLineBuilder; } });
|
6
|
+
var PolylineBuilder_1 = require("./PolylineBuilder");
|
7
|
+
Object.defineProperty(exports, "makePolylineBuilder", { enumerable: true, get: function () { return PolylineBuilder_1.makePolylineBuilder; } });
|
8
|
+
var PressureSensitiveFreehandLineBuilder_1 = require("./PressureSensitiveFreehandLineBuilder");
|
9
|
+
Object.defineProperty(exports, "makePressureSensitiveFreehandLineBuilder", { enumerable: true, get: function () { return PressureSensitiveFreehandLineBuilder_1.makePressureSensitiveFreehandLineBuilder; } });
|
10
|
+
var CircleBuilder_1 = require("./CircleBuilder");
|
11
|
+
Object.defineProperty(exports, "makeOutlinedCircleBuilder", { enumerable: true, get: function () { return CircleBuilder_1.makeOutlinedCircleBuilder; } });
|
12
|
+
var ArrowBuilder_1 = require("./ArrowBuilder");
|
13
|
+
Object.defineProperty(exports, "makeArrowBuilder", { enumerable: true, get: function () { return ArrowBuilder_1.makeArrowBuilder; } });
|
14
|
+
var LineBuilder_1 = require("./LineBuilder");
|
15
|
+
Object.defineProperty(exports, "makeLineBuilder", { enumerable: true, get: function () { return LineBuilder_1.makeLineBuilder; } });
|
16
|
+
var RectangleBuilder_1 = require("./RectangleBuilder");
|
17
|
+
Object.defineProperty(exports, "makeFilledRectangleBuilder", { enumerable: true, get: function () { return RectangleBuilder_1.makeFilledRectangleBuilder; } });
|
18
|
+
Object.defineProperty(exports, "makeOutlinedRectangleBuilder", { enumerable: true, get: function () { return RectangleBuilder_1.makeOutlinedRectangleBuilder; } });
|
@@ -1,8 +1,5 @@
|
|
1
1
|
export * from './builders/types';
|
2
|
-
export
|
3
|
-
export { makePolylineBuilder } from './builders/PolylineBuilder';
|
4
|
-
export { makePressureSensitiveFreehandLineBuilder } from './builders/PressureSensitiveFreehandLineBuilder';
|
5
|
-
export { makeOutlinedCircleBuilder } from './builders/CircleBuilder';
|
2
|
+
export * from './builders/lib';
|
6
3
|
export { default as StrokeSmoother, Curve as StrokeSmootherCurve } from './util/StrokeSmoother';
|
7
4
|
export * from './AbstractComponent';
|
8
5
|
export { default as AbstractComponent } from './AbstractComponent';
|
@@ -29,16 +29,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
29
29
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
30
30
|
};
|
31
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
32
|
-
exports.ImageComponent = exports.BackgroundComponentBackgroundType = exports.BackgroundComponent = exports.StrokeComponent = exports.Text = exports.TextComponent = exports.isRestylableComponent = exports.createRestyleComponentCommand = exports.Stroke = exports.AbstractComponent = exports.StrokeSmoother =
|
32
|
+
exports.ImageComponent = exports.BackgroundComponentBackgroundType = exports.BackgroundComponent = exports.StrokeComponent = exports.Text = exports.TextComponent = exports.isRestylableComponent = exports.createRestyleComponentCommand = exports.Stroke = exports.AbstractComponent = exports.StrokeSmoother = void 0;
|
33
33
|
__exportStar(require("./builders/types"), exports);
|
34
|
-
|
35
|
-
Object.defineProperty(exports, "makeFreehandLineBuilder", { enumerable: true, get: function () { return FreehandLineBuilder_1.makeFreehandLineBuilder; } });
|
36
|
-
var PolylineBuilder_1 = require("./builders/PolylineBuilder");
|
37
|
-
Object.defineProperty(exports, "makePolylineBuilder", { enumerable: true, get: function () { return PolylineBuilder_1.makePolylineBuilder; } });
|
38
|
-
var PressureSensitiveFreehandLineBuilder_1 = require("./builders/PressureSensitiveFreehandLineBuilder");
|
39
|
-
Object.defineProperty(exports, "makePressureSensitiveFreehandLineBuilder", { enumerable: true, get: function () { return PressureSensitiveFreehandLineBuilder_1.makePressureSensitiveFreehandLineBuilder; } });
|
40
|
-
var CircleBuilder_1 = require("./builders/CircleBuilder");
|
41
|
-
Object.defineProperty(exports, "makeOutlinedCircleBuilder", { enumerable: true, get: function () { return CircleBuilder_1.makeOutlinedCircleBuilder; } });
|
34
|
+
__exportStar(require("./builders/lib"), exports);
|
42
35
|
var StrokeSmoother_1 = require("./util/StrokeSmoother");
|
43
36
|
Object.defineProperty(exports, "StrokeSmoother", { enumerable: true, get: function () { return __importDefault(StrokeSmoother_1).default; } });
|
44
37
|
__exportStar(require("./AbstractComponent"), exports);
|
@@ -56,9 +56,7 @@ class StrokeSmoother {
|
|
56
56
|
console.assert(this.lastExitingVec.magnitude() !== 0, 'lastExitingVec has zero length!');
|
57
57
|
// Use the last two points to start a new curve (the last point isn't used
|
58
58
|
// in the current curve and we want connected curves to share end points)
|
59
|
-
this.buffer = [
|
60
|
-
this.buffer[this.buffer.length - 2], lastPoint,
|
61
|
-
];
|
59
|
+
this.buffer = [this.buffer[this.buffer.length - 2], lastPoint];
|
62
60
|
this.currentCurve = null;
|
63
61
|
this.isFirstSegment = false;
|
64
62
|
}
|
@@ -99,8 +97,7 @@ class StrokeSmoother {
|
|
99
97
|
return;
|
100
98
|
}
|
101
99
|
const threshold = Math.min(this.lastPoint.width, newPoint.width) / 3;
|
102
|
-
const shouldSnapToInitial = this.startPoint.pos.distanceTo(newPoint.pos) < threshold
|
103
|
-
&& this.isFirstSegment;
|
100
|
+
const shouldSnapToInitial = this.startPoint.pos.distanceTo(newPoint.pos) < threshold && this.isFirstSegment;
|
104
101
|
// Snap to the starting point if the stroke is contained within a small ball centered
|
105
102
|
// at the starting point.
|
106
103
|
// This allows us to create a circle/dot at the start of the stroke.
|
@@ -153,7 +150,9 @@ class StrokeSmoother {
|
|
153
150
|
const startEndDist = segmentEnd.distanceTo(segmentStart);
|
154
151
|
const maxControlPointDist = maxRelativeLength * startEndDist;
|
155
152
|
// Exit in cases where we would divide by zero
|
156
|
-
if (maxControlPointDist === 0 ||
|
153
|
+
if (maxControlPointDist === 0 ||
|
154
|
+
exitingVec.magnitude() === 0 ||
|
155
|
+
!isFinite(exitingVec.magnitude())) {
|
157
156
|
return;
|
158
157
|
}
|
159
158
|
console.assert(isFinite(enteringVec.magnitude()), 'Pre-normalized enteringVec has NaN or ∞ magnitude!');
|
@@ -13,7 +13,7 @@ const makeAboutDialog = (editor, entries) => {
|
|
13
13
|
const container = document.createElement(entry.minimized ? 'details' : 'div');
|
14
14
|
container.classList.add('about-entry');
|
15
15
|
const header = document.createElement(entry.minimized ? 'summary' : 'h2');
|
16
|
-
if (typeof
|
16
|
+
if (typeof entry.heading === 'string') {
|
17
17
|
header.innerText = entry.heading;
|
18
18
|
}
|
19
19
|
else {
|
@@ -20,7 +20,7 @@ const makeAboutDialog = (editor, options) => {
|
|
20
20
|
const scrollRegion = document.createElement('div');
|
21
21
|
scrollRegion.classList.add('scroll');
|
22
22
|
// Allow scrolling in the scrollable container -- don't forward wheel events.
|
23
|
-
scrollRegion.onwheel = evt => evt.stopPropagation();
|
23
|
+
scrollRegion.onwheel = (evt) => evt.stopPropagation();
|
24
24
|
contentWrapper.replaceChildren(heading, scrollRegion, closeButton);
|
25
25
|
dialog.replaceChildren(contentWrapper);
|
26
26
|
overlay.replaceChildren(dialog);
|
@@ -32,7 +32,7 @@ const makeAboutDialog = (editor, options) => {
|
|
32
32
|
dialog.close();
|
33
33
|
};
|
34
34
|
const addCloseListeners = () => {
|
35
|
-
dialog.addEventListener('pointerdown', event => {
|
35
|
+
dialog.addEventListener('pointerdown', (event) => {
|
36
36
|
if (event.target === dialog) {
|
37
37
|
void closeDialog();
|
38
38
|
}
|
@@ -151,7 +151,7 @@ class EditorImage {
|
|
151
151
|
getAllElements() {
|
152
152
|
const leaves = this.root.getLeaves();
|
153
153
|
(0, exports.sortLeavesByZIndex)(leaves);
|
154
|
-
return leaves.map(leaf => leaf.getContent());
|
154
|
+
return leaves.map((leaf) => leaf.getContent());
|
155
155
|
}
|
156
156
|
/** Returns the number of elements added to this image. @internal */
|
157
157
|
estimateNumElements() {
|
@@ -164,7 +164,7 @@ class EditorImage {
|
|
164
164
|
leaves = leaves.concat(this.background.getLeavesIntersectingRegion(region));
|
165
165
|
}
|
166
166
|
(0, exports.sortLeavesByZIndex)(leaves);
|
167
|
-
return leaves.map(leaf => leaf.getContent());
|
167
|
+
return leaves.map((leaf) => leaf.getContent());
|
168
168
|
}
|
169
169
|
/** Called whenever (just after) an element is completely removed. @internal */
|
170
170
|
onDestroyElement(elem) {
|
@@ -504,8 +504,8 @@ const computeFirstIndexToRender = (sortedLeaves, visibleRect) => {
|
|
504
504
|
for (let i = sortedLeaves.length - 1; i >= 1; i--) {
|
505
505
|
if (
|
506
506
|
// Check for occlusion
|
507
|
-
sortedLeaves[i].getBBox().containsRect(visibleRect)
|
508
|
-
|
507
|
+
sortedLeaves[i].getBBox().containsRect(visibleRect) &&
|
508
|
+
sortedLeaves[i].getContent()?.occludesEverythingBelowWhenRenderedInRect(visibleRect)) {
|
509
509
|
startIndex = i;
|
510
510
|
break;
|
511
511
|
}
|
@@ -541,7 +541,7 @@ class ImageNode {
|
|
541
541
|
}
|
542
542
|
// Override this to change how children are considered within a given region.
|
543
543
|
getChildrenIntersectingRegion(region, isTooSmallFilter) {
|
544
|
-
return this.children.filter(child => {
|
544
|
+
return this.children.filter((child) => {
|
545
545
|
const bbox = child.getBBox();
|
546
546
|
return !isTooSmallFilter?.(bbox) && bbox.intersects(region);
|
547
547
|
});
|
@@ -632,7 +632,7 @@ class ImageNode {
|
|
632
632
|
}
|
633
633
|
return nodeForNewLeaf.addLeaf(leaf);
|
634
634
|
}
|
635
|
-
const containingNodes = this.children.filter(child => child.getBBox().containsRect(leafBBox));
|
635
|
+
const containingNodes = this.children.filter((child) => child.getBBox().containsRect(leafBBox));
|
636
636
|
// Does the leaf already fit within one of the children?
|
637
637
|
if (containingNodes.length > 0 && this.children.length >= this.targetChildCount) {
|
638
638
|
// Sort the containers in ascending order by area
|
@@ -670,7 +670,7 @@ class ImageNode {
|
|
670
670
|
this.bbox = this.content.getBBox();
|
671
671
|
}
|
672
672
|
else {
|
673
|
-
this.bbox = math_1.Rect2.union(...this.children.map(child => child.getBBox()));
|
673
|
+
this.bbox = math_1.Rect2.union(...this.children.map((child) => child.getBBox()));
|
674
674
|
}
|
675
675
|
if (bubbleUp && !oldBBox.eq(this.bbox)) {
|
676
676
|
if (this.bbox.containsRect(oldBBox)) {
|
@@ -705,7 +705,7 @@ class ImageNode {
|
|
705
705
|
const oldParent = this.parent;
|
706
706
|
if (oldParent.parent !== null) {
|
707
707
|
const newParent = oldParent.parent;
|
708
|
-
newParent.children = newParent.children.filter(c => c !== oldParent);
|
708
|
+
newParent.children = newParent.children.filter((c) => c !== oldParent);
|
709
709
|
oldParent.parent = null;
|
710
710
|
oldParent.children = [];
|
711
711
|
this.parent = newParent;
|
@@ -777,11 +777,11 @@ class ImageNode {
|
|
777
777
|
removeChild(child) {
|
778
778
|
this.checkRep();
|
779
779
|
const oldChildCount = this.children.length;
|
780
|
-
this.children = this.children.filter(node => {
|
780
|
+
this.children = this.children.filter((node) => {
|
781
781
|
return node !== child;
|
782
782
|
});
|
783
783
|
console.assert(this.children.length === oldChildCount - 1, `${oldChildCount - 1} ≠ ${this.children.length} after removing all nodes equal to ${child}. Nodes should only be removed once.`);
|
784
|
-
this.children.forEach(child => {
|
784
|
+
this.children.forEach((child) => {
|
785
785
|
child.rebalance();
|
786
786
|
});
|
787
787
|
this.recomputeBBox(true);
|
@@ -830,7 +830,7 @@ class ImageNode {
|
|
830
830
|
render(renderer, visibleRect) {
|
831
831
|
let leaves;
|
832
832
|
if (visibleRect) {
|
833
|
-
leaves = this.getLeavesIntersectingRegion(visibleRect, rect => renderer.isTooSmallToRender(rect));
|
833
|
+
leaves = this.getLeavesIntersectingRegion(visibleRect, (rect) => renderer.isTooSmallToRender(rect));
|
834
834
|
}
|
835
835
|
else {
|
836
836
|
leaves = this.getLeaves();
|
@@ -941,10 +941,8 @@ class RootImageNode extends ImageNode {
|
|
941
941
|
};
|
942
942
|
// Check whether the child is stored in the data/fullscreen
|
943
943
|
// component arrays first.
|
944
|
-
this.dataComponents = this.dataComponents
|
945
|
-
|
946
|
-
this.fullscreenChildren = this.fullscreenChildren
|
947
|
-
.filter(checkTargetChild);
|
944
|
+
this.dataComponents = this.dataComponents.filter(checkTargetChild);
|
945
|
+
this.fullscreenChildren = this.fullscreenChildren.filter(checkTargetChild);
|
948
946
|
if (!removed) {
|
949
947
|
super.removeChild(child);
|
950
948
|
}
|
@@ -52,7 +52,7 @@ const editorImageToSVGSync = (image, options) => {
|
|
52
52
|
};
|
53
53
|
exports.editorImageToSVGSync = editorImageToSVGSync;
|
54
54
|
const editorImageToSVGAsync = (image, preRenderComponent, options) => {
|
55
|
-
return new Promise(resolve => {
|
55
|
+
return new Promise((resolve) => {
|
56
56
|
toSVGInternal(image, async (renderer, onComplete) => {
|
57
57
|
await image.renderAllAsync(renderer, preRenderComponent);
|
58
58
|
const result = onComplete();
|
package/dist/cjs/inputEvents.js
CHANGED
@@ -34,8 +34,8 @@ const keyPressEventFromHTMLEvent = (event) => {
|
|
34
34
|
};
|
35
35
|
exports.keyPressEventFromHTMLEvent = keyPressEventFromHTMLEvent;
|
36
36
|
const isPointerEvt = (event) => {
|
37
|
-
return event.kind === InputEvtType.PointerDownEvt
|
38
|
-
|
39
|
-
|
37
|
+
return (event.kind === InputEvtType.PointerDownEvt ||
|
38
|
+
event.kind === InputEvtType.PointerMoveEvt ||
|
39
|
+
event.kind === InputEvtType.PointerUpEvt);
|
40
40
|
};
|
41
41
|
exports.isPointerEvt = isPointerEvt;
|
package/dist/cjs/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.
|
@@ -91,11 +91,11 @@ const localization = {
|
|
91
91
|
textNodeCount: (count) => `Es gibt ${count} sichtbare Text-Knotenpunkte.`,
|
92
92
|
textNode: (content) => `Text: ${content}`,
|
93
93
|
imageNodeCount: (nodeCount) => `Es gibt ${nodeCount} sichtbare Bild-Knoten.`,
|
94
|
-
imageNode: label => `Bild: ${label}`,
|
94
|
+
imageNode: (label) => `Bild: ${label}`,
|
95
95
|
unlabeledImageNode: 'Bild ohne Label',
|
96
96
|
rerenderAsText: 'Als Text darstellen',
|
97
97
|
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.',
|
98
|
-
loading: percentage => `Laden ${percentage}%...`,
|
98
|
+
loading: (percentage) => `Laden ${percentage}%...`,
|
99
99
|
doneLoading: 'Laden fertig',
|
100
100
|
imageEditor: 'Bild-Editor',
|
101
101
|
undoAnnouncement: (commandDescription) => `${commandDescription} rückgängig gemacht`,
|
@@ -48,9 +48,13 @@ const localization = {
|
|
48
48
|
selectionMenu__duplicate: 'Duplicar',
|
49
49
|
closeSidebar: (toolName) => `Close sidebar for ${toolName}`,
|
50
50
|
dropdownShown: (toolName) => `Menú por ${toolName} es visible`,
|
51
|
-
dropdownHidden: (toolName) => {
|
51
|
+
dropdownHidden: (toolName) => {
|
52
|
+
return `Menú por ${toolName} fue ocultado`;
|
53
|
+
},
|
52
54
|
zoomLevel: (zoomPercent) => `Zoom: ${zoomPercent}%`,
|
53
|
-
colorChangedAnnouncement: (color) => {
|
55
|
+
colorChangedAnnouncement: (color) => {
|
56
|
+
return `Color fue cambiado a ${color}`;
|
57
|
+
},
|
54
58
|
imageSize: (size, units) => `Tamaño del imagen: ${size} ${units}`,
|
55
59
|
imageLoadError: (message) => `Error cargando imagen: ${message}`,
|
56
60
|
penTool: (penId) => `Lapiz ${penId}`,
|
@@ -67,7 +71,7 @@ const localization = {
|
|
67
71
|
closeDialog: 'Cerrar',
|
68
72
|
anyDevicePanning: 'Mover la pantalla con todo dispotivo',
|
69
73
|
copied: (count) => `${count} cosas fueron copiados`,
|
70
|
-
pasted: (count) => count === 1 ? 'Pegado' : `${count} cosas fueron pegados
|
74
|
+
pasted: (count) => (count === 1 ? 'Pegado' : `${count} cosas fueron pegados`),
|
71
75
|
toolEnabledAnnouncement: (toolName) => `${toolName} fue activado`,
|
72
76
|
toolDisabledAnnouncement: (toolName) => `${toolName} fue desactivado`,
|
73
77
|
resizeOutputCommand: (newSize) => `Tamaño de imagen fue cambiado a ${newSize.w}x${newSize.h}`,
|
@@ -85,7 +85,7 @@ class Display {
|
|
85
85
|
// Require about 105 strokes with 4 parts each to use the cache at all.
|
86
86
|
minProportionalRenderTimeToUseCache: 105 * 4,
|
87
87
|
});
|
88
|
-
this.editor.notifier.on(types_1.EditorEventType.DisplayResized, event => {
|
88
|
+
this.editor.notifier.on(types_1.EditorEventType.DisplayResized, (event) => {
|
89
89
|
if (event.kind !== types_1.EditorEventType.DisplayResized) {
|
90
90
|
throw new Error('Mismatched event.kinds!');
|
91
91
|
}
|
@@ -123,10 +123,14 @@ class Display {
|
|
123
123
|
}
|
124
124
|
this.resizeSurfacesCallback = () => {
|
125
125
|
const expectedWidth = (canvas) => {
|
126
|
-
|
126
|
+
const widthInPixels = Math.ceil(canvas.clientWidth * this.devicePixelRatio);
|
127
|
+
// Avoid setting the canvas width to zero -- doing so can cause errors when attempting
|
128
|
+
// to use the canvas:
|
129
|
+
return widthInPixels || canvas.width;
|
127
130
|
};
|
128
131
|
const expectedHeight = (canvas) => {
|
129
|
-
|
132
|
+
const heightInPixels = Math.ceil(canvas.clientHeight * this.devicePixelRatio);
|
133
|
+
return heightInPixels || canvas.height; // Zero-size canvases can cause errors.
|
130
134
|
};
|
131
135
|
const hasSizeMismatch = (canvas) => {
|
132
136
|
return expectedHeight(canvas) !== canvas.height || expectedWidth(canvas) !== canvas.width;
|