@nodetool-ai/gpu 0.8.1

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 (359) hide show
  1. package/README.md +52 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/blend/blendModes.d.ts +67 -0
  4. package/dist/blend/blendModes.d.ts.map +1 -0
  5. package/dist/blend/blendModes.js +80 -0
  6. package/dist/blend/blendModes.js.map +1 -0
  7. package/dist/blend/index.d.ts +10 -0
  8. package/dist/blend/index.d.ts.map +1 -0
  9. package/dist/blend/index.js +10 -0
  10. package/dist/blend/index.js.map +1 -0
  11. package/dist/blend/wgsl.d.ts +16 -0
  12. package/dist/blend/wgsl.d.ts.map +1 -0
  13. package/dist/blend/wgsl.js +85 -0
  14. package/dist/blend/wgsl.js.map +1 -0
  15. package/dist/compositor/compositor.d.ts +112 -0
  16. package/dist/compositor/compositor.d.ts.map +1 -0
  17. package/dist/compositor/compositor.js +353 -0
  18. package/dist/compositor/compositor.js.map +1 -0
  19. package/dist/compositor/headless.d.ts +47 -0
  20. package/dist/compositor/headless.d.ts.map +1 -0
  21. package/dist/compositor/headless.js +158 -0
  22. package/dist/compositor/headless.js.map +1 -0
  23. package/dist/compositor/index.d.ts +8 -0
  24. package/dist/compositor/index.d.ts.map +1 -0
  25. package/dist/compositor/index.js +8 -0
  26. package/dist/compositor/index.js.map +1 -0
  27. package/dist/compositor/shaders.d.ts +24 -0
  28. package/dist/compositor/shaders.d.ts.map +1 -0
  29. package/dist/compositor/shaders.js +241 -0
  30. package/dist/compositor/shaders.js.map +1 -0
  31. package/dist/compositor/transform.d.ts +49 -0
  32. package/dist/compositor/transform.d.ts.map +1 -0
  33. package/dist/compositor/transform.js +74 -0
  34. package/dist/compositor/transform.js.map +1 -0
  35. package/dist/context.d.ts +108 -0
  36. package/dist/context.d.ts.map +1 -0
  37. package/dist/context.js +205 -0
  38. package/dist/context.js.map +1 -0
  39. package/dist/debug/premulValidator.d.ts +85 -0
  40. package/dist/debug/premulValidator.d.ts.map +1 -0
  41. package/dist/debug/premulValidator.js +239 -0
  42. package/dist/debug/premulValidator.js.map +1 -0
  43. package/dist/executor.d.ts +74 -0
  44. package/dist/executor.d.ts.map +1 -0
  45. package/dist/executor.js +413 -0
  46. package/dist/executor.js.map +1 -0
  47. package/dist/fullscreenQuad.d.ts +11 -0
  48. package/dist/fullscreenQuad.d.ts.map +1 -0
  49. package/dist/fullscreenQuad.js +31 -0
  50. package/dist/fullscreenQuad.js.map +1 -0
  51. package/dist/index.d.ts +16 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +16 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/module.d.ts +162 -0
  56. package/dist/module.d.ts.map +1 -0
  57. package/dist/module.js +100 -0
  58. package/dist/module.js.map +1 -0
  59. package/dist/node.d.ts +38 -0
  60. package/dist/node.d.ts.map +1 -0
  61. package/dist/node.js +140 -0
  62. package/dist/node.js.map +1 -0
  63. package/dist/pool.d.ts +30 -0
  64. package/dist/pool.d.ts.map +1 -0
  65. package/dist/pool.js +33 -0
  66. package/dist/pool.js.map +1 -0
  67. package/dist/recipe.d.ts +148 -0
  68. package/dist/recipe.d.ts.map +1 -0
  69. package/dist/recipe.js +181 -0
  70. package/dist/recipe.js.map +1 -0
  71. package/dist/registry.d.ts +49 -0
  72. package/dist/registry.d.ts.map +1 -0
  73. package/dist/registry.js +100 -0
  74. package/dist/registry.js.map +1 -0
  75. package/dist/shaders/_canary/passthrough/v1/module.d.ts +13 -0
  76. package/dist/shaders/_canary/passthrough/v1/module.d.ts.map +1 -0
  77. package/dist/shaders/_canary/passthrough/v1/module.js +71 -0
  78. package/dist/shaders/_canary/passthrough/v1/module.js.map +1 -0
  79. package/dist/shaders/alpha/premulToStraight/v1/module.d.ts +16 -0
  80. package/dist/shaders/alpha/premulToStraight/v1/module.d.ts.map +1 -0
  81. package/dist/shaders/alpha/premulToStraight/v1/module.js +62 -0
  82. package/dist/shaders/alpha/premulToStraight/v1/module.js.map +1 -0
  83. package/dist/shaders/alpha/straightToPremul/v1/module.d.ts +19 -0
  84. package/dist/shaders/alpha/straightToPremul/v1/module.d.ts.map +1 -0
  85. package/dist/shaders/alpha/straightToPremul/v1/module.js +61 -0
  86. package/dist/shaders/alpha/straightToPremul/v1/module.js.map +1 -0
  87. package/dist/shaders/color/brightnessContrast/v1/module.d.ts +17 -0
  88. package/dist/shaders/color/brightnessContrast/v1/module.d.ts.map +1 -0
  89. package/dist/shaders/color/brightnessContrast/v1/module.js +84 -0
  90. package/dist/shaders/color/brightnessContrast/v1/module.js.map +1 -0
  91. package/dist/shaders/color/cdl/v1/module.d.ts +35 -0
  92. package/dist/shaders/color/cdl/v1/module.d.ts.map +1 -0
  93. package/dist/shaders/color/cdl/v1/module.js +106 -0
  94. package/dist/shaders/color/cdl/v1/module.js.map +1 -0
  95. package/dist/shaders/color/channelMerge/v1/module.d.ts +22 -0
  96. package/dist/shaders/color/channelMerge/v1/module.d.ts.map +1 -0
  97. package/dist/shaders/color/channelMerge/v1/module.js +101 -0
  98. package/dist/shaders/color/channelMerge/v1/module.js.map +1 -0
  99. package/dist/shaders/color/channelShuffle/v1/module.d.ts +29 -0
  100. package/dist/shaders/color/channelShuffle/v1/module.d.ts.map +1 -0
  101. package/dist/shaders/color/channelShuffle/v1/module.js +94 -0
  102. package/dist/shaders/color/channelShuffle/v1/module.js.map +1 -0
  103. package/dist/shaders/color/channelSplit/v1/module.d.ts +18 -0
  104. package/dist/shaders/color/channelSplit/v1/module.d.ts.map +1 -0
  105. package/dist/shaders/color/channelSplit/v1/module.js +90 -0
  106. package/dist/shaders/color/channelSplit/v1/module.js.map +1 -0
  107. package/dist/shaders/color/colorBalance/v1/module.d.ts +18 -0
  108. package/dist/shaders/color/colorBalance/v1/module.d.ts.map +1 -0
  109. package/dist/shaders/color/colorBalance/v1/module.js +86 -0
  110. package/dist/shaders/color/colorBalance/v1/module.js.map +1 -0
  111. package/dist/shaders/color/cubeLut/v1/module.d.ts +14 -0
  112. package/dist/shaders/color/cubeLut/v1/module.d.ts.map +1 -0
  113. package/dist/shaders/color/cubeLut/v1/module.js +78 -0
  114. package/dist/shaders/color/cubeLut/v1/module.js.map +1 -0
  115. package/dist/shaders/color/curves/v1/module.d.ts +31 -0
  116. package/dist/shaders/color/curves/v1/module.d.ts.map +1 -0
  117. package/dist/shaders/color/curves/v1/module.js +102 -0
  118. package/dist/shaders/color/curves/v1/module.js.map +1 -0
  119. package/dist/shaders/color/exposure/v1/module.d.ts +15 -0
  120. package/dist/shaders/color/exposure/v1/module.d.ts.map +1 -0
  121. package/dist/shaders/color/exposure/v1/module.js +78 -0
  122. package/dist/shaders/color/exposure/v1/module.js.map +1 -0
  123. package/dist/shaders/color/exposureTone/v1/module.d.ts +28 -0
  124. package/dist/shaders/color/exposureTone/v1/module.d.ts.map +1 -0
  125. package/dist/shaders/color/exposureTone/v1/module.js +107 -0
  126. package/dist/shaders/color/exposureTone/v1/module.js.map +1 -0
  127. package/dist/shaders/color/filmLook/v1/module.d.ts +28 -0
  128. package/dist/shaders/color/filmLook/v1/module.d.ts.map +1 -0
  129. package/dist/shaders/color/filmLook/v1/module.js +103 -0
  130. package/dist/shaders/color/filmLook/v1/module.js.map +1 -0
  131. package/dist/shaders/color/grade/v1/module.d.ts +35 -0
  132. package/dist/shaders/color/grade/v1/module.d.ts.map +1 -0
  133. package/dist/shaders/color/grade/v1/module.js +182 -0
  134. package/dist/shaders/color/grade/v1/module.js.map +1 -0
  135. package/dist/shaders/color/grayscale/v1/module.d.ts +14 -0
  136. package/dist/shaders/color/grayscale/v1/module.d.ts.map +1 -0
  137. package/dist/shaders/color/grayscale/v1/module.js +79 -0
  138. package/dist/shaders/color/grayscale/v1/module.js.map +1 -0
  139. package/dist/shaders/color/hsb/v1/module.d.ts +20 -0
  140. package/dist/shaders/color/hsb/v1/module.d.ts.map +1 -0
  141. package/dist/shaders/color/hsb/v1/module.js +131 -0
  142. package/dist/shaders/color/hsb/v1/module.js.map +1 -0
  143. package/dist/shaders/color/hslAdjust/v1/module.d.ts +30 -0
  144. package/dist/shaders/color/hslAdjust/v1/module.d.ts.map +1 -0
  145. package/dist/shaders/color/hslAdjust/v1/module.js +170 -0
  146. package/dist/shaders/color/hslAdjust/v1/module.js.map +1 -0
  147. package/dist/shaders/color/invert/v1/module.d.ts +15 -0
  148. package/dist/shaders/color/invert/v1/module.d.ts.map +1 -0
  149. package/dist/shaders/color/invert/v1/module.js +85 -0
  150. package/dist/shaders/color/invert/v1/module.js.map +1 -0
  151. package/dist/shaders/color/levels/v1/module.d.ts +33 -0
  152. package/dist/shaders/color/levels/v1/module.d.ts.map +1 -0
  153. package/dist/shaders/color/levels/v1/module.js +116 -0
  154. package/dist/shaders/color/levels/v1/module.js.map +1 -0
  155. package/dist/shaders/color/liftGammaGain/v1/module.d.ts +40 -0
  156. package/dist/shaders/color/liftGammaGain/v1/module.d.ts.map +1 -0
  157. package/dist/shaders/color/liftGammaGain/v1/module.js +114 -0
  158. package/dist/shaders/color/liftGammaGain/v1/module.js.map +1 -0
  159. package/dist/shaders/color/posterize/v1/module.d.ts +16 -0
  160. package/dist/shaders/color/posterize/v1/module.d.ts.map +1 -0
  161. package/dist/shaders/color/posterize/v1/module.js +80 -0
  162. package/dist/shaders/color/posterize/v1/module.js.map +1 -0
  163. package/dist/shaders/color/solarize/v1/module.d.ts +15 -0
  164. package/dist/shaders/color/solarize/v1/module.d.ts.map +1 -0
  165. package/dist/shaders/color/solarize/v1/module.js +83 -0
  166. package/dist/shaders/color/solarize/v1/module.js.map +1 -0
  167. package/dist/shaders/color/splitToning/v1/module.d.ts +26 -0
  168. package/dist/shaders/color/splitToning/v1/module.d.ts.map +1 -0
  169. package/dist/shaders/color/splitToning/v1/module.js +95 -0
  170. package/dist/shaders/color/splitToning/v1/module.js.map +1 -0
  171. package/dist/shaders/filters/blur/gaussian/v1/module.d.ts +23 -0
  172. package/dist/shaders/filters/blur/gaussian/v1/module.d.ts.map +1 -0
  173. package/dist/shaders/filters/blur/gaussian/v1/module.js +110 -0
  174. package/dist/shaders/filters/blur/gaussian/v1/module.js.map +1 -0
  175. package/dist/shaders/filters/blur/separable/v1/module.d.ts +18 -0
  176. package/dist/shaders/filters/blur/separable/v1/module.d.ts.map +1 -0
  177. package/dist/shaders/filters/blur/separable/v1/module.js +64 -0
  178. package/dist/shaders/filters/blur/separable/v1/module.js.map +1 -0
  179. package/dist/shaders/filters/convolve3x3/v1/module.d.ts +23 -0
  180. package/dist/shaders/filters/convolve3x3/v1/module.d.ts.map +1 -0
  181. package/dist/shaders/filters/convolve3x3/v1/module.js +128 -0
  182. package/dist/shaders/filters/convolve3x3/v1/module.js.map +1 -0
  183. package/dist/shaders/filters/glow/v1/module.d.ts +26 -0
  184. package/dist/shaders/filters/glow/v1/module.d.ts.map +1 -0
  185. package/dist/shaders/filters/glow/v1/module.js +102 -0
  186. package/dist/shaders/filters/glow/v1/module.js.map +1 -0
  187. package/dist/shaders/filters/grain/v1/module.d.ts +38 -0
  188. package/dist/shaders/filters/grain/v1/module.d.ts.map +1 -0
  189. package/dist/shaders/filters/grain/v1/module.js +110 -0
  190. package/dist/shaders/filters/grain/v1/module.js.map +1 -0
  191. package/dist/shaders/filters/pixelate/v1/module.d.ts +14 -0
  192. package/dist/shaders/filters/pixelate/v1/module.d.ts.map +1 -0
  193. package/dist/shaders/filters/pixelate/v1/module.js +76 -0
  194. package/dist/shaders/filters/pixelate/v1/module.js.map +1 -0
  195. package/dist/shaders/filters/sharpen/unsharpMask/v1/module.d.ts +17 -0
  196. package/dist/shaders/filters/sharpen/unsharpMask/v1/module.d.ts.map +1 -0
  197. package/dist/shaders/filters/sharpen/unsharpMask/v1/module.js +93 -0
  198. package/dist/shaders/filters/sharpen/unsharpMask/v1/module.js.map +1 -0
  199. package/dist/shaders/filters/threshold/v1/module.d.ts +17 -0
  200. package/dist/shaders/filters/threshold/v1/module.d.ts.map +1 -0
  201. package/dist/shaders/filters/threshold/v1/module.js +71 -0
  202. package/dist/shaders/filters/threshold/v1/module.js.map +1 -0
  203. package/dist/shaders/filters/vignette/v1/module.d.ts +18 -0
  204. package/dist/shaders/filters/vignette/v1/module.d.ts.map +1 -0
  205. package/dist/shaders/filters/vignette/v1/module.js +78 -0
  206. package/dist/shaders/filters/vignette/v1/module.js.map +1 -0
  207. package/dist/shaders/filters/visualFx/v1/module.d.ts +24 -0
  208. package/dist/shaders/filters/visualFx/v1/module.d.ts.map +1 -0
  209. package/dist/shaders/filters/visualFx/v1/module.js +210 -0
  210. package/dist/shaders/filters/visualFx/v1/module.js.map +1 -0
  211. package/dist/shaders/index.d.ts +86 -0
  212. package/dist/shaders/index.d.ts.map +1 -0
  213. package/dist/shaders/index.js +161 -0
  214. package/dist/shaders/index.js.map +1 -0
  215. package/dist/shaders/keyer/chromaKey/v1/module.d.ts +25 -0
  216. package/dist/shaders/keyer/chromaKey/v1/module.d.ts.map +1 -0
  217. package/dist/shaders/keyer/chromaKey/v1/module.js +111 -0
  218. package/dist/shaders/keyer/chromaKey/v1/module.js.map +1 -0
  219. package/dist/shaders/keyer/lumaKey/v1/module.d.ts +22 -0
  220. package/dist/shaders/keyer/lumaKey/v1/module.d.ts.map +1 -0
  221. package/dist/shaders/keyer/lumaKey/v1/module.js +89 -0
  222. package/dist/shaders/keyer/lumaKey/v1/module.js.map +1 -0
  223. package/dist/shaders/mask/apply/v1/module.d.ts +16 -0
  224. package/dist/shaders/mask/apply/v1/module.d.ts.map +1 -0
  225. package/dist/shaders/mask/apply/v1/module.js +79 -0
  226. package/dist/shaders/mask/apply/v1/module.js.map +1 -0
  227. package/dist/shaders/mask/fromImage/v1/module.d.ts +18 -0
  228. package/dist/shaders/mask/fromImage/v1/module.d.ts.map +1 -0
  229. package/dist/shaders/mask/fromImage/v1/module.js +99 -0
  230. package/dist/shaders/mask/fromImage/v1/module.js.map +1 -0
  231. package/dist/shaders/mask/invert/v1/module.d.ts +12 -0
  232. package/dist/shaders/mask/invert/v1/module.d.ts.map +1 -0
  233. package/dist/shaders/mask/invert/v1/module.js +57 -0
  234. package/dist/shaders/mask/invert/v1/module.js.map +1 -0
  235. package/dist/shaders/mixer/add/v1/module.d.ts +17 -0
  236. package/dist/shaders/mixer/add/v1/module.d.ts.map +1 -0
  237. package/dist/shaders/mixer/add/v1/module.js +73 -0
  238. package/dist/shaders/mixer/add/v1/module.js.map +1 -0
  239. package/dist/shaders/mixer/colorOverlay/v1/module.d.ts +26 -0
  240. package/dist/shaders/mixer/colorOverlay/v1/module.d.ts.map +1 -0
  241. package/dist/shaders/mixer/colorOverlay/v1/module.js +81 -0
  242. package/dist/shaders/mixer/colorOverlay/v1/module.js.map +1 -0
  243. package/dist/shaders/mixer/dropShadow/v1/module.d.ts +28 -0
  244. package/dist/shaders/mixer/dropShadow/v1/module.d.ts.map +1 -0
  245. package/dist/shaders/mixer/dropShadow/v1/module.js +104 -0
  246. package/dist/shaders/mixer/dropShadow/v1/module.js.map +1 -0
  247. package/dist/shaders/mixer/outline/v1/module.d.ts +27 -0
  248. package/dist/shaders/mixer/outline/v1/module.d.ts.map +1 -0
  249. package/dist/shaders/mixer/outline/v1/module.js +105 -0
  250. package/dist/shaders/mixer/outline/v1/module.js.map +1 -0
  251. package/dist/shaders/mixer/over/v1/module.d.ts +16 -0
  252. package/dist/shaders/mixer/over/v1/module.d.ts.map +1 -0
  253. package/dist/shaders/mixer/over/v1/module.js +71 -0
  254. package/dist/shaders/mixer/over/v1/module.js.map +1 -0
  255. package/dist/shaders/mixer/shadowCompose/v1/module.d.ts +26 -0
  256. package/dist/shaders/mixer/shadowCompose/v1/module.d.ts.map +1 -0
  257. package/dist/shaders/mixer/shadowCompose/v1/module.js +95 -0
  258. package/dist/shaders/mixer/shadowCompose/v1/module.js.map +1 -0
  259. package/dist/shaders/sources/angularGradient/v1/module.d.ts +18 -0
  260. package/dist/shaders/sources/angularGradient/v1/module.d.ts.map +1 -0
  261. package/dist/shaders/sources/angularGradient/v1/module.js +67 -0
  262. package/dist/shaders/sources/angularGradient/v1/module.js.map +1 -0
  263. package/dist/shaders/sources/checkerboard/v1/module.d.ts +19 -0
  264. package/dist/shaders/sources/checkerboard/v1/module.d.ts.map +1 -0
  265. package/dist/shaders/sources/checkerboard/v1/module.js +70 -0
  266. package/dist/shaders/sources/checkerboard/v1/module.js.map +1 -0
  267. package/dist/shaders/sources/diamondGradient/v1/module.d.ts +18 -0
  268. package/dist/shaders/sources/diamondGradient/v1/module.d.ts.map +1 -0
  269. package/dist/shaders/sources/diamondGradient/v1/module.js +61 -0
  270. package/dist/shaders/sources/diamondGradient/v1/module.js.map +1 -0
  271. package/dist/shaders/sources/gaussianNoise/v1/module.d.ts +21 -0
  272. package/dist/shaders/sources/gaussianNoise/v1/module.d.ts.map +1 -0
  273. package/dist/shaders/sources/gaussianNoise/v1/module.js +72 -0
  274. package/dist/shaders/sources/gaussianNoise/v1/module.js.map +1 -0
  275. package/dist/shaders/sources/linearGradient/v1/module.d.ts +21 -0
  276. package/dist/shaders/sources/linearGradient/v1/module.d.ts.map +1 -0
  277. package/dist/shaders/sources/linearGradient/v1/module.js +72 -0
  278. package/dist/shaders/sources/linearGradient/v1/module.js.map +1 -0
  279. package/dist/shaders/sources/radialGradient/v1/module.d.ts +18 -0
  280. package/dist/shaders/sources/radialGradient/v1/module.d.ts.map +1 -0
  281. package/dist/shaders/sources/radialGradient/v1/module.js +60 -0
  282. package/dist/shaders/sources/radialGradient/v1/module.js.map +1 -0
  283. package/dist/shaders/sources/solid/v1/module.d.ts +17 -0
  284. package/dist/shaders/sources/solid/v1/module.d.ts.map +1 -0
  285. package/dist/shaders/sources/solid/v1/module.js +49 -0
  286. package/dist/shaders/sources/solid/v1/module.js.map +1 -0
  287. package/dist/shaders/transform/affine/v1/module.d.ts +36 -0
  288. package/dist/shaders/transform/affine/v1/module.d.ts.map +1 -0
  289. package/dist/shaders/transform/affine/v1/module.js +94 -0
  290. package/dist/shaders/transform/affine/v1/module.js.map +1 -0
  291. package/dist/shaders/transform/cornerPin/v1/module.d.ts +40 -0
  292. package/dist/shaders/transform/cornerPin/v1/module.d.ts.map +1 -0
  293. package/dist/shaders/transform/cornerPin/v1/module.js +109 -0
  294. package/dist/shaders/transform/cornerPin/v1/module.js.map +1 -0
  295. package/dist/shaders/transform/crop/v1/module.d.ts +26 -0
  296. package/dist/shaders/transform/crop/v1/module.d.ts.map +1 -0
  297. package/dist/shaders/transform/crop/v1/module.js +82 -0
  298. package/dist/shaders/transform/crop/v1/module.js.map +1 -0
  299. package/dist/shaders/transform/displace/v1/module.d.ts +23 -0
  300. package/dist/shaders/transform/displace/v1/module.d.ts.map +1 -0
  301. package/dist/shaders/transform/displace/v1/module.js +95 -0
  302. package/dist/shaders/transform/displace/v1/module.js.map +1 -0
  303. package/dist/shaders/transform/mirror/v1/module.d.ts +14 -0
  304. package/dist/shaders/transform/mirror/v1/module.d.ts.map +1 -0
  305. package/dist/shaders/transform/mirror/v1/module.js +73 -0
  306. package/dist/shaders/transform/mirror/v1/module.js.map +1 -0
  307. package/dist/shaders/transform/offset/v1/module.d.ts +21 -0
  308. package/dist/shaders/transform/offset/v1/module.d.ts.map +1 -0
  309. package/dist/shaders/transform/offset/v1/module.js +88 -0
  310. package/dist/shaders/transform/offset/v1/module.js.map +1 -0
  311. package/dist/shaders/transform/pad/v1/module.d.ts +26 -0
  312. package/dist/shaders/transform/pad/v1/module.d.ts.map +1 -0
  313. package/dist/shaders/transform/pad/v1/module.js +95 -0
  314. package/dist/shaders/transform/pad/v1/module.js.map +1 -0
  315. package/dist/shaders/transform/polarRemap/v1/module.d.ts +20 -0
  316. package/dist/shaders/transform/polarRemap/v1/module.d.ts.map +1 -0
  317. package/dist/shaders/transform/polarRemap/v1/module.js +95 -0
  318. package/dist/shaders/transform/polarRemap/v1/module.js.map +1 -0
  319. package/dist/shaders/transform/resize/v1/module.d.ts +20 -0
  320. package/dist/shaders/transform/resize/v1/module.d.ts.map +1 -0
  321. package/dist/shaders/transform/resize/v1/module.js +116 -0
  322. package/dist/shaders/transform/resize/v1/module.js.map +1 -0
  323. package/dist/shaders/transform/rotate90/v1/module.d.ts +25 -0
  324. package/dist/shaders/transform/rotate90/v1/module.d.ts.map +1 -0
  325. package/dist/shaders/transform/rotate90/v1/module.js +90 -0
  326. package/dist/shaders/transform/rotate90/v1/module.js.map +1 -0
  327. package/dist/shaders/transform/spherize/v1/module.d.ts +21 -0
  328. package/dist/shaders/transform/spherize/v1/module.d.ts.map +1 -0
  329. package/dist/shaders/transform/spherize/v1/module.js +94 -0
  330. package/dist/shaders/transform/spherize/v1/module.js.map +1 -0
  331. package/dist/shaders/transform/tile/v1/module.d.ts +22 -0
  332. package/dist/shaders/transform/tile/v1/module.d.ts.map +1 -0
  333. package/dist/shaders/transform/tile/v1/module.js +89 -0
  334. package/dist/shaders/transform/tile/v1/module.js.map +1 -0
  335. package/dist/shared/lumaWgsl.d.ts +14 -0
  336. package/dist/shared/lumaWgsl.d.ts.map +1 -0
  337. package/dist/shared/lumaWgsl.js +18 -0
  338. package/dist/shared/lumaWgsl.js.map +1 -0
  339. package/dist/shared/premulWgsl.d.ts +46 -0
  340. package/dist/shared/premulWgsl.d.ts.map +1 -0
  341. package/dist/shared/premulWgsl.js +90 -0
  342. package/dist/shared/premulWgsl.js.map +1 -0
  343. package/dist/texture.d.ts +54 -0
  344. package/dist/texture.d.ts.map +1 -0
  345. package/dist/texture.js +70 -0
  346. package/dist/texture.js.map +1 -0
  347. package/dist/types.d.ts +103 -0
  348. package/dist/types.d.ts.map +1 -0
  349. package/dist/types.js +8 -0
  350. package/dist/types.js.map +1 -0
  351. package/dist/validate/wgslLinearity.d.ts +86 -0
  352. package/dist/validate/wgslLinearity.d.ts.map +1 -0
  353. package/dist/validate/wgslLinearity.js +298 -0
  354. package/dist/validate/wgslLinearity.js.map +1 -0
  355. package/dist/webgpu/index.d.ts +11 -0
  356. package/dist/webgpu/index.d.ts.map +1 -0
  357. package/dist/webgpu/index.js +11 -0
  358. package/dist/webgpu/index.js.map +1 -0
  359. package/package.json +85 -0
@@ -0,0 +1,353 @@
1
+ /**
2
+ * WebGPULayerCompositor — the shared layer-compositing engine.
3
+ *
4
+ * Owns the blend + blit render pipelines, the ping-pong accumulation
5
+ * textures, and the sampler. Both the sketch editor and the timeline
6
+ * preview drive it: they upload their own source textures (canvas layers /
7
+ * video frames), seed the background into the read texture, then call
8
+ * {@link renderBlendPass} once per layer and {@link blit} to present.
9
+ *
10
+ * The engine is source-agnostic — it composites `GPUTexture`s addressed by a
11
+ * 2×3 inverse-affine matrix (screen px → layer texel). Sketch supplies
12
+ * `nearest` filtering (pixel-exact paint); the timeline supplies `linear`
13
+ * (smooth scaled video) plus an optional rounded-rect mask.
14
+ */
15
+ import tgpu from "typegpu";
16
+ import * as d from "typegpu/data";
17
+ import { BLEND_COMPOSITE_FRAGMENT, BLIT_FRAGMENT, FULLSCREEN_QUAD_VERTEX } from "./shaders.js";
18
+ /**
19
+ * Blend-pass uniform schema (4 × vec4f = 64 bytes). The single source of
20
+ * truth for both the WGSL `BlendUniforms` struct (see `shaders.ts`) and the
21
+ * host-side packed buffer. Field order mirrors the WGSL struct exactly.
22
+ */
23
+ const BlendUniforms = d.struct({
24
+ params0: d.vec4f, // opacity, blendMode, canvasW, canvasH
25
+ invRow0: d.vec4f, // inverse-affine row 0: a, b, tx, _
26
+ invRow1: d.vec4f, // inverse-affine row 1: c, d, ty, _
27
+ invRow2: d.vec4f, // projective denominator row: p, q, r, _
28
+ params1: d.vec4f, // borderRadius, smoothness, filterMode, irisSoftness
29
+ params2: d.vec4f // wipeEdge (0 = off), wipeProgress, wipeSoftness, irisProgress (-1 = off)
30
+ });
31
+ /** Typed bind group layout for the blend pass. Binding order = WGSL order. */
32
+ const blendLayout = tgpu.bindGroupLayout({
33
+ u: { uniform: BlendUniforms },
34
+ srcTexture: { texture: "float" },
35
+ dstTexture: { texture: "float" },
36
+ srcSampler: { sampler: "filtering" }
37
+ });
38
+ /** Typed bind group layout for the blit pass (single sampled texture). */
39
+ const blitLayout = tgpu.bindGroupLayout({
40
+ blitTexture: { texture: "float" }
41
+ });
42
+ const IDENTITY_INVERSE_AFFINE = {
43
+ a: 1,
44
+ b: 0,
45
+ tx: 0,
46
+ c: 0,
47
+ d: 1,
48
+ ty: 0
49
+ };
50
+ /**
51
+ * Convert a column-major 4×4 clip-space placement matrix (mapping a quad
52
+ * with local coords in [-1,1]² to clip space, as produced by the timeline's
53
+ * `buildTransformMatrix`) into the inverse-affine matrix (screen px → layer
54
+ * texel) the compositor shader expects.
55
+ *
56
+ * The composed screen→texel map is affine, so it is reconstructed exactly by
57
+ * evaluating three points and differencing — no hand-derived trigonometry,
58
+ * which keeps placement faithful to the matrix the caller already trusts.
59
+ */
60
+ export function forwardClipMatrixToInverseAffine(m, sourceWidth, sourceHeight, canvasWidth, canvasHeight) {
61
+ return (invertClipPlacement(m, sourceWidth, sourceHeight, canvasWidth, canvasHeight) ?? {
62
+ ...IDENTITY_INVERSE_AFFINE
63
+ });
64
+ }
65
+ /**
66
+ * {@link forwardClipMatrixToInverseAffine} without the identity fallback: null
67
+ * when the placement covers no area, such as a layer scaled to zero on either
68
+ * axis. A caller that draws layers must skip a null placement. The identity
69
+ * would draw the source 1:1 from the frame's top-left corner.
70
+ */
71
+ export function invertClipPlacement(m, sourceWidth, sourceHeight, canvasWidth, canvasHeight) {
72
+ if (sourceWidth <= 0 ||
73
+ sourceHeight <= 0 ||
74
+ canvasWidth <= 0 ||
75
+ canvasHeight <= 0) {
76
+ return null;
77
+ }
78
+ if (m[3] !== 0 || m[7] !== 0 || m[15] !== 1) {
79
+ const a = (canvasWidth / 2) * (m[0] + m[3]);
80
+ const b = (canvasWidth / 2) * (m[4] + m[7]);
81
+ const c = (canvasWidth / 2) * (m[12] + m[15]);
82
+ const d = (canvasHeight / 2) * (m[3] - m[1]);
83
+ const e = (canvasHeight / 2) * (m[7] - m[5]);
84
+ const f = (canvasHeight / 2) * (m[15] - m[13]);
85
+ const g = m[3];
86
+ const h = m[7];
87
+ const i = m[15];
88
+ const det = a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);
89
+ if (Math.abs(det) < 1e-12)
90
+ return null;
91
+ const n00 = (e * i - f * h) / det;
92
+ const n01 = (c * h - b * i) / det;
93
+ const n02 = (b * f - c * e) / det;
94
+ const n10 = (f * g - d * i) / det;
95
+ const n11 = (a * i - c * g) / det;
96
+ const n12 = (c * d - a * f) / det;
97
+ const n20 = (d * h - e * g) / det;
98
+ const n21 = (b * g - a * h) / det;
99
+ const n22 = (a * e - b * d) / det;
100
+ return {
101
+ a: (sourceWidth / 2) * (n00 + n20),
102
+ b: (sourceWidth / 2) * (n01 + n21),
103
+ tx: (sourceWidth / 2) * (n02 + n22),
104
+ c: (sourceHeight / 2) * (n20 - n10),
105
+ d: (sourceHeight / 2) * (n21 - n11),
106
+ ty: (sourceHeight / 2) * (n22 - n12),
107
+ p: n20,
108
+ q: n21,
109
+ r: n22
110
+ };
111
+ }
112
+ // local → clip: clip = A·local + t (A is the xy 2×2 block, t the xy translation).
113
+ const a00 = m[0];
114
+ const a01 = m[4];
115
+ const a10 = m[1];
116
+ const a11 = m[5];
117
+ const tX = m[12];
118
+ const tY = m[13];
119
+ const det = a00 * a11 - a01 * a10;
120
+ if (Math.abs(det) < 1e-12) {
121
+ return null;
122
+ }
123
+ const inv00 = a11 / det;
124
+ const inv01 = -a01 / det;
125
+ const inv10 = -a10 / det;
126
+ const inv11 = a00 / det;
127
+ // screen px → layer texel, evaluated at one point.
128
+ const texelAt = (X, Y) => {
129
+ // screen px → clip
130
+ const clipX = (X * 2) / canvasWidth - 1;
131
+ const clipY = 1 - (Y * 2) / canvasHeight;
132
+ // clip → local (A⁻¹ · (clip - t))
133
+ const cx = clipX - tX;
134
+ const cy = clipY - tY;
135
+ const localX = inv00 * cx + inv01 * cy;
136
+ const localY = inv10 * cx + inv11 * cy;
137
+ // local [-1,1] → texel [0,dims]. V is flipped: the quad maps local.y = -1
138
+ // (clip-space bottom) to texture row 0 (top), matching the source UVs.
139
+ return {
140
+ x: ((localX + 1) * sourceWidth) / 2,
141
+ y: ((1 - localY) * sourceHeight) / 2
142
+ };
143
+ };
144
+ const p00 = texelAt(0, 0);
145
+ const p10 = texelAt(1, 0);
146
+ const p01 = texelAt(0, 1);
147
+ return {
148
+ a: p10.x - p00.x,
149
+ b: p01.x - p00.x,
150
+ tx: p00.x,
151
+ c: p10.y - p00.y,
152
+ d: p01.y - p00.y,
153
+ ty: p00.y
154
+ };
155
+ }
156
+ /** SDF antialias band (layer-local units) when a border radius is active. */
157
+ const BORDER_RADIUS_SMOOTHNESS = 0.01;
158
+ export class WebGPULayerCompositor {
159
+ device;
160
+ format;
161
+ root;
162
+ blendBindGroupLayout;
163
+ blendPipeline;
164
+ blitBindGroupLayout;
165
+ blitPipeline;
166
+ sampler;
167
+ filterMode;
168
+ pingPongA = null;
169
+ pingPongB = null;
170
+ widthPx = 0;
171
+ heightPx = 0;
172
+ // Per-frame uniform buffers, reused across frames. One distinct buffer per
173
+ // blend pass within a frame: every pass in a frame is encoded into the same
174
+ // submit, so they cannot share a buffer (a write would alias to the last
175
+ // value). `beginFrame` resets the ring index each frame.
176
+ uniformBuffers = [];
177
+ passIndex = 0;
178
+ constructor(device, format, filter = "nearest", label = "layer-compositor") {
179
+ this.device = device;
180
+ this.format = format;
181
+ this.filterMode = filter === "linear" ? 1 : 0;
182
+ this.root = tgpu.initFromDevice({ device });
183
+ this.sampler = device.createSampler({
184
+ label: `${label}-sampler`,
185
+ magFilter: filter,
186
+ minFilter: filter,
187
+ addressModeU: "clamp-to-edge",
188
+ addressModeV: "clamp-to-edge"
189
+ });
190
+ // TypeGPU owns the bind group layouts: `root.unwrap(layout)` returns the
191
+ // GPUBindGroupLayout the WGSL in shaders.ts is authored against, so the
192
+ // host and the shader can never drift apart.
193
+ this.blendBindGroupLayout = this.root.unwrap(blendLayout);
194
+ const blendModule = device.createShaderModule({
195
+ label: `${label}-blend-frag`,
196
+ code: FULLSCREEN_QUAD_VERTEX + BLEND_COMPOSITE_FRAGMENT
197
+ });
198
+ this.blendPipeline = device.createRenderPipeline({
199
+ label: `${label}-blend-pipeline`,
200
+ layout: device.createPipelineLayout({
201
+ bindGroupLayouts: [this.blendBindGroupLayout]
202
+ }),
203
+ vertex: { module: blendModule, entryPoint: "vs_main" },
204
+ fragment: {
205
+ module: blendModule,
206
+ entryPoint: "fs_blend",
207
+ targets: [{ format }]
208
+ },
209
+ primitive: { topology: "triangle-strip" }
210
+ });
211
+ this.blitBindGroupLayout = this.root.unwrap(blitLayout);
212
+ const blitModule = device.createShaderModule({
213
+ label: `${label}-blit-frag`,
214
+ code: FULLSCREEN_QUAD_VERTEX + BLIT_FRAGMENT
215
+ });
216
+ this.blitPipeline = device.createRenderPipeline({
217
+ label: `${label}-blit-pipeline`,
218
+ layout: device.createPipelineLayout({
219
+ bindGroupLayouts: [this.blitBindGroupLayout]
220
+ }),
221
+ vertex: { module: blitModule, entryPoint: "vs_main" },
222
+ fragment: {
223
+ module: blitModule,
224
+ entryPoint: "fs_blit",
225
+ targets: [{ format }]
226
+ },
227
+ primitive: { topology: "triangle-strip" }
228
+ });
229
+ }
230
+ get width() {
231
+ return this.widthPx;
232
+ }
233
+ get height() {
234
+ return this.heightPx;
235
+ }
236
+ /** The ping-pong accumulation textures. Seed the background into A. */
237
+ get textureA() {
238
+ return this.pingPongA;
239
+ }
240
+ get textureB() {
241
+ return this.pingPongB;
242
+ }
243
+ /** (Re)allocate the ping-pong textures when the canvas size changes. */
244
+ ensureSize(width, height) {
245
+ if (this.pingPongA && this.widthPx === width && this.heightPx === height) {
246
+ return;
247
+ }
248
+ const safeW = Math.max(1, width);
249
+ const safeH = Math.max(1, height);
250
+ const usage = GPUTextureUsage.RENDER_ATTACHMENT |
251
+ GPUTextureUsage.TEXTURE_BINDING |
252
+ GPUTextureUsage.COPY_SRC |
253
+ GPUTextureUsage.COPY_DST;
254
+ this.pingPongA?.destroy();
255
+ this.pingPongB?.destroy();
256
+ this.pingPongA = this.device.createTexture({
257
+ label: "layer-compositor-ping-A",
258
+ size: { width: safeW, height: safeH },
259
+ format: this.format,
260
+ usage
261
+ });
262
+ this.pingPongB = this.device.createTexture({
263
+ label: "layer-compositor-ping-B",
264
+ size: { width: safeW, height: safeH },
265
+ format: this.format,
266
+ usage
267
+ });
268
+ this.widthPx = width;
269
+ this.heightPx = height;
270
+ }
271
+ /**
272
+ * Reset the per-frame uniform-buffer ring. Call once before the frame's
273
+ * sequence of {@link renderBlendPass} calls.
274
+ */
275
+ beginFrame() {
276
+ this.passIndex = 0;
277
+ }
278
+ /**
279
+ * Composite one layer: reads `readTex` (current accumulation) and the
280
+ * layer source, writes the blended result to `writeTex` (full-screen).
281
+ */
282
+ renderBlendPass(encoder, readTex, writeTex, params) {
283
+ const { invAffine } = params;
284
+ const borderRadius = params.borderRadius ?? 0;
285
+ const smoothness = borderRadius > 0 ? BORDER_RADIUS_SMOOTHNESS : 0;
286
+ const idx = this.passIndex++;
287
+ let uniformBuffer = this.uniformBuffers[idx];
288
+ if (!uniformBuffer) {
289
+ uniformBuffer = this.root
290
+ .createBuffer(BlendUniforms)
291
+ .$usage("uniform")
292
+ .$name(`layer-compositor-uniform-${idx}`);
293
+ this.uniformBuffers[idx] = uniformBuffer;
294
+ }
295
+ const wipe = params.wipe;
296
+ uniformBuffer.write({
297
+ params0: d.vec4f(params.opacity, params.blendModeId, params.canvasW, params.canvasH),
298
+ invRow0: d.vec4f(invAffine.a, invAffine.b, invAffine.tx, 0),
299
+ invRow1: d.vec4f(invAffine.c, invAffine.d, invAffine.ty, 0),
300
+ invRow2: d.vec4f(invAffine.p ?? 0, invAffine.q ?? 0, invAffine.r ?? 1, 0),
301
+ params1: d.vec4f(borderRadius, smoothness, this.filterMode, params.iris?.softness ?? 0),
302
+ params2: wipe
303
+ ? d.vec4f(wipe.edge, wipe.progress, wipe.softness, params.iris?.progress ?? -1)
304
+ : d.vec4f(0, 0, 0, params.iris?.progress ?? -1)
305
+ });
306
+ const bindGroup = this.device.createBindGroup({
307
+ layout: this.blendBindGroupLayout,
308
+ entries: [
309
+ { binding: 0, resource: { buffer: uniformBuffer.buffer } },
310
+ { binding: 1, resource: params.source.createView() },
311
+ { binding: 2, resource: readTex.createView() },
312
+ { binding: 3, resource: this.sampler }
313
+ ]
314
+ });
315
+ const pass = encoder.beginRenderPass({
316
+ colorAttachments: [
317
+ { view: writeTex.createView(), loadOp: "clear", storeOp: "store" }
318
+ ]
319
+ });
320
+ pass.setPipeline(this.blendPipeline);
321
+ pass.setBindGroup(0, bindGroup);
322
+ pass.draw(4);
323
+ pass.end();
324
+ }
325
+ /** Present `srcTex` to a target view (swap chain or other attachment). */
326
+ blit(encoder, srcTex, targetView) {
327
+ const bindGroup = this.device.createBindGroup({
328
+ layout: this.blitBindGroupLayout,
329
+ entries: [{ binding: 0, resource: srcTex.createView() }]
330
+ });
331
+ const pass = encoder.beginRenderPass({
332
+ colorAttachments: [
333
+ { view: targetView, loadOp: "clear", storeOp: "store" }
334
+ ]
335
+ });
336
+ pass.setPipeline(this.blitPipeline);
337
+ pass.setBindGroup(0, bindGroup);
338
+ pass.draw(4);
339
+ pass.end();
340
+ }
341
+ dispose() {
342
+ this.pingPongA?.destroy();
343
+ this.pingPongB?.destroy();
344
+ this.pingPongA = null;
345
+ this.pingPongB = null;
346
+ // The uniform buffers were created through the root, so destroying the
347
+ // root frees them. The GPUDevice itself is caller-owned and survives
348
+ // (root was created via initFromDevice).
349
+ this.uniformBuffers = [];
350
+ this.root.destroy();
351
+ }
352
+ }
353
+ //# sourceMappingURL=compositor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compositor.js","sourceRoot":"","sources":["../../src/compositor/compositor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Headless layer compositing — the host-agnostic "composite N layers, read
3
+ * back pixels" path used by server-side / Node.js callers.
4
+ *
5
+ * It drives the same {@link WebGPULayerCompositor} the sketch editor and the
6
+ * timeline preview use, so the blend math is identical across browser and
7
+ * Node. The only thing that differs is the boundary: instead of presenting to
8
+ * a canvas, this acquires the final accumulation texture and copies it back to
9
+ * a CPU buffer. Decode (bytes → RGBA) and encode (RGBA → PNG/JPEG) are the
10
+ * caller's job — they stay in the codec layer, not here.
11
+ *
12
+ * Layers are stacked at (0, 0) at their native size against a canvas of the
13
+ * given dimensions (identity screen→texel map). The shader bounds-checks each
14
+ * layer, so layers smaller than the canvas leave the surrounding pixels
15
+ * untouched, and layers larger than the canvas are cropped to the top-left —
16
+ * matching a `top: 0, left: 0` paste.
17
+ */
18
+ import { type LayerTransform2D } from "./transform.js";
19
+ /** One input layer: straight-alpha RGBA8 pixels plus per-layer state. */
20
+ export interface HeadlessLayer {
21
+ /** Straight (non-premultiplied) RGBA8, row-major, length = width*height*4. */
22
+ rgba: Uint8Array;
23
+ width: number;
24
+ height: number;
25
+ /** Layer opacity in [0, 1]. */
26
+ opacity: number;
27
+ /** Canonical blend-mode gpuId (see blendModes.ts). */
28
+ blendModeId: number;
29
+ /**
30
+ * Placement on the canvas. Omitted → the layer's top-left sits at the canvas
31
+ * origin at native size (an untransformed top-left paste).
32
+ */
33
+ transform?: LayerTransform2D;
34
+ }
35
+ /** Composited output: straight-alpha RGBA8 at the requested canvas size. */
36
+ export interface HeadlessCompositeResult {
37
+ rgba: Uint8Array;
38
+ width: number;
39
+ height: number;
40
+ }
41
+ /**
42
+ * Composite `layers` (bottom-first) onto a transparent canvas and read the
43
+ * result back to a CPU buffer. Pure WebGPU given a `device`; works against a
44
+ * browser, Electron, or Node.js Dawn device alike.
45
+ */
46
+ export declare function compositeLayersHeadless(device: GPUDevice, layers: HeadlessLayer[], canvasWidth: number, canvasHeight: number): Promise<HeadlessCompositeResult>;
47
+ //# sourceMappingURL=headless.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless.d.ts","sourceRoot":"","sources":["../../src/compositor/headless.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AAExB,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED,4EAA4E;AAC5E,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAKD;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,aAAa,EAAE,EACvB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,uBAAuB,CAAC,CA8JlC"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Headless layer compositing — the host-agnostic "composite N layers, read
3
+ * back pixels" path used by server-side / Node.js callers.
4
+ *
5
+ * It drives the same {@link WebGPULayerCompositor} the sketch editor and the
6
+ * timeline preview use, so the blend math is identical across browser and
7
+ * Node. The only thing that differs is the boundary: instead of presenting to
8
+ * a canvas, this acquires the final accumulation texture and copies it back to
9
+ * a CPU buffer. Decode (bytes → RGBA) and encode (RGBA → PNG/JPEG) are the
10
+ * caller's job — they stay in the codec layer, not here.
11
+ *
12
+ * Layers are stacked at (0, 0) at their native size against a canvas of the
13
+ * given dimensions (identity screen→texel map). The shader bounds-checks each
14
+ * layer, so layers smaller than the canvas leave the surrounding pixels
15
+ * untouched, and layers larger than the canvas are cropped to the top-left —
16
+ * matching a `top: 0, left: 0` paste.
17
+ */
18
+ import { WebGPULayerCompositor } from "./compositor.js";
19
+ import { FULLSCREEN_QUAD_VERTEX, UNPREMULTIPLY_FRAGMENT } from "./shaders.js";
20
+ import { defaultLayerTransform, layerTransformToInverseAffine } from "./transform.js";
21
+ /** `copyTextureToBuffer` requires a 256-byte-aligned `bytesPerRow`. */
22
+ const ROW_ALIGNMENT = 256;
23
+ /**
24
+ * Composite `layers` (bottom-first) onto a transparent canvas and read the
25
+ * result back to a CPU buffer. Pure WebGPU given a `device`; works against a
26
+ * browser, Electron, or Node.js Dawn device alike.
27
+ */
28
+ export async function compositeLayersHeadless(device, layers, canvasWidth, canvasHeight) {
29
+ const width = Math.max(1, Math.floor(canvasWidth));
30
+ const height = Math.max(1, Math.floor(canvasHeight));
31
+ const format = "rgba8unorm";
32
+ const compositor = new WebGPULayerCompositor(device, format, "nearest");
33
+ compositor.ensureSize(width, height);
34
+ const texA = compositor.textureA;
35
+ const texB = compositor.textureB;
36
+ if (!texA || !texB) {
37
+ compositor.dispose();
38
+ throw new Error("Compositor failed to allocate accumulation textures");
39
+ }
40
+ const sources = [];
41
+ const encoder = device.createCommandEncoder({ label: "headless-composite" });
42
+ // Seed the read texture transparent so the first blend pass composites
43
+ // layer 0 over nothing.
44
+ const clear = encoder.beginRenderPass({
45
+ colorAttachments: [
46
+ {
47
+ view: texA.createView(),
48
+ loadOp: "clear",
49
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
50
+ storeOp: "store"
51
+ }
52
+ ]
53
+ });
54
+ clear.end();
55
+ compositor.beginFrame();
56
+ let read = texA;
57
+ let write = texB;
58
+ for (const layer of layers) {
59
+ const lw = Math.max(1, Math.floor(layer.width));
60
+ const lh = Math.max(1, Math.floor(layer.height));
61
+ const source = device.createTexture({
62
+ label: "headless-composite-layer",
63
+ size: { width: lw, height: lh },
64
+ format,
65
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST
66
+ });
67
+ // Re-wrap as an ArrayBuffer-backed view: `writeTexture` rejects
68
+ // SharedArrayBuffer-backed sources under the DOM WebGPU typings.
69
+ // SAFETY: narrows `ArrayBufferLike` to `ArrayBuffer` for the typings only.
70
+ // The wrap is a view over the same bytes and `writeTexture` copies out of
71
+ // it identically whichever buffer kind actually backs `layer.rgba`, and
72
+ // the explicit byteOffset/byteLength below keep the view's bounds.
73
+ const data = new Uint8Array(layer.rgba.buffer, layer.rgba.byteOffset, layer.rgba.byteLength);
74
+ device.queue.writeTexture({ texture: source }, data, { bytesPerRow: lw * 4, rowsPerImage: lh }, { width: lw, height: lh });
75
+ sources.push(source);
76
+ const transform = layer.transform ?? defaultLayerTransform(lw, lh, width, height);
77
+ compositor.renderBlendPass(encoder, read, write, {
78
+ source,
79
+ opacity: layer.opacity,
80
+ blendModeId: layer.blendModeId,
81
+ canvasW: width,
82
+ canvasH: height,
83
+ invAffine: layerTransformToInverseAffine(transform, lw, lh)
84
+ });
85
+ // Swap: the texture we just wrote becomes the next pass's read.
86
+ const next = read;
87
+ read = write;
88
+ write = next;
89
+ }
90
+ // `read` now holds the final composite (premultiplied). Resolve it to
91
+ // straight alpha on the GPU instead of un-premultiplying per pixel on the
92
+ // CPU: a full-screen pass that divides RGB by alpha, into its own texture.
93
+ const final = read;
94
+ const resolved = device.createTexture({
95
+ label: "headless-composite-resolved",
96
+ size: { width, height },
97
+ format,
98
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC
99
+ });
100
+ const resolveModule = device.createShaderModule({
101
+ label: "headless-composite-unpremultiply",
102
+ code: `${FULLSCREEN_QUAD_VERTEX}\n${UNPREMULTIPLY_FRAGMENT}`
103
+ });
104
+ const resolvePipeline = device.createRenderPipeline({
105
+ label: "headless-composite-unpremultiply",
106
+ layout: "auto",
107
+ vertex: { module: resolveModule, entryPoint: "vs_main" },
108
+ fragment: {
109
+ module: resolveModule,
110
+ entryPoint: "fs_unpremultiply",
111
+ targets: [{ format }]
112
+ },
113
+ primitive: { topology: "triangle-strip" }
114
+ });
115
+ const resolvePass = encoder.beginRenderPass({
116
+ colorAttachments: [
117
+ {
118
+ view: resolved.createView(),
119
+ loadOp: "clear",
120
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
121
+ storeOp: "store"
122
+ }
123
+ ]
124
+ });
125
+ resolvePass.setPipeline(resolvePipeline);
126
+ resolvePass.setBindGroup(0, device.createBindGroup({
127
+ layout: resolvePipeline.getBindGroupLayout(0),
128
+ entries: [{ binding: 0, resource: final.createView() }]
129
+ }));
130
+ resolvePass.draw(4);
131
+ resolvePass.end();
132
+ const bytesPerRow = Math.ceil((width * 4) / ROW_ALIGNMENT) * ROW_ALIGNMENT;
133
+ const readback = device.createBuffer({
134
+ label: "headless-composite-readback",
135
+ size: bytesPerRow * height,
136
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
137
+ });
138
+ encoder.copyTextureToBuffer({ texture: resolved }, { buffer: readback, bytesPerRow, rowsPerImage: height }, { width, height });
139
+ device.queue.submit([encoder.finish()]);
140
+ await readback.mapAsync(GPUMapMode.READ);
141
+ const mapped = new Uint8Array(readback.getMappedRange());
142
+ // Pixels are already straight-alpha; just drop the 256-byte row padding
143
+ // `copyTextureToBuffer` requires (a per-row memcpy, no per-pixel math).
144
+ const rgba = new Uint8Array(width * height * 4);
145
+ const rowBytes = width * 4;
146
+ for (let row = 0; row < height; row++) {
147
+ rgba.set(mapped.subarray(row * bytesPerRow, row * bytesPerRow + rowBytes), row * rowBytes);
148
+ }
149
+ readback.unmap();
150
+ readback.destroy();
151
+ resolved.destroy();
152
+ for (const source of sources) {
153
+ source.destroy();
154
+ }
155
+ compositor.dispose();
156
+ return { rgba, width, height };
157
+ }
158
+ //# sourceMappingURL=headless.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless.js","sourceRoot":"","sources":["../../src/compositor/headless.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shared WebGPU layer-compositing engine. Browser/WebGPU-only.
3
+ */
4
+ export * from "./compositor.js";
5
+ export * from "./shaders.js";
6
+ export * from "./headless.js";
7
+ export * from "./transform.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compositor/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shared WebGPU layer-compositing engine. Browser/WebGPU-only.
3
+ */
4
+ export * from "./compositor.js";
5
+ export * from "./shaders.js";
6
+ export * from "./headless.js";
7
+ export * from "./transform.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compositor/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}