js-draw 0.0.10 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/bundle.js +1 -1
- package/dist/src/Editor.d.ts +2 -2
- package/dist/src/Editor.js +13 -7
- package/dist/src/EditorImage.d.ts +15 -7
- package/dist/src/EditorImage.js +41 -35
- package/dist/src/SVGLoader.d.ts +3 -2
- package/dist/src/SVGLoader.js +9 -7
- package/dist/src/Viewport.d.ts +4 -0
- package/dist/src/Viewport.js +41 -0
- package/dist/src/components/AbstractComponent.d.ts +3 -2
- package/dist/src/components/AbstractComponent.js +3 -0
- package/dist/src/components/SVGGlobalAttributesObject.d.ts +1 -1
- package/dist/src/components/SVGGlobalAttributesObject.js +1 -1
- package/dist/src/components/Stroke.d.ts +1 -1
- package/dist/src/components/UnknownSVGObject.d.ts +1 -1
- package/dist/src/components/UnknownSVGObject.js +1 -1
- package/dist/src/components/builders/ArrowBuilder.d.ts +1 -1
- package/dist/src/components/builders/FreehandLineBuilder.d.ts +1 -1
- package/dist/src/components/builders/LineBuilder.d.ts +1 -1
- package/dist/src/components/builders/RectangleBuilder.d.ts +1 -1
- package/dist/src/components/builders/types.d.ts +1 -1
- package/dist/src/geometry/Mat33.js +3 -0
- package/dist/src/geometry/Path.d.ts +1 -1
- package/dist/src/geometry/Path.js +5 -3
- package/dist/src/geometry/Rect2.d.ts +1 -0
- package/dist/src/geometry/Rect2.js +28 -1
- package/dist/src/{Display.d.ts → rendering/Display.d.ts} +5 -2
- package/dist/src/{Display.js → rendering/Display.js} +33 -4
- package/dist/src/rendering/caching/CacheRecord.d.ts +19 -0
- package/dist/src/rendering/caching/CacheRecord.js +51 -0
- package/dist/src/rendering/caching/CacheRecordManager.d.ts +11 -0
- package/dist/src/rendering/caching/CacheRecordManager.js +39 -0
- package/dist/src/rendering/caching/RenderingCache.d.ts +12 -0
- package/dist/src/rendering/caching/RenderingCache.js +36 -0
- package/dist/src/rendering/caching/RenderingCacheNode.d.ts +28 -0
- package/dist/src/rendering/caching/RenderingCacheNode.js +294 -0
- package/dist/src/rendering/caching/testUtils.d.ts +9 -0
- package/dist/src/rendering/caching/testUtils.js +20 -0
- package/dist/src/rendering/caching/types.d.ts +20 -0
- package/dist/src/rendering/caching/types.js +1 -0
- package/dist/src/rendering/{AbstractRenderer.d.ts → renderers/AbstractRenderer.d.ts} +18 -8
- package/dist/src/rendering/{AbstractRenderer.js → renderers/AbstractRenderer.js} +36 -2
- package/dist/src/rendering/{CanvasRenderer.d.ts → renderers/CanvasRenderer.d.ts} +10 -5
- package/dist/src/rendering/{CanvasRenderer.js → renderers/CanvasRenderer.js} +60 -20
- package/dist/src/rendering/{DummyRenderer.d.ts → renderers/DummyRenderer.d.ts} +9 -5
- package/dist/src/rendering/{DummyRenderer.js → renderers/DummyRenderer.js} +35 -4
- package/dist/src/rendering/{SVGRenderer.d.ts → renderers/SVGRenderer.d.ts} +4 -3
- package/dist/src/rendering/{SVGRenderer.js → renderers/SVGRenderer.js} +14 -11
- package/dist/src/testing/createEditor.js +1 -1
- package/dist/src/toolbar/HTMLToolbar.js +1 -1
- package/dist/src/tools/SelectionTool.js +9 -24
- package/dist/src/types.d.ts +2 -1
- package/package.json +1 -1
- package/src/Editor.ts +15 -8
- package/src/EditorImage.test.ts +2 -2
- package/src/EditorImage.ts +53 -41
- package/src/SVGLoader.ts +11 -8
- package/src/Viewport.ts +56 -0
- package/src/components/AbstractComponent.ts +6 -2
- package/src/components/SVGGlobalAttributesObject.ts +2 -2
- package/src/components/Stroke.ts +1 -1
- package/src/components/UnknownSVGObject.ts +2 -2
- package/src/components/builders/ArrowBuilder.ts +1 -1
- package/src/components/builders/FreehandLineBuilder.ts +1 -1
- package/src/components/builders/LineBuilder.ts +1 -1
- package/src/components/builders/RectangleBuilder.ts +1 -1
- package/src/components/builders/types.ts +1 -1
- package/src/geometry/Mat33.ts +3 -0
- package/src/geometry/Path.toString.test.ts +12 -2
- package/src/geometry/Path.ts +8 -4
- package/src/geometry/Rect2.test.ts +38 -8
- package/src/geometry/Rect2.ts +32 -1
- package/src/{Display.ts → rendering/Display.ts} +38 -6
- package/src/rendering/caching/CacheRecord.test.ts +49 -0
- package/src/rendering/caching/CacheRecord.ts +72 -0
- package/src/rendering/caching/CacheRecordManager.ts +55 -0
- package/src/rendering/caching/RenderingCache.test.ts +44 -0
- package/src/rendering/caching/RenderingCache.ts +56 -0
- package/src/rendering/caching/RenderingCacheNode.ts +365 -0
- package/src/rendering/caching/testUtils.ts +34 -0
- package/src/rendering/caching/types.ts +35 -0
- package/src/rendering/{AbstractRenderer.ts → renderers/AbstractRenderer.ts} +55 -8
- package/src/rendering/{CanvasRenderer.ts → renderers/CanvasRenderer.ts} +74 -25
- package/src/rendering/renderers/DummyRenderer.test.ts +43 -0
- package/src/rendering/{DummyRenderer.ts → renderers/DummyRenderer.ts} +50 -7
- package/src/rendering/{SVGRenderer.ts → renderers/SVGRenderer.ts} +17 -13
- package/src/testing/createEditor.ts +1 -1
- package/src/toolbar/HTMLToolbar.ts +1 -1
- package/src/tools/SelectionTool.test.ts +1 -1
- package/src/tools/SelectionTool.ts +12 -33
- package/src/types.ts +10 -3
- package/tsconfig.json +1 -0
- package/dist/__mocks__/coloris.d.ts +0 -2
- package/dist/__mocks__/coloris.js +0 -5
@@ -0,0 +1,43 @@
|
|
1
|
+
|
2
|
+
import EventDispatcher from '../../EventDispatcher';
|
3
|
+
import Mat33 from '../../geometry/Mat33';
|
4
|
+
import { Vec2 } from '../../geometry/Vec2';
|
5
|
+
import Viewport from '../../Viewport';
|
6
|
+
import DummyRenderer from './DummyRenderer';
|
7
|
+
|
8
|
+
const makeRenderer = (): [DummyRenderer, Viewport] => {
|
9
|
+
const viewport = new Viewport(new EventDispatcher());
|
10
|
+
return [ new DummyRenderer(viewport), viewport ];
|
11
|
+
};
|
12
|
+
|
13
|
+
describe('DummyRenderer', () => {
|
14
|
+
it('should correctly calculate the size of a pixel on the screen', () => {
|
15
|
+
const [ renderer, viewport ] = makeRenderer();
|
16
|
+
viewport.updateScreenSize(Vec2.of(100, 100));
|
17
|
+
viewport.resetTransform(Mat33.identity);
|
18
|
+
|
19
|
+
expect(1/viewport.getScaleFactor()).toBe(1);
|
20
|
+
expect(renderer.getSizeOfCanvasPixelOnScreen()).toBe(1);
|
21
|
+
|
22
|
+
// Updating the translation matrix shouldn't affect the size of a pixel on the
|
23
|
+
// screen.
|
24
|
+
renderer.setTransform(Mat33.translation(Vec2.of(-1, -2)));
|
25
|
+
expect(renderer.getSizeOfCanvasPixelOnScreen()).toBe(1);
|
26
|
+
viewport.resetTransform(Mat33.translation(Vec2.of(3, 4)));
|
27
|
+
expect(renderer.getSizeOfCanvasPixelOnScreen()).toBe(1);
|
28
|
+
|
29
|
+
// Scale objects by a factor of 2 when drawing
|
30
|
+
renderer.setTransform(Mat33.scaling2D(2));
|
31
|
+
expect(renderer.getSizeOfCanvasPixelOnScreen()).toBe(2);
|
32
|
+
viewport.resetTransform(Mat33.scaling2D(0.5));
|
33
|
+
|
34
|
+
// When a renderer transform is set, **only** the renderer transform should be used.
|
35
|
+
expect(renderer.getSizeOfCanvasPixelOnScreen()).toBe(2);
|
36
|
+
renderer.setTransform(null);
|
37
|
+
expect(renderer.getSizeOfCanvasPixelOnScreen()).toBe(0.5);
|
38
|
+
|
39
|
+
// Rotating should not affect the size of a pixel
|
40
|
+
renderer.setTransform(Mat33.zRotation(Math.PI / 4).rightMul(Mat33.scaling2D(4)));
|
41
|
+
expect(renderer.getSizeOfCanvasPixelOnScreen()).toBe(4);
|
42
|
+
});
|
43
|
+
});
|
@@ -1,9 +1,10 @@
|
|
1
1
|
// Renderer that outputs nothing. Useful for automated tests.
|
2
2
|
|
3
|
-
import
|
4
|
-
import
|
5
|
-
import
|
6
|
-
import
|
3
|
+
import Mat33 from '../../geometry/Mat33';
|
4
|
+
import Rect2 from '../../geometry/Rect2';
|
5
|
+
import { Point2, Vec2 } from '../../geometry/Vec2';
|
6
|
+
import Vec3 from '../../geometry/Vec3';
|
7
|
+
import Viewport from '../../Viewport';
|
7
8
|
import AbstractRenderer, { RenderingStyle } from './AbstractRenderer';
|
8
9
|
|
9
10
|
export default class DummyRenderer extends AbstractRenderer {
|
@@ -22,8 +23,17 @@ export default class DummyRenderer extends AbstractRenderer {
|
|
22
23
|
}
|
23
24
|
|
24
25
|
public displaySize(): Vec2 {
|
25
|
-
//
|
26
|
-
|
26
|
+
// Do we have a stored viewport size?
|
27
|
+
const viewportSize = this.getViewport().getResolution();
|
28
|
+
|
29
|
+
// Don't use a 0x0 viewport — DummyRenderer is often used
|
30
|
+
// for tests that run without a display, so pretend we have a
|
31
|
+
// reasonable-sized display.
|
32
|
+
if (viewportSize.x === 0 || viewportSize.y === 0) {
|
33
|
+
return Vec2.of(640, 480);
|
34
|
+
}
|
35
|
+
|
36
|
+
return viewportSize;
|
27
37
|
}
|
28
38
|
|
29
39
|
public clear() {
|
@@ -47,18 +57,29 @@ export default class DummyRenderer extends AbstractRenderer {
|
|
47
57
|
this.lastFillStyle = style;
|
48
58
|
}
|
49
59
|
protected lineTo(point: Vec3) {
|
60
|
+
point = this.canvasToScreen(point);
|
61
|
+
|
50
62
|
this.lastPoint = point;
|
51
63
|
this.pointBuffer.push(point);
|
52
64
|
}
|
53
65
|
protected moveTo(point: Point2) {
|
66
|
+
point = this.canvasToScreen(point);
|
67
|
+
|
54
68
|
this.lastPoint = point;
|
55
69
|
this.pointBuffer.push(point);
|
56
70
|
}
|
57
71
|
protected traceCubicBezierCurve(p1: Vec3, p2: Vec3, p3: Vec3) {
|
72
|
+
p1 = this.canvasToScreen(p1);
|
73
|
+
p2 = this.canvasToScreen(p2);
|
74
|
+
p3 = this.canvasToScreen(p3);
|
75
|
+
|
58
76
|
this.lastPoint = p3;
|
59
77
|
this.pointBuffer.push(p1, p2, p3);
|
60
78
|
}
|
61
79
|
protected traceQuadraticBezierCurve(controlPoint: Vec3, endPoint: Vec3) {
|
80
|
+
controlPoint = this.canvasToScreen(controlPoint);
|
81
|
+
endPoint = this.canvasToScreen(endPoint);
|
82
|
+
|
62
83
|
this.lastPoint = endPoint;
|
63
84
|
this.pointBuffer.push(controlPoint, endPoint);
|
64
85
|
}
|
@@ -67,7 +88,7 @@ export default class DummyRenderer extends AbstractRenderer {
|
|
67
88
|
// As such, it is unlikely to be the target of automated tests.
|
68
89
|
}
|
69
90
|
|
70
|
-
public startObject(boundingBox: Rect2) {
|
91
|
+
public startObject(boundingBox: Rect2, _clip: boolean) {
|
71
92
|
super.startObject(boundingBox);
|
72
93
|
|
73
94
|
this.objectNestingLevel += 1;
|
@@ -77,4 +98,26 @@ export default class DummyRenderer extends AbstractRenderer {
|
|
77
98
|
|
78
99
|
this.objectNestingLevel -= 1;
|
79
100
|
}
|
101
|
+
|
102
|
+
public isTooSmallToRender(_rect: Rect2): boolean {
|
103
|
+
return false;
|
104
|
+
}
|
105
|
+
|
106
|
+
|
107
|
+
public canRenderFromWithoutDataLoss(other: AbstractRenderer) {
|
108
|
+
return other instanceof DummyRenderer;
|
109
|
+
}
|
110
|
+
|
111
|
+
public renderFromOtherOfSameType(transform: Mat33, other: AbstractRenderer): void {
|
112
|
+
if (!(other instanceof DummyRenderer)) {
|
113
|
+
throw new Error(`${other} cannot be rendered onto ${this}`);
|
114
|
+
}
|
115
|
+
|
116
|
+
this.renderedPathCount += other.renderedPathCount;
|
117
|
+
this.lastFillStyle = other.lastFillStyle;
|
118
|
+
this.lastPoint = other.lastPoint;
|
119
|
+
this.pointBuffer.push(...other.pointBuffer.map(point => {
|
120
|
+
return transform.transformVec2(point);
|
121
|
+
}));
|
122
|
+
}
|
80
123
|
}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
|
-
import Path, { PathCommand, PathCommandType } from '
|
3
|
-
import Rect2 from '
|
4
|
-
import { Point2, Vec2 } from '
|
5
|
-
import Viewport from '
|
2
|
+
import Path, { PathCommand, PathCommandType } from '../../geometry/Path';
|
3
|
+
import Rect2 from '../../geometry/Rect2';
|
4
|
+
import { Point2, Vec2 } from '../../geometry/Vec2';
|
5
|
+
import Viewport from '../../Viewport';
|
6
6
|
import AbstractRenderer, { RenderingStyle } from './AbstractRenderer';
|
7
7
|
|
8
8
|
const svgNameSpace = 'http://www.w3.org/2000/svg';
|
@@ -61,7 +61,7 @@ export default class SVGRenderer extends AbstractRenderer {
|
|
61
61
|
|
62
62
|
protected beginPath(startPoint: Point2) {
|
63
63
|
this.currentPath = [];
|
64
|
-
this.pathStart = this.
|
64
|
+
this.pathStart = this.canvasToScreen(startPoint);
|
65
65
|
this.lastPathStart ??= this.pathStart;
|
66
66
|
}
|
67
67
|
|
@@ -126,7 +126,7 @@ export default class SVGRenderer extends AbstractRenderer {
|
|
126
126
|
}
|
127
127
|
|
128
128
|
protected lineTo(point: Point2) {
|
129
|
-
point = this.
|
129
|
+
point = this.canvasToScreen(point);
|
130
130
|
|
131
131
|
this.currentPath!.push({
|
132
132
|
kind: PathCommandType.LineTo,
|
@@ -135,7 +135,7 @@ export default class SVGRenderer extends AbstractRenderer {
|
|
135
135
|
}
|
136
136
|
|
137
137
|
protected moveTo(point: Point2) {
|
138
|
-
point = this.
|
138
|
+
point = this.canvasToScreen(point);
|
139
139
|
|
140
140
|
this.currentPath!.push({
|
141
141
|
kind: PathCommandType.MoveTo,
|
@@ -146,9 +146,9 @@ export default class SVGRenderer extends AbstractRenderer {
|
|
146
146
|
protected traceCubicBezierCurve(
|
147
147
|
controlPoint1: Point2, controlPoint2: Point2, endPoint: Point2
|
148
148
|
) {
|
149
|
-
controlPoint1 = this.
|
150
|
-
controlPoint2 = this.
|
151
|
-
endPoint = this.
|
149
|
+
controlPoint1 = this.canvasToScreen(controlPoint1);
|
150
|
+
controlPoint2 = this.canvasToScreen(controlPoint2);
|
151
|
+
endPoint = this.canvasToScreen(endPoint);
|
152
152
|
|
153
153
|
this.currentPath!.push({
|
154
154
|
kind: PathCommandType.CubicBezierTo,
|
@@ -159,8 +159,8 @@ export default class SVGRenderer extends AbstractRenderer {
|
|
159
159
|
}
|
160
160
|
|
161
161
|
protected traceQuadraticBezierCurve(controlPoint: Point2, endPoint: Point2) {
|
162
|
-
controlPoint = this.
|
163
|
-
endPoint = this.
|
162
|
+
controlPoint = this.canvasToScreen(controlPoint);
|
163
|
+
endPoint = this.canvasToScreen(endPoint);
|
164
164
|
|
165
165
|
this.currentPath!.push({
|
166
166
|
kind: PathCommandType.QuadraticBezierTo,
|
@@ -179,8 +179,12 @@ export default class SVGRenderer extends AbstractRenderer {
|
|
179
179
|
});
|
180
180
|
}
|
181
181
|
|
182
|
-
// Renders a copy of the given element.
|
182
|
+
// Renders a **copy** of the given element.
|
183
183
|
public drawSVGElem(elem: SVGElement) {
|
184
184
|
this.elem.appendChild(elem.cloneNode(true));
|
185
185
|
}
|
186
|
+
|
187
|
+
public isTooSmallToRender(_rect: Rect2): boolean {
|
188
|
+
return false;
|
189
|
+
}
|
186
190
|
}
|
@@ -10,7 +10,7 @@ import BaseTool from '../tools/BaseTool';
|
|
10
10
|
import SelectionTool from '../tools/SelectionTool';
|
11
11
|
import { makeFreehandLineBuilder } from '../components/builders/FreehandLineBuilder';
|
12
12
|
import { Vec2 } from '../geometry/Vec2';
|
13
|
-
import SVGRenderer from '../rendering/SVGRenderer';
|
13
|
+
import SVGRenderer from '../rendering/renderers/SVGRenderer';
|
14
14
|
import Viewport from '../Viewport';
|
15
15
|
import EventDispatcher from '../EventDispatcher';
|
16
16
|
import { ComponentBuilderFactory } from '../components/builders/types';
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
import Color4 from '../Color4';
|
4
4
|
import Stroke from '../components/Stroke';
|
5
|
-
import { RenderingMode } from '../Display';
|
5
|
+
import { RenderingMode } from '../rendering/Display';
|
6
6
|
import Editor from '../Editor';
|
7
7
|
import EditorImage from '../EditorImage';
|
8
8
|
import Path from '../geometry/Path';
|
@@ -7,7 +7,6 @@ import Mat33 from '../geometry/Mat33';
|
|
7
7
|
import Rect2 from '../geometry/Rect2';
|
8
8
|
import { Point2, Vec2 } from '../geometry/Vec2';
|
9
9
|
import { EditorEventType, PointerEvt } from '../types';
|
10
|
-
import Viewport from '../Viewport';
|
11
10
|
import BaseTool from './BaseTool';
|
12
11
|
import { ToolType } from './ToolController';
|
13
12
|
|
@@ -120,7 +119,7 @@ const makeDraggable = (element: HTMLElement, onDrag: DragCallback, onDragEnd: Dr
|
|
120
119
|
};
|
121
120
|
|
122
121
|
// Maximum number of strokes to transform without a re-render.
|
123
|
-
const updateChunkSize =
|
122
|
+
const updateChunkSize = 100;
|
124
123
|
|
125
124
|
class Selection {
|
126
125
|
public region: Rect2;
|
@@ -341,10 +340,16 @@ class Selection {
|
|
341
340
|
this.selectedElems = this.editor.image.getElementsIntersectingRegion(this.region).filter(elem => {
|
342
341
|
if (this.region.containsRect(elem.getBBox())) {
|
343
342
|
return true;
|
344
|
-
} else if (this.region.getEdges().some(edge => elem.intersects(edge))) {
|
345
|
-
return true;
|
346
343
|
}
|
347
|
-
|
344
|
+
|
345
|
+
// Calculated bounding boxes can be slightly larger than their actual contents' bounding box.
|
346
|
+
// As such, test with more lines than just this' edges.
|
347
|
+
const testLines = [];
|
348
|
+
for (const subregion of this.region.divideIntoGrid(2, 2)) {
|
349
|
+
testLines.push(...subregion.getEdges());
|
350
|
+
}
|
351
|
+
|
352
|
+
return testLines.some(edge => elem.intersects(edge));
|
348
353
|
});
|
349
354
|
|
350
355
|
// Find the bounding box of all selected elements.
|
@@ -484,38 +489,12 @@ export default class SelectionTool extends BaseTool {
|
|
484
489
|
});
|
485
490
|
|
486
491
|
if (hasSelection) {
|
487
|
-
const visibleRect = this.editor.viewport.visibleRect;
|
488
|
-
const selectionRect = this.selectionBox.region;
|
489
|
-
|
490
492
|
this.editor.announceForAccessibility(
|
491
493
|
this.editor.localization.selectedElements(this.selectionBox.getSelectedItemCount())
|
492
494
|
);
|
493
495
|
|
494
|
-
|
495
|
-
|
496
|
-
Mat33.scaling2D(2 / 3, visibleRect.center)
|
497
|
-
);
|
498
|
-
|
499
|
-
// Ensure that the selection fits within the target
|
500
|
-
if (targetRect.w < selectionRect.w || targetRect.h < selectionRect.h) {
|
501
|
-
const multiplier = Math.max(
|
502
|
-
selectionRect.w / targetRect.w, selectionRect.h / targetRect.h
|
503
|
-
);
|
504
|
-
const visibleRectTransform = Mat33.scaling2D(multiplier, targetRect.topLeft);
|
505
|
-
const viewportContentTransform = visibleRectTransform.inverse();
|
506
|
-
|
507
|
-
(new Viewport.ViewportTransform(viewportContentTransform)).apply(this.editor);
|
508
|
-
}
|
509
|
-
|
510
|
-
// Ensure that the top left is visible
|
511
|
-
if (!targetRect.containsRect(selectionRect)) {
|
512
|
-
// target position - current position
|
513
|
-
const translation = selectionRect.center.minus(targetRect.center);
|
514
|
-
const visibleRectTransform = Mat33.translation(translation);
|
515
|
-
const viewportContentTransform = visibleRectTransform.inverse();
|
516
|
-
|
517
|
-
(new Viewport.ViewportTransform(viewportContentTransform)).apply(this.editor);
|
518
|
-
}
|
496
|
+
const selectionRect = this.selectionBox.region;
|
497
|
+
this.editor.viewport.zoomTo(selectionRect).apply(this.editor);
|
519
498
|
}
|
520
499
|
}
|
521
500
|
|
package/src/types.ts
CHANGED
@@ -134,11 +134,18 @@ export type OnProgressListener =
|
|
134
134
|
(amountProcessed: number, totalToProcess: number)=> Promise<void>|null;
|
135
135
|
|
136
136
|
export type ComponentAddedListener = (component: AbstractComponent)=> void;
|
137
|
+
|
138
|
+
// Called when a new estimate for the import/export rect has been generated. This can be called multiple times.
|
139
|
+
// Only the last call to this listener must be accurate.
|
140
|
+
// The import/export rect is also returned by [start].
|
141
|
+
export type OnDetermineExportRectListener = (exportRect: Rect2)=> void;
|
142
|
+
|
137
143
|
export interface ImageLoader {
|
138
|
-
// Returns the main region of the loaded image
|
139
144
|
start(
|
140
|
-
onAddComponent: ComponentAddedListener,
|
141
|
-
|
145
|
+
onAddComponent: ComponentAddedListener,
|
146
|
+
onProgressListener: OnProgressListener,
|
147
|
+
onDetermineExportRect?: OnDetermineExportRectListener,
|
148
|
+
): Promise<void>;
|
142
149
|
}
|
143
150
|
|
144
151
|
export interface StrokeDataPoint {
|
package/tsconfig.json
CHANGED