@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 @@
1
+ {"version":3,"file":"color-matrix.d.ts","sourceRoot":"","sources":["../../../src/fills/filters/color-matrix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,oEAAoE;AACpE,qBAAa,0BAA2B,SAAQ,eAAe,CAAC,iBAAiB,CAAC;;IAK9E,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,EAAE,SAAS,GAAG,GAAG;CAMjE"}
@@ -0,0 +1,14 @@
1
+ import { ImageFillFilter } from "./filter";
2
+ /** Applies an arbitrary user-supplied 4×5 color matrix verbatim. */
3
+ export class ColorMatrixImageFillFilter extends ImageFillFilter {
4
+ constructor() {
5
+ super("colorMatrix");
6
+ }
7
+ makeImageFilter(filter, ck) {
8
+ const colorFilter = ck.ColorFilter.MakeMatrix(filter.matrix);
9
+ const imageFilter = ck.ImageFilter.MakeColorFilter(colorFilter, null);
10
+ colorFilter.delete();
11
+ return imageFilter;
12
+ }
13
+ }
14
+ //# sourceMappingURL=color-matrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-matrix.js","sourceRoot":"","sources":["../../../src/fills/filters/color-matrix.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,oEAAoE;AACpE,MAAM,OAAO,0BAA2B,SAAQ,eAAkC;IAC9E;QACI,KAAK,CAAC,aAAa,CAAC,CAAC;IACzB,CAAC;IAED,eAAe,CAAC,MAAyB,EAAE,EAAa;QACpD,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACtE,WAAW,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ"}
@@ -0,0 +1,9 @@
1
+ import type { CanvasKit } from "@motion-script/canvaskit";
2
+ import type { CurvesFilter } from "@motion-script/core";
3
+ import { ImageFillFilter } from "./filter";
4
+ /** Applies a per-channel tone curve, approximated as a linear color-matrix fit (see `fitLinear`). */
5
+ export declare class CurvesImageFillFilter extends ImageFillFilter<CurvesFilter> {
6
+ constructor();
7
+ makeImageFilter(filter: CurvesFilter, ck: CanvasKit): any;
8
+ }
9
+ //# sourceMappingURL=curves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curves.d.ts","sourceRoot":"","sources":["../../../src/fills/filters/curves.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AA0D3C,qGAAqG;AACrG,qBAAa,qBAAsB,SAAQ,eAAe,CAAC,YAAY,CAAC;;IAKpE,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,SAAS,GAAG,GAAG;CAU5D"}
@@ -0,0 +1,89 @@
1
+ import { ImageFillFilter } from "./filter";
2
+ /**
3
+ * Evaluate a piecewise-linear curve at x ∈ [0, 1].
4
+ * Assumes `points` are sorted by their x coordinate.
5
+ */
6
+ function evalCurve(points, x) {
7
+ if (points.length === 0)
8
+ return x;
9
+ if (x <= points[0][0])
10
+ return points[0][1];
11
+ const last = points[points.length - 1];
12
+ if (x >= last[0])
13
+ return last[1];
14
+ for (let i = 0; i < points.length - 1; i++) {
15
+ const [x0, y0] = points[i];
16
+ const [x1, y1] = points[i + 1];
17
+ if (x >= x0 && x <= x1) {
18
+ const t = x1 === x0 ? 0 : (x - x0) / (x1 - x0);
19
+ return y0 + (y1 - y0) * t;
20
+ }
21
+ }
22
+ return x;
23
+ }
24
+ /**
25
+ * Best-fit linear approximation `out = scale * in + bias` for the curve, chosen
26
+ * via least-squares over a dense sampling. The piecewise-linear curve cannot be
27
+ * represented exactly by a 4×5 color matrix (Skia exposes no LUT color filter
28
+ * in the WASM build), so a linear approximation is used.
29
+ */
30
+ function fitLinear(points) {
31
+ const N = 64;
32
+ let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
33
+ for (let i = 0; i < N; i++) {
34
+ const x = i / (N - 1);
35
+ const y = evalCurve(points, x);
36
+ sumX += x;
37
+ sumY += y;
38
+ sumXY += x * y;
39
+ sumXX += x * x;
40
+ }
41
+ const denom = N * sumXX - sumX * sumX;
42
+ const scale = denom === 0 ? 1 : (N * sumXY - sumX * sumY) / denom;
43
+ const bias = (sumY - scale * sumX) / N;
44
+ return { scale, bias };
45
+ }
46
+ function buildMatrix(channel, scale, bias) {
47
+ // 4×5 row-major color matrix: rows are [R, G, B, A], columns [R, G, B, A, 1].
48
+ // Default to identity; override the diagonal + bias on the chosen channel(s).
49
+ const m = [
50
+ 1, 0, 0, 0, 0,
51
+ 0, 1, 0, 0, 0,
52
+ 0, 0, 1, 0, 0,
53
+ 0, 0, 0, 1, 0,
54
+ ];
55
+ if (channel === 'rgb' || channel === 'r') {
56
+ m[0] = scale;
57
+ m[4] = bias;
58
+ }
59
+ if (channel === 'rgb' || channel === 'g') {
60
+ m[6] = scale;
61
+ m[9] = bias;
62
+ }
63
+ if (channel === 'rgb' || channel === 'b') {
64
+ m[12] = scale;
65
+ m[14] = bias;
66
+ }
67
+ if (channel === 'a') {
68
+ m[18] = scale;
69
+ m[19] = bias;
70
+ }
71
+ return m;
72
+ }
73
+ /** Applies a per-channel tone curve, approximated as a linear color-matrix fit (see `fitLinear`). */
74
+ export class CurvesImageFillFilter extends ImageFillFilter {
75
+ constructor() {
76
+ super("curves");
77
+ }
78
+ makeImageFilter(filter, ck) {
79
+ const channel = filter.channel ?? 'rgb';
80
+ const sorted = [...filter.points].sort((a, b) => a[0] - b[0]);
81
+ const { scale, bias } = fitLinear(sorted);
82
+ const matrix = buildMatrix(channel, scale, bias);
83
+ const colorFilter = ck.ColorFilter.MakeMatrix(matrix);
84
+ const imageFilter = ck.ImageFilter.MakeColorFilter(colorFilter, null);
85
+ colorFilter.delete();
86
+ return imageFilter;
87
+ }
88
+ }
89
+ //# sourceMappingURL=curves.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curves.js","sourceRoot":"","sources":["../../../src/fills/filters/curves.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C;;;GAGG;AACH,SAAS,SAAS,CAAC,MAA0B,EAAE,CAAS;IACpD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/C,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACL,CAAC;IACD,OAAO,CAAC,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,MAA0B;IACzC,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,CAAC;QAAC,IAAI,IAAI,CAAC,CAAC;QAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;QAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;IAClE,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW,CAAC,OAAsB,EAAE,KAAa,EAAE,IAAY;IACpE,8EAA8E;IAC9E,8EAA8E;IAC9E,MAAM,CAAC,GAAG;QACN,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACb,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACb,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACb,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KAChB,CAAC;IACF,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAAC,CAAC;IACxE,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAAC,CAAC;IACxE,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;QAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAAC,CAAC;IAC1E,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;QAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAAC,CAAC;IACrD,OAAO,CAAC,CAAC;AACb,CAAC;AAED,qGAAqG;AACrG,MAAM,OAAO,qBAAsB,SAAQ,eAA6B;IACpE;QACI,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,eAAe,CAAC,MAAoB,EAAE,EAAa;QAC/C,MAAM,OAAO,GAAkB,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;QACvD,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACtE,WAAW,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ"}
@@ -0,0 +1,9 @@
1
+ import type { CanvasKit } from "@motion-script/canvaskit";
2
+ import type { ExposureFilter } from "@motion-script/core";
3
+ import { ImageFillFilter } from "./filter";
4
+ /** Multiplies RGB channels by `value` (linear exposure scaling), alpha untouched. */
5
+ export declare class ExposureImageFillFilter extends ImageFillFilter<ExposureFilter> {
6
+ constructor();
7
+ makeImageFilter(filter: ExposureFilter, ck: CanvasKit): any;
8
+ }
9
+ //# sourceMappingURL=exposure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exposure.d.ts","sourceRoot":"","sources":["../../../src/fills/filters/exposure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,qFAAqF;AACrF,qBAAa,uBAAwB,SAAQ,eAAe,CAAC,cAAc,CAAC;;IAKxE,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,SAAS,GAAG,GAAG;CAc9D"}
@@ -0,0 +1,22 @@
1
+ import { ImageFillFilter } from "./filter";
2
+ /** Multiplies RGB channels by `value` (linear exposure scaling), alpha untouched. */
3
+ export class ExposureImageFillFilter extends ImageFillFilter {
4
+ constructor() {
5
+ super("exposure");
6
+ }
7
+ makeImageFilter(filter, ck) {
8
+ const v = filter.value;
9
+ // Scale RGB channels by `value`, preserve alpha.
10
+ const matrix = [
11
+ v, 0, 0, 0, 0,
12
+ 0, v, 0, 0, 0,
13
+ 0, 0, v, 0, 0,
14
+ 0, 0, 0, 1, 0,
15
+ ];
16
+ const colorFilter = ck.ColorFilter.MakeMatrix(matrix);
17
+ const imageFilter = ck.ImageFilter.MakeColorFilter(colorFilter, null);
18
+ colorFilter.delete();
19
+ return imageFilter;
20
+ }
21
+ }
22
+ //# sourceMappingURL=exposure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exposure.js","sourceRoot":"","sources":["../../../src/fills/filters/exposure.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,qFAAqF;AACrF,MAAM,OAAO,uBAAwB,SAAQ,eAA+B;IACxE;QACI,KAAK,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAED,eAAe,CAAC,MAAsB,EAAE,EAAa;QACjD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACvB,iDAAiD;QACjD,MAAM,MAAM,GAAG;YACX,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACb,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACb,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACb,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SAChB,CAAC;QACF,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACtE,WAAW,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ"}
@@ -0,0 +1,17 @@
1
+ import type { CanvasKit } from "@motion-script/canvaskit";
2
+ import type { MediaFilter } from "@motion-script/core";
3
+ /**
4
+ * Abstract base for per-filter-type image-fill filters.
5
+ *
6
+ * Subclasses build a Skia ImageFilter from a filter spec. Filters are composed
7
+ * in array order (index 0 is innermost — applied first to the image content)
8
+ * and attached to the paint via setImageFilter when drawing the fill.
9
+ */
10
+ export declare abstract class ImageFillFilter<T extends MediaFilter = MediaFilter> {
11
+ readonly type: string;
12
+ constructor(type: string);
13
+ abstract makeImageFilter(filter: T, ck: CanvasKit): any;
14
+ /** Release any persistent CanvasKit objects held by this filter. */
15
+ dispose(): void;
16
+ }
17
+ //# sourceMappingURL=filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../src/fills/filters/filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;;;GAMG;AACH,8BAAsB,eAAe,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM;IAIxB,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,GAAG,GAAG;IAEvD,oEAAoE;IACpE,OAAO,IAAI,IAAI;CAClB"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Abstract base for per-filter-type image-fill filters.
3
+ *
4
+ * Subclasses build a Skia ImageFilter from a filter spec. Filters are composed
5
+ * in array order (index 0 is innermost — applied first to the image content)
6
+ * and attached to the paint via setImageFilter when drawing the fill.
7
+ */
8
+ export class ImageFillFilter {
9
+ type;
10
+ constructor(type) {
11
+ this.type = type;
12
+ }
13
+ /** Release any persistent CanvasKit objects held by this filter. */
14
+ dispose() { }
15
+ }
16
+ //# sourceMappingURL=filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../src/fills/filters/filter.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,OAAgB,eAAe;IACxB,IAAI,CAAS;IAEtB,YAAY,IAAY;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAID,oEAAoE;IACpE,OAAO,KAAW,CAAC;CACtB"}
@@ -0,0 +1,9 @@
1
+ import type { CanvasKit } from "@motion-script/canvaskit";
2
+ import type { GrayscaleFilter } from "@motion-script/core";
3
+ import { ImageFillFilter } from "./filter";
4
+ /** Desaturates toward BT.709 luminance, blended with the original by `value`. */
5
+ export declare class GrayscaleImageFillFilter extends ImageFillFilter<GrayscaleFilter> {
6
+ constructor();
7
+ makeImageFilter(filter: GrayscaleFilter, ck: CanvasKit): any;
8
+ }
9
+ //# sourceMappingURL=grayscale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grayscale.d.ts","sourceRoot":"","sources":["../../../src/fills/filters/grayscale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAO3C,iFAAiF;AACjF,qBAAa,wBAAyB,SAAQ,eAAe,CAAC,eAAe,CAAC;;IAK1E,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,GAAG,GAAG;CAa/D"}
@@ -0,0 +1,25 @@
1
+ import { ImageFillFilter } from "./filter";
2
+ // ITU-R BT.709 luminance weights
3
+ const LR = 0.2126;
4
+ const LG = 0.7152;
5
+ const LB = 0.0722;
6
+ /** Desaturates toward BT.709 luminance, blended with the original by `value`. */
7
+ export class GrayscaleImageFillFilter extends ImageFillFilter {
8
+ constructor() {
9
+ super("grayscale");
10
+ }
11
+ makeImageFilter(filter, ck) {
12
+ const a = Math.max(0, Math.min(1, filter.value));
13
+ const matrix = [
14
+ 1 - a + a * LR, a * LG, a * LB, 0, 0,
15
+ a * LR, 1 - a + a * LG, a * LB, 0, 0,
16
+ a * LR, a * LG, 1 - a + a * LB, 0, 0,
17
+ 0, 0, 0, 1, 0,
18
+ ];
19
+ const colorFilter = ck.ColorFilter.MakeMatrix(matrix);
20
+ const imageFilter = ck.ImageFilter.MakeColorFilter(colorFilter, null);
21
+ colorFilter.delete();
22
+ return imageFilter;
23
+ }
24
+ }
25
+ //# sourceMappingURL=grayscale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grayscale.js","sourceRoot":"","sources":["../../../src/fills/filters/grayscale.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,iCAAiC;AACjC,MAAM,EAAE,GAAG,MAAM,CAAC;AAClB,MAAM,EAAE,GAAG,MAAM,CAAC;AAClB,MAAM,EAAE,GAAG,MAAM,CAAC;AAElB,iFAAiF;AACjF,MAAM,OAAO,wBAAyB,SAAQ,eAAgC;IAC1E;QACI,KAAK,CAAC,WAAW,CAAC,CAAC;IACvB,CAAC;IAED,eAAe,CAAC,MAAuB,EAAE,EAAa;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG;YACX,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;YACpC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;YACpC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;YACpC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SAChB,CAAC;QACF,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACtE,WAAW,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ"}
@@ -0,0 +1,16 @@
1
+ import type { CanvasKit } from "@motion-script/canvaskit";
2
+ import type { MediaFilter } from "@motion-script/core";
3
+ import { ImageFillFilter } from "./filter";
4
+ export declare class ImageFillFilterRegistry {
5
+ private static readonly list;
6
+ static get(type: string): ImageFillFilter | undefined;
7
+ static makeImageFilter(filter: MediaFilter, ck: CanvasKit): any;
8
+ /**
9
+ * Compose filters into a single MediaFilter chain applied in array order
10
+ * (index 0 is innermost — applied first to the image content). Filter order
11
+ * matters: e.g. blur-then-grayscale ≠ grayscale-then-blur.
12
+ */
13
+ static compose(filters: MediaFilter[], ck: CanvasKit): any | null;
14
+ static disposeAll(): void;
15
+ }
16
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/fills/filters/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAS3C,qBAAa,uBAAuB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAQ1B;IAEF,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIrD,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,GAAG,GAAG;IAM/D;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,SAAS,GAAG,GAAG,GAAG,IAAI;IAYjE,MAAM,CAAC,UAAU,IAAI,IAAI;CAK5B"}
@@ -0,0 +1,50 @@
1
+ import { ExposureImageFillFilter } from "./exposure";
2
+ import { BlurImageFillFilter } from "./blur";
3
+ import { GrayscaleImageFillFilter } from "./grayscale";
4
+ import { AlphaImageFillFilter } from "./alpha";
5
+ import { ColorMatrixImageFillFilter } from "./color-matrix";
6
+ import { CurvesImageFillFilter } from "./curves";
7
+ import { ColorAdjustmentImageFillFilter } from "./color-adjustment";
8
+ export class ImageFillFilterRegistry {
9
+ static list = [
10
+ new ExposureImageFillFilter(),
11
+ new BlurImageFillFilter(),
12
+ new GrayscaleImageFillFilter(),
13
+ new AlphaImageFillFilter(),
14
+ new ColorMatrixImageFillFilter(),
15
+ new CurvesImageFillFilter(),
16
+ new ColorAdjustmentImageFillFilter(),
17
+ ];
18
+ static get(type) {
19
+ return this.list.find((filter) => filter.type === type);
20
+ }
21
+ static makeImageFilter(filter, ck) {
22
+ const handler = this.get(filter.type);
23
+ if (!handler)
24
+ return null;
25
+ return handler.makeImageFilter(filter, ck);
26
+ }
27
+ /**
28
+ * Compose filters into a single MediaFilter chain applied in array order
29
+ * (index 0 is innermost — applied first to the image content). Filter order
30
+ * matters: e.g. blur-then-grayscale ≠ grayscale-then-blur.
31
+ */
32
+ static compose(filters, ck) {
33
+ let composed = null;
34
+ for (const filter of filters) {
35
+ const made = this.makeImageFilter(filter, ck);
36
+ if (made == null)
37
+ continue;
38
+ composed = composed === null
39
+ ? made
40
+ : ck.ImageFilter.MakeCompose(made, composed);
41
+ }
42
+ return composed;
43
+ }
44
+ static disposeAll() {
45
+ for (const handler of this.list) {
46
+ handler.dispose();
47
+ }
48
+ }
49
+ }
50
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/fills/filters/registry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAEpE,MAAM,OAAO,uBAAuB;IACxB,MAAM,CAAU,IAAI,GAAsB;QAC9C,IAAI,uBAAuB,EAAE;QAC7B,IAAI,mBAAmB,EAAE;QACzB,IAAI,wBAAwB,EAAE;QAC9B,IAAI,oBAAoB,EAAE;QAC1B,IAAI,0BAA0B,EAAE;QAChC,IAAI,qBAAqB,EAAE;QAC3B,IAAI,8BAA8B,EAAE;KACvC,CAAC;IAEF,MAAM,CAAC,GAAG,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,MAAmB,EAAE,EAAa;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,OAAO,CAAC,eAAe,CAAC,MAAa,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,OAAsB,EAAE,EAAa;QAChD,IAAI,QAAQ,GAAQ,IAAI,CAAC;QACzB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,IAAI,IAAI,IAAI;gBAAE,SAAS;YAC3B,QAAQ,GAAG,QAAQ,KAAK,IAAI;gBACxB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,UAAU;QACb,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC;IACL,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { CanvasKit, Shader } from "@motion-script/canvaskit";
2
+ /**
3
+ * Caches built gradient `Shader`s keyed on a cheap string derived from the
4
+ * resolved fill plus the pixel bounds it was resolved against.
5
+ *
6
+ * Without this, every gradient fill rebuilt its shader (and re-`.map()`'d its
7
+ * colors into Color4f arrays) on every frame for every shape, and the old
8
+ * Shader — a wasm-heap object — was never `.delete()`'d, so it leaked until the
9
+ * JS finalization registry caught up. Reusing a shader while its inputs are
10
+ * unchanged removes both the rebuild cost and the per-frame leak.
11
+ *
12
+ * The cache is bounded; the oldest entry's shader is deleted on eviction.
13
+ */
14
+ export declare class GradientShaderCache {
15
+ private readonly limit;
16
+ private map;
17
+ constructor(limit?: number);
18
+ /**
19
+ * Return the cached shader for `key`, or build + store it via `build`.
20
+ * Re-inserts on hit so the Map iteration order acts as a simple LRU.
21
+ */
22
+ get(key: string, build: () => Shader): Shader;
23
+ dispose(): void;
24
+ }
25
+ /** Build a CanvasKit Color4f array from normalized RGBA tuples. */
26
+ export declare function toCkColors(ck: CanvasKit, colors: readonly (readonly [number, number, number, number])[]): Float32Array[];
27
+ /** Append a list of numbers to a key buffer, comma-separated. */
28
+ export declare function pushNums(parts: string[], nums: readonly number[]): void;
29
+ //# sourceMappingURL=gradient-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradient-cache.d.ts","sourceRoot":"","sources":["../../src/fills/gradient-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,qBAAa,mBAAmB;IAGhB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,GAAG,CAA6B;gBAEX,KAAK,SAAM;IAExC;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,MAAM,GAAG,MAAM;IAoB7C,OAAO,IAAI,IAAI;CAIlB;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CACtB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,GAC/D,YAAY,EAAE,CAEhB;AAED,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAEvE"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Caches built gradient `Shader`s keyed on a cheap string derived from the
3
+ * resolved fill plus the pixel bounds it was resolved against.
4
+ *
5
+ * Without this, every gradient fill rebuilt its shader (and re-`.map()`'d its
6
+ * colors into Color4f arrays) on every frame for every shape, and the old
7
+ * Shader — a wasm-heap object — was never `.delete()`'d, so it leaked until the
8
+ * JS finalization registry caught up. Reusing a shader while its inputs are
9
+ * unchanged removes both the rebuild cost and the per-frame leak.
10
+ *
11
+ * The cache is bounded; the oldest entry's shader is deleted on eviction.
12
+ */
13
+ export class GradientShaderCache {
14
+ limit;
15
+ map = new Map();
16
+ constructor(limit = 256) {
17
+ this.limit = limit;
18
+ }
19
+ /**
20
+ * Return the cached shader for `key`, or build + store it via `build`.
21
+ * Re-inserts on hit so the Map iteration order acts as a simple LRU.
22
+ */
23
+ get(key, build) {
24
+ const existing = this.map.get(key);
25
+ if (existing) {
26
+ // Refresh recency.
27
+ this.map.delete(key);
28
+ this.map.set(key, existing);
29
+ return existing;
30
+ }
31
+ const shader = build();
32
+ this.map.set(key, shader);
33
+ if (this.map.size > this.limit) {
34
+ const oldest = this.map.keys().next().value;
35
+ if (oldest !== undefined) {
36
+ this.map.get(oldest)?.delete();
37
+ this.map.delete(oldest);
38
+ }
39
+ }
40
+ return shader;
41
+ }
42
+ dispose() {
43
+ for (const shader of this.map.values())
44
+ shader.delete();
45
+ this.map.clear();
46
+ }
47
+ }
48
+ /** Build a CanvasKit Color4f array from normalized RGBA tuples. */
49
+ export function toCkColors(ck, colors) {
50
+ return colors.map((c) => ck.Color4f(c[0], c[1], c[2], c[3]));
51
+ }
52
+ /** Append a list of numbers to a key buffer, comma-separated. */
53
+ export function pushNums(parts, nums) {
54
+ for (let i = 0; i < nums.length; i++)
55
+ parts.push(nums[i].toFixed(4));
56
+ }
57
+ //# sourceMappingURL=gradient-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradient-cache.js","sourceRoot":"","sources":["../../src/fills/gradient-cache.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,mBAAmB;IAGC;IAFrB,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExC,YAA6B,QAAQ,GAAG;QAAX,UAAK,GAAL,KAAK,CAAM;IAAG,CAAC;IAE5C;;;OAGG;IACH,GAAG,CAAC,GAAW,EAAE,KAAmB;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,EAAE,CAAC;YACX,mBAAmB;YACnB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC5B,OAAO,QAAQ,CAAC;QACpB,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAA2B,CAAC;YAClE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,OAAO;QACH,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;YAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACxD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACJ;AAED,mEAAmE;AACnE,MAAM,UAAU,UAAU,CACtB,EAAa,EACb,MAA8D;IAE9D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,QAAQ,CAAC,KAAe,EAAE,IAAuB;IAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { CanvasKit, Paint } from "@motion-script/canvaskit";
2
+ import { type BlendMode, type FillResolved, type FillSpace } from "@motion-script/core";
3
+ import type { WebStorageAdapter } from "../storage-adapter";
4
+ import type { FillRendererContext } from "./renderer";
5
+ export type { FillRenderer } from "./renderer";
6
+ export type { FillRendererContext } from "./renderer";
7
+ export { FillRenderRegistry } from "./registry";
8
+ export interface ShapeBounds {
9
+ left: number;
10
+ top: number;
11
+ right: number;
12
+ bottom: number;
13
+ }
14
+ export interface DrawnShape {
15
+ draw: (paint: Paint) => void;
16
+ getBounds?: () => ShapeBounds | null;
17
+ }
18
+ /**
19
+ * Stateless paint applicator. All async work (decoding images, extracting
20
+ * video frames) happens in WebStorageAdapter before render. By the time
21
+ * applyFills runs, every required CKImage is already cached.
22
+ */
23
+ export declare class FillHandler {
24
+ offscreenCanvas: HTMLCanvasElement | null;
25
+ offscreenCtx: CanvasRenderingContext2D | null;
26
+ private canvasKit;
27
+ private getPaint;
28
+ private getCanvas;
29
+ private getUnionBounds;
30
+ private getSpaceRect;
31
+ private assets;
32
+ private currentBounds;
33
+ constructor(canvasKit: CanvasKit, getPaint: () => Paint, getCanvas: () => import("@motion-script/canvaskit").Canvas, getUnionBounds: () => ShapeBounds | null, getSpaceRect: (space: FillSpace) => ShapeBounds | null, assets: WebStorageAdapter);
34
+ private unionPath;
35
+ setCurrentBounds(bounds: ShapeBounds | null): void;
36
+ boundsForSpace(space: FillSpace, shape: {
37
+ ckPath?: {
38
+ getBounds(): Float32Array;
39
+ };
40
+ } | null): ShapeBounds | null;
41
+ dispose(): void;
42
+ getCanvasKitBlendMode(blend: BlendMode): any;
43
+ buildRendererCtx(paint: Paint): FillRendererContext;
44
+ applyFills(fills: FillResolved[], shapes: Array<{
45
+ draw: (p: Paint) => void;
46
+ ckPath?: any;
47
+ }>): boolean;
48
+ }
49
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/fills/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,SAAS,EACT,KAAK,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACH,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,SAAS,EACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtD,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;CACxC;AAED;;;;GAIG;AACH,qBAAa,WAAW;IACpB,eAAe,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IACjD,YAAY,EAAE,wBAAwB,GAAG,IAAI,CAAQ;IAErD,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,SAAS,CAAkD;IACnE,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,MAAM,CAAoB;IAKlC,OAAO,CAAC,aAAa,CAA4B;gBAG7C,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,KAAK,EACrB,SAAS,EAAE,MAAM,OAAO,0BAA0B,EAAE,MAAM,EAC1D,cAAc,EAAE,MAAM,WAAW,GAAG,IAAI,EACxC,YAAY,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,WAAW,GAAG,IAAI,EACtD,MAAM,EAAE,iBAAiB;IAe7B,OAAO,CAAC,SAAS;IAkBjB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAOlD,cAAc,CACV,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE;QAAE,MAAM,CAAC,EAAE;YAAE,SAAS,IAAI,YAAY,CAAA;SAAE,CAAA;KAAE,GAAG,IAAI,GACzD,WAAW,GAAG,IAAI;IAgBrB,OAAO,IAAI,IAAI;IAKf,qBAAqB,CAAC,KAAK,EAAE,SAAS,GAAG,GAAG;IAuB5C,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,mBAAmB;IAcnD,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC,GAAG,OAAO;CAqExG"}