framefields 2.0.2

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 (408) hide show
  1. package/LICENCE +202 -0
  2. package/README.md +740 -0
  3. package/dist/audio/index.d.mts +5 -0
  4. package/dist/audio/index.mjs +14 -0
  5. package/dist/audio-Dvwwz8xU.d.mts +37 -0
  6. package/dist/audio-Dvwwz8xU.d.mts.map +1 -0
  7. package/dist/audio-TAvPwzLR.mjs +214 -0
  8. package/dist/audio-TAvPwzLR.mjs.map +1 -0
  9. package/dist/audio-x28ZgQBP.mjs +85 -0
  10. package/dist/audio-x28ZgQBP.mjs.map +1 -0
  11. package/dist/chunk-GMkBE123.mjs +47 -0
  12. package/dist/client-C74hb7fy.mjs +66 -0
  13. package/dist/client-C74hb7fy.mjs.map +1 -0
  14. package/dist/dist-1iUYuPct.mjs +1859 -0
  15. package/dist/dist-1iUYuPct.mjs.map +1 -0
  16. package/dist/dist-Bx6J0VcM.mjs +1859 -0
  17. package/dist/dist-Bx6J0VcM.mjs.map +1 -0
  18. package/dist/dist-C_hjvkdN.mjs +2220 -0
  19. package/dist/dist-C_hjvkdN.mjs.map +1 -0
  20. package/dist/dist-DKm2IyEJ.mjs +94 -0
  21. package/dist/dist-DKm2IyEJ.mjs.map +1 -0
  22. package/dist/dist-cjs-B5EVqDFp.mjs +85 -0
  23. package/dist/dist-cjs-B5EVqDFp.mjs.map +1 -0
  24. package/dist/dist-cjs-BGJkdexX.mjs +437 -0
  25. package/dist/dist-cjs-BGJkdexX.mjs.map +1 -0
  26. package/dist/dist-cjs-BKmGCgtm.mjs +9069 -0
  27. package/dist/dist-cjs-BKmGCgtm.mjs.map +1 -0
  28. package/dist/dist-cjs-BUc0_kg-.mjs +1091 -0
  29. package/dist/dist-cjs-BUc0_kg-.mjs.map +1 -0
  30. package/dist/dist-cjs-BUwe2XhR.mjs +153 -0
  31. package/dist/dist-cjs-BUwe2XhR.mjs.map +1 -0
  32. package/dist/dist-cjs-BWgoUCXJ.mjs +137 -0
  33. package/dist/dist-cjs-BWgoUCXJ.mjs.map +1 -0
  34. package/dist/dist-cjs-CmZEMtO6.mjs +6 -0
  35. package/dist/dist-cjs-D7kEM-Mj.mjs +181 -0
  36. package/dist/dist-cjs-D7kEM-Mj.mjs.map +1 -0
  37. package/dist/dist-cjs-DFUmy89O.mjs +48 -0
  38. package/dist/dist-cjs-DFUmy89O.mjs.map +1 -0
  39. package/dist/dist-cjs-Df7144zM.mjs +209 -0
  40. package/dist/dist-cjs-Df7144zM.mjs.map +1 -0
  41. package/dist/dist-cjs-DgxjcvBN.mjs +98 -0
  42. package/dist/dist-cjs-DgxjcvBN.mjs.map +1 -0
  43. package/dist/dist-cjs-DsMdld8l.mjs +5015 -0
  44. package/dist/dist-cjs-DsMdld8l.mjs.map +1 -0
  45. package/dist/dist-cjs-Dzs5P3K0.mjs +51 -0
  46. package/dist/dist-cjs-Dzs5P3K0.mjs.map +1 -0
  47. package/dist/dist-cjs-ECMuIF57.mjs +323 -0
  48. package/dist/dist-cjs-ECMuIF57.mjs.map +1 -0
  49. package/dist/dist-cjs-lYvO8aDo.mjs +64 -0
  50. package/dist/dist-cjs-lYvO8aDo.mjs.map +1 -0
  51. package/dist/dist-cjs-qEJrwjGk.mjs +66 -0
  52. package/dist/dist-cjs-qEJrwjGk.mjs.map +1 -0
  53. package/dist/dist-cjs-x5cwlqA5.mjs +43 -0
  54. package/dist/dist-cjs-x5cwlqA5.mjs.map +1 -0
  55. package/dist/dist-gjHmorxL.mjs +27479 -0
  56. package/dist/dist-gjHmorxL.mjs.map +1 -0
  57. package/dist/effects/index.d.mts +5 -0
  58. package/dist/effects/index.mjs +35 -0
  59. package/dist/effects-CHWORCYd.mjs +811 -0
  60. package/dist/effects-CHWORCYd.mjs.map +1 -0
  61. package/dist/event-streams-D-APZ7Ke.mjs +204 -0
  62. package/dist/event-streams-D-APZ7Ke.mjs.map +1 -0
  63. package/dist/fonts/index.d.mts +2 -0
  64. package/dist/fonts/index.mjs +3 -0
  65. package/dist/fonts-DrGTBJJk.mjs +188 -0
  66. package/dist/fonts-DrGTBJJk.mjs.map +1 -0
  67. package/dist/index-B0BNPEoH.d.mts +2117 -0
  68. package/dist/index-B0BNPEoH.d.mts.map +1 -0
  69. package/dist/index-BMVVmc4G.d.mts +72 -0
  70. package/dist/index-BMVVmc4G.d.mts.map +1 -0
  71. package/dist/index-D1ZsMpke.d.mts +264 -0
  72. package/dist/index-D1ZsMpke.d.mts.map +1 -0
  73. package/dist/index-D2jDC7O5.d.mts +3643 -0
  74. package/dist/index-D2jDC7O5.d.mts.map +1 -0
  75. package/dist/index-D2wJqSl5.d.mts +114 -0
  76. package/dist/index-D2wJqSl5.d.mts.map +1 -0
  77. package/dist/index-DKFGNyMB.d.mts +309 -0
  78. package/dist/index-DKFGNyMB.d.mts.map +1 -0
  79. package/dist/index-DiSKzDGR.d.mts +65 -0
  80. package/dist/index-DiSKzDGR.d.mts.map +1 -0
  81. package/dist/index.d.mts +4425 -0
  82. package/dist/index.d.mts.map +1 -0
  83. package/dist/index.mjs +2623 -0
  84. package/dist/index.mjs.map +1 -0
  85. package/dist/package-C58KmGKw.mjs +6 -0
  86. package/dist/package-C58KmGKw.mjs.map +1 -0
  87. package/dist/preview/index.d.mts +90 -0
  88. package/dist/preview/index.d.mts.map +1 -0
  89. package/dist/preview/index.mjs +15 -0
  90. package/dist/preview-engine/audio.mjs +1 -0
  91. package/dist/preview-engine/child_process-AIL2NBWS.mjs +1 -0
  92. package/dist/preview-engine/chunk-24P6DAB3.mjs +1 -0
  93. package/dist/preview-engine/chunk-37EFVZWT.mjs +1 -0
  94. package/dist/preview-engine/chunk-3O5OKR6D.mjs +223 -0
  95. package/dist/preview-engine/chunk-47VT677S.mjs +8 -0
  96. package/dist/preview-engine/chunk-4BEJJKEU.mjs +315 -0
  97. package/dist/preview-engine/chunk-4GEWSUX5.mjs +1 -0
  98. package/dist/preview-engine/chunk-55CCFPUX.mjs +237 -0
  99. package/dist/preview-engine/chunk-5JD65JSJ.mjs +110 -0
  100. package/dist/preview-engine/chunk-5UP7FSGT.mjs +294 -0
  101. package/dist/preview-engine/chunk-5XDHHOF2.mjs +367 -0
  102. package/dist/preview-engine/chunk-6YJP57MZ.mjs +729 -0
  103. package/dist/preview-engine/chunk-6ZOXGAYA.mjs +112 -0
  104. package/dist/preview-engine/chunk-AOLAHYVV.mjs +529 -0
  105. package/dist/preview-engine/chunk-B6PLCMBM.mjs +1 -0
  106. package/dist/preview-engine/chunk-BJKH76OM.mjs +264 -0
  107. package/dist/preview-engine/chunk-BUIQ5TUH.mjs +104 -0
  108. package/dist/preview-engine/chunk-BVF64D6H.mjs +1 -0
  109. package/dist/preview-engine/chunk-CA5N7JRZ.mjs +138 -0
  110. package/dist/preview-engine/chunk-CNSHAFEA.mjs +1 -0
  111. package/dist/preview-engine/chunk-CURR5X7D.mjs +1 -0
  112. package/dist/preview-engine/chunk-CVGM2U4J.mjs +47 -0
  113. package/dist/preview-engine/chunk-CYY366IE.mjs +1 -0
  114. package/dist/preview-engine/chunk-D5PHI6ET.mjs +109 -0
  115. package/dist/preview-engine/chunk-D7MZHP2Y.mjs +275 -0
  116. package/dist/preview-engine/chunk-DPPH3NK2.mjs +182 -0
  117. package/dist/preview-engine/chunk-DPST2XLC.mjs +418 -0
  118. package/dist/preview-engine/chunk-DRLEOHN5.mjs +1 -0
  119. package/dist/preview-engine/chunk-EDIZNO3P.mjs +1 -0
  120. package/dist/preview-engine/chunk-EHIIT4ZR.mjs +52 -0
  121. package/dist/preview-engine/chunk-FKZ4XXPE.mjs +1 -0
  122. package/dist/preview-engine/chunk-G3HW4VER.mjs +60 -0
  123. package/dist/preview-engine/chunk-G76HSKOS.mjs +184 -0
  124. package/dist/preview-engine/chunk-GYG2IIBR.mjs +1 -0
  125. package/dist/preview-engine/chunk-H2F5NVQ6.mjs +63 -0
  126. package/dist/preview-engine/chunk-H5BPCY7N.mjs +188 -0
  127. package/dist/preview-engine/chunk-HAXK42HG.mjs +997 -0
  128. package/dist/preview-engine/chunk-HXMDPMLB.mjs +1 -0
  129. package/dist/preview-engine/chunk-HYBAPT6I.mjs +1 -0
  130. package/dist/preview-engine/chunk-I4FH6HYU.mjs +73 -0
  131. package/dist/preview-engine/chunk-IYVN2QEL.mjs +1 -0
  132. package/dist/preview-engine/chunk-JPXQPP6J.mjs +1 -0
  133. package/dist/preview-engine/chunk-JWNHTRED.mjs +164 -0
  134. package/dist/preview-engine/chunk-KZOLCZIV.mjs +103 -0
  135. package/dist/preview-engine/chunk-L62MRHGZ.mjs +89 -0
  136. package/dist/preview-engine/chunk-LEEZXHQO.mjs +117 -0
  137. package/dist/preview-engine/chunk-LKYN3BM2.mjs +1 -0
  138. package/dist/preview-engine/chunk-LP3EP33S.mjs +610 -0
  139. package/dist/preview-engine/chunk-M2GRYRLM.mjs +111 -0
  140. package/dist/preview-engine/chunk-MC7TZZLD.mjs +134 -0
  141. package/dist/preview-engine/chunk-MT2DZQHO.mjs +1 -0
  142. package/dist/preview-engine/chunk-MTJHQATU.mjs +1 -0
  143. package/dist/preview-engine/chunk-N4LHIPHZ.mjs +340 -0
  144. package/dist/preview-engine/chunk-N4PWLBZ7.mjs +5 -0
  145. package/dist/preview-engine/chunk-NQZKBFC6.mjs +40 -0
  146. package/dist/preview-engine/chunk-NWRSVVTF.mjs +186 -0
  147. package/dist/preview-engine/chunk-P3HBP725.mjs +1 -0
  148. package/dist/preview-engine/chunk-PIAJWALT.mjs +1 -0
  149. package/dist/preview-engine/chunk-PJ3DVG45.mjs +1 -0
  150. package/dist/preview-engine/chunk-QP2NI4XD.mjs +82 -0
  151. package/dist/preview-engine/chunk-SA3JUR6D.mjs +52 -0
  152. package/dist/preview-engine/chunk-SRT2OCQW.mjs +1 -0
  153. package/dist/preview-engine/chunk-SWD76532.mjs +98 -0
  154. package/dist/preview-engine/chunk-SXX7HX34.mjs +191 -0
  155. package/dist/preview-engine/chunk-SZ7YRPKO.mjs +3 -0
  156. package/dist/preview-engine/chunk-TMRLZV5X.mjs +1 -0
  157. package/dist/preview-engine/chunk-U446SQP3.mjs +292 -0
  158. package/dist/preview-engine/chunk-UDNCEHUI.mjs +141 -0
  159. package/dist/preview-engine/chunk-V3H7WWOT.mjs +271 -0
  160. package/dist/preview-engine/chunk-V7ZVVUQU.mjs +108 -0
  161. package/dist/preview-engine/chunk-VJGK7MLJ.mjs +3 -0
  162. package/dist/preview-engine/chunk-VSSB73UU.mjs +58 -0
  163. package/dist/preview-engine/chunk-VXUJWPIK.mjs +1 -0
  164. package/dist/preview-engine/chunk-XD4GKD6H.mjs +5 -0
  165. package/dist/preview-engine/chunk-XKO4RYKN.mjs +3 -0
  166. package/dist/preview-engine/chunk-XOEEGC4Z.mjs +1 -0
  167. package/dist/preview-engine/chunk-YAQFFQPG.mjs +1 -0
  168. package/dist/preview-engine/chunk-YKMBRUAE.mjs +1 -0
  169. package/dist/preview-engine/chunk-YSTLMWCG.mjs +1 -0
  170. package/dist/preview-engine/chunk-Z4ERCLNF.mjs +1 -0
  171. package/dist/preview-engine/chunk-ZEYUXJIV.mjs +1 -0
  172. package/dist/preview-engine/chunk-ZX6APG6E.mjs +117 -0
  173. package/dist/preview-engine/effects.mjs +1 -0
  174. package/dist/preview-engine/esbuild-GWV7CM7D.mjs +1 -0
  175. package/dist/preview-engine/fonts.mjs +1 -0
  176. package/dist/preview-engine/framefields.mjs +1959 -0
  177. package/dist/preview-engine/onnxruntime-node-56GSZEH3.mjs +1 -0
  178. package/dist/preview-engine/player.mjs +155 -0
  179. package/dist/preview-engine/renderers-2AUSIYZN.mjs +1 -0
  180. package/dist/preview-engine/renderers-2QN6KZJP.mjs +1 -0
  181. package/dist/preview-engine/renderers-32SKW7ML.mjs +1 -0
  182. package/dist/preview-engine/renderers-5QYK6766.mjs +1 -0
  183. package/dist/preview-engine/renderers-6BJA6MSU.mjs +251 -0
  184. package/dist/preview-engine/renderers-6QAF3LQ2.mjs +1 -0
  185. package/dist/preview-engine/renderers-7AO5746S.mjs +296 -0
  186. package/dist/preview-engine/renderers-AFYKNM6N.mjs +1 -0
  187. package/dist/preview-engine/renderers-AGMH5CRH.mjs +1 -0
  188. package/dist/preview-engine/renderers-AHSGP6LY.mjs +126 -0
  189. package/dist/preview-engine/renderers-ASTBICLA.mjs +1 -0
  190. package/dist/preview-engine/renderers-BHVPLYNN.mjs +1 -0
  191. package/dist/preview-engine/renderers-D7PVQFVU.mjs +1 -0
  192. package/dist/preview-engine/renderers-DB4ABTNA.mjs +1 -0
  193. package/dist/preview-engine/renderers-F2NFJI5L.mjs +1 -0
  194. package/dist/preview-engine/renderers-FI7YHNLY.mjs +1 -0
  195. package/dist/preview-engine/renderers-GBHULMPH.mjs +1 -0
  196. package/dist/preview-engine/renderers-GUKQUMGG.mjs +55 -0
  197. package/dist/preview-engine/renderers-HGT7QDY3.mjs +1 -0
  198. package/dist/preview-engine/renderers-HOYLA7ZK.mjs +1 -0
  199. package/dist/preview-engine/renderers-KKI2D3MZ.mjs +1 -0
  200. package/dist/preview-engine/renderers-KRAJNV4E.mjs +1 -0
  201. package/dist/preview-engine/renderers-KUGZKSVE.mjs +1 -0
  202. package/dist/preview-engine/renderers-L2EQQIOC.mjs +1 -0
  203. package/dist/preview-engine/renderers-LK3NRMGR.mjs +1 -0
  204. package/dist/preview-engine/renderers-LX654SZ3.mjs +1 -0
  205. package/dist/preview-engine/renderers-MCFQFYEL.mjs +1 -0
  206. package/dist/preview-engine/renderers-O6HOYIPS.mjs +1 -0
  207. package/dist/preview-engine/renderers-OEVXCGE2.mjs +1 -0
  208. package/dist/preview-engine/renderers-QVD6C4CS.mjs +1 -0
  209. package/dist/preview-engine/renderers-R3XEYD5V.mjs +248 -0
  210. package/dist/preview-engine/renderers-RBFWJWVM.mjs +1 -0
  211. package/dist/preview-engine/renderers-RX3VLVLO.mjs +1 -0
  212. package/dist/preview-engine/renderers-SM6JP64K.mjs +1 -0
  213. package/dist/preview-engine/renderers-TKMAATVS.mjs +1 -0
  214. package/dist/preview-engine/renderers-UGZUPONY.mjs +1 -0
  215. package/dist/preview-engine/renderers-UTFXZE3G.mjs +1 -0
  216. package/dist/preview-engine/renderers-UWPH7HBH.mjs +1 -0
  217. package/dist/preview-engine/renderers-UZGECFVO.mjs +1 -0
  218. package/dist/preview-engine/renderers-VGU3LNLT.mjs +1 -0
  219. package/dist/preview-engine/renderers-W3VVM5HB.mjs +1 -0
  220. package/dist/preview-engine/renderers-WJUTT5BB.mjs +1 -0
  221. package/dist/preview-engine/renderers-XA2M4YXK.mjs +1 -0
  222. package/dist/preview-engine/renderers-XIHRFEFQ.mjs +1 -0
  223. package/dist/preview-engine/renderers-XJTA5MFG.mjs +1 -0
  224. package/dist/preview-engine/renderers-XLTY5APF.mjs +1 -0
  225. package/dist/preview-engine/renderers-XZ3VXFGZ.mjs +1 -0
  226. package/dist/preview-engine/renderers-YKUQUCTO.mjs +124 -0
  227. package/dist/preview-engine/renderers-YVN3EIOP.mjs +1 -0
  228. package/dist/preview-engine/renderers-YWRP23SZ.mjs +125 -0
  229. package/dist/preview-engine/renderers-ZPWOUWZJ.mjs +120 -0
  230. package/dist/preview-engine/resvg-js-VMU4A77S.mjs +1 -0
  231. package/dist/preview-engine/server-utils-2FAIV45N.mjs +1 -0
  232. package/dist/preview-engine/sharp-V6ZTBNDW.mjs +1 -0
  233. package/dist/preview-engine/shims/fs-promises.mjs +1 -0
  234. package/dist/preview-engine/shims/fs.mjs +1 -0
  235. package/dist/preview-engine/shims/module.mjs +1 -0
  236. package/dist/preview-engine/shims/os.mjs +1 -0
  237. package/dist/preview-engine/shims/path.mjs +1 -0
  238. package/dist/preview-engine/shims/url.mjs +1 -0
  239. package/dist/preview-engine/signals.mjs +1 -0
  240. package/dist/preview-engine/webgpu-NSSANM4F.mjs +1 -0
  241. package/dist/preview-uQM210iy.mjs +2149 -0
  242. package/dist/preview-uQM210iy.mjs.map +1 -0
  243. package/dist/program-Dl510wmI.mjs +5183 -0
  244. package/dist/program-Dl510wmI.mjs.map +1 -0
  245. package/dist/renderer/index.d.mts +3 -0
  246. package/dist/renderer/index.mjs +6 -0
  247. package/dist/renderer-3BNskNuJ.mjs +3 -0
  248. package/dist/renderer-7DOcIxFG.mjs +288 -0
  249. package/dist/renderer-7DOcIxFG.mjs.map +1 -0
  250. package/dist/renderer-9dHlMQGX.mjs +3 -0
  251. package/dist/renderer-B1CvhW4p.mjs +677 -0
  252. package/dist/renderer-B1CvhW4p.mjs.map +1 -0
  253. package/dist/renderer-B2XzjK0z.mjs +3 -0
  254. package/dist/renderer-B80s47yo.mjs +166 -0
  255. package/dist/renderer-B80s47yo.mjs.map +1 -0
  256. package/dist/renderer-B9-QSJcG.mjs +479 -0
  257. package/dist/renderer-B9-QSJcG.mjs.map +1 -0
  258. package/dist/renderer-BAQmR0Zo.mjs +3 -0
  259. package/dist/renderer-BDLnExoP.mjs +127 -0
  260. package/dist/renderer-BDLnExoP.mjs.map +1 -0
  261. package/dist/renderer-BGXU6vcW.mjs +270 -0
  262. package/dist/renderer-BGXU6vcW.mjs.map +1 -0
  263. package/dist/renderer-BGvORwkQ.mjs +3 -0
  264. package/dist/renderer-BLikd6BK.mjs +3 -0
  265. package/dist/renderer-BMovYRoR.mjs +3 -0
  266. package/dist/renderer-BQHbp-Sp.mjs +243 -0
  267. package/dist/renderer-BQHbp-Sp.mjs.map +1 -0
  268. package/dist/renderer-BREIjsUU.mjs +252 -0
  269. package/dist/renderer-BREIjsUU.mjs.map +1 -0
  270. package/dist/renderer-BSbTJBWc.mjs +3 -0
  271. package/dist/renderer-BTu2EVhF.mjs +3 -0
  272. package/dist/renderer-BU1rwNRT.mjs +3 -0
  273. package/dist/renderer-BXMmISWG.mjs +499 -0
  274. package/dist/renderer-BXMmISWG.mjs.map +1 -0
  275. package/dist/renderer-BZJm3m4f.mjs +3 -0
  276. package/dist/renderer-B_NuVaIP.mjs +744 -0
  277. package/dist/renderer-B_NuVaIP.mjs.map +1 -0
  278. package/dist/renderer-BfJSUjPN.mjs +3 -0
  279. package/dist/renderer-BqyAgNt3.mjs +3 -0
  280. package/dist/renderer-BryTM2g7.mjs +3 -0
  281. package/dist/renderer-BsgIcBKH.mjs +391 -0
  282. package/dist/renderer-BsgIcBKH.mjs.map +1 -0
  283. package/dist/renderer-ByDhfrPE.mjs +422 -0
  284. package/dist/renderer-ByDhfrPE.mjs.map +1 -0
  285. package/dist/renderer-C-H680_l.mjs +3 -0
  286. package/dist/renderer-C17wL9QX.mjs +181 -0
  287. package/dist/renderer-C17wL9QX.mjs.map +1 -0
  288. package/dist/renderer-C2n-EHxg.mjs +1 -0
  289. package/dist/renderer-CB5aWAaf.mjs +343 -0
  290. package/dist/renderer-CB5aWAaf.mjs.map +1 -0
  291. package/dist/renderer-CB7lH5K8.mjs +3 -0
  292. package/dist/renderer-CDLrNgfo.mjs +3 -0
  293. package/dist/renderer-CDOUAN7X.mjs +454 -0
  294. package/dist/renderer-CDOUAN7X.mjs.map +1 -0
  295. package/dist/renderer-CH8sdfYX.mjs +387 -0
  296. package/dist/renderer-CH8sdfYX.mjs.map +1 -0
  297. package/dist/renderer-CIvaRnP_.mjs +261 -0
  298. package/dist/renderer-CIvaRnP_.mjs.map +1 -0
  299. package/dist/renderer-CMzEjdzi.mjs +369 -0
  300. package/dist/renderer-CMzEjdzi.mjs.map +1 -0
  301. package/dist/renderer-COkcU3db.mjs +3302 -0
  302. package/dist/renderer-COkcU3db.mjs.map +1 -0
  303. package/dist/renderer-CQCoggIa.mjs +3 -0
  304. package/dist/renderer-CQdVj2JS.mjs +3 -0
  305. package/dist/renderer-CQiTodg9.mjs +337 -0
  306. package/dist/renderer-CQiTodg9.mjs.map +1 -0
  307. package/dist/renderer-CV2m6k1V.mjs +3 -0
  308. package/dist/renderer-CYY-poLe.mjs +3 -0
  309. package/dist/renderer-CZgB5st8.mjs +3 -0
  310. package/dist/renderer-C_Ki91kc.mjs +3 -0
  311. package/dist/renderer-CclIvsLO.mjs +3 -0
  312. package/dist/renderer-Cj-whdVr.mjs +655 -0
  313. package/dist/renderer-Cj-whdVr.mjs.map +1 -0
  314. package/dist/renderer-CkykdR_D.mjs +3 -0
  315. package/dist/renderer-Cl1oUXMi.mjs +1143 -0
  316. package/dist/renderer-Cl1oUXMi.mjs.map +1 -0
  317. package/dist/renderer-CmApuKjS.mjs +3 -0
  318. package/dist/renderer-CpkiHRhh.mjs +269 -0
  319. package/dist/renderer-CpkiHRhh.mjs.map +1 -0
  320. package/dist/renderer-CszOjcRW.mjs +3 -0
  321. package/dist/renderer-CtVkU_GA.mjs +44 -0
  322. package/dist/renderer-CtVkU_GA.mjs.map +1 -0
  323. package/dist/renderer-Cu074POw.mjs +3 -0
  324. package/dist/renderer-CwQhzcUn.mjs +644 -0
  325. package/dist/renderer-CwQhzcUn.mjs.map +1 -0
  326. package/dist/renderer-CzPWB0Ss.mjs +273 -0
  327. package/dist/renderer-CzPWB0Ss.mjs.map +1 -0
  328. package/dist/renderer-D4qLmox-.mjs +3 -0
  329. package/dist/renderer-D6bWQtr-.mjs +3 -0
  330. package/dist/renderer-D6cJ6MSq.mjs +3 -0
  331. package/dist/renderer-D7EX8IjU.mjs +240 -0
  332. package/dist/renderer-D7EX8IjU.mjs.map +1 -0
  333. package/dist/renderer-DDp7_TUi.d.mts +10 -0
  334. package/dist/renderer-DDp7_TUi.d.mts.map +1 -0
  335. package/dist/renderer-DFKsLrUs.mjs +256 -0
  336. package/dist/renderer-DFKsLrUs.mjs.map +1 -0
  337. package/dist/renderer-DPSsf8-t.mjs +3 -0
  338. package/dist/renderer-DQLGnEFc.mjs +3 -0
  339. package/dist/renderer-DY2SVYUW.mjs +3 -0
  340. package/dist/renderer-DZGtBUCx.mjs +792 -0
  341. package/dist/renderer-DZGtBUCx.mjs.map +1 -0
  342. package/dist/renderer-DabG62XS.mjs +406 -0
  343. package/dist/renderer-DabG62XS.mjs.map +1 -0
  344. package/dist/renderer-DbaQLI4z.mjs +771 -0
  345. package/dist/renderer-DbaQLI4z.mjs.map +1 -0
  346. package/dist/renderer-DjI45OYC.mjs +71 -0
  347. package/dist/renderer-DjI45OYC.mjs.map +1 -0
  348. package/dist/renderer-Dm08-hAU.mjs +323 -0
  349. package/dist/renderer-Dm08-hAU.mjs.map +1 -0
  350. package/dist/renderer-DoAY5JbB.mjs +4 -0
  351. package/dist/renderer-Dp_FfvF-.mjs +401 -0
  352. package/dist/renderer-Dp_FfvF-.mjs.map +1 -0
  353. package/dist/renderer-Dt6fzgX5.mjs +756 -0
  354. package/dist/renderer-Dt6fzgX5.mjs.map +1 -0
  355. package/dist/renderer-DuplLRbp.mjs +3 -0
  356. package/dist/renderer-DvfUbZ31.mjs +3 -0
  357. package/dist/renderer-DxjVQV6f.mjs +311 -0
  358. package/dist/renderer-DxjVQV6f.mjs.map +1 -0
  359. package/dist/renderer-Fco4EmAu.mjs +23868 -0
  360. package/dist/renderer-Fco4EmAu.mjs.map +1 -0
  361. package/dist/renderer-HFfcJlmR.mjs +981 -0
  362. package/dist/renderer-HFfcJlmR.mjs.map +1 -0
  363. package/dist/renderer-I-Sw3JBB.mjs +145 -0
  364. package/dist/renderer-I-Sw3JBB.mjs.map +1 -0
  365. package/dist/renderer-OWQmmg4Z.mjs +697 -0
  366. package/dist/renderer-OWQmmg4Z.mjs.map +1 -0
  367. package/dist/renderer-Q_uUQipO.mjs +3 -0
  368. package/dist/renderer-Ryo2CEFD.mjs +586 -0
  369. package/dist/renderer-Ryo2CEFD.mjs.map +1 -0
  370. package/dist/renderer-Tp6OXWNZ.mjs +257 -0
  371. package/dist/renderer-Tp6OXWNZ.mjs.map +1 -0
  372. package/dist/renderer-UQFCgeNx.mjs +3 -0
  373. package/dist/renderer-WkVrkCVA.mjs +83 -0
  374. package/dist/renderer-WkVrkCVA.mjs.map +1 -0
  375. package/dist/renderer-XcmYTd6P.mjs +3818 -0
  376. package/dist/renderer-XcmYTd6P.mjs.map +1 -0
  377. package/dist/renderer-_uvdg48N.mjs +333 -0
  378. package/dist/renderer-_uvdg48N.mjs.map +1 -0
  379. package/dist/renderer-bZU_ndxf.mjs +8 -0
  380. package/dist/renderer-bZU_ndxf.mjs.map +1 -0
  381. package/dist/renderer-eMsnzJg9.mjs +3 -0
  382. package/dist/renderer-ho_jXJ0H.mjs +254 -0
  383. package/dist/renderer-ho_jXJ0H.mjs.map +1 -0
  384. package/dist/renderer-k2JL79kM.mjs +306 -0
  385. package/dist/renderer-k2JL79kM.mjs.map +1 -0
  386. package/dist/renderer-pHiz78e0.mjs +3 -0
  387. package/dist/renderer-pxXf9dvk.mjs +394 -0
  388. package/dist/renderer-pxXf9dvk.mjs.map +1 -0
  389. package/dist/renderer-vCFTm0oe.mjs +226 -0
  390. package/dist/renderer-vCFTm0oe.mjs.map +1 -0
  391. package/dist/renderer-vvpdx1vk.mjs +379 -0
  392. package/dist/renderer-vvpdx1vk.mjs.map +1 -0
  393. package/dist/renderer-x2s9LmVL.mjs +1121 -0
  394. package/dist/renderer-x2s9LmVL.mjs.map +1 -0
  395. package/dist/renderers-BWg16W-V-BXG_cjhM.mjs +49 -0
  396. package/dist/renderers-BWg16W-V-BXG_cjhM.mjs.map +1 -0
  397. package/dist/signals/index.d.mts +7 -0
  398. package/dist/signals/index.mjs +10 -0
  399. package/dist/signals-BwbdO3AN.mjs +224 -0
  400. package/dist/signals-BwbdO3AN.mjs.map +1 -0
  401. package/dist/signin-CZj4Oc5s.mjs +865 -0
  402. package/dist/signin-CZj4Oc5s.mjs.map +1 -0
  403. package/dist/sso-oidc-C0_31ThY.mjs +1051 -0
  404. package/dist/sso-oidc-C0_31ThY.mjs.map +1 -0
  405. package/dist/sts-DD4ggEXC.mjs +6 -0
  406. package/dist/sts-nXw8RDJI.mjs +1395 -0
  407. package/dist/sts-nXw8RDJI.mjs.map +1 -0
  408. package/package.json +173 -0
@@ -0,0 +1,981 @@
1
+ import { St as getFingerprint } from "./dist-Bx6J0VcM.mjs";
2
+ import { n as defineRenderer } from "./renderer-CtVkU_GA.mjs";
3
+ import { G as lutStore } from "./dist-gjHmorxL.mjs";
4
+
5
+ //#region ../../nodes/node-extract-lut/dist/renderers-CDotFzd9.mjs
6
+ const extractionCache = /* @__PURE__ */ new Map();
7
+ const pendingExtractions = /* @__PURE__ */ new Map();
8
+ const latestRequestedFingerprint = /* @__PURE__ */ new Map();
9
+ const activeTextures = /* @__PURE__ */ new Map();
10
+ const pipelineCache = /* @__PURE__ */ new WeakMap();
11
+ /**
12
+ * Lazily compiles and caches the two WGSL compute shaders per device.
13
+ *
14
+ * Both shaders write a flat array of f32 triples (R,G,B) for every cell of a
15
+ * `lutSize³` cube. The host uploads whatever small set of parameters is needed
16
+ * (RBF weights OR LAB statistics), then reads the result back as a typed array
17
+ * that can be forwarded to `lutStore.createOrUpdate`.
18
+ *
19
+ * Workgroup size 8×8×4 = 256 threads maps cleanly onto lutSize=33 with
20
+ * ceil(33/8)=5 groups on X/Y and ceil(33/4)=9 on Z → 5×5×9 = 225 dispatches.
21
+ */
22
+ function getOrCreatePipelines(device) {
23
+ const cached = pipelineCache.get(device);
24
+ if (cached) return cached;
25
+ const pipelines = {
26
+ rbf: device.createComputePipeline({
27
+ layout: "auto",
28
+ compute: {
29
+ module: device.createShaderModule({ code: `
30
+ struct Params {
31
+ lutSize : u32,
32
+ numSamples : u32,
33
+ epsilonSq : f32,
34
+ }
35
+
36
+ @group(0) @binding(0) var<uniform> params : Params;
37
+ @group(0) @binding(1) var<storage, read> srcPoints : array<vec4f>; // [numSamples]
38
+ @group(0) @binding(2) var<storage, read> weights : array<vec4f>; // [numSamples]
39
+ @group(0) @binding(3) var<storage, read> poly : array<vec4f>; // [4]
40
+ @group(0) @binding(4) var<storage, read_write> lut : array<f32>; // [lutSize³ * 3]
41
+
42
+ @compute @workgroup_size(8, 8, 4)
43
+ fn main(@builtin(global_invocation_id) gid : vec3u) {
44
+ let lutSize = params.lutSize;
45
+ if (gid.x >= lutSize || gid.y >= lutSize || gid.z >= lutSize) { return; }
46
+
47
+ let inR = f32(gid.x) / f32(lutSize - 1u);
48
+ let inG = f32(gid.y) / f32(lutSize - 1u);
49
+ let inB = f32(gid.z) / f32(lutSize - 1u);
50
+ let p = vec3f(inR, inG, inB);
51
+
52
+ // Polynomial part: poly[0] + poly[1]*r + poly[2]*g + poly[3]*b
53
+ var out = poly[0].xyz + poly[1].xyz * inR + poly[2].xyz * inG + poly[3].xyz * inB;
54
+
55
+ // RBF sum
56
+ let eps = params.epsilonSq;
57
+ let M = params.numSamples;
58
+ var minDistSq = 1e10;
59
+ var rbfSum = vec3f(0.0);
60
+ for (var i = 0u; i < M; i++) {
61
+ let d = p - srcPoints[i].xyz;
62
+ let dSq = dot(d, d);
63
+ minDistSq = min(minDistSq, dSq);
64
+ let phi = sqrt(dSq + eps);
65
+ rbfSum += weights[i].xyz * phi;
66
+ }
67
+
68
+ // Smoothly fade out RBF weight contribution for regions far from samples
69
+ // starts fading at distance 0.25 (dist^2 = 0.0625), fully faded at 0.5 (dist^2 = 0.25)
70
+ let rbfFade = clamp(1.0 - (minDistSq - 0.0625) / (0.25 - 0.0625), 0.0, 1.0);
71
+ out += rbfSum * rbfFade;
72
+
73
+ // Smoothly blend the entire mapping towards identity for regions extremely far from samples
74
+ // starts blending at distance 0.35 (dist^2 = 0.1225), fully identity at 0.65 (dist^2 = 0.4225)
75
+ let identityBlend = clamp((minDistSq - 0.1225) / (0.4225 - 0.1225), 0.0, 1.0);
76
+ out = mix(out, p, identityBlend);
77
+
78
+ // Clamp + write
79
+ let cell = (gid.z * lutSize * lutSize + gid.y * lutSize + gid.x) * 3u;
80
+ lut[cell + 0u] = clamp(out.r, 0.0, 1.0);
81
+ lut[cell + 1u] = clamp(out.g, 0.0, 1.0);
82
+ lut[cell + 2u] = clamp(out.b, 0.0, 1.0);
83
+ }` }),
84
+ entryPoint: "main"
85
+ }
86
+ }),
87
+ statistical: device.createComputePipeline({
88
+ layout: "auto",
89
+ compute: {
90
+ module: device.createShaderModule({ code: `
91
+ struct Stats {
92
+ srcMean : vec4f, // (meanL, meanA, meanB, pad) of source
93
+ tgtMean : vec4f, // (meanL, meanA, meanB, pad) of target
94
+ scale : vec4f, // tgtStd / srcStd per channel
95
+ lutSize : u32,
96
+ }
97
+
98
+ @group(0) @binding(0) var<uniform> stats : Stats;
99
+ @group(0) @binding(1) var<storage, read_write> lut : array<f32>;
100
+
101
+ // Constants matching the Reinhard/rgbToLab implementation
102
+ const INV_SQRT3 : f32 = 0.57735026919; // 1 / sqrt(3)
103
+ const INV_SQRT6 : f32 = 0.40824829046; // 1 / sqrt(6)
104
+ const INV_SQRT2 : f32 = 0.70710678118; // 1 / sqrt(2)
105
+
106
+ fn safeLog10(v : f32) -> f32 {
107
+ return log(max(v, 1e-5)) * 0.43429448190; // log10(x) = ln(x) / ln(10)
108
+ }
109
+
110
+ fn rgbToLab(rgb : vec3f) -> vec3f {
111
+ let R = max(rgb.r, 1e-5);
112
+ let G = max(rgb.g, 1e-5);
113
+ let B = max(rgb.b, 1e-5);
114
+
115
+ let Lms_L = safeLog10(0.3811 * R + 0.5783 * G + 0.0402 * B);
116
+ let Lms_M = safeLog10(0.1967 * R + 0.7244 * G + 0.0782 * B);
117
+ let Lms_S = safeLog10(0.0241 * R + 0.1288 * G + 0.8444 * B);
118
+
119
+ return vec3f(
120
+ (Lms_L + Lms_M + Lms_S) * INV_SQRT3,
121
+ (Lms_L + Lms_M - 2.0 * Lms_S) * INV_SQRT6,
122
+ (Lms_L - Lms_M) * INV_SQRT2,
123
+ );
124
+ }
125
+
126
+ fn labToRgb(lab : vec3f) -> vec3f {
127
+ let l = lab.x; let a = lab.y; let b = lab.z;
128
+
129
+ let L_log = l * INV_SQRT3 + a * INV_SQRT6 + b * INV_SQRT2;
130
+ let M_log = l * INV_SQRT3 + a * INV_SQRT6 - b * INV_SQRT2;
131
+ let S_log = l * INV_SQRT3 - 2.0 * a * INV_SQRT6;
132
+
133
+ let L = pow(10.0, L_log);
134
+ let M = pow(10.0, M_log);
135
+ let S = pow(10.0, S_log);
136
+
137
+ return clamp(vec3f(
138
+ 4.4679 * L - 3.5873 * M + 0.1193 * S,
139
+ -1.2186 * L + 2.3809 * M - 0.1624 * S,
140
+ 0.0497 * L - 0.2439 * M + 1.2045 * S,
141
+ ), vec3f(0.0), vec3f(1.0));
142
+ }
143
+
144
+ @compute @workgroup_size(8, 8, 4)
145
+ fn main(@builtin(global_invocation_id) gid : vec3u) {
146
+ let lutSize = stats.lutSize;
147
+ if (gid.x >= lutSize || gid.y >= lutSize || gid.z >= lutSize) { return; }
148
+
149
+ let inR = f32(gid.x) / f32(lutSize - 1u);
150
+ let inG = f32(gid.y) / f32(lutSize - 1u);
151
+ let inB = f32(gid.z) / f32(lutSize - 1u);
152
+
153
+ let lab = rgbToLab(vec3f(inR, inG, inB));
154
+ let mapped = stats.scale.xyz * (lab - stats.srcMean.xyz) + stats.tgtMean.xyz;
155
+ let rgb = labToRgb(mapped);
156
+
157
+ let cell = (gid.z * lutSize * lutSize + gid.y * lutSize + gid.x) * 3u;
158
+ lut[cell + 0u] = rgb.r;
159
+ lut[cell + 1u] = rgb.g;
160
+ lut[cell + 2u] = rgb.b;
161
+ }` }),
162
+ entryPoint: "main"
163
+ }
164
+ })
165
+ };
166
+ pipelineCache.set(device, pipelines);
167
+ return pipelines;
168
+ }
169
+ function solveLU(A, B, n) {
170
+ const ipiv = new Int32Array(n);
171
+ for (let i = 0; i < n; i++) ipiv[i] = i;
172
+ for (let i = 0; i < n; i++) {
173
+ let maxVal = 0;
174
+ let pivotRow = i;
175
+ for (let r = i; r < n; r++) {
176
+ const val = Math.abs(A[r * n + i]);
177
+ if (val > maxVal) {
178
+ maxVal = val;
179
+ pivotRow = r;
180
+ }
181
+ }
182
+ if (maxVal < 1e-9) return null;
183
+ else if (pivotRow !== i) {
184
+ const tmp = ipiv[i];
185
+ ipiv[i] = ipiv[pivotRow];
186
+ ipiv[pivotRow] = tmp;
187
+ for (let col = 0; col < n; col++) {
188
+ const i1 = i * n + col, i2 = pivotRow * n + col;
189
+ const t = A[i1];
190
+ A[i1] = A[i2];
191
+ A[i2] = t;
192
+ }
193
+ for (let col = 0; col < 3; col++) {
194
+ const i1 = i * 3 + col, i2 = pivotRow * 3 + col;
195
+ const t = B[i1];
196
+ B[i1] = B[i2];
197
+ B[i2] = t;
198
+ }
199
+ }
200
+ const pivot = A[i * n + i];
201
+ if (Math.abs(pivot) < 1e-9) return null;
202
+ for (let r = i + 1; r < n; r++) {
203
+ const factor = A[r * n + i] / pivot;
204
+ A[r * n + i] = 0;
205
+ for (let col = i + 1; col < n; col++) A[r * n + col] -= factor * A[i * n + col];
206
+ for (let col = 0; col < 3; col++) B[r * 3 + col] -= factor * B[i * 3 + col];
207
+ }
208
+ }
209
+ const X = new Float64Array(n * 3);
210
+ for (let col = 0; col < 3; col++) for (let i = n - 1; i >= 0; i--) {
211
+ let sum = B[i * 3 + col];
212
+ for (let j = i + 1; j < n; j++) sum -= A[i * n + j] * X[j * 3 + col];
213
+ const denom = A[i * n + i];
214
+ if (Math.abs(denom) < 1e-9) return null;
215
+ X[i * 3 + col] = sum / denom;
216
+ }
217
+ return X;
218
+ }
219
+ function hasAbsurdCoefficients(X_sol) {
220
+ for (let i = 0; i < X_sol.length; i++) {
221
+ const val = X_sol[i];
222
+ if (Number.isNaN(val) || !Number.isFinite(val) || Math.abs(val) > 1e5) return true;
223
+ }
224
+ return false;
225
+ }
226
+ function solveLU1D(A, B, n) {
227
+ const ipiv = new Int32Array(n);
228
+ for (let i = 0; i < n; i++) ipiv[i] = i;
229
+ for (let i = 0; i < n; i++) {
230
+ let maxVal = 0;
231
+ let pivotRow = i;
232
+ for (let r = i; r < n; r++) {
233
+ const val = Math.abs(A[r * n + i]);
234
+ if (val > maxVal) {
235
+ maxVal = val;
236
+ pivotRow = r;
237
+ }
238
+ }
239
+ if (maxVal < 1e-9) return null;
240
+ else if (pivotRow !== i) {
241
+ const tmp = ipiv[i];
242
+ ipiv[i] = ipiv[pivotRow];
243
+ ipiv[pivotRow] = tmp;
244
+ for (let col = 0; col < n; col++) {
245
+ const i1 = i * n + col, i2 = pivotRow * n + col;
246
+ const t$1 = A[i1];
247
+ A[i1] = A[i2];
248
+ A[i2] = t$1;
249
+ }
250
+ const t = B[i];
251
+ B[i] = B[pivotRow];
252
+ B[pivotRow] = t;
253
+ }
254
+ const pivot = A[i * n + i];
255
+ if (Math.abs(pivot) < 1e-9) return null;
256
+ for (let r = i + 1; r < n; r++) {
257
+ const factor = A[r * n + i] / pivot;
258
+ A[r * n + i] = 0;
259
+ for (let col = i + 1; col < n; col++) A[r * n + col] -= factor * A[i * n + col];
260
+ B[r] -= factor * B[i];
261
+ }
262
+ }
263
+ const X = new Float64Array(n);
264
+ for (let i = n - 1; i >= 0; i--) {
265
+ let sum = B[i];
266
+ for (let j = i + 1; j < n; j++) sum -= A[i * n + j] * X[j];
267
+ const denom = A[i * n + i];
268
+ if (Math.abs(denom) < 1e-9) return null;
269
+ X[i] = sum / denom;
270
+ }
271
+ return X;
272
+ }
273
+ function solve1DChannel(srcVals, tgtVals, epsilonSq) {
274
+ const M = srcVals.length;
275
+ const H = M + 2;
276
+ const K_mat = new Float64Array(H * H);
277
+ const B_rhs = new Float64Array(H);
278
+ for (let i = 0; i < M; i++) {
279
+ const xi = srcVals[i];
280
+ B_rhs[i] = tgtVals[i];
281
+ for (let j = 0; j < M; j++) {
282
+ const dx = xi - srcVals[j];
283
+ K_mat[i * H + j] = Math.sqrt(dx * dx + epsilonSq);
284
+ }
285
+ K_mat[i * H + M + 0] = 1;
286
+ K_mat[i * H + M + 1] = xi;
287
+ K_mat[(M + 0) * H + i] = 1;
288
+ K_mat[(M + 1) * H + i] = xi;
289
+ }
290
+ let diagMean = 0;
291
+ for (let i = 0; i < M; i++) diagMean += K_mat[i * H + i];
292
+ diagMean /= M;
293
+ const lambda = Math.max(1e-4, diagMean * .01);
294
+ for (let i = 0; i < M; i++) K_mat[i * H + i] += lambda;
295
+ const polyLambda = Math.max(1e-4, diagMean * .001);
296
+ for (let k = 0; k < 2; k++) K_mat[(M + k) * H + M + k] = polyLambda;
297
+ return solveLU1D(K_mat, B_rhs, H);
298
+ }
299
+ function evaluate1DChannel(srcVals, X_sol, epsilonSq, lutSize) {
300
+ const M = srcVals.length;
301
+ const out = new Float32Array(lutSize);
302
+ for (let cell = 0; cell < lutSize; cell++) {
303
+ const p = cell / (lutSize - 1);
304
+ let minDistSq = 1e10;
305
+ for (let i = 0; i < M; i++) {
306
+ const dx = p - srcVals[i];
307
+ minDistSq = Math.min(minDistSq, dx * dx);
308
+ }
309
+ let rbfSum = 0;
310
+ for (let i = 0; i < M; i++) {
311
+ const dx = p - srcVals[i];
312
+ const phi = Math.sqrt(dx * dx + epsilonSq);
313
+ rbfSum += X_sol[i] * phi;
314
+ }
315
+ const rbfFade = Math.max(0, Math.min(1, 1 - (minDistSq - .0625) / .1875));
316
+ let val = X_sol[M + 0] + X_sol[M + 1] * p + rbfSum * rbfFade;
317
+ const identityBlend = Math.max(0, Math.min(1, (minDistSq - .1225) / .3));
318
+ val = val * (1 - identityBlend) + p * identityBlend;
319
+ out[cell] = Math.max(0, Math.min(1, val));
320
+ }
321
+ return out;
322
+ }
323
+ function isSeparableOperationTree(vv, sourceMedia) {
324
+ const sourceFingerprint = getFingerprint(sourceMedia);
325
+ let current = vv;
326
+ while (current) {
327
+ const op = current.operation;
328
+ if (!op) break;
329
+ const mediaToFingerprint = {
330
+ ...current,
331
+ metadata: {},
332
+ operation: current.operation ? { ...current.operation } : void 0
333
+ };
334
+ if (mediaToFingerprint.operation) delete mediaToFingerprint.operation.lutUrl;
335
+ if (getFingerprint(mediaToFingerprint) === sourceFingerprint) return true;
336
+ if (op.op === "source") return false;
337
+ if (op.op === "Curves") {
338
+ if (op.curveType !== "rgb") return false;
339
+ } else if (op.op === "Levels") {} else return false;
340
+ if (current.children && current.children.length > 0) current = current.children[0];
341
+ else break;
342
+ }
343
+ return false;
344
+ }
345
+ function rgbToLab(r, g, b) {
346
+ const R = Math.max(1e-5, r), G = Math.max(1e-5, g), B = Math.max(1e-5, b);
347
+ const L = Math.log10(Math.max(1e-5, .3811 * R + .5783 * G + .0402 * B));
348
+ const M = Math.log10(Math.max(1e-5, .1967 * R + .7244 * G + .0782 * B));
349
+ const S = Math.log10(Math.max(1e-5, .0241 * R + .1288 * G + .8444 * B));
350
+ return [
351
+ (L + M + S) / Math.sqrt(3),
352
+ (L + M - 2 * S) / Math.sqrt(6),
353
+ (L - M) / Math.sqrt(2)
354
+ ];
355
+ }
356
+ function getPixelRGB(pixels, idx, isBGRA) {
357
+ const o = idx * 4;
358
+ const rIdx = isBGRA ? o + 2 : o;
359
+ const bIdx = isBGRA ? o : o + 2;
360
+ return [
361
+ pixels[rIdx] / 255,
362
+ pixels[o + 1] / 255,
363
+ pixels[bIdx] / 255
364
+ ];
365
+ }
366
+ function hashString(str) {
367
+ let hash = 5381;
368
+ for (let i = 0; i < str.length; i++) hash = hash * 33 ^ str.charCodeAt(i);
369
+ return hash >>> 0;
370
+ }
371
+ var SeededRandom = class {
372
+ state;
373
+ constructor(seed) {
374
+ this.state = seed || 1;
375
+ }
376
+ next() {
377
+ this.state = (this.state * 1664525 + 1013904223) % 4294967296;
378
+ return this.state / 4294967296;
379
+ }
380
+ };
381
+ function seededShuffle(array, seed) {
382
+ const rng = new SeededRandom(seed);
383
+ const shuffled = [...array];
384
+ for (let i = shuffled.length - 1; i > 0; i--) {
385
+ const j = Math.floor(rng.next() * (i + 1));
386
+ const temp = shuffled[i];
387
+ shuffled[i] = shuffled[j];
388
+ shuffled[j] = temp;
389
+ }
390
+ return shuffled;
391
+ }
392
+ function buildUniqueColorPool(srcPixels, tgtPixels, isBGRA, gridResolution = 20) {
393
+ const occupied = /* @__PURE__ */ new Set();
394
+ const pool = [];
395
+ const numPixels = srcPixels.length / 4;
396
+ for (let i = 0; i < numPixels; i++) {
397
+ const src = getPixelRGB(srcPixels, i, isBGRA);
398
+ const r = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[0] * gridResolution)));
399
+ const g = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[1] * gridResolution)));
400
+ const b = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[2] * gridResolution)));
401
+ const cellKey = r * gridResolution * gridResolution + g * gridResolution + b;
402
+ if (!occupied.has(cellKey)) {
403
+ occupied.add(cellKey);
404
+ pool.push({
405
+ src,
406
+ tgt: getPixelRGB(tgtPixels, i, isBGRA)
407
+ });
408
+ }
409
+ }
410
+ return pool;
411
+ }
412
+ /**
413
+ * Evaluates the fitted RBF on the GPU.
414
+ *
415
+ * CPU work that remains:
416
+ * • Build K matrix O(M²) – tiny (≈ 162×162)
417
+ * • solveLU O(M³) – tiny
418
+ *
419
+ * GPU work (replaces the triple-nested JS loop):
420
+ * • 33³ = 35 937 threads × M inner iterations → ~5.7 M parallel MADs
421
+ *
422
+ * Returns a plain Float32Array of length lutSize³×3 for lutStore.
423
+ */
424
+ async function evaluateRbfOnGpu(device, pipelines, sampledPoints, X_sol, lutSize, epsilonSq) {
425
+ const M = sampledPoints.length;
426
+ const totalCells = lutSize * lutSize * lutSize;
427
+ const wgs = 8;
428
+ const srcPointsData = new Float32Array(M * 4);
429
+ const weightsData = new Float32Array(M * 4);
430
+ for (let i = 0; i < M; i++) {
431
+ srcPointsData[i * 4 + 0] = sampledPoints[i].src[0];
432
+ srcPointsData[i * 4 + 1] = sampledPoints[i].src[1];
433
+ srcPointsData[i * 4 + 2] = sampledPoints[i].src[2];
434
+ srcPointsData[i * 4 + 3] = 0;
435
+ weightsData[i * 4 + 0] = X_sol[i * 3 + 0];
436
+ weightsData[i * 4 + 1] = X_sol[i * 3 + 1];
437
+ weightsData[i * 4 + 2] = X_sol[i * 3 + 2];
438
+ weightsData[i * 4 + 3] = 0;
439
+ }
440
+ const polyData = new Float32Array(16);
441
+ for (let k = 0; k < 4; k++) {
442
+ polyData[k * 4 + 0] = X_sol[(M + k) * 3 + 0];
443
+ polyData[k * 4 + 1] = X_sol[(M + k) * 3 + 1];
444
+ polyData[k * 4 + 2] = X_sol[(M + k) * 3 + 2];
445
+ polyData[k * 4 + 3] = 0;
446
+ }
447
+ const paramsBuffer = device.createBuffer({
448
+ size: 16,
449
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
450
+ });
451
+ const paramsData = /* @__PURE__ */ new ArrayBuffer(16);
452
+ new Uint32Array(paramsData, 0, 2).set([lutSize, M]);
453
+ new Float32Array(paramsData, 8, 1).set([epsilonSq]);
454
+ device.queue.writeBuffer(paramsBuffer, 0, paramsData);
455
+ const srcPointsBuf = upload(device, srcPointsData);
456
+ const weightsBuf = upload(device, weightsData);
457
+ const polyBuf = upload(device, polyData);
458
+ const lutByteSize = totalCells * 3 * 4;
459
+ const lutBuf = device.createBuffer({
460
+ size: lutByteSize,
461
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
462
+ });
463
+ const readbackBuf = device.createBuffer({
464
+ size: lutByteSize,
465
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
466
+ });
467
+ const bg = device.createBindGroup({
468
+ layout: pipelines.rbf.getBindGroupLayout(0),
469
+ entries: [
470
+ {
471
+ binding: 0,
472
+ resource: { buffer: paramsBuffer }
473
+ },
474
+ {
475
+ binding: 1,
476
+ resource: { buffer: srcPointsBuf }
477
+ },
478
+ {
479
+ binding: 2,
480
+ resource: { buffer: weightsBuf }
481
+ },
482
+ {
483
+ binding: 3,
484
+ resource: { buffer: polyBuf }
485
+ },
486
+ {
487
+ binding: 4,
488
+ resource: { buffer: lutBuf }
489
+ }
490
+ ]
491
+ });
492
+ const enc = device.createCommandEncoder({ label: "rbf-lut-eval" });
493
+ const pass = enc.beginComputePass();
494
+ pass.setPipeline(pipelines.rbf);
495
+ pass.setBindGroup(0, bg);
496
+ const groups = Math.ceil(lutSize / wgs);
497
+ pass.dispatchWorkgroups(groups, groups, Math.ceil(lutSize / 4));
498
+ pass.end();
499
+ enc.copyBufferToBuffer(lutBuf, 0, readbackBuf, 0, lutByteSize);
500
+ device.queue.submit([enc.finish()]);
501
+ await readbackBuf.mapAsync(GPUMapMode.READ);
502
+ const result = new Float32Array(readbackBuf.getMappedRange().slice(0));
503
+ readbackBuf.unmap();
504
+ paramsBuffer.destroy();
505
+ srcPointsBuf.destroy();
506
+ weightsBuf.destroy();
507
+ polyBuf.destroy();
508
+ lutBuf.destroy();
509
+ readbackBuf.destroy();
510
+ return result;
511
+ }
512
+ /**
513
+ * Generates the statistical LAB-transfer LUT entirely on the GPU.
514
+ * The only CPU work is computing 6 scalars (mean/std per LAB channel).
515
+ */
516
+ async function evaluateStatisticalOnGpu(device, pipelines, srcMean, tgtMean, scale, lutSize) {
517
+ const lutByteSize = lutSize * lutSize * lutSize * 3 * 4;
518
+ const statsData = /* @__PURE__ */ new ArrayBuffer(64);
519
+ const f = new Float32Array(statsData);
520
+ const u = new Uint32Array(statsData);
521
+ f[0] = srcMean[0];
522
+ f[1] = srcMean[1];
523
+ f[2] = srcMean[2];
524
+ f[4] = tgtMean[0];
525
+ f[5] = tgtMean[1];
526
+ f[6] = tgtMean[2];
527
+ f[8] = scale[0];
528
+ f[9] = scale[1];
529
+ f[10] = scale[2];
530
+ u[12] = lutSize;
531
+ const statsBuf = device.createBuffer({
532
+ size: 64,
533
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
534
+ });
535
+ device.queue.writeBuffer(statsBuf, 0, statsData);
536
+ const lutBuf = device.createBuffer({
537
+ size: lutByteSize,
538
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
539
+ });
540
+ const readbackBuf = device.createBuffer({
541
+ size: lutByteSize,
542
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
543
+ });
544
+ const bg = device.createBindGroup({
545
+ layout: pipelines.statistical.getBindGroupLayout(0),
546
+ entries: [{
547
+ binding: 0,
548
+ resource: { buffer: statsBuf }
549
+ }, {
550
+ binding: 1,
551
+ resource: { buffer: lutBuf }
552
+ }]
553
+ });
554
+ const enc = device.createCommandEncoder({ label: "stat-lut-eval" });
555
+ const pass = enc.beginComputePass();
556
+ pass.setPipeline(pipelines.statistical);
557
+ pass.setBindGroup(0, bg);
558
+ const groups = Math.ceil(lutSize / 8);
559
+ pass.dispatchWorkgroups(groups, groups, Math.ceil(lutSize / 4));
560
+ pass.end();
561
+ enc.copyBufferToBuffer(lutBuf, 0, readbackBuf, 0, lutByteSize);
562
+ device.queue.submit([enc.finish()]);
563
+ await readbackBuf.mapAsync(GPUMapMode.READ);
564
+ const result = new Float32Array(readbackBuf.getMappedRange().slice(0));
565
+ readbackBuf.unmap();
566
+ statsBuf.destroy();
567
+ lutBuf.destroy();
568
+ readbackBuf.destroy();
569
+ return result;
570
+ }
571
+ /** Uploads a Float32Array into a storage-readable GPUBuffer. */
572
+ function upload(device, data) {
573
+ const buf = device.createBuffer({
574
+ size: Math.max(data.byteLength, 16),
575
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
576
+ });
577
+ device.queue.writeBuffer(buf, 0, data);
578
+ return buf;
579
+ }
580
+ /**
581
+ * Converts a flat Float32Array [R0,G0,B0, R1,G1,B1 …] returned from the GPU
582
+ * into the tuple array expected by `lutStore.createOrUpdate`.
583
+ */
584
+ function flatToPoints(flat) {
585
+ const n = flat.length / 3;
586
+ const out = new Array(n);
587
+ for (let i = 0; i < n; i++) out[i] = [
588
+ flat[i * 3],
589
+ flat[i * 3 + 1],
590
+ flat[i * 3 + 2]
591
+ ];
592
+ return out;
593
+ }
594
+ const ExtractLutWebGPURenderer = async (args) => {
595
+ const { ctx, encoder, pass, props, drawChild } = args;
596
+ const op = props.virtualMedia?.operation;
597
+ if (op?.op !== "ExtractLUT" || !op) return;
598
+ const nodeId = op.nodeId ?? props.renderId;
599
+ const mediaToFingerprint = {
600
+ ...props.virtualMedia,
601
+ metadata: {},
602
+ operation: props.virtualMedia?.operation ? { ...props.virtualMedia.operation } : void 0
603
+ };
604
+ if (mediaToFingerprint.operation) {
605
+ delete mediaToFingerprint.operation.lutUrl;
606
+ delete mediaToFingerprint.operation.timeline;
607
+ delete mediaToFingerprint.operation.startFrame;
608
+ }
609
+ const lutUrl = op.lutUrl ?? `runtime://lut/extract-lut-${nodeId}-${getFingerprint(mediaToFingerprint)}`;
610
+ const fingerprint = lutUrl.startsWith(`runtime://lut/extract-lut-${nodeId}-`) ? lutUrl.slice(`runtime://lut/extract-lut-${nodeId}-`.length) : getFingerprint(mediaToFingerprint);
611
+ const cacheKey = `${nodeId}-${fingerprint}`;
612
+ const sourceMedia = props.virtualMedia?.children?.[0];
613
+ const targetMedia = props.virtualMedia?.children?.[1];
614
+ if (!sourceMedia || !targetMedia) {
615
+ pass.end();
616
+ return;
617
+ }
618
+ const strategy = op.strategy ?? "deterministic";
619
+ const samplePoints = op.samplePoints ?? 150;
620
+ const gridSize = 64;
621
+ const numPixels = gridSize * gridSize;
622
+ if (extractionCache.get(nodeId) === fingerprint && lutStore.get(lutUrl, ctx.device)) {
623
+ pass.end();
624
+ return;
625
+ }
626
+ if (pendingExtractions.has(cacheKey)) {
627
+ pass.end();
628
+ return;
629
+ }
630
+ latestRequestedFingerprint.set(nodeId, fingerprint);
631
+ pass.end();
632
+ lutStore.getOrLoad(lutUrl, ctx.device);
633
+ const prev = activeTextures.get(nodeId);
634
+ if (prev) {
635
+ const toDestroy = prev;
636
+ ctx.device.queue.onSubmittedWorkDone().then(() => {
637
+ try {
638
+ toDestroy.srcTex.destroy();
639
+ } catch {}
640
+ try {
641
+ toDestroy.tgtTex.destroy();
642
+ } catch {}
643
+ });
644
+ activeTextures.delete(nodeId);
645
+ }
646
+ const srcTex = ctx.device.createTexture({
647
+ label: `ExtractLUT-src-grid-${nodeId}`,
648
+ size: [gridSize, gridSize],
649
+ format: ctx.renderer.format,
650
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC
651
+ });
652
+ ctx.renderer.beginFrame(encoder, srcTex.createView(), {
653
+ r: 0,
654
+ g: 0,
655
+ b: 0,
656
+ a: 1
657
+ }, gridSize, gridSize, "clear").end();
658
+ ctx.renderer.pushScissor({
659
+ x: 0,
660
+ y: 0,
661
+ width: gridSize,
662
+ height: gridSize
663
+ });
664
+ ctx.renderer.pushIdentity();
665
+ await drawChild(sourceMedia, {
666
+ ...props,
667
+ renderId: `${nodeId}-c0`,
668
+ virtualMedia: sourceMedia,
669
+ containerWidth: gridSize,
670
+ containerHeight: gridSize,
671
+ forceWait: true
672
+ }, srcTex.createView(), srcTex, gridSize, gridSize);
673
+ ctx.renderer.popTransform();
674
+ ctx.renderer.popScissor();
675
+ const tgtTex = ctx.device.createTexture({
676
+ label: `ExtractLUT-tgt-grid-${nodeId}`,
677
+ size: [gridSize, gridSize],
678
+ format: ctx.renderer.format,
679
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC
680
+ });
681
+ activeTextures.set(nodeId, {
682
+ srcTex,
683
+ tgtTex
684
+ });
685
+ ctx.renderer.beginFrame(encoder, tgtTex.createView(), {
686
+ r: 0,
687
+ g: 0,
688
+ b: 0,
689
+ a: 1
690
+ }, gridSize, gridSize, "clear").end();
691
+ ctx.renderer.pushScissor({
692
+ x: 0,
693
+ y: 0,
694
+ width: gridSize,
695
+ height: gridSize
696
+ });
697
+ ctx.renderer.pushIdentity();
698
+ await drawChild(targetMedia, {
699
+ ...props,
700
+ renderId: `${nodeId}-c1`,
701
+ virtualMedia: targetMedia,
702
+ containerWidth: gridSize,
703
+ containerHeight: gridSize,
704
+ forceWait: true
705
+ }, tgtTex.createView(), tgtTex, gridSize, gridSize);
706
+ ctx.renderer.popTransform();
707
+ ctx.renderer.popScissor();
708
+ const bytesPerPixel = 4;
709
+ const align = 256;
710
+ const unpaddedBPR = gridSize * bytesPerPixel;
711
+ const bytesPerRow = Math.ceil(unpaddedBPR / align) * align;
712
+ const stagingSize = bytesPerRow * gridSize;
713
+ const srcStagingBuffer = ctx.device.createBuffer({
714
+ label: `ExtractLUT-src-staging-${nodeId}`,
715
+ size: stagingSize,
716
+ usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST
717
+ });
718
+ const tgtStagingBuffer = ctx.device.createBuffer({
719
+ label: `ExtractLUT-tgt-staging-${nodeId}`,
720
+ size: stagingSize,
721
+ usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST
722
+ });
723
+ encoder.copyTextureToBuffer({ texture: srcTex }, {
724
+ buffer: srcStagingBuffer,
725
+ bytesPerRow
726
+ }, [gridSize, gridSize]);
727
+ encoder.copyTextureToBuffer({ texture: tgtTex }, {
728
+ buffer: tgtStagingBuffer,
729
+ bytesPerRow
730
+ }, [gridSize, gridSize]);
731
+ let startMapping = () => {};
732
+ const mainSubmitPromise = new Promise((resolve) => {
733
+ startMapping = resolve;
734
+ });
735
+ const originalSubmit = ctx.device.queue.submit;
736
+ ctx.device.queue.submit = function(commandBuffers) {
737
+ ctx.device.queue.submit = originalSubmit;
738
+ originalSubmit.call(this, commandBuffers);
739
+ startMapping();
740
+ };
741
+ const extractionPromise = (async () => {
742
+ try {
743
+ await mainSubmitPromise;
744
+ if (latestRequestedFingerprint.get(nodeId) !== fingerprint) {
745
+ try {
746
+ srcStagingBuffer.destroy();
747
+ tgtStagingBuffer.destroy();
748
+ } catch {}
749
+ lutStore.rejectRawDataPromise(lutUrl, new DOMException("Extraction superseded by a newer request", "AbortError"));
750
+ return;
751
+ }
752
+ await ctx.device.queue.onSubmittedWorkDone();
753
+ await Promise.all([srcStagingBuffer.mapAsync(GPUMapMode.READ), tgtStagingBuffer.mapAsync(GPUMapMode.READ)]);
754
+ const srcPixels = new Uint8Array(numPixels * bytesPerPixel);
755
+ const tgtPixels = new Uint8Array(numPixels * bytesPerPixel);
756
+ const copyRows = (src, dst) => {
757
+ if (bytesPerRow === unpaddedBPR) dst.set(src);
758
+ else for (let y = 0; y < gridSize; y++) dst.set(src.subarray(y * bytesPerRow, y * bytesPerRow + unpaddedBPR), y * unpaddedBPR);
759
+ };
760
+ copyRows(new Uint8Array(srcStagingBuffer.getMappedRange()), srcPixels);
761
+ copyRows(new Uint8Array(tgtStagingBuffer.getMappedRange()), tgtPixels);
762
+ srcStagingBuffer.unmap();
763
+ srcStagingBuffer.destroy();
764
+ tgtStagingBuffer.unmap();
765
+ tgtStagingBuffer.destroy();
766
+ if (latestRequestedFingerprint.get(nodeId) !== fingerprint) {
767
+ lutStore.rejectRawDataPromise(lutUrl, new DOMException("Extraction superceded by a newer request", "AbortError"));
768
+ return;
769
+ }
770
+ const isBGRA = ctx.renderer.format === "bgra8unorm" || ctx.renderer.format === "bgra8unorm-srgb";
771
+ const lutSize = 33;
772
+ const pipelines = getOrCreatePipelines(ctx.device);
773
+ let flat = null;
774
+ let succeeded = false;
775
+ if (strategy === "deterministic") {
776
+ const shuffled = seededShuffle(buildUniqueColorPool(srcPixels, tgtPixels, isBGRA, 20), hashString(getFingerprint({
777
+ ...props.virtualMedia,
778
+ metadata: {},
779
+ operation: void 0
780
+ })));
781
+ const sampledPoints = shuffled.slice(0, Math.min(shuffled.length, samplePoints));
782
+ const M = sampledPoints.length;
783
+ if (M >= 8) {
784
+ if (isSeparableOperationTree(targetMedia, sourceMedia)) {
785
+ let epsilonSq = .01;
786
+ let totalMinDist = 0;
787
+ for (let i = 0; i < M; i++) {
788
+ let minD = Infinity;
789
+ for (let j = 0; j < M; j++) {
790
+ if (i === j) continue;
791
+ const dx = sampledPoints[i].src[0] - sampledPoints[j].src[0];
792
+ minD = Math.min(minD, dx * dx);
793
+ }
794
+ totalMinDist += Math.sqrt(minD);
795
+ }
796
+ const meanNND = totalMinDist / M;
797
+ epsilonSq = Math.max(meanNND * meanNND * 4, 1e-4);
798
+ const srcR = sampledPoints.map((p) => p.src[0]);
799
+ const tgtR = sampledPoints.map((p) => p.tgt[0]);
800
+ const srcG = sampledPoints.map((p) => p.src[1]);
801
+ const tgtG = sampledPoints.map((p) => p.tgt[1]);
802
+ const srcB = sampledPoints.map((p) => p.src[2]);
803
+ const tgtB = sampledPoints.map((p) => p.tgt[2]);
804
+ const X_sol_R = solve1DChannel(srcR, tgtR, epsilonSq);
805
+ const X_sol_G = solve1DChannel(srcG, tgtG, epsilonSq);
806
+ const X_sol_B = solve1DChannel(srcB, tgtB, epsilonSq);
807
+ if (X_sol_R && !hasAbsurdCoefficients(X_sol_R) && X_sol_G && !hasAbsurdCoefficients(X_sol_G) && X_sol_B && !hasAbsurdCoefficients(X_sol_B)) {
808
+ const lutR = evaluate1DChannel(srcR, X_sol_R, epsilonSq, lutSize);
809
+ const lutG = evaluate1DChannel(srcG, X_sol_G, epsilonSq, lutSize);
810
+ const lutB = evaluate1DChannel(srcB, X_sol_B, epsilonSq, lutSize);
811
+ flat = new Float32Array(lutSize * lutSize * lutSize * 3);
812
+ for (let b = 0; b < lutSize; b++) for (let g = 0; g < lutSize; g++) for (let r = 0; r < lutSize; r++) {
813
+ const idx = (b * lutSize * lutSize + g * lutSize + r) * 3;
814
+ flat[idx + 0] = lutR[r];
815
+ flat[idx + 1] = lutG[g];
816
+ flat[idx + 2] = lutB[b];
817
+ }
818
+ succeeded = true;
819
+ }
820
+ }
821
+ if (!succeeded) {
822
+ const H = M + 4;
823
+ let epsilonSq = .01;
824
+ let totalMinDist = 0;
825
+ for (let i = 0; i < M; i++) {
826
+ let minD = Infinity;
827
+ for (let j = 0; j < M; j++) {
828
+ if (i === j) continue;
829
+ const dx = sampledPoints[i].src[0] - sampledPoints[j].src[0];
830
+ const dy = sampledPoints[i].src[1] - sampledPoints[j].src[1];
831
+ const dz = sampledPoints[i].src[2] - sampledPoints[j].src[2];
832
+ minD = Math.min(minD, dx * dx + dy * dy + dz * dz);
833
+ }
834
+ totalMinDist += Math.sqrt(minD);
835
+ }
836
+ const meanNND = totalMinDist / M;
837
+ epsilonSq = Math.max(meanNND * meanNND * 4, 1e-4);
838
+ const K_mat = new Float64Array(H * H);
839
+ const B_rhs = new Float64Array(H * 3);
840
+ for (let i = 0; i < M; i++) {
841
+ const pi = sampledPoints[i].src;
842
+ const gi = sampledPoints[i].tgt;
843
+ B_rhs[i * 3 + 0] = gi[0];
844
+ B_rhs[i * 3 + 1] = gi[1];
845
+ B_rhs[i * 3 + 2] = gi[2];
846
+ for (let j = 0; j < M; j++) {
847
+ const pj = sampledPoints[j].src;
848
+ const dx = pi[0] - pj[0], dy = pi[1] - pj[1], dz = pi[2] - pj[2];
849
+ K_mat[i * H + j] = Math.sqrt(dx * dx + dy * dy + dz * dz + epsilonSq);
850
+ }
851
+ K_mat[i * H + M + 0] = 1;
852
+ K_mat[i * H + M + 1] = pi[0];
853
+ K_mat[i * H + M + 2] = pi[1];
854
+ K_mat[i * H + M + 3] = pi[2];
855
+ K_mat[(M + 0) * H + i] = 1;
856
+ K_mat[(M + 1) * H + i] = pi[0];
857
+ K_mat[(M + 2) * H + i] = pi[1];
858
+ K_mat[(M + 3) * H + i] = pi[2];
859
+ }
860
+ let diagMean = 0;
861
+ for (let i = 0; i < M; i++) diagMean += K_mat[i * H + i];
862
+ diagMean /= M;
863
+ const lambda = Math.max(1e-4, diagMean * .01);
864
+ for (let i = 0; i < M; i++) K_mat[i * H + i] += lambda;
865
+ const polyLambda = Math.max(1e-4, diagMean * .001);
866
+ for (let k = 0; k < 4; k++) K_mat[(M + k) * H + M + k] = polyLambda;
867
+ const X_sol = solveLU(K_mat, B_rhs, H);
868
+ if (X_sol && !hasAbsurdCoefficients(X_sol)) try {
869
+ flat = await evaluateRbfOnGpu(ctx.device, pipelines, sampledPoints, X_sol, lutSize, epsilonSq);
870
+ let hasInvalid = false;
871
+ for (let i = 0; i < flat.length; i++) {
872
+ const val = flat[i];
873
+ if (Number.isNaN(val) || !Number.isFinite(val)) {
874
+ hasInvalid = true;
875
+ break;
876
+ }
877
+ }
878
+ if (!hasInvalid) succeeded = true;
879
+ } catch (gpuErr) {
880
+ console.error("[ExtractLUT] RBF GPU evaluation failed:", gpuErr);
881
+ }
882
+ }
883
+ }
884
+ }
885
+ if (!succeeded) {
886
+ let srcMeanL = 0, srcMeanA = 0, srcMeanB = 0;
887
+ let tgtMeanL = 0, tgtMeanA = 0, tgtMeanB = 0;
888
+ const srcLABs = [];
889
+ const tgtLABs = [];
890
+ for (let i = 0; i < numPixels; i++) {
891
+ const sl = rgbToLab(...getPixelRGB(srcPixels, i, isBGRA));
892
+ srcLABs.push(sl);
893
+ srcMeanL += sl[0];
894
+ srcMeanA += sl[1];
895
+ srcMeanB += sl[2];
896
+ const tl = rgbToLab(...getPixelRGB(tgtPixels, i, isBGRA));
897
+ tgtLABs.push(tl);
898
+ tgtMeanL += tl[0];
899
+ tgtMeanA += tl[1];
900
+ tgtMeanB += tl[2];
901
+ }
902
+ srcMeanL /= numPixels;
903
+ srcMeanA /= numPixels;
904
+ srcMeanB /= numPixels;
905
+ tgtMeanL /= numPixels;
906
+ tgtMeanA /= numPixels;
907
+ tgtMeanB /= numPixels;
908
+ let srcStdL = 0, srcStdA = 0, srcStdB = 0;
909
+ let tgtStdL = 0, tgtStdA = 0, tgtStdB = 0;
910
+ for (let i = 0; i < numPixels; i++) {
911
+ srcStdL += (srcLABs[i][0] - srcMeanL) ** 2;
912
+ srcStdA += (srcLABs[i][1] - srcMeanA) ** 2;
913
+ srcStdB += (srcLABs[i][2] - srcMeanB) ** 2;
914
+ tgtStdL += (tgtLABs[i][0] - tgtMeanL) ** 2;
915
+ tgtStdA += (tgtLABs[i][1] - tgtMeanA) ** 2;
916
+ tgtStdB += (tgtLABs[i][2] - tgtMeanB) ** 2;
917
+ }
918
+ srcStdL = Math.max(Math.sqrt(srcStdL / numPixels), 1e-6);
919
+ srcStdA = Math.max(Math.sqrt(srcStdA / numPixels), 1e-6);
920
+ srcStdB = Math.max(Math.sqrt(srcStdB / numPixels), 1e-6);
921
+ tgtStdL = Math.sqrt(tgtStdL / numPixels);
922
+ tgtStdA = Math.sqrt(tgtStdA / numPixels);
923
+ tgtStdB = Math.sqrt(tgtStdB / numPixels);
924
+ if (srcStdL < 1e-4 || srcMeanL < 1e-4) {
925
+ flat = new Float32Array(lutSize * lutSize * lutSize * 3);
926
+ for (let b = 0; b < lutSize; b++) for (let g = 0; g < lutSize; g++) for (let r = 0; r < lutSize; r++) {
927
+ const idx = (b * lutSize * lutSize + g * lutSize + r) * 3;
928
+ flat[idx + 0] = r / (lutSize - 1);
929
+ flat[idx + 1] = g / (lutSize - 1);
930
+ flat[idx + 2] = b / (lutSize - 1);
931
+ }
932
+ } else flat = await evaluateStatisticalOnGpu(ctx.device, pipelines, [
933
+ srcMeanL,
934
+ srcMeanA,
935
+ srcMeanB
936
+ ], [
937
+ tgtMeanL,
938
+ tgtMeanA,
939
+ tgtMeanB
940
+ ], [
941
+ tgtStdL / srcStdL,
942
+ tgtStdA / srcStdA,
943
+ tgtStdB / srcStdB
944
+ ], lutSize);
945
+ }
946
+ const smoothedPoints = flatToPoints(flat);
947
+ if (latestRequestedFingerprint.get(nodeId) !== fingerprint) {
948
+ lutStore.rejectRawDataPromise(lutUrl, new DOMException("Extraction superseded by a newer request", "AbortError"));
949
+ return;
950
+ }
951
+ lutStore.createOrUpdate(lutUrl, ctx.device, smoothedPoints, lutSize, "3D");
952
+ extractionCache.set(nodeId, fingerprint);
953
+ } catch (err) {
954
+ console.error("[ExtractLUT] Async extraction error:", err);
955
+ try {
956
+ const lutSize = 33;
957
+ const identityPoints = [];
958
+ for (let z = 0; z < lutSize; z++) for (let y = 0; y < lutSize; y++) for (let x = 0; x < lutSize; x++) identityPoints.push([
959
+ x / (lutSize - 1),
960
+ y / (lutSize - 1),
961
+ z / (lutSize - 1)
962
+ ]);
963
+ if (latestRequestedFingerprint.get(nodeId) === fingerprint) {
964
+ lutStore.createOrUpdate(lutUrl, ctx.device, identityPoints, lutSize, "3D");
965
+ extractionCache.set(nodeId, fingerprint);
966
+ }
967
+ } catch (fallbackErr) {
968
+ console.error("[ExtractLUT] Failed to write fallback identity LUT:", fallbackErr);
969
+ lutStore.rejectRawDataPromise(lutUrl, err);
970
+ }
971
+ } finally {
972
+ pendingExtractions.delete(cacheKey);
973
+ }
974
+ })();
975
+ pendingExtractions.set(cacheKey, extractionPromise);
976
+ };
977
+ var renderers_default = defineRenderer({ WebGPURenderer: ExtractLutWebGPURenderer });
978
+
979
+ //#endregion
980
+ export { renderers_default as default };
981
+ //# sourceMappingURL=renderer-HFfcJlmR.mjs.map