@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.
Files changed (262) hide show
  1. package/README.md +47 -0
  2. package/dist/audio/player.d.ts +43 -0
  3. package/dist/audio/player.d.ts.map +1 -0
  4. package/dist/audio/player.js +165 -0
  5. package/dist/audio/player.js.map +1 -0
  6. package/dist/effects/bloom.d.ts +19 -0
  7. package/dist/effects/bloom.d.ts.map +1 -0
  8. package/dist/effects/bloom.js +64 -0
  9. package/dist/effects/bloom.js.map +1 -0
  10. package/dist/effects/blur.d.ts +8 -0
  11. package/dist/effects/blur.d.ts.map +1 -0
  12. package/dist/effects/blur.js +12 -0
  13. package/dist/effects/blur.js.map +1 -0
  14. package/dist/effects/bulge-pinch.d.ts +20 -0
  15. package/dist/effects/bulge-pinch.d.ts.map +1 -0
  16. package/dist/effects/bulge-pinch.js +86 -0
  17. package/dist/effects/bulge-pinch.js.map +1 -0
  18. package/dist/effects/chromatic-aberration.d.ts +19 -0
  19. package/dist/effects/chromatic-aberration.d.ts.map +1 -0
  20. package/dist/effects/chromatic-aberration.js +59 -0
  21. package/dist/effects/chromatic-aberration.js.map +1 -0
  22. package/dist/effects/effect.d.ts +32 -0
  23. package/dist/effects/effect.d.ts.map +1 -0
  24. package/dist/effects/effect.js +22 -0
  25. package/dist/effects/effect.js.map +1 -0
  26. package/dist/effects/grayscale.d.ts +12 -0
  27. package/dist/effects/grayscale.d.ts.map +1 -0
  28. package/dist/effects/grayscale.js +31 -0
  29. package/dist/effects/grayscale.js.map +1 -0
  30. package/dist/effects/index.d.ts +13 -0
  31. package/dist/effects/index.d.ts.map +1 -0
  32. package/dist/effects/index.js +13 -0
  33. package/dist/effects/index.js.map +1 -0
  34. package/dist/effects/pixelate.d.ts +23 -0
  35. package/dist/effects/pixelate.d.ts.map +1 -0
  36. package/dist/effects/pixelate.js +37 -0
  37. package/dist/effects/pixelate.js.map +1 -0
  38. package/dist/effects/registry.d.ts +17 -0
  39. package/dist/effects/registry.d.ts.map +1 -0
  40. package/dist/effects/registry.js +56 -0
  41. package/dist/effects/registry.js.map +1 -0
  42. package/dist/effects/sksl-cache.d.ts +6 -0
  43. package/dist/effects/sksl-cache.d.ts.map +1 -0
  44. package/dist/effects/sksl-cache.js +21 -0
  45. package/dist/effects/sksl-cache.js.map +1 -0
  46. package/dist/effects/sksl-layer.d.ts +30 -0
  47. package/dist/effects/sksl-layer.d.ts.map +1 -0
  48. package/dist/effects/sksl-layer.js +82 -0
  49. package/dist/effects/sksl-layer.js.map +1 -0
  50. package/dist/effects/texture.d.ts +31 -0
  51. package/dist/effects/texture.d.ts.map +1 -0
  52. package/dist/effects/texture.js +66 -0
  53. package/dist/effects/texture.js.map +1 -0
  54. package/dist/effects/vintage.d.ts +20 -0
  55. package/dist/effects/vintage.d.ts.map +1 -0
  56. package/dist/effects/vintage.js +47 -0
  57. package/dist/effects/vintage.js.map +1 -0
  58. package/dist/effects/zoom.d.ts +20 -0
  59. package/dist/effects/zoom.d.ts.map +1 -0
  60. package/dist/effects/zoom.js +65 -0
  61. package/dist/effects/zoom.js.map +1 -0
  62. package/dist/exporter.d.ts +24 -0
  63. package/dist/exporter.d.ts.map +1 -0
  64. package/dist/exporter.js +177 -0
  65. package/dist/exporter.js.map +1 -0
  66. package/dist/fills/conic-gradient.d.ts +12 -0
  67. package/dist/fills/conic-gradient.d.ts.map +1 -0
  68. package/dist/fills/conic-gradient.js +44 -0
  69. package/dist/fills/conic-gradient.js.map +1 -0
  70. package/dist/fills/filters/alpha.d.ts +9 -0
  71. package/dist/fills/filters/alpha.d.ts.map +1 -0
  72. package/dist/fills/filters/alpha.js +21 -0
  73. package/dist/fills/filters/alpha.js.map +1 -0
  74. package/dist/fills/filters/blur.d.ts +9 -0
  75. package/dist/fills/filters/blur.d.ts.map +1 -0
  76. package/dist/fills/filters/blur.js +12 -0
  77. package/dist/fills/filters/blur.js.map +1 -0
  78. package/dist/fills/filters/color-adjustment.d.ts +14 -0
  79. package/dist/fills/filters/color-adjustment.d.ts.map +1 -0
  80. package/dist/fills/filters/color-adjustment.js +147 -0
  81. package/dist/fills/filters/color-adjustment.js.map +1 -0
  82. package/dist/fills/filters/color-matrix.d.ts +9 -0
  83. package/dist/fills/filters/color-matrix.d.ts.map +1 -0
  84. package/dist/fills/filters/color-matrix.js +14 -0
  85. package/dist/fills/filters/color-matrix.js.map +1 -0
  86. package/dist/fills/filters/curves.d.ts +9 -0
  87. package/dist/fills/filters/curves.d.ts.map +1 -0
  88. package/dist/fills/filters/curves.js +89 -0
  89. package/dist/fills/filters/curves.js.map +1 -0
  90. package/dist/fills/filters/exposure.d.ts +9 -0
  91. package/dist/fills/filters/exposure.d.ts.map +1 -0
  92. package/dist/fills/filters/exposure.js +22 -0
  93. package/dist/fills/filters/exposure.js.map +1 -0
  94. package/dist/fills/filters/filter.d.ts +17 -0
  95. package/dist/fills/filters/filter.d.ts.map +1 -0
  96. package/dist/fills/filters/filter.js +16 -0
  97. package/dist/fills/filters/filter.js.map +1 -0
  98. package/dist/fills/filters/grayscale.d.ts +9 -0
  99. package/dist/fills/filters/grayscale.d.ts.map +1 -0
  100. package/dist/fills/filters/grayscale.js +25 -0
  101. package/dist/fills/filters/grayscale.js.map +1 -0
  102. package/dist/fills/filters/registry.d.ts +16 -0
  103. package/dist/fills/filters/registry.d.ts.map +1 -0
  104. package/dist/fills/filters/registry.js +50 -0
  105. package/dist/fills/filters/registry.js.map +1 -0
  106. package/dist/fills/gradient-cache.d.ts +29 -0
  107. package/dist/fills/gradient-cache.d.ts.map +1 -0
  108. package/dist/fills/gradient-cache.js +57 -0
  109. package/dist/fills/gradient-cache.js.map +1 -0
  110. package/dist/fills/handler.d.ts +49 -0
  111. package/dist/fills/handler.d.ts.map +1 -0
  112. package/dist/fills/handler.js +172 -0
  113. package/dist/fills/handler.js.map +1 -0
  114. package/dist/fills/image.d.ts +34 -0
  115. package/dist/fills/image.d.ts.map +1 -0
  116. package/dist/fills/image.js +91 -0
  117. package/dist/fills/image.js.map +1 -0
  118. package/dist/fills/linear-gradient.d.ts +12 -0
  119. package/dist/fills/linear-gradient.d.ts.map +1 -0
  120. package/dist/fills/linear-gradient.js +48 -0
  121. package/dist/fills/linear-gradient.js.map +1 -0
  122. package/dist/fills/noise.d.ts +11 -0
  123. package/dist/fills/noise.d.ts.map +1 -0
  124. package/dist/fills/noise.js +82 -0
  125. package/dist/fills/noise.js.map +1 -0
  126. package/dist/fills/radial-gradient.d.ts +9 -0
  127. package/dist/fills/radial-gradient.d.ts.map +1 -0
  128. package/dist/fills/radial-gradient.js +43 -0
  129. package/dist/fills/radial-gradient.js.map +1 -0
  130. package/dist/fills/registry.d.ts +10 -0
  131. package/dist/fills/registry.d.ts.map +1 -0
  132. package/dist/fills/registry.js +34 -0
  133. package/dist/fills/registry.js.map +1 -0
  134. package/dist/fills/renderer.d.ts +24 -0
  135. package/dist/fills/renderer.d.ts.map +1 -0
  136. package/dist/fills/renderer.js +5 -0
  137. package/dist/fills/renderer.js.map +1 -0
  138. package/dist/fills/solid.d.ts +7 -0
  139. package/dist/fills/solid.d.ts.map +1 -0
  140. package/dist/fills/solid.js +13 -0
  141. package/dist/fills/solid.js.map +1 -0
  142. package/dist/fills/stripe.d.ts +7 -0
  143. package/dist/fills/stripe.d.ts.map +1 -0
  144. package/dist/fills/stripe.js +85 -0
  145. package/dist/fills/stripe.js.map +1 -0
  146. package/dist/fills/video.d.ts +6 -0
  147. package/dist/fills/video.d.ts.map +1 -0
  148. package/dist/fills/video.js +14 -0
  149. package/dist/fills/video.js.map +1 -0
  150. package/dist/font-style.d.ts +23 -0
  151. package/dist/font-style.d.ts.map +1 -0
  152. package/dist/font-style.js +34 -0
  153. package/dist/font-style.js.map +1 -0
  154. package/dist/getter.d.ts +9 -0
  155. package/dist/getter.d.ts.map +1 -0
  156. package/dist/getter.js +26 -0
  157. package/dist/getter.js.map +1 -0
  158. package/dist/index.d.ts +9 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +11 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/master-clock.d.ts +42 -0
  163. package/dist/master-clock.d.ts.map +1 -0
  164. package/dist/master-clock.js +134 -0
  165. package/dist/master-clock.js.map +1 -0
  166. package/dist/measure-scope.d.ts +14 -0
  167. package/dist/measure-scope.d.ts.map +1 -0
  168. package/dist/measure-scope.js +29 -0
  169. package/dist/measure-scope.js.map +1 -0
  170. package/dist/render-context.d.ts +107 -0
  171. package/dist/render-context.d.ts.map +1 -0
  172. package/dist/render-context.js +940 -0
  173. package/dist/render-context.js.map +1 -0
  174. package/dist/shapes/alpha-contour.d.ts +27 -0
  175. package/dist/shapes/alpha-contour.d.ts.map +1 -0
  176. package/dist/shapes/alpha-contour.js +330 -0
  177. package/dist/shapes/alpha-contour.js.map +1 -0
  178. package/dist/shapes/base.d.ts +46 -0
  179. package/dist/shapes/base.d.ts.map +1 -0
  180. package/dist/shapes/base.js +95 -0
  181. package/dist/shapes/base.js.map +1 -0
  182. package/dist/shapes/boolean.d.ts +28 -0
  183. package/dist/shapes/boolean.d.ts.map +1 -0
  184. package/dist/shapes/boolean.js +90 -0
  185. package/dist/shapes/boolean.js.map +1 -0
  186. package/dist/shapes/ellipse.d.ts +32 -0
  187. package/dist/shapes/ellipse.d.ts.map +1 -0
  188. package/dist/shapes/ellipse.js +50 -0
  189. package/dist/shapes/ellipse.js.map +1 -0
  190. package/dist/shapes/image.d.ts +66 -0
  191. package/dist/shapes/image.d.ts.map +1 -0
  192. package/dist/shapes/image.js +214 -0
  193. package/dist/shapes/image.js.map +1 -0
  194. package/dist/shapes/index.d.ts +67 -0
  195. package/dist/shapes/index.d.ts.map +1 -0
  196. package/dist/shapes/index.js +297 -0
  197. package/dist/shapes/index.js.map +1 -0
  198. package/dist/shapes/line.d.ts +25 -0
  199. package/dist/shapes/line.d.ts.map +1 -0
  200. package/dist/shapes/line.js +87 -0
  201. package/dist/shapes/line.js.map +1 -0
  202. package/dist/shapes/mask.d.ts +28 -0
  203. package/dist/shapes/mask.d.ts.map +1 -0
  204. package/dist/shapes/mask.js +106 -0
  205. package/dist/shapes/mask.js.map +1 -0
  206. package/dist/shapes/paragraph-layout.d.ts +64 -0
  207. package/dist/shapes/paragraph-layout.d.ts.map +1 -0
  208. package/dist/shapes/paragraph-layout.js +156 -0
  209. package/dist/shapes/paragraph-layout.js.map +1 -0
  210. package/dist/shapes/path.d.ts +29 -0
  211. package/dist/shapes/path.d.ts.map +1 -0
  212. package/dist/shapes/path.js +71 -0
  213. package/dist/shapes/path.js.map +1 -0
  214. package/dist/shapes/polygon.d.ts +33 -0
  215. package/dist/shapes/polygon.d.ts.map +1 -0
  216. package/dist/shapes/polygon.js +86 -0
  217. package/dist/shapes/polygon.js.map +1 -0
  218. package/dist/shapes/polygram.d.ts +34 -0
  219. package/dist/shapes/polygram.d.ts.map +1 -0
  220. package/dist/shapes/polygram.js +90 -0
  221. package/dist/shapes/polygram.js.map +1 -0
  222. package/dist/shapes/rect.d.ts +41 -0
  223. package/dist/shapes/rect.d.ts.map +1 -0
  224. package/dist/shapes/rect.js +111 -0
  225. package/dist/shapes/rect.js.map +1 -0
  226. package/dist/shapes/richtext.d.ts +28 -0
  227. package/dist/shapes/richtext.d.ts.map +1 -0
  228. package/dist/shapes/richtext.js +32 -0
  229. package/dist/shapes/richtext.js.map +1 -0
  230. package/dist/shapes/shape-handler.d.ts +79 -0
  231. package/dist/shapes/shape-handler.d.ts.map +1 -0
  232. package/dist/shapes/shape-handler.js +304 -0
  233. package/dist/shapes/shape-handler.js.map +1 -0
  234. package/dist/shapes/text.d.ts +13 -0
  235. package/dist/shapes/text.d.ts.map +1 -0
  236. package/dist/shapes/text.js +67 -0
  237. package/dist/shapes/text.js.map +1 -0
  238. package/dist/shapes/trim.d.ts +10 -0
  239. package/dist/shapes/trim.d.ts.map +1 -0
  240. package/dist/shapes/trim.js +49 -0
  241. package/dist/shapes/trim.js.map +1 -0
  242. package/dist/storage-adapter.d.ts +56 -0
  243. package/dist/storage-adapter.d.ts.map +1 -0
  244. package/dist/storage-adapter.js +188 -0
  245. package/dist/storage-adapter.js.map +1 -0
  246. package/dist/stroke/index.d.ts +34 -0
  247. package/dist/stroke/index.d.ts.map +1 -0
  248. package/dist/stroke/index.js +360 -0
  249. package/dist/stroke/index.js.map +1 -0
  250. package/dist/stroke/stroke-handler.d.ts +45 -0
  251. package/dist/stroke/stroke-handler.d.ts.map +1 -0
  252. package/dist/stroke/stroke-handler.js +371 -0
  253. package/dist/stroke/stroke-handler.js.map +1 -0
  254. package/dist/video/extract.d.ts +54 -0
  255. package/dist/video/extract.d.ts.map +1 -0
  256. package/dist/video/extract.js +192 -0
  257. package/dist/video/extract.js.map +1 -0
  258. package/dist/video/extract.worker.d.ts +50 -0
  259. package/dist/video/extract.worker.d.ts.map +1 -0
  260. package/dist/video/extract.worker.js +224 -0
  261. package/dist/video/extract.worker.js.map +1 -0
  262. 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"}