@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,67 @@
|
|
|
1
|
+
import { withTextDescriptor } from "@motion-script/core";
|
|
2
|
+
import { layoutParagraph, drawShapedRun } from "./paragraph-layout";
|
|
3
|
+
/**
|
|
4
|
+
* Lay out a Text node into a drawable `CurrentShape`. When `fontSize` is
|
|
5
|
+
* "autofit", first probes an unwrapped single-line layout to derive a scale
|
|
6
|
+
* that fits the box; with wrap enabled, shrinking stops at `minFontSize` and
|
|
7
|
+
* wrapping takes over instead. Returned shape has no `ckPath` (`isText: true`)
|
|
8
|
+
* since glyph paths aren't available — strokes/fills fall back to glyph-union
|
|
9
|
+
* handling elsewhere.
|
|
10
|
+
*/
|
|
11
|
+
export function buildText(canvasKit, canvas, fontMgr, state) {
|
|
12
|
+
const fullState = withTextDescriptor(state);
|
|
13
|
+
const x = fullState.x;
|
|
14
|
+
const y = fullState.y;
|
|
15
|
+
const autofit = fullState.fontSize === 'autofit';
|
|
16
|
+
let fontSize = autofit ? 100 : fullState.fontSize;
|
|
17
|
+
let wrap = fullState.wrap && fullState.width > 0;
|
|
18
|
+
const segment = (size) => ({
|
|
19
|
+
text: fullState.text,
|
|
20
|
+
fontFamily: fullState.fontFamily,
|
|
21
|
+
fontSize: size,
|
|
22
|
+
fontWeight: fullState.fontWeight,
|
|
23
|
+
fontStyle: fullState.fontStyle,
|
|
24
|
+
letterSpacing: fullState.letterSpacing,
|
|
25
|
+
});
|
|
26
|
+
// Autofit: shape once unwrapped to get the intrinsic single-line size, then
|
|
27
|
+
// scale the font so the text fits the box. With wrap on, stop shrinking at
|
|
28
|
+
// minFontSize and let the text wrap instead.
|
|
29
|
+
if (autofit && fullState.width > 0 && fullState.height > 0) {
|
|
30
|
+
const probe = layoutParagraph(canvasKit, fontMgr, [segment(fontSize)], {
|
|
31
|
+
align: fullState.align,
|
|
32
|
+
lineHeight: fullState.lineHeight,
|
|
33
|
+
maxWidth: Infinity,
|
|
34
|
+
originX: x,
|
|
35
|
+
originY: y,
|
|
36
|
+
});
|
|
37
|
+
const scaleW = probe.width > 0 ? fullState.width / probe.width : 1;
|
|
38
|
+
const scaleH = probe.height > 0 ? fullState.height / probe.height : 1;
|
|
39
|
+
const singleLineFit = fontSize * Math.min(scaleW, scaleH);
|
|
40
|
+
for (const f of probe.fonts)
|
|
41
|
+
f.delete();
|
|
42
|
+
if (wrap && singleLineFit < fullState.minFontSize) {
|
|
43
|
+
fontSize = fullState.minFontSize;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
fontSize = singleLineFit;
|
|
47
|
+
wrap = false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const layout = layoutParagraph(canvasKit, fontMgr, [segment(fontSize)], {
|
|
51
|
+
align: fullState.align,
|
|
52
|
+
lineHeight: fullState.lineHeight,
|
|
53
|
+
maxWidth: wrap ? fullState.width : Infinity,
|
|
54
|
+
originX: x,
|
|
55
|
+
originY: y,
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
bounds: layout.bounds,
|
|
59
|
+
isText: true,
|
|
60
|
+
draw: (paint) => {
|
|
61
|
+
for (const run of layout.runs) {
|
|
62
|
+
drawShapedRun(canvas, run, paint);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/shapes/text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CanvasKit, Path as CKPath } from "@motion-script/canvaskit";
|
|
2
|
+
/**
|
|
3
|
+
* Returns the sub-path spanning [start, end] (fractions of total contour
|
|
4
|
+
* length, measured across all contours combined) by walking each contour with
|
|
5
|
+
* `ContourMeasureIter` and stitching the overlapping segments back into one
|
|
6
|
+
* path. Falls back to the original path if it has zero length, and to a
|
|
7
|
+
* degenerate point path if the range selects nothing.
|
|
8
|
+
*/
|
|
9
|
+
export declare function trimPath(canvasKit: CanvasKit, ckPath: CKPath, start: number, end: number): CKPath;
|
|
10
|
+
//# sourceMappingURL=trim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trim.d.ts","sourceRoot":"","sources":["../../src/shapes/trim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAE1E;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CA2CjG"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the sub-path spanning [start, end] (fractions of total contour
|
|
3
|
+
* length, measured across all contours combined) by walking each contour with
|
|
4
|
+
* `ContourMeasureIter` and stitching the overlapping segments back into one
|
|
5
|
+
* path. Falls back to the original path if it has zero length, and to a
|
|
6
|
+
* degenerate point path if the range selects nothing.
|
|
7
|
+
*/
|
|
8
|
+
export function trimPath(canvasKit, ckPath, start, end) {
|
|
9
|
+
let totalLength = 0;
|
|
10
|
+
let iter = new canvasKit.ContourMeasureIter(ckPath, false, 1);
|
|
11
|
+
let contour = iter.next();
|
|
12
|
+
while (contour) {
|
|
13
|
+
totalLength += contour.length();
|
|
14
|
+
contour.delete();
|
|
15
|
+
contour = iter.next();
|
|
16
|
+
}
|
|
17
|
+
iter.delete();
|
|
18
|
+
if (totalLength <= 0)
|
|
19
|
+
return ckPath;
|
|
20
|
+
const startD = start * totalLength;
|
|
21
|
+
const endD = end * totalLength;
|
|
22
|
+
const segments = [];
|
|
23
|
+
iter = new canvasKit.ContourMeasureIter(ckPath, false, 1);
|
|
24
|
+
let accumulated = 0;
|
|
25
|
+
contour = iter.next();
|
|
26
|
+
while (contour) {
|
|
27
|
+
const len = contour.length();
|
|
28
|
+
const contourStart = accumulated;
|
|
29
|
+
const contourEnd = accumulated + len;
|
|
30
|
+
if (contourEnd > startD && contourStart < endD) {
|
|
31
|
+
const segStart = Math.max(0, startD - contourStart);
|
|
32
|
+
const segEnd = Math.min(len, endD - contourStart);
|
|
33
|
+
segments.push(contour.getSegment(segStart, segEnd, true));
|
|
34
|
+
}
|
|
35
|
+
accumulated = contourEnd;
|
|
36
|
+
contour.delete();
|
|
37
|
+
contour = iter.next();
|
|
38
|
+
}
|
|
39
|
+
iter.delete();
|
|
40
|
+
if (segments.length === 0) {
|
|
41
|
+
return canvasKit.Path.MakeFromSVGString("M 0 0") ?? ckPath;
|
|
42
|
+
}
|
|
43
|
+
if (segments.length === 1)
|
|
44
|
+
return segments[0];
|
|
45
|
+
const svgParts = segments.map(s => s.toSVGString());
|
|
46
|
+
segments.forEach(s => s.delete());
|
|
47
|
+
return canvasKit.Path.MakeFromSVGString(svgParts.join(" ")) ?? ckPath;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=trim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trim.js","sourceRoot":"","sources":["../../src/shapes/trim.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,SAAoB,EAAE,MAAc,EAAE,KAAa,EAAE,GAAW;IACrF,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,IAAI,GAAG,IAAI,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,OAAO,OAAO,EAAE,CAAC;QACb,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAEd,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAEpC,MAAM,MAAM,GAAG,KAAK,GAAG,WAAW,CAAC;IACnC,MAAM,IAAI,GAAG,GAAG,GAAG,WAAW,CAAC;IAC/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,GAAG,IAAI,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC1D,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,OAAO,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,WAAW,CAAC;QACjC,MAAM,UAAU,GAAG,WAAW,GAAG,GAAG,CAAC;QACrC,IAAI,UAAU,GAAG,MAAM,IAAI,YAAY,GAAG,IAAI,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,YAAY,CAAC,CAAC;YAClD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,WAAW,GAAG,UAAU,CAAC;QACzB,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAEd,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC;IAC/D,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,OAAO,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { CanvasKit, Image as CKImage, TypefaceFontProvider } from "@motion-script/canvaskit";
|
|
2
|
+
import { AssetCatalog, StorageAdapter, type Size2D } from "@motion-script/core";
|
|
3
|
+
/**
|
|
4
|
+
* Browser implementation of {@link StorageAdapter} — owns all async asset
|
|
5
|
+
* decoding (images, video, audio, fonts) so the render loop can stay
|
|
6
|
+
* synchronous. Caches decoded results keyed by source URL/family and exposes
|
|
7
|
+
* synchronous getters (`getCKImage`, `getVideoFrame`, `getAudioBuffer`,
|
|
8
|
+
* `getFontMgr`) that the render context reads during a frame, after the
|
|
9
|
+
* corresponding `loadX()`/prefetch has resolved for that frame's assets.
|
|
10
|
+
*/
|
|
11
|
+
export declare class WebStorageAdapter extends StorageAdapter {
|
|
12
|
+
private canvasKit;
|
|
13
|
+
private fontMgr;
|
|
14
|
+
private disposed;
|
|
15
|
+
private imagePixels;
|
|
16
|
+
private imageCKCache;
|
|
17
|
+
private audioBuffers;
|
|
18
|
+
private audioCtx;
|
|
19
|
+
private fps;
|
|
20
|
+
/** Families already registered with the font provider (registered once, all weights at once). */
|
|
21
|
+
private registeredFontFamilies;
|
|
22
|
+
/**
|
|
23
|
+
* Frames to keep cached in the dominant direction of motion. With a 1400×800
|
|
24
|
+
* RGBA frame at ~4.5 MB, 96 frames ≈ 430 MB of GPU memory — generous but
|
|
25
|
+
* bounded regardless of clip length.
|
|
26
|
+
*/
|
|
27
|
+
private static readonly FORWARD_WINDOW_FRAMES;
|
|
28
|
+
/**
|
|
29
|
+
* Smaller back-window — enough to absorb brief reverses without re-decoding,
|
|
30
|
+
* but not so large that ping-pong loops eat all VRAM.
|
|
31
|
+
*/
|
|
32
|
+
private static readonly BACK_WINDOW_FRAMES;
|
|
33
|
+
constructor(canvasKit: CanvasKit, catalog: AssetCatalog, viewport: Size2D, fps: number);
|
|
34
|
+
getCanvasKit(): CanvasKit;
|
|
35
|
+
/** Fetches and decodes `src`, optionally downscaled to the on-screen target size, caching raw RGBA pixels for later upload via {@link getCKImage}. No-op if already cached. */
|
|
36
|
+
loadImage(src: string, width: number, height: number): Promise<void>;
|
|
37
|
+
private imageTargetPixels;
|
|
38
|
+
/** Lazily uploads cached pixels for `url` to a GPU-resident CanvasKit image, memoizing the result; returns null until {@link loadImage} has completed. */
|
|
39
|
+
getCKImage(url: string): CKImage | null;
|
|
40
|
+
/**
|
|
41
|
+
* Open a streaming decode session for `src` and wait for the first frame
|
|
42
|
+
* around `trimStart` to land. The rest of the clip is *not* decoded —
|
|
43
|
+
* frames stream in on-demand as `getVideoFrame` advances the playhead.
|
|
44
|
+
*/
|
|
45
|
+
loadVideo(): Promise<void>;
|
|
46
|
+
private makeCKImageFromPixels;
|
|
47
|
+
/** Fetches and decodes `src` into a Web Audio `AudioBuffer`, cached for {@link getAudioBuffer}. No-op if already cached. */
|
|
48
|
+
loadAudio(src: string, _startFrame: number, _endFrame: number, _trimStart?: number, _trimEnd?: number): Promise<void>;
|
|
49
|
+
fetchAudioData(src: string): Promise<ArrayBuffer>;
|
|
50
|
+
getAudioBuffer(src: string): AudioBuffer | null;
|
|
51
|
+
/** Registers every weight/slant file for `fontFamily` with the shared {@link TypefaceFontProvider} under the bare family name (once per family — see {@link registeredFontFamilies}); enables dynamic/tweenable weight matching at draw time. */
|
|
52
|
+
loadFont(key: string, fontFamily: string, _fontWeight: number): Promise<void>;
|
|
53
|
+
getFontMgr(): TypefaceFontProvider;
|
|
54
|
+
dispose(): void;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=storage-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-adapter.d.ts","sourceRoot":"","sources":["../src/storage-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAUhF;;;;;;;GAOG;AACH,qBAAa,iBAAkB,SAAQ,cAAc;IACjD,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAkB;IAElC,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,YAAY,CAA8B;IAGlD,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,GAAG,CAAS;IAEpB,iGAAiG;IACjG,OAAO,CAAC,sBAAsB,CAAqB;IAEnD;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAM;IACnD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAM;gBAEpC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAOtF,YAAY,IAAI,SAAS;IAMzB,+KAA+K;IACzK,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC1E,OAAO,CAAC,iBAAiB;IAoBzB,0JAA0J;IAC1J,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAavC;;;;OAIG;IACG,SAAS,IAEZ,OAAO,CAAC,IAAI,CAAC;IAQhB,OAAO,CAAC,qBAAqB;IAgB7B,4HAA4H;IACtH,SAAS,CACX,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,MAAU,EACtB,QAAQ,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAUV,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAKvD,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAM/C,iPAAiP;IAC3O,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBnF,UAAU,IAAI,oBAAoB;IAMlC,OAAO,IAAI,IAAI;CAkBlB"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { StorageAdapter } from "@motion-script/core";
|
|
2
|
+
/**
|
|
3
|
+
* Browser implementation of {@link StorageAdapter} — owns all async asset
|
|
4
|
+
* decoding (images, video, audio, fonts) so the render loop can stay
|
|
5
|
+
* synchronous. Caches decoded results keyed by source URL/family and exposes
|
|
6
|
+
* synchronous getters (`getCKImage`, `getVideoFrame`, `getAudioBuffer`,
|
|
7
|
+
* `getFontMgr`) that the render context reads during a frame, after the
|
|
8
|
+
* corresponding `loadX()`/prefetch has resolved for that frame's assets.
|
|
9
|
+
*/
|
|
10
|
+
export class WebStorageAdapter extends StorageAdapter {
|
|
11
|
+
canvasKit;
|
|
12
|
+
fontMgr;
|
|
13
|
+
disposed = false;
|
|
14
|
+
imagePixels = new Map();
|
|
15
|
+
imageCKCache = new Map();
|
|
16
|
+
audioBuffers = new Map();
|
|
17
|
+
audioCtx = null;
|
|
18
|
+
fps;
|
|
19
|
+
/** Families already registered with the font provider (registered once, all weights at once). */
|
|
20
|
+
registeredFontFamilies = new Set();
|
|
21
|
+
/**
|
|
22
|
+
* Frames to keep cached in the dominant direction of motion. With a 1400×800
|
|
23
|
+
* RGBA frame at ~4.5 MB, 96 frames ≈ 430 MB of GPU memory — generous but
|
|
24
|
+
* bounded regardless of clip length.
|
|
25
|
+
*/
|
|
26
|
+
static FORWARD_WINDOW_FRAMES = 96;
|
|
27
|
+
/**
|
|
28
|
+
* Smaller back-window — enough to absorb brief reverses without re-decoding,
|
|
29
|
+
* but not so large that ping-pong loops eat all VRAM.
|
|
30
|
+
*/
|
|
31
|
+
static BACK_WINDOW_FRAMES = 32;
|
|
32
|
+
constructor(canvasKit, catalog, viewport, fps) {
|
|
33
|
+
super(catalog, viewport);
|
|
34
|
+
this.canvasKit = canvasKit;
|
|
35
|
+
this.fps = fps;
|
|
36
|
+
this.fontMgr = canvasKit.TypefaceFontProvider.Make();
|
|
37
|
+
}
|
|
38
|
+
getCanvasKit() {
|
|
39
|
+
return this.canvasKit;
|
|
40
|
+
}
|
|
41
|
+
// ─── Image ───────────────────────────────────────────────────────────────
|
|
42
|
+
/** Fetches and decodes `src`, optionally downscaled to the on-screen target size, caching raw RGBA pixels for later upload via {@link getCKImage}. No-op if already cached. */
|
|
43
|
+
async loadImage(src, width, height) {
|
|
44
|
+
if (this.imagePixels.has(src))
|
|
45
|
+
return;
|
|
46
|
+
const target = this.imageTargetPixels(src, width, height);
|
|
47
|
+
const response = await fetch(src);
|
|
48
|
+
const blob = await response.blob();
|
|
49
|
+
const bitmap = target
|
|
50
|
+
? await createImageBitmap(blob, {
|
|
51
|
+
resizeWidth: target.width,
|
|
52
|
+
resizeHeight: target.height,
|
|
53
|
+
resizeQuality: "high",
|
|
54
|
+
})
|
|
55
|
+
: await createImageBitmap(blob);
|
|
56
|
+
const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);
|
|
57
|
+
const ctx = canvas.getContext("2d", { willReadFrequently: true });
|
|
58
|
+
if (!ctx) {
|
|
59
|
+
bitmap.close();
|
|
60
|
+
throw new Error(`loadImage(${src}): could not get 2d context`);
|
|
61
|
+
}
|
|
62
|
+
ctx.drawImage(bitmap, 0, 0);
|
|
63
|
+
const data = ctx.getImageData(0, 0, bitmap.width, bitmap.height).data;
|
|
64
|
+
bitmap.close();
|
|
65
|
+
this.imagePixels.set(src, {
|
|
66
|
+
width: canvas.width,
|
|
67
|
+
height: canvas.height,
|
|
68
|
+
pixels: new Uint8Array(data),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
imageTargetPixels(src, width, height) {
|
|
72
|
+
let meta;
|
|
73
|
+
try {
|
|
74
|
+
meta = this.catalog.getImageMeta(src);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
if (!meta.width || !meta.height)
|
|
80
|
+
return null;
|
|
81
|
+
if (width <= 0 && height <= 0)
|
|
82
|
+
return null;
|
|
83
|
+
const targetW = width > 0 ? Math.min(width, this.viewport.width) : 0;
|
|
84
|
+
const targetH = height > 0 ? Math.min(height, this.viewport.height) : 0;
|
|
85
|
+
const sx = targetW > 0 ? targetW / meta.width : 0;
|
|
86
|
+
const sy = targetH > 0 ? targetH / meta.height : 0;
|
|
87
|
+
const ratio = Math.max(sx, sy);
|
|
88
|
+
if (ratio <= 0 || ratio >= 1)
|
|
89
|
+
return null;
|
|
90
|
+
return {
|
|
91
|
+
width: Math.max(1, Math.round(meta.width * ratio)),
|
|
92
|
+
height: Math.max(1, Math.round(meta.height * ratio)),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Lazily uploads cached pixels for `url` to a GPU-resident CanvasKit image, memoizing the result; returns null until {@link loadImage} has completed. */
|
|
96
|
+
getCKImage(url) {
|
|
97
|
+
const cached = this.imagePixels.get(url);
|
|
98
|
+
if (!cached)
|
|
99
|
+
return null;
|
|
100
|
+
const existing = this.imageCKCache.get(url);
|
|
101
|
+
if (existing)
|
|
102
|
+
return existing;
|
|
103
|
+
const made = this.makeCKImageFromPixels(cached.pixels, cached.width, cached.height);
|
|
104
|
+
if (made)
|
|
105
|
+
this.imageCKCache.set(url, made);
|
|
106
|
+
return made;
|
|
107
|
+
}
|
|
108
|
+
// ─── Video ───────────────────────────────────────────────────────────────
|
|
109
|
+
/**
|
|
110
|
+
* Open a streaming decode session for `src` and wait for the first frame
|
|
111
|
+
* around `trimStart` to land. The rest of the clip is *not* decoded —
|
|
112
|
+
* frames stream in on-demand as `getVideoFrame` advances the playhead.
|
|
113
|
+
*/
|
|
114
|
+
async loadVideo() {
|
|
115
|
+
throw new Error("Video support is not yet implemented in WebStorageAdapter.");
|
|
116
|
+
}
|
|
117
|
+
makeCKImageFromPixels(pixels, width, height) {
|
|
118
|
+
return this.canvasKit.MakeImage({
|
|
119
|
+
width,
|
|
120
|
+
height,
|
|
121
|
+
alphaType: this.canvasKit.AlphaType.Unpremul,
|
|
122
|
+
colorType: this.canvasKit.ColorType.RGBA_8888,
|
|
123
|
+
colorSpace: this.canvasKit.ColorSpace.SRGB,
|
|
124
|
+
}, pixels, 4 * width);
|
|
125
|
+
}
|
|
126
|
+
// ─── Audio ───────────────────────────────────────────────────────────────
|
|
127
|
+
/** Fetches and decodes `src` into a Web Audio `AudioBuffer`, cached for {@link getAudioBuffer}. No-op if already cached. */
|
|
128
|
+
async loadAudio(src, _startFrame, _endFrame, _trimStart = 0, _trimEnd) {
|
|
129
|
+
if (this.audioBuffers.has(src))
|
|
130
|
+
return;
|
|
131
|
+
if (!this.audioCtx)
|
|
132
|
+
this.audioCtx = new AudioContext();
|
|
133
|
+
const response = await fetch(src);
|
|
134
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
135
|
+
const audioBuffer = await this.audioCtx.decodeAudioData(arrayBuffer);
|
|
136
|
+
this.audioBuffers.set(src, audioBuffer);
|
|
137
|
+
}
|
|
138
|
+
async fetchAudioData(src) {
|
|
139
|
+
const response = await fetch(src);
|
|
140
|
+
return response.arrayBuffer();
|
|
141
|
+
}
|
|
142
|
+
getAudioBuffer(src) {
|
|
143
|
+
return this.audioBuffers.get(src) ?? null;
|
|
144
|
+
}
|
|
145
|
+
// ─── Font ────────────────────────────────────────────────────────────────
|
|
146
|
+
/** Registers every weight/slant file for `fontFamily` with the shared {@link TypefaceFontProvider} under the bare family name (once per family — see {@link registeredFontFamilies}); enables dynamic/tweenable weight matching at draw time. */
|
|
147
|
+
async loadFont(key, fontFamily, _fontWeight) {
|
|
148
|
+
// Register every weight/slant of the family under its bare family name so
|
|
149
|
+
// CanvasKit's matcher (see resolveTypeface) can pick the closest file for
|
|
150
|
+
// any requested weight — that's what gives us dynamic, tween-able weights
|
|
151
|
+
// instead of needing an exact `family@weight` file. Done once per family.
|
|
152
|
+
if (this.registeredFontFamilies.has(fontFamily))
|
|
153
|
+
return;
|
|
154
|
+
const metas = this.catalog.getFontFamilyMetas(fontFamily);
|
|
155
|
+
if (metas.length === 0) {
|
|
156
|
+
console.warn(`[WebStorageAdapter] No font manifest entry for "${key}". Add it to the manifest font record.`);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Dedupe by src in case the same file is registered under multiple keys.
|
|
160
|
+
const sources = [...new Set(metas.map(m => m.src))];
|
|
161
|
+
await Promise.all(sources.map(async (src) => {
|
|
162
|
+
const response = await fetch(src);
|
|
163
|
+
const bytes = await response.arrayBuffer();
|
|
164
|
+
this.fontMgr.registerFont(new Uint8Array(bytes), fontFamily);
|
|
165
|
+
}));
|
|
166
|
+
this.registeredFontFamilies.add(fontFamily);
|
|
167
|
+
}
|
|
168
|
+
getFontMgr() {
|
|
169
|
+
return this.fontMgr;
|
|
170
|
+
}
|
|
171
|
+
// ─── Lifecycle ───────────────────────────────────────────────────────────
|
|
172
|
+
dispose() {
|
|
173
|
+
if (this.disposed)
|
|
174
|
+
return;
|
|
175
|
+
this.disposed = true;
|
|
176
|
+
for (const img of this.imageCKCache.values())
|
|
177
|
+
img.delete();
|
|
178
|
+
this.imageCKCache.clear();
|
|
179
|
+
this.imagePixels.clear();
|
|
180
|
+
this.audioBuffers.clear();
|
|
181
|
+
if (this.audioCtx && this.audioCtx.state !== "closed") {
|
|
182
|
+
this.audioCtx.close();
|
|
183
|
+
}
|
|
184
|
+
this.audioCtx = null;
|
|
185
|
+
super.dispose();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=storage-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-adapter.js","sourceRoot":"","sources":["../src/storage-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { CanvasKit, Canvas, Paint, Path as CKPath } from "@motion-script/canvaskit";
|
|
2
|
+
import type { FillResolved, ShadowResolved, StrokeResolved } from "@motion-script/core";
|
|
3
|
+
import type { FillHandler } from "../fills/handler";
|
|
4
|
+
export declare class StrokeHandler {
|
|
5
|
+
private canvasKit;
|
|
6
|
+
private getCanvas;
|
|
7
|
+
private getPaint;
|
|
8
|
+
private fills;
|
|
9
|
+
constructor(canvasKit: CanvasKit, getCanvas: () => Canvas, getPaint: () => Paint, fills: FillHandler);
|
|
10
|
+
makeUniformDashEffect(path: CKPath, dash: number[], dashOffset?: number, fit?: {
|
|
11
|
+
scaledDash: number[];
|
|
12
|
+
scale: number;
|
|
13
|
+
}): any | null;
|
|
14
|
+
private measureDashFit;
|
|
15
|
+
private buildDashedPath;
|
|
16
|
+
private deviceMetrics;
|
|
17
|
+
private resolveStrokeWidth;
|
|
18
|
+
private snapPath;
|
|
19
|
+
applyStrokes(strokes: StrokeResolved[], shapes: Array<{
|
|
20
|
+
draw: (p: Paint) => void;
|
|
21
|
+
ckPath?: CKPath;
|
|
22
|
+
}>, resolveBounds?: (fill: StrokeResolved["fill"], shape: {
|
|
23
|
+
ckPath?: CKPath;
|
|
24
|
+
}) => void): boolean;
|
|
25
|
+
private drawStroke;
|
|
26
|
+
private drawTextUnionStroke;
|
|
27
|
+
applyShadows(shadows: ShadowResolved[], shapes: Array<{
|
|
28
|
+
draw: (p: Paint) => void;
|
|
29
|
+
ckPath?: CKPath;
|
|
30
|
+
}>, fills: FillResolved[], strokes: StrokeResolved[], resolveBounds?: (fill: FillResolved, shape: {
|
|
31
|
+
ckPath?: CKPath;
|
|
32
|
+
} | null) => void): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stroke/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,SAAS,EACT,MAAM,EACN,KAAK,EACL,IAAI,IAAI,MAAM,EACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACR,YAAY,EACZ,cAAc,EACd,cAAc,EACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,qBAAa,aAAa;IACtB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,KAAK,CAAc;gBAEvB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,MAAM,EACvB,QAAQ,EAAE,MAAM,KAAK,EACrB,KAAK,EAAE,WAAW;IAQtB,qBAAqB,CACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,GAAE,MAAU,EACtB,GAAG,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAC9C,GAAG,GAAG,IAAI;IAQb,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,eAAe;IAgEvB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,QAAQ;IA2DhB,YAAY,CACR,OAAO,EAAE,cAAc,EAAE,EACzB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAC5D,aAAa,CAAC,EAAE,CACZ,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAC5B,KAAK,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KACzB,IAAI,GACV,OAAO;IA8CV,OAAO,CAAC,UAAU;IA+DlB,OAAO,CAAC,mBAAmB;IAmC3B,YAAY,CACR,OAAO,EAAE,cAAc,EAAE,EACzB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAC5D,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,EAAE,cAAc,EAAE,EACzB,aAAa,CAAC,EAAE,CACZ,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAChC,IAAI,GACV,IAAI;CAqEV"}
|