@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,360 @@
|
|
|
1
|
+
import { FillRenderRegistry } from "../fills/registry";
|
|
2
|
+
export class StrokeHandler {
|
|
3
|
+
canvasKit;
|
|
4
|
+
getCanvas;
|
|
5
|
+
getPaint;
|
|
6
|
+
fills;
|
|
7
|
+
constructor(canvasKit, getCanvas, getPaint, fills) {
|
|
8
|
+
this.canvasKit = canvasKit;
|
|
9
|
+
this.getCanvas = getCanvas;
|
|
10
|
+
this.getPaint = getPaint;
|
|
11
|
+
this.fills = fills;
|
|
12
|
+
}
|
|
13
|
+
makeUniformDashEffect(path, dash, dashOffset = 0, fit) {
|
|
14
|
+
const info = fit ?? this.measureDashFit(path, dash);
|
|
15
|
+
if (!info)
|
|
16
|
+
return null;
|
|
17
|
+
return this.canvasKit.PathEffect.MakeDash(info.scaledDash, dashOffset * info.scale);
|
|
18
|
+
}
|
|
19
|
+
// Compute a per-contour-uniform dash pattern by scaling the dash array so an
|
|
20
|
+
// integer number of cycles fits the path length exactly.
|
|
21
|
+
measureDashFit(path, dash) {
|
|
22
|
+
const cycleLength = dash.reduce((a, b) => a + b, 0);
|
|
23
|
+
if (cycleLength <= 0)
|
|
24
|
+
return null;
|
|
25
|
+
let totalLength = 0;
|
|
26
|
+
const iter = new this.canvasKit.ContourMeasureIter(path, false, 1);
|
|
27
|
+
let contour = iter.next();
|
|
28
|
+
while (contour) {
|
|
29
|
+
totalLength += contour.length();
|
|
30
|
+
contour.delete();
|
|
31
|
+
contour = iter.next();
|
|
32
|
+
}
|
|
33
|
+
iter.delete();
|
|
34
|
+
if (totalLength <= 0)
|
|
35
|
+
return null;
|
|
36
|
+
const cycles = Math.max(1, Math.round(totalLength / cycleLength));
|
|
37
|
+
const scale = totalLength / (cycles * cycleLength);
|
|
38
|
+
return { scaledDash: dash.map(d => d * scale), scale };
|
|
39
|
+
}
|
|
40
|
+
// Build a path consisting of just the "on" dash segments along the original
|
|
41
|
+
// path. Used so we can run makeStroked() on a dashed path and draw the
|
|
42
|
+
// result as a fill (gives uniform AA on all sides). The caller owns the
|
|
43
|
+
// returned path and must delete() it.
|
|
44
|
+
buildDashedPath(path, dash, dashOffset, fit) {
|
|
45
|
+
const resolvedFit = fit ?? this.measureDashFit(path, dash);
|
|
46
|
+
if (!resolvedFit)
|
|
47
|
+
return null;
|
|
48
|
+
const { scaledDash, scale } = resolvedFit;
|
|
49
|
+
const cycle = scaledDash.reduce((a, b) => a + b, 0);
|
|
50
|
+
if (cycle <= 0)
|
|
51
|
+
return null;
|
|
52
|
+
const startOffset = ((dashOffset * scale) % cycle + cycle) % cycle;
|
|
53
|
+
const builder = new this.canvasKit.PathBuilder();
|
|
54
|
+
const iter = new this.canvasKit.ContourMeasureIter(path, false, 1);
|
|
55
|
+
let contour = iter.next();
|
|
56
|
+
let appended = false;
|
|
57
|
+
while (contour) {
|
|
58
|
+
const length = contour.length();
|
|
59
|
+
// Locate the dash segment that contains startOffset.
|
|
60
|
+
let dashIndex = 0;
|
|
61
|
+
let segStart = 0;
|
|
62
|
+
while (segStart + scaledDash[dashIndex] <= startOffset && dashIndex < scaledDash.length) {
|
|
63
|
+
segStart += scaledDash[dashIndex];
|
|
64
|
+
dashIndex = (dashIndex + 1) % scaledDash.length;
|
|
65
|
+
if (dashIndex === 0)
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
let dashRemaining = scaledDash[dashIndex] - (startOffset - segStart);
|
|
69
|
+
let drawing = dashIndex % 2 === 0;
|
|
70
|
+
let t = 0;
|
|
71
|
+
while (t < length - 1e-6) {
|
|
72
|
+
const segLen = Math.min(dashRemaining, length - t);
|
|
73
|
+
if (drawing && segLen > 1e-3) {
|
|
74
|
+
const seg = contour.getSegment(t, t + segLen, true);
|
|
75
|
+
if (seg) {
|
|
76
|
+
builder.addPath(seg);
|
|
77
|
+
seg.delete();
|
|
78
|
+
appended = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
t += segLen;
|
|
82
|
+
dashRemaining -= segLen;
|
|
83
|
+
if (dashRemaining <= 1e-6) {
|
|
84
|
+
dashIndex = (dashIndex + 1) % scaledDash.length;
|
|
85
|
+
dashRemaining = scaledDash[dashIndex];
|
|
86
|
+
drawing = !drawing;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
contour.delete();
|
|
90
|
+
contour = iter.next();
|
|
91
|
+
}
|
|
92
|
+
iter.delete();
|
|
93
|
+
if (!appended) {
|
|
94
|
+
builder.delete();
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
return builder.detachAndDelete();
|
|
98
|
+
}
|
|
99
|
+
deviceMetrics(canvas) {
|
|
100
|
+
const m = canvas.getTotalMatrix();
|
|
101
|
+
return {
|
|
102
|
+
sx: Math.hypot(m[0], m[3]),
|
|
103
|
+
sy: Math.hypot(m[1], m[4]),
|
|
104
|
+
tx: m[2],
|
|
105
|
+
ty: m[5],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
// For thin strokes (≤ ~2.5 device px), round to an integer device width
|
|
109
|
+
// ≥ 1 px and convert back to logical units. Returns the adjusted logical
|
|
110
|
+
// weight and the integer device width (or -1 when no snapping should occur).
|
|
111
|
+
resolveStrokeWidth(weight, deviceScale) {
|
|
112
|
+
if (weight <= 0 || deviceScale <= 0) {
|
|
113
|
+
return { logical: 0, intDeviceWidth: -1 };
|
|
114
|
+
}
|
|
115
|
+
const deviceWidth = weight * deviceScale;
|
|
116
|
+
if (deviceWidth >= 2.5) {
|
|
117
|
+
return { logical: weight, intDeviceWidth: -1 };
|
|
118
|
+
}
|
|
119
|
+
const intDeviceWidth = Math.max(1, Math.round(deviceWidth));
|
|
120
|
+
return { logical: intDeviceWidth / deviceScale, intDeviceWidth };
|
|
121
|
+
}
|
|
122
|
+
// Snap the canvas so the path's bounds land exactly on the device pixel
|
|
123
|
+
// grid — half-pixel offsets for odd stroke widths, integer for even — on
|
|
124
|
+
// ALL four sides. When the path's device-space size isn't already an
|
|
125
|
+
// integer we apply a sub-pixel scale around the top-left corner so right
|
|
126
|
+
// and bottom also align. Bails on rotated/skewed matrices since "pixel
|
|
127
|
+
// grid" isn't well defined there. Returns true if canvas.save() was called.
|
|
128
|
+
snapPath(canvas, intDeviceWidth, ckPath) {
|
|
129
|
+
if (intDeviceWidth <= 0 || !ckPath)
|
|
130
|
+
return false;
|
|
131
|
+
const m = canvas.getTotalMatrix();
|
|
132
|
+
if (Math.abs(m[1]) > 1e-6 || Math.abs(m[3]) > 1e-6)
|
|
133
|
+
return false;
|
|
134
|
+
const sx = m[0], sy = m[4], tx = m[2], ty = m[5];
|
|
135
|
+
if (sx === 0 || sy === 0)
|
|
136
|
+
return false;
|
|
137
|
+
const b = ckPath.getBounds();
|
|
138
|
+
const wLog = b[2] - b[0];
|
|
139
|
+
const hLog = b[3] - b[1];
|
|
140
|
+
if (wLog <= 0 || hLog <= 0)
|
|
141
|
+
return false;
|
|
142
|
+
const leftDev = tx + sx * b[0];
|
|
143
|
+
const topDev = ty + sy * b[1];
|
|
144
|
+
const rightDev = tx + sx * b[2];
|
|
145
|
+
const bottomDev = ty + sy * b[3];
|
|
146
|
+
const offset = intDeviceWidth % 2 === 0 ? 0 : 0.5;
|
|
147
|
+
const targetLeft = Math.round(leftDev - offset) + offset;
|
|
148
|
+
const targetTop = Math.round(topDev - offset) + offset;
|
|
149
|
+
const targetRight = Math.round(rightDev - offset) + offset;
|
|
150
|
+
const targetBottom = Math.round(bottomDev - offset) + offset;
|
|
151
|
+
// Refuse to snap if rounding would collapse the path.
|
|
152
|
+
if (targetRight - targetLeft < 1)
|
|
153
|
+
return false;
|
|
154
|
+
if (targetBottom - targetTop < 1)
|
|
155
|
+
return false;
|
|
156
|
+
const scaleX = (targetRight - targetLeft) / (rightDev - leftDev);
|
|
157
|
+
const scaleY = (targetBottom - targetTop) / (bottomDev - topDev);
|
|
158
|
+
// Skip when the path is already aligned.
|
|
159
|
+
if (Math.abs(scaleX - 1) < 1e-4
|
|
160
|
+
&& Math.abs(scaleY - 1) < 1e-4
|
|
161
|
+
&& Math.abs(targetLeft - leftDev) < 1e-4
|
|
162
|
+
&& Math.abs(targetTop - topDev) < 1e-4)
|
|
163
|
+
return false;
|
|
164
|
+
// Concat L such that current * L maps the path bounds to the targets.
|
|
165
|
+
// L is axis-aligned scale+translate in path-local space:
|
|
166
|
+
// L = [scaleX 0 c; 0 scaleY d; 0 0 1]
|
|
167
|
+
// where (scaleX, scaleY) makes device width/height integer and (c, d)
|
|
168
|
+
// shifts the top-left corner to (targetLeft, targetTop).
|
|
169
|
+
const c = (targetLeft - tx) / sx - scaleX * b[0];
|
|
170
|
+
const d = (targetTop - ty) / sy - scaleY * b[1];
|
|
171
|
+
canvas.save();
|
|
172
|
+
canvas.concat([scaleX, 0, c, 0, scaleY, d, 0, 0, 1]);
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
// `resolveBounds`, when supplied, returns the bounds a stroke's fill shader
|
|
176
|
+
// should resolve against for a given shape (driven by the fill's `space`).
|
|
177
|
+
// The shader is rebuilt per shape so each can resolve against its own rect;
|
|
178
|
+
// when omitted, bounds come from whatever the fill handler last set.
|
|
179
|
+
applyStrokes(strokes, shapes, resolveBounds) {
|
|
180
|
+
if (strokes.length === 0)
|
|
181
|
+
return false;
|
|
182
|
+
const canvas = this.getCanvas();
|
|
183
|
+
const paint = this.getPaint();
|
|
184
|
+
paint.setStyle(this.canvasKit.PaintStyle.Stroke);
|
|
185
|
+
const rendererCtx = this.fills.buildRendererCtx(paint);
|
|
186
|
+
for (const stroke of strokes) {
|
|
187
|
+
const weight = stroke.weight ?? 1;
|
|
188
|
+
const { sx, sy } = this.deviceMetrics(canvas);
|
|
189
|
+
const { logical, intDeviceWidth } = this.resolveStrokeWidth(weight, Math.max(sx, sy));
|
|
190
|
+
paint.setStrokeWidth(logical);
|
|
191
|
+
const opacity = stroke.fill.opacity !== undefined ? stroke.fill.opacity : 1.0;
|
|
192
|
+
paint.setAlphaf(opacity);
|
|
193
|
+
if (stroke.fill.blend) {
|
|
194
|
+
paint.setBlendMode(this.fills.getCanvasKitBlendMode(stroke.fill.blend));
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
paint.setBlendMode(this.canvasKit.BlendMode.SrcOver);
|
|
198
|
+
}
|
|
199
|
+
for (const shape of shapes) {
|
|
200
|
+
if (resolveBounds)
|
|
201
|
+
resolveBounds(stroke.fill, shape);
|
|
202
|
+
if (!FillRenderRegistry.applyPaint(stroke.fill, rendererCtx))
|
|
203
|
+
continue;
|
|
204
|
+
const snapped = this.snapPath(canvas, intDeviceWidth, shape.ckPath);
|
|
205
|
+
this.drawStroke(canvas, paint, shape, stroke, logical, intDeviceWidth);
|
|
206
|
+
if (snapped)
|
|
207
|
+
canvas.restore();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
paint.setBlendMode(this.canvasKit.BlendMode.SrcOver);
|
|
211
|
+
paint.setAlphaf(1.0);
|
|
212
|
+
paint.setShader(null);
|
|
213
|
+
paint.setStyle(this.canvasKit.PaintStyle.Stroke);
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
// Draw one stroke pass on one shape. For thin strokes (intDeviceWidth > 0)
|
|
217
|
+
// we convert the stroke to a filled path via Path.makeStroked() and draw it
|
|
218
|
+
// as a fill — fill rasterization gives uniform AA on every side, which the
|
|
219
|
+
// stroke rasterizer doesn't for sub-pixel widths. Dashed thin strokes get
|
|
220
|
+
// their dash pattern baked into a path first (buildDashedPath) so the same
|
|
221
|
+
// makeStroked trick works on them.
|
|
222
|
+
drawStroke(canvas, paint, shape, stroke, logicalWidth, intDeviceWidth) {
|
|
223
|
+
if (shape.isText) {
|
|
224
|
+
this.drawTextUnionStroke(canvas, paint, shape, stroke, logicalWidth);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const hasDash = !!(stroke.dash && stroke.dash.length > 0);
|
|
228
|
+
// Measure dash fit once; pass to both buildDashedPath and makeUniformDashEffect
|
|
229
|
+
// so the contour iteration runs only once per dashed shape.
|
|
230
|
+
const dashFit = hasDash && shape.ckPath
|
|
231
|
+
? this.measureDashFit(shape.ckPath, stroke.dash)
|
|
232
|
+
: null;
|
|
233
|
+
if (intDeviceWidth > 0 && shape.ckPath) {
|
|
234
|
+
const source = hasDash
|
|
235
|
+
? this.buildDashedPath(shape.ckPath, stroke.dash, stroke.dashOffset ?? 0, dashFit ?? undefined)
|
|
236
|
+
: shape.ckPath;
|
|
237
|
+
if (source) {
|
|
238
|
+
const filled = source.makeStroked({ width: logicalWidth });
|
|
239
|
+
if (source !== shape.ckPath)
|
|
240
|
+
source.delete();
|
|
241
|
+
if (filled) {
|
|
242
|
+
paint.setStyle(this.canvasKit.PaintStyle.Fill);
|
|
243
|
+
canvas.drawPath(filled, paint);
|
|
244
|
+
paint.setStyle(this.canvasKit.PaintStyle.Stroke);
|
|
245
|
+
filled.delete();
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Fallback for thick strokes or when makeStroked/dashing failed.
|
|
251
|
+
if (hasDash && shape.ckPath) {
|
|
252
|
+
const effect = this.makeUniformDashEffect(shape.ckPath, stroke.dash, stroke.dashOffset ?? 0, dashFit ?? undefined);
|
|
253
|
+
if (effect) {
|
|
254
|
+
paint.setPathEffect(effect);
|
|
255
|
+
canvas.drawPath(shape.ckPath, paint);
|
|
256
|
+
paint.setPathEffect(null);
|
|
257
|
+
effect.delete();
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
shape.draw(paint);
|
|
262
|
+
}
|
|
263
|
+
// Strokes that follow the union of all glyph silhouettes, like Figma. We
|
|
264
|
+
// can't get glyph paths out of canvaskit-wasm to compute a real union, so
|
|
265
|
+
// we stroke each glyph at 2× width inside a saveLayer and then erase the
|
|
266
|
+
// interior (DstOut against the fill silhouette). What's left is an
|
|
267
|
+
// outside-aligned stroke of the requested width on the outer boundary of
|
|
268
|
+
// the union — internal crossings at overlapping glyphs disappear because
|
|
269
|
+
// they sit inside the silhouette and get erased.
|
|
270
|
+
//
|
|
271
|
+
// Dashed text strokes piggy-back on Skia's drawText → glyph-path fallback:
|
|
272
|
+
// setting PathEffect.MakeDash on the paint causes the stroke rasterizer to
|
|
273
|
+
// dash along each glyph's outline. We can't size the dash to the contour
|
|
274
|
+
// (no path to measure), so the dash array is used as-is.
|
|
275
|
+
drawTextUnionStroke(canvas, paint, shape, stroke, logicalWidth) {
|
|
276
|
+
const hasDash = !!(stroke.dash && stroke.dash.length > 0);
|
|
277
|
+
let dashEffect = null;
|
|
278
|
+
if (hasDash) {
|
|
279
|
+
dashEffect = this.canvasKit.PathEffect.MakeDash(stroke.dash, stroke.dashOffset ?? 0);
|
|
280
|
+
paint.setPathEffect(dashEffect);
|
|
281
|
+
}
|
|
282
|
+
canvas.saveLayer();
|
|
283
|
+
paint.setStrokeWidth(logicalWidth * 2);
|
|
284
|
+
shape.draw(paint);
|
|
285
|
+
const eraser = new this.canvasKit.Paint();
|
|
286
|
+
eraser.setStyle(this.canvasKit.PaintStyle.Fill);
|
|
287
|
+
eraser.setBlendMode(this.canvasKit.BlendMode.DstOut);
|
|
288
|
+
eraser.setColor(this.canvasKit.WHITE);
|
|
289
|
+
shape.draw(eraser);
|
|
290
|
+
eraser.delete();
|
|
291
|
+
canvas.restore();
|
|
292
|
+
paint.setStrokeWidth(logicalWidth);
|
|
293
|
+
if (dashEffect) {
|
|
294
|
+
paint.setPathEffect(null);
|
|
295
|
+
dashEffect.delete();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
applyShadows(shadows, shapes, fills, strokes, resolveBounds) {
|
|
299
|
+
if (shadows.length === 0)
|
|
300
|
+
return;
|
|
301
|
+
const canvas = this.getCanvas();
|
|
302
|
+
const paint = this.getPaint();
|
|
303
|
+
const hasFill = fills.length > 0 && fills.some(f => (f.opacity ?? 1) > 0);
|
|
304
|
+
const hasStrokes = strokes.length > 0;
|
|
305
|
+
for (const shadow of shadows) {
|
|
306
|
+
const dx = shadow.dx ?? 0;
|
|
307
|
+
const dy = shadow.dy ?? 0;
|
|
308
|
+
const opacity = shadow.fill.opacity !== undefined ? shadow.fill.opacity : 1.0;
|
|
309
|
+
const layerPaint = new this.canvasKit.Paint();
|
|
310
|
+
layerPaint.setAlphaf(opacity);
|
|
311
|
+
if (shadow.blur > 0) {
|
|
312
|
+
const sigma = shadow.blur / 2;
|
|
313
|
+
const filter = this.canvasKit.ImageFilter.MakeBlur(sigma, sigma, this.canvasKit.TileMode.Decal, null);
|
|
314
|
+
layerPaint.setImageFilter(filter);
|
|
315
|
+
}
|
|
316
|
+
canvas.save();
|
|
317
|
+
// Scene coords are Y-up; the canvas is Y-down, so negate dy to keep
|
|
318
|
+
// a positive dy nudging the shadow upward.
|
|
319
|
+
canvas.translate(dx, -dy);
|
|
320
|
+
canvas.saveLayer(layerPaint);
|
|
321
|
+
paint.setAlphaf(1.0);
|
|
322
|
+
if (resolveBounds)
|
|
323
|
+
resolveBounds(shadow.fill, null);
|
|
324
|
+
FillRenderRegistry.applyPaint(shadow.fill, this.fills.buildRendererCtx(paint));
|
|
325
|
+
if (hasFill) {
|
|
326
|
+
paint.setStyle(this.canvasKit.PaintStyle.Fill);
|
|
327
|
+
paint.setPathEffect(null);
|
|
328
|
+
for (const shape of shapes)
|
|
329
|
+
shape.draw(paint);
|
|
330
|
+
}
|
|
331
|
+
if (hasStrokes) {
|
|
332
|
+
paint.setStyle(this.canvasKit.PaintStyle.Stroke);
|
|
333
|
+
for (const stroke of strokes) {
|
|
334
|
+
const weight = stroke.weight ?? 1;
|
|
335
|
+
const { sx, sy } = this.deviceMetrics(canvas);
|
|
336
|
+
const { logical, intDeviceWidth } = this.resolveStrokeWidth(weight, Math.max(sx, sy));
|
|
337
|
+
paint.setStrokeWidth(logical);
|
|
338
|
+
paint.setPathEffect(null);
|
|
339
|
+
// Shadow strokes inherit the shadow's silhouette colour set
|
|
340
|
+
// above — they are not painted with the real stroke fill.
|
|
341
|
+
for (const shape of shapes) {
|
|
342
|
+
const snapped = this.snapPath(canvas, intDeviceWidth, shape.ckPath);
|
|
343
|
+
this.drawStroke(canvas, paint, shape, stroke, logical, intDeviceWidth);
|
|
344
|
+
if (snapped)
|
|
345
|
+
canvas.restore();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
canvas.restore();
|
|
350
|
+
canvas.restore();
|
|
351
|
+
layerPaint.delete();
|
|
352
|
+
}
|
|
353
|
+
paint.setStyle(this.canvasKit.PaintStyle.Fill);
|
|
354
|
+
paint.setPathEffect(null);
|
|
355
|
+
paint.setBlendMode(this.canvasKit.BlendMode.SrcOver);
|
|
356
|
+
paint.setAlphaf(1.0);
|
|
357
|
+
paint.setShader(null);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stroke/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
/**
|
|
5
|
+
* Paints strokes and shadows over shape silhouettes. Handles the gritty parts
|
|
6
|
+
* of vector stroking on Skia: sub-pixel-width strokes are rasterized as filled
|
|
7
|
+
* paths for uniform AA (see {@link drawStroke}), thin strokes get pixel-grid
|
|
8
|
+
* snapped (see {@link snapPath}), dashes are length-fit per contour, and text
|
|
9
|
+
* gets a synthesized union outline since glyph paths aren't directly available
|
|
10
|
+
* (see {@link drawTextUnionStroke}). Delegates shader/paint setup for fills to
|
|
11
|
+
* {@link FillHandler}.
|
|
12
|
+
*/
|
|
13
|
+
export declare class StrokeHandler {
|
|
14
|
+
private canvasKit;
|
|
15
|
+
private getCanvas;
|
|
16
|
+
private getPaint;
|
|
17
|
+
private fills;
|
|
18
|
+
constructor(canvasKit: CanvasKit, getCanvas: () => Canvas, getPaint: () => Paint, fills: FillHandler);
|
|
19
|
+
makeUniformDashEffect(path: CKPath, dash: number[], dashOffset?: number, fit?: {
|
|
20
|
+
scaledDash: number[];
|
|
21
|
+
scale: number;
|
|
22
|
+
}): any | null;
|
|
23
|
+
private measureDashFit;
|
|
24
|
+
private buildDashedPath;
|
|
25
|
+
private deviceMetrics;
|
|
26
|
+
private resolveStrokeWidth;
|
|
27
|
+
private snapPath;
|
|
28
|
+
/** Paints each resolved stroke over every shape: resolves device-px stroke width (with thin-stroke snapping), builds the fill shader per shape via the registry, then draws through {@link drawStroke}. */
|
|
29
|
+
applyStrokes(strokes: StrokeResolved[], shapes: Array<{
|
|
30
|
+
draw: (p: Paint) => void;
|
|
31
|
+
ckPath?: CKPath;
|
|
32
|
+
}>, resolveBounds?: (fill: StrokeResolved["fill"], shape: {
|
|
33
|
+
ckPath?: CKPath;
|
|
34
|
+
}) => void): boolean;
|
|
35
|
+
private drawStroke;
|
|
36
|
+
private drawTextUnionStroke;
|
|
37
|
+
/** Paints drop shadows: for each shadow, offsets and optionally blurs a silhouette layer (filled shapes and/or strokes recolored to the shadow's fill/opacity), composited beneath the real paint via `saveLayer`. */
|
|
38
|
+
applyShadows(shadows: ShadowResolved[], shapes: Array<{
|
|
39
|
+
draw: (p: Paint) => void;
|
|
40
|
+
ckPath?: CKPath;
|
|
41
|
+
}>, fills: FillResolved[], strokes: StrokeResolved[], resolveBounds?: (fill: FillResolved, shape: {
|
|
42
|
+
ckPath?: CKPath;
|
|
43
|
+
} | null) => void): void;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=stroke-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stroke-handler.d.ts","sourceRoot":"","sources":["../../src/stroke/stroke-handler.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;;;;;;;;GAQG;AACH,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,2MAA2M;IAC3M,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,sNAAsN;IACtN,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"}
|