@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,90 @@
1
+ /**
2
+ * Combines paths via CanvasKit `PathOp`s and tracks nested "path collection"
3
+ * frames. A frame records each contributed path transformed into the
4
+ * coordinate space active when the frame began (via the inverse of that base
5
+ * matrix), so paths drawn under different transforms still combine correctly
6
+ * in one space — used for both explicit boolean ops and vector masks.
7
+ */
8
+ export class BooleanHandler {
9
+ canvasKit;
10
+ getCanvas;
11
+ pathCollectionStack = [];
12
+ booleanOpStack = [];
13
+ constructor(canvasKit, getCanvas) {
14
+ this.canvasKit = canvasKit;
15
+ this.getCanvas = getCanvas;
16
+ }
17
+ dispose() {
18
+ this.pathCollectionStack = [];
19
+ this.booleanOpStack = [];
20
+ }
21
+ isCollecting() {
22
+ return this.pathCollectionStack.length > 0;
23
+ }
24
+ contributeToPathCollection(path) {
25
+ if (this.pathCollectionStack.length === 0)
26
+ return;
27
+ const frame = this.pathCollectionStack[this.pathCollectionStack.length - 1];
28
+ const current = this.getCanvas().getTotalMatrix();
29
+ const rel = this.canvasKit.Matrix.multiply(frame.invBaseMatrix, current);
30
+ const builder = new this.canvasKit.PathBuilder();
31
+ builder.addPath(path, rel);
32
+ frame.paths.push(builder.detachAndDelete());
33
+ }
34
+ pushFrame() {
35
+ const m = Array.from(this.getCanvas().getTotalMatrix());
36
+ const inv = this.canvasKit.Matrix.invert(m) ?? this.canvasKit.Matrix.identity();
37
+ this.pathCollectionStack.push({ paths: [], invBaseMatrix: inv });
38
+ }
39
+ popFrame() {
40
+ const frame = this.pathCollectionStack.pop();
41
+ return frame ? frame.paths : [];
42
+ }
43
+ toCanvasKitPathOp(op) {
44
+ switch (op) {
45
+ case "subtract": return this.canvasKit.PathOp.Difference;
46
+ case "intersect": return this.canvasKit.PathOp.Intersect;
47
+ case "exclude": return this.canvasKit.PathOp.XOR;
48
+ case "union":
49
+ default: return this.canvasKit.PathOp.Union;
50
+ }
51
+ }
52
+ /** Folds `paths` left-to-right with `op`, deleting inputs as it consumes them. Caller owns the result. */
53
+ combinePaths(paths, op) {
54
+ if (paths.length === 0)
55
+ return null;
56
+ const ckOp = this.toCanvasKitPathOp(op);
57
+ let combined = paths[0];
58
+ for (let i = 1; i < paths.length; i++) {
59
+ const next = this.canvasKit.Path.MakeFromOp(combined, paths[i], ckOp);
60
+ combined.delete();
61
+ paths[i].delete();
62
+ if (!next) {
63
+ for (let j = i + 1; j < paths.length; j++)
64
+ paths[j].delete();
65
+ return null;
66
+ }
67
+ combined = next;
68
+ }
69
+ return combined;
70
+ }
71
+ beginBoolean(op) {
72
+ this.pushFrame();
73
+ this.booleanOpStack.push(op);
74
+ }
75
+ endBoolean(getCanvas) {
76
+ const op = this.booleanOpStack.pop() ?? "union";
77
+ const paths = this.popFrame();
78
+ const combined = this.combinePaths(paths, op);
79
+ if (!combined)
80
+ return null;
81
+ this.contributeToPathCollection(combined);
82
+ const canvas = getCanvas();
83
+ const shape = {
84
+ draw: (paint) => { canvas.drawPath(combined, paint); },
85
+ ckPath: combined,
86
+ };
87
+ return shape;
88
+ }
89
+ }
90
+ //# sourceMappingURL=boolean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean.js","sourceRoot":"","sources":["../../src/shapes/boolean.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { EllipseState } from "@motion-script/core";
2
+ import { BaseShape } from "./base";
3
+ type EllipseGeo = {
4
+ cx: number;
5
+ cy: number;
6
+ halfWidth: number;
7
+ halfHeight: number;
8
+ left: number;
9
+ right: number;
10
+ sweep: number;
11
+ isFullShape: boolean;
12
+ startAngle: number;
13
+ };
14
+ /** Ellipse, optionally a partial arc (`sweep` < 360°) defined via SVG arc commands. */
15
+ export declare class EllipseShape extends BaseShape<EllipseState, EllipseGeo> {
16
+ protected resolveState(state: Partial<EllipseState>): EllipseState;
17
+ protected computeGeometry(): EllipseGeo;
18
+ protected buildSVGPath(geo: EllipseGeo): string;
19
+ protected needsTrim(): boolean;
20
+ protected getTrimRange(): {
21
+ start: number;
22
+ end: number;
23
+ };
24
+ protected computeBounds(geo: EllipseGeo): {
25
+ left: number;
26
+ top: number;
27
+ right: number;
28
+ bottom: number;
29
+ };
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=ellipse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../src/shapes/ellipse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,KAAK,UAAU,GAAG;IACd,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,uFAAuF;AACvF,qBAAa,YAAa,SAAQ,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC;IACjE,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY;IAIlE,SAAS,CAAC,eAAe,IAAI,UAAU;IAiBvC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM;IAgB/C,SAAS,CAAC,SAAS,IAAI,OAAO;IAI9B,SAAS,CAAC,YAAY;;;;IAItB,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU;;;;;;CAI1C"}
@@ -0,0 +1,50 @@
1
+ import { withEllipseDescriptor } from "@motion-script/core";
2
+ import { BaseShape } from "./base";
3
+ /** Ellipse, optionally a partial arc (`sweep` < 360°) defined via SVG arc commands. */
4
+ export class EllipseShape extends BaseShape {
5
+ resolveState(state) {
6
+ return withEllipseDescriptor(state);
7
+ }
8
+ computeGeometry() {
9
+ const s = this.fullState;
10
+ const halfWidth = s.width / 2;
11
+ const halfHeight = s.height / 2;
12
+ const left = s.x - halfWidth;
13
+ const right = s.x + halfWidth;
14
+ const sweep = s.sweep ?? 360;
15
+ return {
16
+ cx: s.x, cy: s.y,
17
+ halfWidth, halfHeight,
18
+ left, right,
19
+ sweep,
20
+ isFullShape: Math.abs(sweep) >= 360,
21
+ startAngle: s.startAngle ?? 0,
22
+ };
23
+ }
24
+ buildSVGPath(geo) {
25
+ const { cx, cy, halfWidth, halfHeight, left, right, sweep, isFullShape, startAngle } = geo;
26
+ if (isFullShape) {
27
+ return `M ${left} ${cy} A ${halfWidth} ${halfHeight} 0 1 0 ${right} ${cy} A ${halfWidth} ${halfHeight} 0 1 0 ${left} ${cy} Z`;
28
+ }
29
+ const endAngle = startAngle + sweep;
30
+ const toRad = Math.PI / 180;
31
+ const sx = cx + halfWidth * Math.cos(startAngle * toRad);
32
+ const sy = cy + halfHeight * Math.sin(startAngle * toRad);
33
+ const ex = cx + halfWidth * Math.cos(endAngle * toRad);
34
+ const ey = cy + halfHeight * Math.sin(endAngle * toRad);
35
+ const largeArc = Math.abs(sweep) > 180 ? 1 : 0;
36
+ const sweepFlag = sweep > 0 ? 1 : 0;
37
+ return `M ${sx} ${sy} A ${halfWidth} ${halfHeight} 0 ${largeArc} ${sweepFlag} ${ex} ${ey}`;
38
+ }
39
+ needsTrim() {
40
+ return this.fullState.start !== 0 || this.fullState.end !== 1;
41
+ }
42
+ getTrimRange() {
43
+ return { start: this.fullState.start, end: this.fullState.end };
44
+ }
45
+ computeBounds(geo) {
46
+ const { cx, cy, halfWidth, halfHeight } = geo;
47
+ return { left: cx - halfWidth, top: cy - halfHeight, right: cx + halfWidth, bottom: cy + halfHeight };
48
+ }
49
+ }
50
+ //# sourceMappingURL=ellipse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ellipse.js","sourceRoot":"","sources":["../../src/shapes/ellipse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { CanvasKit, Canvas, Paint } from "@motion-script/canvaskit";
2
+ import { type FillResolved, type ImageState, type ShadowResolved, type StrokeResolved, withImageDescriptor } from "@motion-script/core";
3
+ import type { WebStorageAdapter } from "../storage-adapter";
4
+ import type { FillHandler } from "../fills/handler";
5
+ import type { ShapeHandler } from "./shape-handler";
6
+ import type { StrokeHandler } from "../stroke/stroke-handler";
7
+ /**
8
+ * Renders an Image node.
9
+ *
10
+ * Stroke / shadow / overlay-fill clipping follows the image's vector
11
+ * silhouette, extracted once at decode time by the asset manager (marching
12
+ * squares on the alpha channel, Douglas–Peucker simplified). That contour
13
+ * lives in image-pixel space; for each draw we transform it through the same
14
+ * matrix the image shader uses (so it lines up with the visible image), then
15
+ * stroke / fill it like any other path.
16
+ *
17
+ * Per-draw pipeline:
18
+ * 1. resolve CKImage and bounds.
19
+ * 2. build the alpha path (cached behind the asset manager).
20
+ * 3. shadows — stroke or fill the alpha path with shadow paint, blurred
21
+ * via a saveLayer image-filter.
22
+ * 4. base image — drawRect with the image shader.
23
+ * 5. overlay fills — fill the alpha path with each overlay fill.
24
+ * 6. strokes — stroke the alpha path with each stroke fill. Skia's stroke
25
+ * primitive gives sharp edges at any weight, real round/miter joins,
26
+ * and dash support out of the box.
27
+ */
28
+ export declare class ImageNodeRenderer {
29
+ private canvasKit;
30
+ private getCanvas;
31
+ private getPaint;
32
+ private assets;
33
+ private fills;
34
+ private shapeHandler;
35
+ private strokes;
36
+ constructor(canvasKit: CanvasKit, getCanvas: () => Canvas, getPaint: () => Paint, assets: WebStorageAdapter, fills: FillHandler, shapeHandler: ShapeHandler, strokes: StrokeHandler);
37
+ /**
38
+ * Returns `{ img, owned }`. `owned: true` means the caller created the
39
+ * CKImage inline (from raw `state.data`) and must `.delete()` it after
40
+ * drawing. `owned: false` means the storage adapter owns it.
41
+ */
42
+ private resolveImage;
43
+ private toImageFillResolved;
44
+ /**
45
+ * Build a CKPath from the cached alpha contours, with each vertex pre-
46
+ * transformed from image-pixel space into the destination bounds. The
47
+ * matrix matches the image shader's matrix so the path lines up with
48
+ * the visible image. Caller owns the returned path (.delete() when done).
49
+ * Returns null if no contour is cached.
50
+ */
51
+ private buildAlphaPath;
52
+ draw(state: ImageState, shadows: ShadowResolved[], overlayFills: FillResolved[], strokes: StrokeResolved[]): void;
53
+ private drawImage;
54
+ private applyFilters;
55
+ /**
56
+ * Drop shadow following the alpha contour. Renders the silhouette filled
57
+ * with the shadow fill into a blurred + translated saveLayer.
58
+ */
59
+ private drawShadow;
60
+ /** Overlay fills clipped to the alpha contour (or rect if no contour). */
61
+ private drawOverlayFills;
62
+ /** Stroke the alpha contour. Sharp edges at any weight, real joins, dash support. */
63
+ private drawStroke;
64
+ }
65
+ export { withImageDescriptor };
66
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/shapes/image.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,SAAS,EACT,MAAM,EACN,KAAK,EAGR,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACH,KAAK,YAAY,EAEjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,mBAAmB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,iBAAiB;IAEtB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,OAAO;gBANP,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,MAAM,EACvB,QAAQ,EAAE,MAAM,KAAK,EACrB,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,WAAW,EAClB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,aAAa;IAGlC;;;;OAIG;IACH,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,mBAAmB;IAW3B;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAiCtB,IAAI,CACA,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,cAAc,EAAE,EACzB,YAAY,EAAE,YAAY,EAAE,EAC5B,OAAO,EAAE,cAAc,EAAE,GAC1B,IAAI;IAiDP,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,YAAY;IASpB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAuClB,0EAA0E;IAC1E,OAAO,CAAC,gBAAgB;IAYxB,qFAAqF;IACrF,OAAO,CAAC,UAAU;CAWrB;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,214 @@
1
+ import { withImageDescriptor, } from "@motion-script/core";
2
+ import { computeImageMatrix, makeImageShader } from "../fills/image";
3
+ import { ImageFillFilterRegistry } from "../fills/filters/registry";
4
+ /**
5
+ * Renders an Image node.
6
+ *
7
+ * Stroke / shadow / overlay-fill clipping follows the image's vector
8
+ * silhouette, extracted once at decode time by the asset manager (marching
9
+ * squares on the alpha channel, Douglas–Peucker simplified). That contour
10
+ * lives in image-pixel space; for each draw we transform it through the same
11
+ * matrix the image shader uses (so it lines up with the visible image), then
12
+ * stroke / fill it like any other path.
13
+ *
14
+ * Per-draw pipeline:
15
+ * 1. resolve CKImage and bounds.
16
+ * 2. build the alpha path (cached behind the asset manager).
17
+ * 3. shadows — stroke or fill the alpha path with shadow paint, blurred
18
+ * via a saveLayer image-filter.
19
+ * 4. base image — drawRect with the image shader.
20
+ * 5. overlay fills — fill the alpha path with each overlay fill.
21
+ * 6. strokes — stroke the alpha path with each stroke fill. Skia's stroke
22
+ * primitive gives sharp edges at any weight, real round/miter joins,
23
+ * and dash support out of the box.
24
+ */
25
+ export class ImageNodeRenderer {
26
+ canvasKit;
27
+ getCanvas;
28
+ getPaint;
29
+ assets;
30
+ fills;
31
+ shapeHandler;
32
+ strokes;
33
+ constructor(canvasKit, getCanvas, getPaint, assets, fills, shapeHandler, strokes) {
34
+ this.canvasKit = canvasKit;
35
+ this.getCanvas = getCanvas;
36
+ this.getPaint = getPaint;
37
+ this.assets = assets;
38
+ this.fills = fills;
39
+ this.shapeHandler = shapeHandler;
40
+ this.strokes = strokes;
41
+ }
42
+ /**
43
+ * Returns `{ img, owned }`. `owned: true` means the caller created the
44
+ * CKImage inline (from raw `state.data`) and must `.delete()` it after
45
+ * drawing. `owned: false` means the storage adapter owns it.
46
+ */
47
+ resolveImage(state) {
48
+ if (state.src) {
49
+ const img = this.assets.getCKImage(state.src);
50
+ return img ? { img, owned: false } : null;
51
+ }
52
+ return null;
53
+ }
54
+ toImageFillResolved(state) {
55
+ return {
56
+ type: "image",
57
+ src: state.src ?? "",
58
+ mode: state.mode,
59
+ transform: state.transform,
60
+ scaling: state.scaling,
61
+ filters: state.filters,
62
+ };
63
+ }
64
+ /**
65
+ * Build a CKPath from the cached alpha contours, with each vertex pre-
66
+ * transformed from image-pixel space into the destination bounds. The
67
+ * matrix matches the image shader's matrix so the path lines up with
68
+ * the visible image. Caller owns the returned path (.delete() when done).
69
+ * Returns null if no contour is cached.
70
+ */
71
+ buildAlphaPath(img, state, bounds) {
72
+ if (!state.src)
73
+ return null;
74
+ const contours = this.assets.getAlphaContour?.(state.src);
75
+ if (!contours || contours.length === 0)
76
+ return null;
77
+ const m = computeImageMatrix(img.width(), img.height(), this.toImageFillResolved(state), bounds);
78
+ // m is row-major 3×3: [sx, shx, tx, shy, sy, ty, …] (no perspective).
79
+ const sx = m[0], shx = m[1], tx = m[2];
80
+ const shy = m[3], sy = m[4], ty = m[5];
81
+ // Build an SVG path string; CanvasKit's Path types expose
82
+ // MakeFromSVGString but not the runtime moveTo/lineTo methods.
83
+ const parts = [];
84
+ for (const contour of contours) {
85
+ if (contour.length < 4)
86
+ continue;
87
+ const x0 = sx * contour[0] + shx * contour[1] + tx;
88
+ const y0 = shy * contour[0] + sy * contour[1] + ty;
89
+ parts.push(`M${x0.toFixed(2)},${y0.toFixed(2)}`);
90
+ for (let i = 2; i < contour.length; i += 2) {
91
+ const px = sx * contour[i] + shx * contour[i + 1] + tx;
92
+ const py = shy * contour[i] + sy * contour[i + 1] + ty;
93
+ parts.push(`L${px.toFixed(2)},${py.toFixed(2)}`);
94
+ }
95
+ parts.push("Z");
96
+ }
97
+ if (parts.length === 0)
98
+ return null;
99
+ const path = this.canvasKit.Path.MakeFromSVGString(parts.join(""));
100
+ if (!path)
101
+ return null;
102
+ path.setFillType(this.canvasKit.FillType.EvenOdd);
103
+ return path;
104
+ }
105
+ draw(state, shadows, overlayFills, strokes) {
106
+ const canvas = this.getCanvas();
107
+ const ck = this.canvasKit;
108
+ const resolved = this.resolveImage(state);
109
+ if (!resolved)
110
+ return;
111
+ const { img, owned } = resolved;
112
+ const halfW = state.width / 2;
113
+ const halfH = state.height / 2;
114
+ const bounds = {
115
+ left: state.x - halfW,
116
+ top: state.y - halfH,
117
+ right: state.x + halfW,
118
+ bottom: state.y + halfH,
119
+ };
120
+ const boundsRect = ck.LTRBRect(bounds.left, bounds.top, bounds.right, bounds.bottom);
121
+ const imageFill = this.toImageFillResolved(state);
122
+ // Path may be null if the image is still decoding or has no alpha
123
+ // contour. We fall back to drawing strokes/shadows around the rect
124
+ // bounds in that case (matches Box behaviour).
125
+ const alphaPath = this.buildAlphaPath(img, state, bounds);
126
+ this.shapeHandler.pushBounds(bounds);
127
+ try {
128
+ for (const shadow of shadows) {
129
+ this.drawShadow(canvas, alphaPath, boundsRect, shadow, overlayFills, strokes);
130
+ }
131
+ this.drawImage(canvas, img, imageFill, bounds, boundsRect);
132
+ if (overlayFills.length > 0) {
133
+ this.drawOverlayFills(canvas, alphaPath, boundsRect, overlayFills);
134
+ }
135
+ for (const stroke of strokes) {
136
+ this.drawStroke(canvas, alphaPath, boundsRect, stroke);
137
+ }
138
+ }
139
+ finally {
140
+ this.shapeHandler.popBounds();
141
+ alphaPath?.delete();
142
+ // Only the `state.data` (inline) path produces a renderer-owned
143
+ // CKImage. The adapter-cached path is released by the adapter
144
+ // when underlying pixels are evicted.
145
+ if (owned)
146
+ img.delete();
147
+ }
148
+ }
149
+ drawImage(canvas, img, imageFill, bounds, boundsRect) {
150
+ const ck = this.canvasKit;
151
+ const paint = this.getPaint();
152
+ paint.setStyle(ck.PaintStyle.Fill);
153
+ paint.setAlphaf(imageFill.opacity ?? 1);
154
+ paint.setBlendMode(ck.BlendMode.SrcOver);
155
+ paint.setShader(makeImageShader(img, imageFill, ck, bounds));
156
+ this.applyFilters(paint, imageFill);
157
+ canvas.drawRect(boundsRect, paint);
158
+ paint.setShader(null);
159
+ paint.setImageFilter(null);
160
+ paint.setAlphaf(1);
161
+ }
162
+ applyFilters(paint, fill) {
163
+ if (!fill.filters || fill.filters.length === 0) {
164
+ paint.setImageFilter(null);
165
+ return;
166
+ }
167
+ const composed = ImageFillFilterRegistry.compose(fill.filters, this.canvasKit);
168
+ paint.setImageFilter(composed);
169
+ }
170
+ /**
171
+ * Drop shadow following the alpha contour. Renders the silhouette filled
172
+ * with the shadow fill into a blurred + translated saveLayer.
173
+ */
174
+ drawShadow(canvas, alphaPath, boundsRect, shadow, _overlayFills, _strokes) {
175
+ const ck = this.canvasKit;
176
+ const dx = shadow.dx ?? 0;
177
+ const dy = shadow.dy ?? 0;
178
+ const opacity = shadow.fill.opacity !== undefined ? shadow.fill.opacity : 1;
179
+ const layerPaint = new ck.Paint();
180
+ layerPaint.setAlphaf(opacity);
181
+ if (shadow.blur > 0) {
182
+ const sigma = shadow.blur / 2;
183
+ layerPaint.setImageFilter(ck.ImageFilter.MakeBlur(sigma, sigma, ck.TileMode.Decal, null));
184
+ }
185
+ canvas.save();
186
+ // Scene coords are Y-up; the canvas is Y-down, so negate dy to keep a
187
+ // positive dy nudging the shadow upward.
188
+ canvas.translate(dx, -dy);
189
+ canvas.saveLayer(layerPaint);
190
+ const shape = alphaPath
191
+ ? { draw: (p) => canvas.drawPath(alphaPath, p), ckPath: alphaPath }
192
+ : { draw: (p) => canvas.drawRect(boundsRect, p) };
193
+ this.fills.applyFills([{ ...shadow.fill, opacity: 1 }], [shape]);
194
+ canvas.restore();
195
+ canvas.restore();
196
+ layerPaint.delete();
197
+ }
198
+ /** Overlay fills clipped to the alpha contour (or rect if no contour). */
199
+ drawOverlayFills(canvas, alphaPath, boundsRect, overlayFills) {
200
+ const shape = alphaPath
201
+ ? { draw: (p) => canvas.drawPath(alphaPath, p), ckPath: alphaPath }
202
+ : { draw: (p) => canvas.drawRect(boundsRect, p) };
203
+ this.fills.applyFills(overlayFills, [shape]);
204
+ }
205
+ /** Stroke the alpha contour. Sharp edges at any weight, real joins, dash support. */
206
+ drawStroke(canvas, alphaPath, boundsRect, stroke) {
207
+ const shape = alphaPath
208
+ ? { draw: (p) => canvas.drawPath(alphaPath, p), ckPath: alphaPath }
209
+ : { draw: (p) => canvas.drawRect(boundsRect, p) };
210
+ this.strokes.applyStrokes([stroke], [shape]);
211
+ }
212
+ }
213
+ export { withImageDescriptor };
214
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/shapes/image.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { CanvasKit, Canvas, Paint, Path as CKPath, TypefaceFontProvider } from "@motion-script/canvaskit";
2
+ import { BooleanOperation, EllipseState, LineState, MaskApplyLayer, MaskOptions, PathState, PolygonState, PolygramState, RectState, ShadowResolved, TextState } from "@motion-script/core";
3
+ export interface CurrentShape {
4
+ draw: (paint: Paint) => void;
5
+ ckPath?: CKPath;
6
+ bounds?: {
7
+ left: number;
8
+ top: number;
9
+ right: number;
10
+ bottom: number;
11
+ };
12
+ isText?: boolean;
13
+ }
14
+ export declare class ShapeHandler {
15
+ private canvasKit;
16
+ private getCanvas;
17
+ private getPaint;
18
+ private fontMgr;
19
+ shapes: CurrentShape[];
20
+ paintApplied: boolean;
21
+ private pendingShadows;
22
+ private boolean;
23
+ private mask;
24
+ private boundsOverride;
25
+ private shapeCache;
26
+ private currentNodeId;
27
+ private shapeIndex;
28
+ private _cachedBounds;
29
+ private _boundsDirty;
30
+ constructor(canvasKit: CanvasKit, getCanvas: () => Canvas, getPaint: () => Paint, fontMgr: TypefaceFontProvider);
31
+ beginNode(nodeId: string): void;
32
+ reset(): void;
33
+ storePendingShadows(shadows: ShadowResolved[]): void;
34
+ takePendingShadows(): ShadowResolved[] | null;
35
+ dispose(): void;
36
+ isCollectingPaths(): boolean;
37
+ pushBounds(b: {
38
+ left: number;
39
+ top: number;
40
+ right: number;
41
+ bottom: number;
42
+ }): void;
43
+ popBounds(): void;
44
+ getShapeBounds(): {
45
+ left: number;
46
+ top: number;
47
+ right: number;
48
+ bottom: number;
49
+ } | null;
50
+ private addShape;
51
+ rect(state: Partial<RectState>): void;
52
+ ellipse(state: Partial<EllipseState>): void;
53
+ path(state: Partial<PathState>): void;
54
+ line(state: Partial<LineState>): void;
55
+ polygon(state: Partial<PolygonState>): void;
56
+ polygram(state: Partial<PolygramState>): void;
57
+ text(state: Partial<TextState>): void;
58
+ cut(): void;
59
+ unionStrokeShape(): CurrentShape | null;
60
+ beginBoolean(op: BooleanOperation): void;
61
+ endBoolean(): void;
62
+ beginMask(options?: MaskOptions): void;
63
+ applyMask(): void;
64
+ endMask(): void;
65
+ getMaskApply(): Set<MaskApplyLayer> | null;
66
+ }
67
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shapes/index.ts"],"names":[],"mappings":"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"}