@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,111 @@
|
|
|
1
|
+
import { isUniformBorderRadius, isZeroBorderRadius, resolveBorderRadius, withRectDescriptor, } from "@motion-script/core";
|
|
2
|
+
import { BaseShape } from "./base";
|
|
3
|
+
function roundedRectToSvg(l, t, r, b, tl, tr, br, bl) {
|
|
4
|
+
return [
|
|
5
|
+
`M ${l + tl} ${t}`,
|
|
6
|
+
`L ${r - tr} ${t}`,
|
|
7
|
+
tr > 0 ? `A ${tr} ${tr} 0 0 1 ${r} ${t + tr}` : "",
|
|
8
|
+
`L ${r} ${b - br}`,
|
|
9
|
+
br > 0 ? `A ${br} ${br} 0 0 1 ${r - br} ${b}` : "",
|
|
10
|
+
`L ${l + bl} ${b}`,
|
|
11
|
+
bl > 0 ? `A ${bl} ${bl} 0 0 1 ${l} ${b - bl}` : "",
|
|
12
|
+
`L ${l} ${t + tl}`,
|
|
13
|
+
tl > 0 ? `A ${tl} ${tl} 0 0 1 ${l + tl} ${t}` : "",
|
|
14
|
+
"Z",
|
|
15
|
+
].filter(Boolean).join(" ");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Rect with optional per-corner radii. Radii are scaled down uniformly when
|
|
19
|
+
* they'd overlap (sum exceeds the side length) to avoid self-intersecting
|
|
20
|
+
* geometry. Isolated, untrimmed rects skip the SVG-path route entirely and
|
|
21
|
+
* draw/clip via `drawRect`/`drawRRect` for cheaper rendering and crisper edges.
|
|
22
|
+
*/
|
|
23
|
+
export class RectShape extends BaseShape {
|
|
24
|
+
resolveState(state) {
|
|
25
|
+
return withRectDescriptor(state);
|
|
26
|
+
}
|
|
27
|
+
computeGeometry() {
|
|
28
|
+
const s = this.fullState;
|
|
29
|
+
const halfWidth = s.width / 2;
|
|
30
|
+
const halfHeight = s.height / 2;
|
|
31
|
+
const left = s.x - halfWidth;
|
|
32
|
+
const top = s.y - halfHeight;
|
|
33
|
+
const right = s.x + halfWidth;
|
|
34
|
+
const bottom = s.y + halfHeight;
|
|
35
|
+
const rawBr = resolveBorderRadius(s.borderRadius);
|
|
36
|
+
let tl = Math.max(0, rawBr.topLeft);
|
|
37
|
+
let tr = Math.max(0, rawBr.topRight);
|
|
38
|
+
let br = Math.max(0, rawBr.bottomRight);
|
|
39
|
+
let bl = Math.max(0, rawBr.bottomLeft);
|
|
40
|
+
const w = s.width;
|
|
41
|
+
const h = s.height;
|
|
42
|
+
const scaleTop = tl + tr > 0 ? Math.min(1, w / (tl + tr)) : 1;
|
|
43
|
+
const scaleBottom = bl + br > 0 ? Math.min(1, w / (bl + br)) : 1;
|
|
44
|
+
const scaleLeft = tl + bl > 0 ? Math.min(1, h / (tl + bl)) : 1;
|
|
45
|
+
const scaleRight = tr + br > 0 ? Math.min(1, h / (tr + br)) : 1;
|
|
46
|
+
const scale = Math.min(scaleTop, scaleBottom, scaleLeft, scaleRight);
|
|
47
|
+
tl *= scale;
|
|
48
|
+
tr *= scale;
|
|
49
|
+
br *= scale;
|
|
50
|
+
bl *= scale;
|
|
51
|
+
const resolved = { topLeft: tl, topRight: tr, bottomRight: br, bottomLeft: bl };
|
|
52
|
+
return {
|
|
53
|
+
left, top, right, bottom,
|
|
54
|
+
tl, tr, br, bl,
|
|
55
|
+
isZero: isZeroBorderRadius(resolved),
|
|
56
|
+
isUniform: isUniformBorderRadius(resolved),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
buildSVGPath(geo) {
|
|
60
|
+
const { left, top, right, bottom, tl, tr, br, bl, isZero, isUniform } = geo;
|
|
61
|
+
if (isZero) {
|
|
62
|
+
return `M ${left} ${top} L ${right} ${top} L ${right} ${bottom} L ${left} ${bottom} Z`;
|
|
63
|
+
}
|
|
64
|
+
if (isUniform) {
|
|
65
|
+
return roundedRectToSvg(left, top, right, bottom, tl, tl, tl, tl);
|
|
66
|
+
}
|
|
67
|
+
return roundedRectToSvg(left, top, right, bottom, tl, tr, br, bl);
|
|
68
|
+
}
|
|
69
|
+
needsTrim() {
|
|
70
|
+
return this.fullState.start !== 0 || this.fullState.end !== 1;
|
|
71
|
+
}
|
|
72
|
+
getTrimRange() {
|
|
73
|
+
return { start: this.fullState.start, end: this.fullState.end };
|
|
74
|
+
}
|
|
75
|
+
computeBounds(geo) {
|
|
76
|
+
return { left: geo.left, top: geo.top, right: geo.right, bottom: geo.bottom };
|
|
77
|
+
}
|
|
78
|
+
draw(paint, isolated) {
|
|
79
|
+
const geo = this.geometry;
|
|
80
|
+
if (isolated && !this.needsTrim()) {
|
|
81
|
+
const ck = this.canvasKit;
|
|
82
|
+
const ltrb = ck.LTRBRect(geo.left, geo.top, geo.right, geo.bottom);
|
|
83
|
+
if (geo.isZero) {
|
|
84
|
+
this.canvas.drawRect(ltrb, paint);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (geo.isUniform) {
|
|
88
|
+
this.canvas.drawRRect(ck.RRectXY(ltrb, geo.tl, geo.tl), paint);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
super.draw(paint, isolated);
|
|
93
|
+
}
|
|
94
|
+
clip(isolated) {
|
|
95
|
+
const geo = this.geometry;
|
|
96
|
+
const ck = this.canvasKit;
|
|
97
|
+
if (isolated && !this.needsTrim()) {
|
|
98
|
+
const ltrb = ck.LTRBRect(geo.left, geo.top, geo.right, geo.bottom);
|
|
99
|
+
if (geo.isZero) {
|
|
100
|
+
this.canvas.clipRect(ltrb, ck.ClipOp.Intersect, true);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (geo.isUniform) {
|
|
104
|
+
this.canvas.clipRRect(ck.RRectXY(ltrb, geo.tl, geo.tl), ck.ClipOp.Intersect, true);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
super.clip(isolated);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=rect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rect.js","sourceRoot":"","sources":["../../src/shapes/rect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CanvasKit, Font, TypefaceFontProvider } from "@motion-script/canvaskit";
|
|
2
|
+
import { RichTextState, ResolvedTextSpan } from "@motion-script/core";
|
|
3
|
+
import { type ShapedRun } from "./paragraph-layout";
|
|
4
|
+
/**
|
|
5
|
+
* A shaped run ready to draw, paired with the span that styled it so the
|
|
6
|
+
* caller can apply that span's resolved fills/strokes.
|
|
7
|
+
*/
|
|
8
|
+
export interface LaidOutRun extends ShapedRun {
|
|
9
|
+
span: ResolvedTextSpan;
|
|
10
|
+
}
|
|
11
|
+
export interface RichTextLayout {
|
|
12
|
+
runs: LaidOutRun[];
|
|
13
|
+
bounds: {
|
|
14
|
+
left: number;
|
|
15
|
+
top: number;
|
|
16
|
+
right: number;
|
|
17
|
+
bottom: number;
|
|
18
|
+
};
|
|
19
|
+
/** Fonts created during layout. Caller must delete() each after drawing. */
|
|
20
|
+
fonts: Font[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Lay out rich text via ParagraphBuilder (line-breaking, alignment, per-span
|
|
24
|
+
* sizing/spacing) and return shaped glyph runs we draw with our own paints, so
|
|
25
|
+
* per-span gradient/image fills and glyph strokes keep working.
|
|
26
|
+
*/
|
|
27
|
+
export declare function layoutRichText(canvasKit: CanvasKit, fontMgr: TypefaceFontProvider, state: RichTextState): RichTextLayout;
|
|
28
|
+
//# sourceMappingURL=richtext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"richtext.d.ts","sourceRoot":"","sources":["../../src/shapes/richtext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAA0C,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE5F;;;GAGG;AACH,MAAM,WAAW,UAAW,SAAQ,SAAS;IACzC,IAAI,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,4EAA4E;IAC5E,KAAK,EAAE,IAAI,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC1B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,aAAa,GACrB,cAAc,CA4BhB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { layoutParagraph } from "./paragraph-layout";
|
|
2
|
+
/**
|
|
3
|
+
* Lay out rich text via ParagraphBuilder (line-breaking, alignment, per-span
|
|
4
|
+
* sizing/spacing) and return shaped glyph runs we draw with our own paints, so
|
|
5
|
+
* per-span gradient/image fills and glyph strokes keep working.
|
|
6
|
+
*/
|
|
7
|
+
export function layoutRichText(canvasKit, fontMgr, state) {
|
|
8
|
+
const { spans, lineHeight, align, width } = state;
|
|
9
|
+
const segments = spans.map(s => ({
|
|
10
|
+
text: s.text,
|
|
11
|
+
fontFamily: s.fontFamily,
|
|
12
|
+
fontSize: s.fontSize,
|
|
13
|
+
fontWeight: s.fontWeight,
|
|
14
|
+
fontStyle: s.fontStyle,
|
|
15
|
+
letterSpacing: s.letterSpacing,
|
|
16
|
+
}));
|
|
17
|
+
const layout = layoutParagraph(canvasKit, fontMgr, segments, {
|
|
18
|
+
align,
|
|
19
|
+
lineHeight,
|
|
20
|
+
// RichText boxes are hug/explicit; wrap only when a finite width exists.
|
|
21
|
+
maxWidth: width > 0 ? width : Infinity,
|
|
22
|
+
// RichText draws in the node's centered local space (origin 0,0).
|
|
23
|
+
originX: 0,
|
|
24
|
+
originY: 0,
|
|
25
|
+
});
|
|
26
|
+
const runs = layout.runs.map(run => ({
|
|
27
|
+
...run,
|
|
28
|
+
span: spans[run.segmentIndex],
|
|
29
|
+
}));
|
|
30
|
+
return { runs, bounds: layout.bounds, fonts: layout.fonts };
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=richtext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"richtext.js","sourceRoot":"","sources":["../../src/shapes/richtext.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAyC,MAAM,oBAAoB,CAAC;AAiB5F;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC1B,SAAoB,EACpB,OAA6B,EAC7B,KAAoB;IAEpB,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAElD,MAAM,QAAQ,GAAuB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,aAAa,EAAE,CAAC,CAAC,aAAa;KACjC,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE;QACzD,KAAK;QACL,UAAU;QACV,yEAAyE;QACzE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;QACtC,kEAAkE;QAClE,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;KACb,CAAC,CAAC;IAEH,MAAM,IAAI,GAAiB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/C,GAAG,GAAG;QACN,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;KAChC,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
/**
|
|
4
|
+
* A drawable produced by any shape kind (path-backed or text). `ckPath` is
|
|
5
|
+
* absent for text (canvaskit-wasm exposes no glyph paths) and optional
|
|
6
|
+
* `bounds`/`isText` let fills/strokes/bounds logic special-case those shapes.
|
|
7
|
+
*/
|
|
8
|
+
export interface CurrentShape {
|
|
9
|
+
draw: (paint: Paint) => void;
|
|
10
|
+
ckPath?: CKPath;
|
|
11
|
+
bounds?: {
|
|
12
|
+
left: number;
|
|
13
|
+
top: number;
|
|
14
|
+
right: number;
|
|
15
|
+
bottom: number;
|
|
16
|
+
};
|
|
17
|
+
isText?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Per-frame collector and compositor for a node's shapes. Accumulates path
|
|
21
|
+
* primitives and text, resolves bounds for fill/stroke shaders, supports
|
|
22
|
+
* cut/boolean/mask compositing that collapse `shapes` into a single drawable,
|
|
23
|
+
* and caches `BaseShape` instances across frames (keyed by node id + index)
|
|
24
|
+
* so `ckPath`s survive when input state is unchanged or only trim moved.
|
|
25
|
+
*/
|
|
26
|
+
export declare class ShapeHandler {
|
|
27
|
+
private canvasKit;
|
|
28
|
+
private getCanvas;
|
|
29
|
+
private getPaint;
|
|
30
|
+
private fontMgr;
|
|
31
|
+
shapes: CurrentShape[];
|
|
32
|
+
paintApplied: boolean;
|
|
33
|
+
private pendingShadows;
|
|
34
|
+
private boolean;
|
|
35
|
+
private mask;
|
|
36
|
+
private boundsOverride;
|
|
37
|
+
private shapeCache;
|
|
38
|
+
private currentNodeId;
|
|
39
|
+
private shapeIndex;
|
|
40
|
+
private _cachedBounds;
|
|
41
|
+
private _boundsDirty;
|
|
42
|
+
constructor(canvasKit: CanvasKit, getCanvas: () => Canvas, getPaint: () => Paint, fontMgr: TypefaceFontProvider);
|
|
43
|
+
beginNode(nodeId: string): void;
|
|
44
|
+
reset(): void;
|
|
45
|
+
storePendingShadows(shadows: ShadowResolved[]): void;
|
|
46
|
+
takePendingShadows(): ShadowResolved[] | null;
|
|
47
|
+
dispose(): void;
|
|
48
|
+
isCollectingPaths(): boolean;
|
|
49
|
+
pushBounds(b: {
|
|
50
|
+
left: number;
|
|
51
|
+
top: number;
|
|
52
|
+
right: number;
|
|
53
|
+
bottom: number;
|
|
54
|
+
}): void;
|
|
55
|
+
popBounds(): void;
|
|
56
|
+
getShapeBounds(): {
|
|
57
|
+
left: number;
|
|
58
|
+
top: number;
|
|
59
|
+
right: number;
|
|
60
|
+
bottom: number;
|
|
61
|
+
} | null;
|
|
62
|
+
private addShape;
|
|
63
|
+
rect(state: Partial<RectState>): void;
|
|
64
|
+
ellipse(state: Partial<EllipseState>): void;
|
|
65
|
+
path(state: Partial<PathState>): void;
|
|
66
|
+
line(state: Partial<LineState>): void;
|
|
67
|
+
polygon(state: Partial<PolygonState>): void;
|
|
68
|
+
polygram(state: Partial<PolygramState>): void;
|
|
69
|
+
text(state: Partial<TextState>): void;
|
|
70
|
+
cut(): void;
|
|
71
|
+
unionStrokeShape(): CurrentShape | null;
|
|
72
|
+
beginBoolean(op: BooleanOperation): void;
|
|
73
|
+
endBoolean(): void;
|
|
74
|
+
beginMask(options?: MaskOptions): void;
|
|
75
|
+
applyMask(): void;
|
|
76
|
+
endMask(): void;
|
|
77
|
+
getMaskApply(): Set<MaskApplyLayer> | null;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=shape-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shape-handler.d.ts","sourceRoot":"","sources":["../../src/shapes/shape-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { RectShape } from "./rect";
|
|
2
|
+
import { EllipseShape } from "./ellipse";
|
|
3
|
+
import { PathShape } from "./path";
|
|
4
|
+
import { LineShape } from "./line";
|
|
5
|
+
import { buildText } from "./text";
|
|
6
|
+
import { PolygonShape } from "./polygon";
|
|
7
|
+
import { PolygramShape } from "./polygram";
|
|
8
|
+
import { BooleanHandler } from "./boolean";
|
|
9
|
+
import { MaskHandler } from "./mask";
|
|
10
|
+
// Shallow equality check for plain state objects. Handles the common case where
|
|
11
|
+
// all values are primitives or the same object reference (e.g. arrays held stable).
|
|
12
|
+
function shallowEqual(a, b) {
|
|
13
|
+
const keysA = Object.keys(a);
|
|
14
|
+
if (keysA.length !== Object.keys(b).length)
|
|
15
|
+
return false;
|
|
16
|
+
for (const k of keysA) {
|
|
17
|
+
if (a[k] !== b[k])
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
function shallowEqualExcluding(a, b, ...exclude) {
|
|
23
|
+
const excSet = new Set(exclude);
|
|
24
|
+
const keysA = Object.keys(a).filter(k => !excSet.has(k));
|
|
25
|
+
const keysB = Object.keys(b).filter(k => !excSet.has(k));
|
|
26
|
+
if (keysA.length !== keysB.length)
|
|
27
|
+
return false;
|
|
28
|
+
for (const k of keysA) {
|
|
29
|
+
if (a[k] !== b[k])
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Per-frame collector and compositor for a node's shapes. Accumulates path
|
|
36
|
+
* primitives and text, resolves bounds for fill/stroke shaders, supports
|
|
37
|
+
* cut/boolean/mask compositing that collapse `shapes` into a single drawable,
|
|
38
|
+
* and caches `BaseShape` instances across frames (keyed by node id + index)
|
|
39
|
+
* so `ckPath`s survive when input state is unchanged or only trim moved.
|
|
40
|
+
*/
|
|
41
|
+
export class ShapeHandler {
|
|
42
|
+
canvasKit;
|
|
43
|
+
getCanvas;
|
|
44
|
+
getPaint;
|
|
45
|
+
fontMgr;
|
|
46
|
+
shapes = [];
|
|
47
|
+
paintApplied = false;
|
|
48
|
+
pendingShadows = null;
|
|
49
|
+
boolean;
|
|
50
|
+
mask;
|
|
51
|
+
// Bounds override stack. Callers like the image-node renderer push their
|
|
52
|
+
// own rect so fills that depend on shape bounds (gradients, image-shaders)
|
|
53
|
+
// resolve correctly even though no path lives in `shapes`.
|
|
54
|
+
boundsOverride = [];
|
|
55
|
+
// Shape instance cache: survives reset() so ckPaths persist across frames.
|
|
56
|
+
// Key format: "<nodeId>:<shapeIndex>"
|
|
57
|
+
shapeCache = new Map();
|
|
58
|
+
currentNodeId = "";
|
|
59
|
+
shapeIndex = 0;
|
|
60
|
+
// Cached union bounds for the current shape set, cleared when shapes change.
|
|
61
|
+
_cachedBounds = null;
|
|
62
|
+
_boundsDirty = true;
|
|
63
|
+
constructor(canvasKit, getCanvas, getPaint, fontMgr) {
|
|
64
|
+
this.canvasKit = canvasKit;
|
|
65
|
+
this.getCanvas = getCanvas;
|
|
66
|
+
this.getPaint = getPaint;
|
|
67
|
+
this.fontMgr = fontMgr;
|
|
68
|
+
this.boolean = new BooleanHandler(canvasKit, getCanvas);
|
|
69
|
+
this.mask = new MaskHandler(canvasKit, getCanvas, this.boolean);
|
|
70
|
+
}
|
|
71
|
+
beginNode(nodeId) {
|
|
72
|
+
this.currentNodeId = nodeId;
|
|
73
|
+
this.shapeIndex = 0;
|
|
74
|
+
}
|
|
75
|
+
reset() {
|
|
76
|
+
this.shapes = [];
|
|
77
|
+
this.paintApplied = false;
|
|
78
|
+
this.pendingShadows = null;
|
|
79
|
+
this._boundsDirty = true;
|
|
80
|
+
this._cachedBounds = null;
|
|
81
|
+
}
|
|
82
|
+
storePendingShadows(shadows) {
|
|
83
|
+
this.pendingShadows = shadows.length > 0 ? shadows : null;
|
|
84
|
+
}
|
|
85
|
+
takePendingShadows() {
|
|
86
|
+
const s = this.pendingShadows;
|
|
87
|
+
this.pendingShadows = null;
|
|
88
|
+
return s;
|
|
89
|
+
}
|
|
90
|
+
dispose() {
|
|
91
|
+
this.shapes = [];
|
|
92
|
+
for (const entry of this.shapeCache.values()) {
|
|
93
|
+
entry.shape.deletePaths();
|
|
94
|
+
}
|
|
95
|
+
this.shapeCache.clear();
|
|
96
|
+
this.boolean.dispose();
|
|
97
|
+
this.mask.dispose();
|
|
98
|
+
}
|
|
99
|
+
isCollectingPaths() {
|
|
100
|
+
return this.boolean.isCollecting();
|
|
101
|
+
}
|
|
102
|
+
pushBounds(b) {
|
|
103
|
+
this.boundsOverride.push(b);
|
|
104
|
+
}
|
|
105
|
+
popBounds() {
|
|
106
|
+
this.boundsOverride.pop();
|
|
107
|
+
}
|
|
108
|
+
getShapeBounds() {
|
|
109
|
+
if (this.boundsOverride.length > 0) {
|
|
110
|
+
return this.boundsOverride[this.boundsOverride.length - 1];
|
|
111
|
+
}
|
|
112
|
+
if (!this._boundsDirty && this._cachedBounds !== null) {
|
|
113
|
+
return this._cachedBounds;
|
|
114
|
+
}
|
|
115
|
+
let left = Infinity, top = Infinity, right = -Infinity, bottom = -Infinity;
|
|
116
|
+
for (const shape of this.shapes) {
|
|
117
|
+
if (shape.ckPath) {
|
|
118
|
+
const b = shape.ckPath.getBounds();
|
|
119
|
+
if (b[0] < left)
|
|
120
|
+
left = b[0];
|
|
121
|
+
if (b[1] < top)
|
|
122
|
+
top = b[1];
|
|
123
|
+
if (b[2] > right)
|
|
124
|
+
right = b[2];
|
|
125
|
+
if (b[3] > bottom)
|
|
126
|
+
bottom = b[3];
|
|
127
|
+
}
|
|
128
|
+
else if (shape.bounds) {
|
|
129
|
+
if (shape.bounds.left < left)
|
|
130
|
+
left = shape.bounds.left;
|
|
131
|
+
if (shape.bounds.top < top)
|
|
132
|
+
top = shape.bounds.top;
|
|
133
|
+
if (shape.bounds.right > right)
|
|
134
|
+
right = shape.bounds.right;
|
|
135
|
+
if (shape.bounds.bottom > bottom)
|
|
136
|
+
bottom = shape.bounds.bottom;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
this._boundsDirty = false;
|
|
140
|
+
this._cachedBounds = isFinite(left) ? { left, top, right, bottom } : null;
|
|
141
|
+
return this._cachedBounds;
|
|
142
|
+
}
|
|
143
|
+
addShape(newShape) {
|
|
144
|
+
this._boundsDirty = true;
|
|
145
|
+
const isolated = !this.boolean.isCollecting();
|
|
146
|
+
// Try to reuse a cached shape if we have a stable node ID.
|
|
147
|
+
let shape = newShape;
|
|
148
|
+
if (this.currentNodeId) {
|
|
149
|
+
const key = `${this.currentNodeId}:${this.shapeIndex++}`;
|
|
150
|
+
const entry = this.shapeCache.get(key);
|
|
151
|
+
if (entry) {
|
|
152
|
+
const cached = entry.shape;
|
|
153
|
+
const newState = newShape.inputState;
|
|
154
|
+
const oldState = cached.inputState;
|
|
155
|
+
if (shallowEqual(newState, oldState)) {
|
|
156
|
+
// Exact match — reuse the cached shape (with its ckPath intact).
|
|
157
|
+
shape = cached;
|
|
158
|
+
}
|
|
159
|
+
else if (cached.hasTrim() && newShape.hasTrim()
|
|
160
|
+
&& shallowEqualExcluding(newState, oldState, 'start', 'end')) {
|
|
161
|
+
// Only trim range changed — re-trim from the cached base path.
|
|
162
|
+
const { start, end } = newShape.trimRange();
|
|
163
|
+
if (entry.trimStart !== start || entry.trimEnd !== end) {
|
|
164
|
+
cached.retrim(start, end);
|
|
165
|
+
entry.trimStart = start;
|
|
166
|
+
entry.trimEnd = end;
|
|
167
|
+
}
|
|
168
|
+
cached.inputState = newShape.inputState;
|
|
169
|
+
shape = cached;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
// State mismatch — evict old entry and use new shape.
|
|
173
|
+
cached.deletePaths();
|
|
174
|
+
const tr = newShape.hasTrim() ? newShape.trimRange() : { start: 0, end: 1 };
|
|
175
|
+
this.shapeCache.set(key, { shape: newShape, trimStart: tr.start, trimEnd: tr.end });
|
|
176
|
+
shape = newShape;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
const tr = newShape.hasTrim() ? newShape.trimRange() : { start: 0, end: 1 };
|
|
181
|
+
this.shapeCache.set(key, { shape: newShape, trimStart: tr.start, trimEnd: tr.end });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (!isolated) {
|
|
185
|
+
shape.ensurePath();
|
|
186
|
+
if (shape.ckPath)
|
|
187
|
+
this.boolean.contributeToPathCollection(shape.ckPath);
|
|
188
|
+
}
|
|
189
|
+
this.shapes.push(shape.toCurrentShape(isolated));
|
|
190
|
+
}
|
|
191
|
+
rect(state) {
|
|
192
|
+
this.addShape(new RectShape(this.canvasKit, this.getCanvas(), state));
|
|
193
|
+
}
|
|
194
|
+
ellipse(state) {
|
|
195
|
+
this.addShape(new EllipseShape(this.canvasKit, this.getCanvas(), state));
|
|
196
|
+
}
|
|
197
|
+
path(state) {
|
|
198
|
+
this.addShape(new PathShape(this.canvasKit, this.getCanvas(), state));
|
|
199
|
+
}
|
|
200
|
+
line(state) {
|
|
201
|
+
this.addShape(new LineShape(this.canvasKit, this.getCanvas(), state));
|
|
202
|
+
}
|
|
203
|
+
polygon(state) {
|
|
204
|
+
this.addShape(new PolygonShape(this.canvasKit, this.getCanvas(), state));
|
|
205
|
+
}
|
|
206
|
+
polygram(state) {
|
|
207
|
+
this.addShape(new PolygramShape(this.canvasKit, this.getCanvas(), state));
|
|
208
|
+
}
|
|
209
|
+
text(state) {
|
|
210
|
+
this._boundsDirty = true;
|
|
211
|
+
const shape = buildText(this.canvasKit, this.getCanvas(), this.fontMgr, state);
|
|
212
|
+
this.shapes.push(shape);
|
|
213
|
+
}
|
|
214
|
+
// ─── Cut ───────────────────────────────────────────────────────────────────
|
|
215
|
+
// Use the most-recently drawn shape as a cutter: union all the shapes before
|
|
216
|
+
// it, then subtract that last shape, so only it punches a hole. The combined
|
|
217
|
+
// path replaces `shapes`, so anything drawn afterward stacks onto it and the
|
|
218
|
+
// whole thing paints as one surface — a single gradient resolves across all
|
|
219
|
+
// of it. Shapes without a ckPath (text) are skipped.
|
|
220
|
+
cut() {
|
|
221
|
+
const withPaths = this.shapes.filter(s => s.ckPath);
|
|
222
|
+
if (withPaths.length === 0)
|
|
223
|
+
return;
|
|
224
|
+
// The last shape is the cutter; everything before it is the base.
|
|
225
|
+
const cutter = withPaths[withPaths.length - 1].ckPath.copy();
|
|
226
|
+
const baseShapes = withPaths.slice(0, -1);
|
|
227
|
+
let combined;
|
|
228
|
+
if (baseShapes.length === 0) {
|
|
229
|
+
// Nothing to cut from — the lone shape stays as-is.
|
|
230
|
+
cutter.delete();
|
|
231
|
+
combined = withPaths[0].ckPath.copy();
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
const base = this.boolean.combinePaths(baseShapes.map(s => s.ckPath.copy()), "union");
|
|
235
|
+
if (!base) {
|
|
236
|
+
cutter.delete();
|
|
237
|
+
combined = null;
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
combined = this.boolean.combinePaths([base, cutter], "subtract");
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// combinePaths consumed/deleted the copies; now drop the originals.
|
|
244
|
+
for (const shape of this.shapes)
|
|
245
|
+
shape.ckPath?.delete();
|
|
246
|
+
this.shapes = [];
|
|
247
|
+
this.paintApplied = false;
|
|
248
|
+
if (!combined)
|
|
249
|
+
return;
|
|
250
|
+
const canvas = this.getCanvas();
|
|
251
|
+
this.shapes.push({
|
|
252
|
+
draw: (paint) => { canvas.drawPath(combined, paint); },
|
|
253
|
+
ckPath: combined,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
// Build a single shape from the union of all accumulated path shapes, so a
|
|
257
|
+
// stroke follows only the outer boundary with no seams where shapes overlap.
|
|
258
|
+
// Returns null when there are fewer than two path shapes (caller strokes the
|
|
259
|
+
// shapes directly) or text is involved (no path to union). The caller owns
|
|
260
|
+
// the returned shape's ckPath and must delete() it. Does not mutate `shapes`.
|
|
261
|
+
unionStrokeShape() {
|
|
262
|
+
if (this.shapes.some(s => s.isText))
|
|
263
|
+
return null;
|
|
264
|
+
const withPaths = this.shapes.filter(s => s.ckPath);
|
|
265
|
+
if (withPaths.length < 2)
|
|
266
|
+
return null;
|
|
267
|
+
const combined = this.boolean.combinePaths(withPaths.map(s => s.ckPath.copy()), "union");
|
|
268
|
+
if (!combined)
|
|
269
|
+
return null;
|
|
270
|
+
const canvas = this.getCanvas();
|
|
271
|
+
return {
|
|
272
|
+
draw: (paint) => { canvas.drawPath(combined, paint); },
|
|
273
|
+
ckPath: combined,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
// ─── Boolean ─────────────────────────────────────────────────────────────
|
|
277
|
+
beginBoolean(op) {
|
|
278
|
+
this.boolean.beginBoolean(op);
|
|
279
|
+
}
|
|
280
|
+
endBoolean() {
|
|
281
|
+
const shape = this.boolean.endBoolean(this.getCanvas);
|
|
282
|
+
this.shapes = [];
|
|
283
|
+
this.paintApplied = false;
|
|
284
|
+
if (shape)
|
|
285
|
+
this.shapes.push(shape);
|
|
286
|
+
}
|
|
287
|
+
// ─── Mask ─────────────────────────────────────────────────────────────────
|
|
288
|
+
beginMask(options) {
|
|
289
|
+
this.mask.beginMask(options);
|
|
290
|
+
}
|
|
291
|
+
applyMask() {
|
|
292
|
+
this.mask.applyMask(() => {
|
|
293
|
+
this.shapes = [];
|
|
294
|
+
this.paintApplied = false;
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
endMask() {
|
|
298
|
+
this.mask.endMask();
|
|
299
|
+
}
|
|
300
|
+
getMaskApply() {
|
|
301
|
+
return this.mask.getApply();
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=shape-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shape-handler.js","sourceRoot":"","sources":["../../src/shapes/shape-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CanvasKit, Canvas, TypefaceFontProvider } from "@motion-script/canvaskit";
|
|
2
|
+
import { TextState } from "@motion-script/core";
|
|
3
|
+
import type { CurrentShape } from "./shape-handler";
|
|
4
|
+
/**
|
|
5
|
+
* Lay out a Text node into a drawable `CurrentShape`. When `fontSize` is
|
|
6
|
+
* "autofit", first probes an unwrapped single-line layout to derive a scale
|
|
7
|
+
* that fits the box; with wrap enabled, shrinking stops at `minFontSize` and
|
|
8
|
+
* wrapping takes over instead. Returned shape has no `ckPath` (`isText: true`)
|
|
9
|
+
* since glyph paths aren't available — strokes/fills fall back to glyph-union
|
|
10
|
+
* handling elsewhere.
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildText(canvasKit: CanvasKit, canvas: Canvas, fontMgr: TypefaceFontProvider, state: Partial<TextState>): CurrentShape;
|
|
13
|
+
//# sourceMappingURL=text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/shapes/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAS,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAsB,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACrB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,GAC1B,YAAY,CA2Dd"}
|