@motion-script/web 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/README.md +47 -0
- package/dist/audio/player.d.ts +43 -0
- package/dist/audio/player.d.ts.map +1 -0
- package/dist/audio/player.js +165 -0
- package/dist/audio/player.js.map +1 -0
- package/dist/effects/bloom.d.ts +19 -0
- package/dist/effects/bloom.d.ts.map +1 -0
- package/dist/effects/bloom.js +64 -0
- package/dist/effects/bloom.js.map +1 -0
- package/dist/effects/blur.d.ts +8 -0
- package/dist/effects/blur.d.ts.map +1 -0
- package/dist/effects/blur.js +12 -0
- package/dist/effects/blur.js.map +1 -0
- package/dist/effects/bulge-pinch.d.ts +20 -0
- package/dist/effects/bulge-pinch.d.ts.map +1 -0
- package/dist/effects/bulge-pinch.js +86 -0
- package/dist/effects/bulge-pinch.js.map +1 -0
- package/dist/effects/chromatic-aberration.d.ts +19 -0
- package/dist/effects/chromatic-aberration.d.ts.map +1 -0
- package/dist/effects/chromatic-aberration.js +59 -0
- package/dist/effects/chromatic-aberration.js.map +1 -0
- package/dist/effects/effect.d.ts +32 -0
- package/dist/effects/effect.d.ts.map +1 -0
- package/dist/effects/effect.js +22 -0
- package/dist/effects/effect.js.map +1 -0
- package/dist/effects/grayscale.d.ts +12 -0
- package/dist/effects/grayscale.d.ts.map +1 -0
- package/dist/effects/grayscale.js +31 -0
- package/dist/effects/grayscale.js.map +1 -0
- package/dist/effects/index.d.ts +13 -0
- package/dist/effects/index.d.ts.map +1 -0
- package/dist/effects/index.js +13 -0
- package/dist/effects/index.js.map +1 -0
- package/dist/effects/pixelate.d.ts +23 -0
- package/dist/effects/pixelate.d.ts.map +1 -0
- package/dist/effects/pixelate.js +37 -0
- package/dist/effects/pixelate.js.map +1 -0
- package/dist/effects/registry.d.ts +17 -0
- package/dist/effects/registry.d.ts.map +1 -0
- package/dist/effects/registry.js +56 -0
- package/dist/effects/registry.js.map +1 -0
- package/dist/effects/sksl-cache.d.ts +6 -0
- package/dist/effects/sksl-cache.d.ts.map +1 -0
- package/dist/effects/sksl-cache.js +21 -0
- package/dist/effects/sksl-cache.js.map +1 -0
- package/dist/effects/sksl-layer.d.ts +30 -0
- package/dist/effects/sksl-layer.d.ts.map +1 -0
- package/dist/effects/sksl-layer.js +82 -0
- package/dist/effects/sksl-layer.js.map +1 -0
- package/dist/effects/texture.d.ts +31 -0
- package/dist/effects/texture.d.ts.map +1 -0
- package/dist/effects/texture.js +66 -0
- package/dist/effects/texture.js.map +1 -0
- package/dist/effects/vintage.d.ts +20 -0
- package/dist/effects/vintage.d.ts.map +1 -0
- package/dist/effects/vintage.js +47 -0
- package/dist/effects/vintage.js.map +1 -0
- package/dist/effects/zoom.d.ts +20 -0
- package/dist/effects/zoom.d.ts.map +1 -0
- package/dist/effects/zoom.js +65 -0
- package/dist/effects/zoom.js.map +1 -0
- package/dist/exporter.d.ts +24 -0
- package/dist/exporter.d.ts.map +1 -0
- package/dist/exporter.js +177 -0
- package/dist/exporter.js.map +1 -0
- package/dist/fills/conic-gradient.d.ts +12 -0
- package/dist/fills/conic-gradient.d.ts.map +1 -0
- package/dist/fills/conic-gradient.js +44 -0
- package/dist/fills/conic-gradient.js.map +1 -0
- package/dist/fills/filters/alpha.d.ts +9 -0
- package/dist/fills/filters/alpha.d.ts.map +1 -0
- package/dist/fills/filters/alpha.js +21 -0
- package/dist/fills/filters/alpha.js.map +1 -0
- package/dist/fills/filters/blur.d.ts +9 -0
- package/dist/fills/filters/blur.d.ts.map +1 -0
- package/dist/fills/filters/blur.js +12 -0
- package/dist/fills/filters/blur.js.map +1 -0
- package/dist/fills/filters/color-adjustment.d.ts +14 -0
- package/dist/fills/filters/color-adjustment.d.ts.map +1 -0
- package/dist/fills/filters/color-adjustment.js +147 -0
- package/dist/fills/filters/color-adjustment.js.map +1 -0
- package/dist/fills/filters/color-matrix.d.ts +9 -0
- package/dist/fills/filters/color-matrix.d.ts.map +1 -0
- package/dist/fills/filters/color-matrix.js +14 -0
- package/dist/fills/filters/color-matrix.js.map +1 -0
- package/dist/fills/filters/curves.d.ts +9 -0
- package/dist/fills/filters/curves.d.ts.map +1 -0
- package/dist/fills/filters/curves.js +89 -0
- package/dist/fills/filters/curves.js.map +1 -0
- package/dist/fills/filters/exposure.d.ts +9 -0
- package/dist/fills/filters/exposure.d.ts.map +1 -0
- package/dist/fills/filters/exposure.js +22 -0
- package/dist/fills/filters/exposure.js.map +1 -0
- package/dist/fills/filters/filter.d.ts +17 -0
- package/dist/fills/filters/filter.d.ts.map +1 -0
- package/dist/fills/filters/filter.js +16 -0
- package/dist/fills/filters/filter.js.map +1 -0
- package/dist/fills/filters/grayscale.d.ts +9 -0
- package/dist/fills/filters/grayscale.d.ts.map +1 -0
- package/dist/fills/filters/grayscale.js +25 -0
- package/dist/fills/filters/grayscale.js.map +1 -0
- package/dist/fills/filters/registry.d.ts +16 -0
- package/dist/fills/filters/registry.d.ts.map +1 -0
- package/dist/fills/filters/registry.js +50 -0
- package/dist/fills/filters/registry.js.map +1 -0
- package/dist/fills/gradient-cache.d.ts +29 -0
- package/dist/fills/gradient-cache.d.ts.map +1 -0
- package/dist/fills/gradient-cache.js +57 -0
- package/dist/fills/gradient-cache.js.map +1 -0
- package/dist/fills/handler.d.ts +49 -0
- package/dist/fills/handler.d.ts.map +1 -0
- package/dist/fills/handler.js +172 -0
- package/dist/fills/handler.js.map +1 -0
- package/dist/fills/image.d.ts +34 -0
- package/dist/fills/image.d.ts.map +1 -0
- package/dist/fills/image.js +91 -0
- package/dist/fills/image.js.map +1 -0
- package/dist/fills/linear-gradient.d.ts +12 -0
- package/dist/fills/linear-gradient.d.ts.map +1 -0
- package/dist/fills/linear-gradient.js +48 -0
- package/dist/fills/linear-gradient.js.map +1 -0
- package/dist/fills/noise.d.ts +11 -0
- package/dist/fills/noise.d.ts.map +1 -0
- package/dist/fills/noise.js +82 -0
- package/dist/fills/noise.js.map +1 -0
- package/dist/fills/radial-gradient.d.ts +9 -0
- package/dist/fills/radial-gradient.d.ts.map +1 -0
- package/dist/fills/radial-gradient.js +43 -0
- package/dist/fills/radial-gradient.js.map +1 -0
- package/dist/fills/registry.d.ts +10 -0
- package/dist/fills/registry.d.ts.map +1 -0
- package/dist/fills/registry.js +34 -0
- package/dist/fills/registry.js.map +1 -0
- package/dist/fills/renderer.d.ts +24 -0
- package/dist/fills/renderer.d.ts.map +1 -0
- package/dist/fills/renderer.js +5 -0
- package/dist/fills/renderer.js.map +1 -0
- package/dist/fills/solid.d.ts +7 -0
- package/dist/fills/solid.d.ts.map +1 -0
- package/dist/fills/solid.js +13 -0
- package/dist/fills/solid.js.map +1 -0
- package/dist/fills/stripe.d.ts +7 -0
- package/dist/fills/stripe.d.ts.map +1 -0
- package/dist/fills/stripe.js +85 -0
- package/dist/fills/stripe.js.map +1 -0
- package/dist/fills/video.d.ts +6 -0
- package/dist/fills/video.d.ts.map +1 -0
- package/dist/fills/video.js +14 -0
- package/dist/fills/video.js.map +1 -0
- package/dist/font-style.d.ts +23 -0
- package/dist/font-style.d.ts.map +1 -0
- package/dist/font-style.js +34 -0
- package/dist/font-style.js.map +1 -0
- package/dist/getter.d.ts +9 -0
- package/dist/getter.d.ts.map +1 -0
- package/dist/getter.js +26 -0
- package/dist/getter.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/master-clock.d.ts +42 -0
- package/dist/master-clock.d.ts.map +1 -0
- package/dist/master-clock.js +134 -0
- package/dist/master-clock.js.map +1 -0
- package/dist/measure-scope.d.ts +14 -0
- package/dist/measure-scope.d.ts.map +1 -0
- package/dist/measure-scope.js +29 -0
- package/dist/measure-scope.js.map +1 -0
- package/dist/render-context.d.ts +107 -0
- package/dist/render-context.d.ts.map +1 -0
- package/dist/render-context.js +940 -0
- package/dist/render-context.js.map +1 -0
- package/dist/shapes/alpha-contour.d.ts +27 -0
- package/dist/shapes/alpha-contour.d.ts.map +1 -0
- package/dist/shapes/alpha-contour.js +330 -0
- package/dist/shapes/alpha-contour.js.map +1 -0
- package/dist/shapes/base.d.ts +46 -0
- package/dist/shapes/base.d.ts.map +1 -0
- package/dist/shapes/base.js +95 -0
- package/dist/shapes/base.js.map +1 -0
- package/dist/shapes/boolean.d.ts +28 -0
- package/dist/shapes/boolean.d.ts.map +1 -0
- package/dist/shapes/boolean.js +90 -0
- package/dist/shapes/boolean.js.map +1 -0
- package/dist/shapes/ellipse.d.ts +32 -0
- package/dist/shapes/ellipse.d.ts.map +1 -0
- package/dist/shapes/ellipse.js +50 -0
- package/dist/shapes/ellipse.js.map +1 -0
- package/dist/shapes/image.d.ts +66 -0
- package/dist/shapes/image.d.ts.map +1 -0
- package/dist/shapes/image.js +214 -0
- package/dist/shapes/image.js.map +1 -0
- package/dist/shapes/index.d.ts +67 -0
- package/dist/shapes/index.d.ts.map +1 -0
- package/dist/shapes/index.js +297 -0
- package/dist/shapes/index.js.map +1 -0
- package/dist/shapes/line.d.ts +25 -0
- package/dist/shapes/line.d.ts.map +1 -0
- package/dist/shapes/line.js +87 -0
- package/dist/shapes/line.js.map +1 -0
- package/dist/shapes/mask.d.ts +28 -0
- package/dist/shapes/mask.d.ts.map +1 -0
- package/dist/shapes/mask.js +106 -0
- package/dist/shapes/mask.js.map +1 -0
- package/dist/shapes/paragraph-layout.d.ts +64 -0
- package/dist/shapes/paragraph-layout.d.ts.map +1 -0
- package/dist/shapes/paragraph-layout.js +156 -0
- package/dist/shapes/paragraph-layout.js.map +1 -0
- package/dist/shapes/path.d.ts +29 -0
- package/dist/shapes/path.d.ts.map +1 -0
- package/dist/shapes/path.js +71 -0
- package/dist/shapes/path.js.map +1 -0
- package/dist/shapes/polygon.d.ts +33 -0
- package/dist/shapes/polygon.d.ts.map +1 -0
- package/dist/shapes/polygon.js +86 -0
- package/dist/shapes/polygon.js.map +1 -0
- package/dist/shapes/polygram.d.ts +34 -0
- package/dist/shapes/polygram.d.ts.map +1 -0
- package/dist/shapes/polygram.js +90 -0
- package/dist/shapes/polygram.js.map +1 -0
- package/dist/shapes/rect.d.ts +41 -0
- package/dist/shapes/rect.d.ts.map +1 -0
- package/dist/shapes/rect.js +111 -0
- package/dist/shapes/rect.js.map +1 -0
- package/dist/shapes/richtext.d.ts +28 -0
- package/dist/shapes/richtext.d.ts.map +1 -0
- package/dist/shapes/richtext.js +32 -0
- package/dist/shapes/richtext.js.map +1 -0
- package/dist/shapes/shape-handler.d.ts +79 -0
- package/dist/shapes/shape-handler.d.ts.map +1 -0
- package/dist/shapes/shape-handler.js +304 -0
- package/dist/shapes/shape-handler.js.map +1 -0
- package/dist/shapes/text.d.ts +13 -0
- package/dist/shapes/text.d.ts.map +1 -0
- package/dist/shapes/text.js +67 -0
- package/dist/shapes/text.js.map +1 -0
- package/dist/shapes/trim.d.ts +10 -0
- package/dist/shapes/trim.d.ts.map +1 -0
- package/dist/shapes/trim.js +49 -0
- package/dist/shapes/trim.js.map +1 -0
- package/dist/storage-adapter.d.ts +56 -0
- package/dist/storage-adapter.d.ts.map +1 -0
- package/dist/storage-adapter.js +188 -0
- package/dist/storage-adapter.js.map +1 -0
- package/dist/stroke/index.d.ts +34 -0
- package/dist/stroke/index.d.ts.map +1 -0
- package/dist/stroke/index.js +360 -0
- package/dist/stroke/index.js.map +1 -0
- package/dist/stroke/stroke-handler.d.ts +45 -0
- package/dist/stroke/stroke-handler.d.ts.map +1 -0
- package/dist/stroke/stroke-handler.js +371 -0
- package/dist/stroke/stroke-handler.js.map +1 -0
- package/dist/video/extract.d.ts +54 -0
- package/dist/video/extract.d.ts.map +1 -0
- package/dist/video/extract.js +192 -0
- package/dist/video/extract.js.map +1 -0
- package/dist/video/extract.worker.d.ts +50 -0
- package/dist/video/extract.worker.d.ts.map +1 -0
- package/dist/video/extract.worker.js +224 -0
- package/dist/video/extract.worker.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Combines paths via CanvasKit `PathOp`s and tracks nested "path collection"
|
|
3
|
+
* frames. A frame records each contributed path transformed into the
|
|
4
|
+
* coordinate space active when the frame began (via the inverse of that base
|
|
5
|
+
* matrix), so paths drawn under different transforms still combine correctly
|
|
6
|
+
* in one space — used for both explicit boolean ops and vector masks.
|
|
7
|
+
*/
|
|
8
|
+
export class BooleanHandler {
|
|
9
|
+
canvasKit;
|
|
10
|
+
getCanvas;
|
|
11
|
+
pathCollectionStack = [];
|
|
12
|
+
booleanOpStack = [];
|
|
13
|
+
constructor(canvasKit, getCanvas) {
|
|
14
|
+
this.canvasKit = canvasKit;
|
|
15
|
+
this.getCanvas = getCanvas;
|
|
16
|
+
}
|
|
17
|
+
dispose() {
|
|
18
|
+
this.pathCollectionStack = [];
|
|
19
|
+
this.booleanOpStack = [];
|
|
20
|
+
}
|
|
21
|
+
isCollecting() {
|
|
22
|
+
return this.pathCollectionStack.length > 0;
|
|
23
|
+
}
|
|
24
|
+
contributeToPathCollection(path) {
|
|
25
|
+
if (this.pathCollectionStack.length === 0)
|
|
26
|
+
return;
|
|
27
|
+
const frame = this.pathCollectionStack[this.pathCollectionStack.length - 1];
|
|
28
|
+
const current = this.getCanvas().getTotalMatrix();
|
|
29
|
+
const rel = this.canvasKit.Matrix.multiply(frame.invBaseMatrix, current);
|
|
30
|
+
const builder = new this.canvasKit.PathBuilder();
|
|
31
|
+
builder.addPath(path, rel);
|
|
32
|
+
frame.paths.push(builder.detachAndDelete());
|
|
33
|
+
}
|
|
34
|
+
pushFrame() {
|
|
35
|
+
const m = Array.from(this.getCanvas().getTotalMatrix());
|
|
36
|
+
const inv = this.canvasKit.Matrix.invert(m) ?? this.canvasKit.Matrix.identity();
|
|
37
|
+
this.pathCollectionStack.push({ paths: [], invBaseMatrix: inv });
|
|
38
|
+
}
|
|
39
|
+
popFrame() {
|
|
40
|
+
const frame = this.pathCollectionStack.pop();
|
|
41
|
+
return frame ? frame.paths : [];
|
|
42
|
+
}
|
|
43
|
+
toCanvasKitPathOp(op) {
|
|
44
|
+
switch (op) {
|
|
45
|
+
case "subtract": return this.canvasKit.PathOp.Difference;
|
|
46
|
+
case "intersect": return this.canvasKit.PathOp.Intersect;
|
|
47
|
+
case "exclude": return this.canvasKit.PathOp.XOR;
|
|
48
|
+
case "union":
|
|
49
|
+
default: return this.canvasKit.PathOp.Union;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Folds `paths` left-to-right with `op`, deleting inputs as it consumes them. Caller owns the result. */
|
|
53
|
+
combinePaths(paths, op) {
|
|
54
|
+
if (paths.length === 0)
|
|
55
|
+
return null;
|
|
56
|
+
const ckOp = this.toCanvasKitPathOp(op);
|
|
57
|
+
let combined = paths[0];
|
|
58
|
+
for (let i = 1; i < paths.length; i++) {
|
|
59
|
+
const next = this.canvasKit.Path.MakeFromOp(combined, paths[i], ckOp);
|
|
60
|
+
combined.delete();
|
|
61
|
+
paths[i].delete();
|
|
62
|
+
if (!next) {
|
|
63
|
+
for (let j = i + 1; j < paths.length; j++)
|
|
64
|
+
paths[j].delete();
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
combined = next;
|
|
68
|
+
}
|
|
69
|
+
return combined;
|
|
70
|
+
}
|
|
71
|
+
beginBoolean(op) {
|
|
72
|
+
this.pushFrame();
|
|
73
|
+
this.booleanOpStack.push(op);
|
|
74
|
+
}
|
|
75
|
+
endBoolean(getCanvas) {
|
|
76
|
+
const op = this.booleanOpStack.pop() ?? "union";
|
|
77
|
+
const paths = this.popFrame();
|
|
78
|
+
const combined = this.combinePaths(paths, op);
|
|
79
|
+
if (!combined)
|
|
80
|
+
return null;
|
|
81
|
+
this.contributeToPathCollection(combined);
|
|
82
|
+
const canvas = getCanvas();
|
|
83
|
+
const shape = {
|
|
84
|
+
draw: (paint) => { canvas.drawPath(combined, paint); },
|
|
85
|
+
ckPath: combined,
|
|
86
|
+
};
|
|
87
|
+
return shape;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=boolean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean.js","sourceRoot":"","sources":["../../src/shapes/boolean.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { EllipseState } from "@motion-script/core";
|
|
2
|
+
import { BaseShape } from "./base";
|
|
3
|
+
type EllipseGeo = {
|
|
4
|
+
cx: number;
|
|
5
|
+
cy: number;
|
|
6
|
+
halfWidth: number;
|
|
7
|
+
halfHeight: number;
|
|
8
|
+
left: number;
|
|
9
|
+
right: number;
|
|
10
|
+
sweep: number;
|
|
11
|
+
isFullShape: boolean;
|
|
12
|
+
startAngle: number;
|
|
13
|
+
};
|
|
14
|
+
/** Ellipse, optionally a partial arc (`sweep` < 360°) defined via SVG arc commands. */
|
|
15
|
+
export declare class EllipseShape extends BaseShape<EllipseState, EllipseGeo> {
|
|
16
|
+
protected resolveState(state: Partial<EllipseState>): EllipseState;
|
|
17
|
+
protected computeGeometry(): EllipseGeo;
|
|
18
|
+
protected buildSVGPath(geo: EllipseGeo): string;
|
|
19
|
+
protected needsTrim(): boolean;
|
|
20
|
+
protected getTrimRange(): {
|
|
21
|
+
start: number;
|
|
22
|
+
end: number;
|
|
23
|
+
};
|
|
24
|
+
protected computeBounds(geo: EllipseGeo): {
|
|
25
|
+
left: number;
|
|
26
|
+
top: number;
|
|
27
|
+
right: number;
|
|
28
|
+
bottom: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=ellipse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../src/shapes/ellipse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,KAAK,UAAU,GAAG;IACd,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,uFAAuF;AACvF,qBAAa,YAAa,SAAQ,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC;IACjE,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY;IAIlE,SAAS,CAAC,eAAe,IAAI,UAAU;IAiBvC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM;IAgB/C,SAAS,CAAC,SAAS,IAAI,OAAO;IAI9B,SAAS,CAAC,YAAY;;;;IAItB,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU;;;;;;CAI1C"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { withEllipseDescriptor } from "@motion-script/core";
|
|
2
|
+
import { BaseShape } from "./base";
|
|
3
|
+
/** Ellipse, optionally a partial arc (`sweep` < 360°) defined via SVG arc commands. */
|
|
4
|
+
export class EllipseShape extends BaseShape {
|
|
5
|
+
resolveState(state) {
|
|
6
|
+
return withEllipseDescriptor(state);
|
|
7
|
+
}
|
|
8
|
+
computeGeometry() {
|
|
9
|
+
const s = this.fullState;
|
|
10
|
+
const halfWidth = s.width / 2;
|
|
11
|
+
const halfHeight = s.height / 2;
|
|
12
|
+
const left = s.x - halfWidth;
|
|
13
|
+
const right = s.x + halfWidth;
|
|
14
|
+
const sweep = s.sweep ?? 360;
|
|
15
|
+
return {
|
|
16
|
+
cx: s.x, cy: s.y,
|
|
17
|
+
halfWidth, halfHeight,
|
|
18
|
+
left, right,
|
|
19
|
+
sweep,
|
|
20
|
+
isFullShape: Math.abs(sweep) >= 360,
|
|
21
|
+
startAngle: s.startAngle ?? 0,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
buildSVGPath(geo) {
|
|
25
|
+
const { cx, cy, halfWidth, halfHeight, left, right, sweep, isFullShape, startAngle } = geo;
|
|
26
|
+
if (isFullShape) {
|
|
27
|
+
return `M ${left} ${cy} A ${halfWidth} ${halfHeight} 0 1 0 ${right} ${cy} A ${halfWidth} ${halfHeight} 0 1 0 ${left} ${cy} Z`;
|
|
28
|
+
}
|
|
29
|
+
const endAngle = startAngle + sweep;
|
|
30
|
+
const toRad = Math.PI / 180;
|
|
31
|
+
const sx = cx + halfWidth * Math.cos(startAngle * toRad);
|
|
32
|
+
const sy = cy + halfHeight * Math.sin(startAngle * toRad);
|
|
33
|
+
const ex = cx + halfWidth * Math.cos(endAngle * toRad);
|
|
34
|
+
const ey = cy + halfHeight * Math.sin(endAngle * toRad);
|
|
35
|
+
const largeArc = Math.abs(sweep) > 180 ? 1 : 0;
|
|
36
|
+
const sweepFlag = sweep > 0 ? 1 : 0;
|
|
37
|
+
return `M ${sx} ${sy} A ${halfWidth} ${halfHeight} 0 ${largeArc} ${sweepFlag} ${ex} ${ey}`;
|
|
38
|
+
}
|
|
39
|
+
needsTrim() {
|
|
40
|
+
return this.fullState.start !== 0 || this.fullState.end !== 1;
|
|
41
|
+
}
|
|
42
|
+
getTrimRange() {
|
|
43
|
+
return { start: this.fullState.start, end: this.fullState.end };
|
|
44
|
+
}
|
|
45
|
+
computeBounds(geo) {
|
|
46
|
+
const { cx, cy, halfWidth, halfHeight } = geo;
|
|
47
|
+
return { left: cx - halfWidth, top: cy - halfHeight, right: cx + halfWidth, bottom: cy + halfHeight };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=ellipse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ellipse.js","sourceRoot":"","sources":["../../src/shapes/ellipse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { CanvasKit, Canvas, Paint } from "@motion-script/canvaskit";
|
|
2
|
+
import { type FillResolved, type ImageState, type ShadowResolved, type StrokeResolved, withImageDescriptor } from "@motion-script/core";
|
|
3
|
+
import type { WebStorageAdapter } from "../storage-adapter";
|
|
4
|
+
import type { FillHandler } from "../fills/handler";
|
|
5
|
+
import type { ShapeHandler } from "./shape-handler";
|
|
6
|
+
import type { StrokeHandler } from "../stroke/stroke-handler";
|
|
7
|
+
/**
|
|
8
|
+
* Renders an Image node.
|
|
9
|
+
*
|
|
10
|
+
* Stroke / shadow / overlay-fill clipping follows the image's vector
|
|
11
|
+
* silhouette, extracted once at decode time by the asset manager (marching
|
|
12
|
+
* squares on the alpha channel, Douglas–Peucker simplified). That contour
|
|
13
|
+
* lives in image-pixel space; for each draw we transform it through the same
|
|
14
|
+
* matrix the image shader uses (so it lines up with the visible image), then
|
|
15
|
+
* stroke / fill it like any other path.
|
|
16
|
+
*
|
|
17
|
+
* Per-draw pipeline:
|
|
18
|
+
* 1. resolve CKImage and bounds.
|
|
19
|
+
* 2. build the alpha path (cached behind the asset manager).
|
|
20
|
+
* 3. shadows — stroke or fill the alpha path with shadow paint, blurred
|
|
21
|
+
* via a saveLayer image-filter.
|
|
22
|
+
* 4. base image — drawRect with the image shader.
|
|
23
|
+
* 5. overlay fills — fill the alpha path with each overlay fill.
|
|
24
|
+
* 6. strokes — stroke the alpha path with each stroke fill. Skia's stroke
|
|
25
|
+
* primitive gives sharp edges at any weight, real round/miter joins,
|
|
26
|
+
* and dash support out of the box.
|
|
27
|
+
*/
|
|
28
|
+
export declare class ImageNodeRenderer {
|
|
29
|
+
private canvasKit;
|
|
30
|
+
private getCanvas;
|
|
31
|
+
private getPaint;
|
|
32
|
+
private assets;
|
|
33
|
+
private fills;
|
|
34
|
+
private shapeHandler;
|
|
35
|
+
private strokes;
|
|
36
|
+
constructor(canvasKit: CanvasKit, getCanvas: () => Canvas, getPaint: () => Paint, assets: WebStorageAdapter, fills: FillHandler, shapeHandler: ShapeHandler, strokes: StrokeHandler);
|
|
37
|
+
/**
|
|
38
|
+
* Returns `{ img, owned }`. `owned: true` means the caller created the
|
|
39
|
+
* CKImage inline (from raw `state.data`) and must `.delete()` it after
|
|
40
|
+
* drawing. `owned: false` means the storage adapter owns it.
|
|
41
|
+
*/
|
|
42
|
+
private resolveImage;
|
|
43
|
+
private toImageFillResolved;
|
|
44
|
+
/**
|
|
45
|
+
* Build a CKPath from the cached alpha contours, with each vertex pre-
|
|
46
|
+
* transformed from image-pixel space into the destination bounds. The
|
|
47
|
+
* matrix matches the image shader's matrix so the path lines up with
|
|
48
|
+
* the visible image. Caller owns the returned path (.delete() when done).
|
|
49
|
+
* Returns null if no contour is cached.
|
|
50
|
+
*/
|
|
51
|
+
private buildAlphaPath;
|
|
52
|
+
draw(state: ImageState, shadows: ShadowResolved[], overlayFills: FillResolved[], strokes: StrokeResolved[]): void;
|
|
53
|
+
private drawImage;
|
|
54
|
+
private applyFilters;
|
|
55
|
+
/**
|
|
56
|
+
* Drop shadow following the alpha contour. Renders the silhouette filled
|
|
57
|
+
* with the shadow fill into a blurred + translated saveLayer.
|
|
58
|
+
*/
|
|
59
|
+
private drawShadow;
|
|
60
|
+
/** Overlay fills clipped to the alpha contour (or rect if no contour). */
|
|
61
|
+
private drawOverlayFills;
|
|
62
|
+
/** Stroke the alpha contour. Sharp edges at any weight, real joins, dash support. */
|
|
63
|
+
private drawStroke;
|
|
64
|
+
}
|
|
65
|
+
export { withImageDescriptor };
|
|
66
|
+
//# sourceMappingURL=image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/shapes/image.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,SAAS,EACT,MAAM,EACN,KAAK,EAGR,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACH,KAAK,YAAY,EAEjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,mBAAmB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,iBAAiB;IAEtB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,OAAO;gBANP,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,MAAM,EACvB,QAAQ,EAAE,MAAM,KAAK,EACrB,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,WAAW,EAClB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,aAAa;IAGlC;;;;OAIG;IACH,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,mBAAmB;IAW3B;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAiCtB,IAAI,CACA,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,cAAc,EAAE,EACzB,YAAY,EAAE,YAAY,EAAE,EAC5B,OAAO,EAAE,cAAc,EAAE,GAC1B,IAAI;IAiDP,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,YAAY;IASpB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAuClB,0EAA0E;IAC1E,OAAO,CAAC,gBAAgB;IAYxB,qFAAqF;IACrF,OAAO,CAAC,UAAU;CAWrB;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { withImageDescriptor, } from "@motion-script/core";
|
|
2
|
+
import { computeImageMatrix, makeImageShader } from "../fills/image";
|
|
3
|
+
import { ImageFillFilterRegistry } from "../fills/filters/registry";
|
|
4
|
+
/**
|
|
5
|
+
* Renders an Image node.
|
|
6
|
+
*
|
|
7
|
+
* Stroke / shadow / overlay-fill clipping follows the image's vector
|
|
8
|
+
* silhouette, extracted once at decode time by the asset manager (marching
|
|
9
|
+
* squares on the alpha channel, Douglas–Peucker simplified). That contour
|
|
10
|
+
* lives in image-pixel space; for each draw we transform it through the same
|
|
11
|
+
* matrix the image shader uses (so it lines up with the visible image), then
|
|
12
|
+
* stroke / fill it like any other path.
|
|
13
|
+
*
|
|
14
|
+
* Per-draw pipeline:
|
|
15
|
+
* 1. resolve CKImage and bounds.
|
|
16
|
+
* 2. build the alpha path (cached behind the asset manager).
|
|
17
|
+
* 3. shadows — stroke or fill the alpha path with shadow paint, blurred
|
|
18
|
+
* via a saveLayer image-filter.
|
|
19
|
+
* 4. base image — drawRect with the image shader.
|
|
20
|
+
* 5. overlay fills — fill the alpha path with each overlay fill.
|
|
21
|
+
* 6. strokes — stroke the alpha path with each stroke fill. Skia's stroke
|
|
22
|
+
* primitive gives sharp edges at any weight, real round/miter joins,
|
|
23
|
+
* and dash support out of the box.
|
|
24
|
+
*/
|
|
25
|
+
export class ImageNodeRenderer {
|
|
26
|
+
canvasKit;
|
|
27
|
+
getCanvas;
|
|
28
|
+
getPaint;
|
|
29
|
+
assets;
|
|
30
|
+
fills;
|
|
31
|
+
shapeHandler;
|
|
32
|
+
strokes;
|
|
33
|
+
constructor(canvasKit, getCanvas, getPaint, assets, fills, shapeHandler, strokes) {
|
|
34
|
+
this.canvasKit = canvasKit;
|
|
35
|
+
this.getCanvas = getCanvas;
|
|
36
|
+
this.getPaint = getPaint;
|
|
37
|
+
this.assets = assets;
|
|
38
|
+
this.fills = fills;
|
|
39
|
+
this.shapeHandler = shapeHandler;
|
|
40
|
+
this.strokes = strokes;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Returns `{ img, owned }`. `owned: true` means the caller created the
|
|
44
|
+
* CKImage inline (from raw `state.data`) and must `.delete()` it after
|
|
45
|
+
* drawing. `owned: false` means the storage adapter owns it.
|
|
46
|
+
*/
|
|
47
|
+
resolveImage(state) {
|
|
48
|
+
if (state.src) {
|
|
49
|
+
const img = this.assets.getCKImage(state.src);
|
|
50
|
+
return img ? { img, owned: false } : null;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
toImageFillResolved(state) {
|
|
55
|
+
return {
|
|
56
|
+
type: "image",
|
|
57
|
+
src: state.src ?? "",
|
|
58
|
+
mode: state.mode,
|
|
59
|
+
transform: state.transform,
|
|
60
|
+
scaling: state.scaling,
|
|
61
|
+
filters: state.filters,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Build a CKPath from the cached alpha contours, with each vertex pre-
|
|
66
|
+
* transformed from image-pixel space into the destination bounds. The
|
|
67
|
+
* matrix matches the image shader's matrix so the path lines up with
|
|
68
|
+
* the visible image. Caller owns the returned path (.delete() when done).
|
|
69
|
+
* Returns null if no contour is cached.
|
|
70
|
+
*/
|
|
71
|
+
buildAlphaPath(img, state, bounds) {
|
|
72
|
+
if (!state.src)
|
|
73
|
+
return null;
|
|
74
|
+
const contours = this.assets.getAlphaContour?.(state.src);
|
|
75
|
+
if (!contours || contours.length === 0)
|
|
76
|
+
return null;
|
|
77
|
+
const m = computeImageMatrix(img.width(), img.height(), this.toImageFillResolved(state), bounds);
|
|
78
|
+
// m is row-major 3×3: [sx, shx, tx, shy, sy, ty, …] (no perspective).
|
|
79
|
+
const sx = m[0], shx = m[1], tx = m[2];
|
|
80
|
+
const shy = m[3], sy = m[4], ty = m[5];
|
|
81
|
+
// Build an SVG path string; CanvasKit's Path types expose
|
|
82
|
+
// MakeFromSVGString but not the runtime moveTo/lineTo methods.
|
|
83
|
+
const parts = [];
|
|
84
|
+
for (const contour of contours) {
|
|
85
|
+
if (contour.length < 4)
|
|
86
|
+
continue;
|
|
87
|
+
const x0 = sx * contour[0] + shx * contour[1] + tx;
|
|
88
|
+
const y0 = shy * contour[0] + sy * contour[1] + ty;
|
|
89
|
+
parts.push(`M${x0.toFixed(2)},${y0.toFixed(2)}`);
|
|
90
|
+
for (let i = 2; i < contour.length; i += 2) {
|
|
91
|
+
const px = sx * contour[i] + shx * contour[i + 1] + tx;
|
|
92
|
+
const py = shy * contour[i] + sy * contour[i + 1] + ty;
|
|
93
|
+
parts.push(`L${px.toFixed(2)},${py.toFixed(2)}`);
|
|
94
|
+
}
|
|
95
|
+
parts.push("Z");
|
|
96
|
+
}
|
|
97
|
+
if (parts.length === 0)
|
|
98
|
+
return null;
|
|
99
|
+
const path = this.canvasKit.Path.MakeFromSVGString(parts.join(""));
|
|
100
|
+
if (!path)
|
|
101
|
+
return null;
|
|
102
|
+
path.setFillType(this.canvasKit.FillType.EvenOdd);
|
|
103
|
+
return path;
|
|
104
|
+
}
|
|
105
|
+
draw(state, shadows, overlayFills, strokes) {
|
|
106
|
+
const canvas = this.getCanvas();
|
|
107
|
+
const ck = this.canvasKit;
|
|
108
|
+
const resolved = this.resolveImage(state);
|
|
109
|
+
if (!resolved)
|
|
110
|
+
return;
|
|
111
|
+
const { img, owned } = resolved;
|
|
112
|
+
const halfW = state.width / 2;
|
|
113
|
+
const halfH = state.height / 2;
|
|
114
|
+
const bounds = {
|
|
115
|
+
left: state.x - halfW,
|
|
116
|
+
top: state.y - halfH,
|
|
117
|
+
right: state.x + halfW,
|
|
118
|
+
bottom: state.y + halfH,
|
|
119
|
+
};
|
|
120
|
+
const boundsRect = ck.LTRBRect(bounds.left, bounds.top, bounds.right, bounds.bottom);
|
|
121
|
+
const imageFill = this.toImageFillResolved(state);
|
|
122
|
+
// Path may be null if the image is still decoding or has no alpha
|
|
123
|
+
// contour. We fall back to drawing strokes/shadows around the rect
|
|
124
|
+
// bounds in that case (matches Box behaviour).
|
|
125
|
+
const alphaPath = this.buildAlphaPath(img, state, bounds);
|
|
126
|
+
this.shapeHandler.pushBounds(bounds);
|
|
127
|
+
try {
|
|
128
|
+
for (const shadow of shadows) {
|
|
129
|
+
this.drawShadow(canvas, alphaPath, boundsRect, shadow, overlayFills, strokes);
|
|
130
|
+
}
|
|
131
|
+
this.drawImage(canvas, img, imageFill, bounds, boundsRect);
|
|
132
|
+
if (overlayFills.length > 0) {
|
|
133
|
+
this.drawOverlayFills(canvas, alphaPath, boundsRect, overlayFills);
|
|
134
|
+
}
|
|
135
|
+
for (const stroke of strokes) {
|
|
136
|
+
this.drawStroke(canvas, alphaPath, boundsRect, stroke);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
this.shapeHandler.popBounds();
|
|
141
|
+
alphaPath?.delete();
|
|
142
|
+
// Only the `state.data` (inline) path produces a renderer-owned
|
|
143
|
+
// CKImage. The adapter-cached path is released by the adapter
|
|
144
|
+
// when underlying pixels are evicted.
|
|
145
|
+
if (owned)
|
|
146
|
+
img.delete();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
drawImage(canvas, img, imageFill, bounds, boundsRect) {
|
|
150
|
+
const ck = this.canvasKit;
|
|
151
|
+
const paint = this.getPaint();
|
|
152
|
+
paint.setStyle(ck.PaintStyle.Fill);
|
|
153
|
+
paint.setAlphaf(imageFill.opacity ?? 1);
|
|
154
|
+
paint.setBlendMode(ck.BlendMode.SrcOver);
|
|
155
|
+
paint.setShader(makeImageShader(img, imageFill, ck, bounds));
|
|
156
|
+
this.applyFilters(paint, imageFill);
|
|
157
|
+
canvas.drawRect(boundsRect, paint);
|
|
158
|
+
paint.setShader(null);
|
|
159
|
+
paint.setImageFilter(null);
|
|
160
|
+
paint.setAlphaf(1);
|
|
161
|
+
}
|
|
162
|
+
applyFilters(paint, fill) {
|
|
163
|
+
if (!fill.filters || fill.filters.length === 0) {
|
|
164
|
+
paint.setImageFilter(null);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const composed = ImageFillFilterRegistry.compose(fill.filters, this.canvasKit);
|
|
168
|
+
paint.setImageFilter(composed);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Drop shadow following the alpha contour. Renders the silhouette filled
|
|
172
|
+
* with the shadow fill into a blurred + translated saveLayer.
|
|
173
|
+
*/
|
|
174
|
+
drawShadow(canvas, alphaPath, boundsRect, shadow, _overlayFills, _strokes) {
|
|
175
|
+
const ck = this.canvasKit;
|
|
176
|
+
const dx = shadow.dx ?? 0;
|
|
177
|
+
const dy = shadow.dy ?? 0;
|
|
178
|
+
const opacity = shadow.fill.opacity !== undefined ? shadow.fill.opacity : 1;
|
|
179
|
+
const layerPaint = new ck.Paint();
|
|
180
|
+
layerPaint.setAlphaf(opacity);
|
|
181
|
+
if (shadow.blur > 0) {
|
|
182
|
+
const sigma = shadow.blur / 2;
|
|
183
|
+
layerPaint.setImageFilter(ck.ImageFilter.MakeBlur(sigma, sigma, ck.TileMode.Decal, null));
|
|
184
|
+
}
|
|
185
|
+
canvas.save();
|
|
186
|
+
// Scene coords are Y-up; the canvas is Y-down, so negate dy to keep a
|
|
187
|
+
// positive dy nudging the shadow upward.
|
|
188
|
+
canvas.translate(dx, -dy);
|
|
189
|
+
canvas.saveLayer(layerPaint);
|
|
190
|
+
const shape = alphaPath
|
|
191
|
+
? { draw: (p) => canvas.drawPath(alphaPath, p), ckPath: alphaPath }
|
|
192
|
+
: { draw: (p) => canvas.drawRect(boundsRect, p) };
|
|
193
|
+
this.fills.applyFills([{ ...shadow.fill, opacity: 1 }], [shape]);
|
|
194
|
+
canvas.restore();
|
|
195
|
+
canvas.restore();
|
|
196
|
+
layerPaint.delete();
|
|
197
|
+
}
|
|
198
|
+
/** Overlay fills clipped to the alpha contour (or rect if no contour). */
|
|
199
|
+
drawOverlayFills(canvas, alphaPath, boundsRect, overlayFills) {
|
|
200
|
+
const shape = alphaPath
|
|
201
|
+
? { draw: (p) => canvas.drawPath(alphaPath, p), ckPath: alphaPath }
|
|
202
|
+
: { draw: (p) => canvas.drawRect(boundsRect, p) };
|
|
203
|
+
this.fills.applyFills(overlayFills, [shape]);
|
|
204
|
+
}
|
|
205
|
+
/** Stroke the alpha contour. Sharp edges at any weight, real joins, dash support. */
|
|
206
|
+
drawStroke(canvas, alphaPath, boundsRect, stroke) {
|
|
207
|
+
const shape = alphaPath
|
|
208
|
+
? { draw: (p) => canvas.drawPath(alphaPath, p), ckPath: alphaPath }
|
|
209
|
+
: { draw: (p) => canvas.drawRect(boundsRect, p) };
|
|
210
|
+
this.strokes.applyStrokes([stroke], [shape]);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
export { withImageDescriptor };
|
|
214
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/shapes/image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { CanvasKit, Canvas, Paint, Path as CKPath, TypefaceFontProvider } from "@motion-script/canvaskit";
|
|
2
|
+
import { BooleanOperation, EllipseState, LineState, MaskApplyLayer, MaskOptions, PathState, PolygonState, PolygramState, RectState, ShadowResolved, TextState } from "@motion-script/core";
|
|
3
|
+
export interface CurrentShape {
|
|
4
|
+
draw: (paint: Paint) => void;
|
|
5
|
+
ckPath?: CKPath;
|
|
6
|
+
bounds?: {
|
|
7
|
+
left: number;
|
|
8
|
+
top: number;
|
|
9
|
+
right: number;
|
|
10
|
+
bottom: number;
|
|
11
|
+
};
|
|
12
|
+
isText?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare class ShapeHandler {
|
|
15
|
+
private canvasKit;
|
|
16
|
+
private getCanvas;
|
|
17
|
+
private getPaint;
|
|
18
|
+
private fontMgr;
|
|
19
|
+
shapes: CurrentShape[];
|
|
20
|
+
paintApplied: boolean;
|
|
21
|
+
private pendingShadows;
|
|
22
|
+
private boolean;
|
|
23
|
+
private mask;
|
|
24
|
+
private boundsOverride;
|
|
25
|
+
private shapeCache;
|
|
26
|
+
private currentNodeId;
|
|
27
|
+
private shapeIndex;
|
|
28
|
+
private _cachedBounds;
|
|
29
|
+
private _boundsDirty;
|
|
30
|
+
constructor(canvasKit: CanvasKit, getCanvas: () => Canvas, getPaint: () => Paint, fontMgr: TypefaceFontProvider);
|
|
31
|
+
beginNode(nodeId: string): void;
|
|
32
|
+
reset(): void;
|
|
33
|
+
storePendingShadows(shadows: ShadowResolved[]): void;
|
|
34
|
+
takePendingShadows(): ShadowResolved[] | null;
|
|
35
|
+
dispose(): void;
|
|
36
|
+
isCollectingPaths(): boolean;
|
|
37
|
+
pushBounds(b: {
|
|
38
|
+
left: number;
|
|
39
|
+
top: number;
|
|
40
|
+
right: number;
|
|
41
|
+
bottom: number;
|
|
42
|
+
}): void;
|
|
43
|
+
popBounds(): void;
|
|
44
|
+
getShapeBounds(): {
|
|
45
|
+
left: number;
|
|
46
|
+
top: number;
|
|
47
|
+
right: number;
|
|
48
|
+
bottom: number;
|
|
49
|
+
} | null;
|
|
50
|
+
private addShape;
|
|
51
|
+
rect(state: Partial<RectState>): void;
|
|
52
|
+
ellipse(state: Partial<EllipseState>): void;
|
|
53
|
+
path(state: Partial<PathState>): void;
|
|
54
|
+
line(state: Partial<LineState>): void;
|
|
55
|
+
polygon(state: Partial<PolygonState>): void;
|
|
56
|
+
polygram(state: Partial<PolygramState>): void;
|
|
57
|
+
text(state: Partial<TextState>): void;
|
|
58
|
+
cut(): void;
|
|
59
|
+
unionStrokeShape(): CurrentShape | null;
|
|
60
|
+
beginBoolean(op: BooleanOperation): void;
|
|
61
|
+
endBoolean(): void;
|
|
62
|
+
beginMask(options?: MaskOptions): void;
|
|
63
|
+
applyMask(): void;
|
|
64
|
+
endMask(): void;
|
|
65
|
+
getMaskApply(): Set<MaskApplyLayer> | null;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shapes/index.ts"],"names":[],"mappings":"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"}
|