@photivra/engine 1.4.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1074) hide show
  1. package/CHANGELOG.md +401 -6
  2. package/CITATION.cff +1 -1
  3. package/NODE_SUPPORT.md +64 -12
  4. package/README.md +301 -182
  5. package/SECURITY.md +37 -28
  6. package/THIRD_PARTY.md +148 -4
  7. package/dist/camera/equivalent-focal-length.d.ts +13 -14
  8. package/dist/camera/equivalent-focal-length.js +15 -13
  9. package/dist/camera/equivalent-focal-length.js.map +1 -1
  10. package/dist/camera/field-of-view.d.ts +30 -19
  11. package/dist/camera/field-of-view.js +67 -18
  12. package/dist/camera/field-of-view.js.map +1 -1
  13. package/dist/camera/lens-projection.d.ts +170 -0
  14. package/dist/camera/lens-projection.js +444 -0
  15. package/dist/camera/lens-projection.js.map +1 -0
  16. package/dist/camera/projected-object-size.d.ts +10 -11
  17. package/dist/camera/projected-object-size.js +12 -10
  18. package/dist/camera/projected-object-size.js.map +1 -1
  19. package/dist/capture/capture-export-metadata.d.ts +9 -10
  20. package/dist/capture/capture-export-metadata.js +8 -5
  21. package/dist/capture/capture-export-metadata.js.map +1 -1
  22. package/dist/capture/dng-import.d.ts +91 -0
  23. package/dist/capture/dng-import.js +343 -0
  24. package/dist/capture/dng-import.js.map +1 -0
  25. package/dist/capture/environment-raw-producer.d.ts +37 -17
  26. package/dist/capture/environment-raw-producer.js +43 -19
  27. package/dist/capture/environment-raw-producer.js.map +1 -1
  28. package/dist/capture/export-jpeg.d.ts +35 -4
  29. package/dist/capture/export-jpeg.js +133 -47
  30. package/dist/capture/export-jpeg.js.map +1 -1
  31. package/dist/capture/export-tiff.d.ts +48 -24
  32. package/dist/capture/export-tiff.js +91 -31
  33. package/dist/capture/export-tiff.js.map +1 -1
  34. package/dist/capture/focus-control.d.ts +42 -65
  35. package/dist/capture/focus-control.js +56 -75
  36. package/dist/capture/focus-control.js.map +1 -1
  37. package/dist/capture/host-yield-cadence.d.ts +25 -0
  38. package/dist/capture/host-yield-cadence.js +25 -0
  39. package/dist/capture/host-yield-cadence.js.map +1 -0
  40. package/dist/capture/linear-encoding.d.ts +14 -12
  41. package/dist/capture/linear-encoding.js +14 -13
  42. package/dist/capture/linear-encoding.js.map +1 -1
  43. package/dist/capture/lossless-jpeg.d.ts +27 -0
  44. package/dist/capture/lossless-jpeg.js +237 -0
  45. package/dist/capture/lossless-jpeg.js.map +1 -0
  46. package/dist/capture/native-environment-lean.d.ts +227 -0
  47. package/dist/capture/native-environment-lean.js +974 -0
  48. package/dist/capture/native-environment-lean.js.map +1 -0
  49. package/dist/capture/native-environment-optical-stage.d.ts +97 -0
  50. package/dist/capture/native-environment-optical-stage.js +340 -0
  51. package/dist/capture/native-environment-optical-stage.js.map +1 -0
  52. package/dist/capture/native-environment-raw.d.ts +140 -6
  53. package/dist/capture/native-environment-raw.js +435 -34
  54. package/dist/capture/native-environment-raw.js.map +1 -1
  55. package/dist/capture/native-raw-development.d.ts +118 -5
  56. package/dist/capture/native-raw-development.js +224 -59
  57. package/dist/capture/native-raw-development.js.map +1 -1
  58. package/dist/capture/native-raw-dng.d.ts +60 -0
  59. package/dist/capture/native-raw-dng.js +167 -0
  60. package/dist/capture/native-raw-dng.js.map +1 -0
  61. package/dist/capture/native-raw.d.ts +67 -10
  62. package/dist/capture/native-raw.js +90 -24
  63. package/dist/capture/native-raw.js.map +1 -1
  64. package/dist/capture/packed-sensor-raw.d.ts +160 -0
  65. package/dist/capture/packed-sensor-raw.js +221 -0
  66. package/dist/capture/packed-sensor-raw.js.map +1 -0
  67. package/dist/capture/photographic-export.d.ts +58 -35
  68. package/dist/capture/photographic-export.js +177 -70
  69. package/dist/capture/photographic-export.js.map +1 -1
  70. package/dist/capture/raw-development-kernel.d.ts +52 -0
  71. package/dist/capture/raw-development-kernel.js +88 -0
  72. package/dist/capture/raw-development-kernel.js.map +1 -0
  73. package/dist/capture/raw-frame-limits.d.ts +7 -7
  74. package/dist/capture/raw-frame-limits.js +7 -6
  75. package/dist/capture/raw-frame-limits.js.map +1 -1
  76. package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
  77. package/dist/capture/raw-frame-reconstruction.js +9 -8
  78. package/dist/capture/raw-frame-reconstruction.js.map +1 -1
  79. package/dist/capture/raw-white-level.d.ts +55 -0
  80. package/dist/capture/raw-white-level.js +165 -0
  81. package/dist/capture/raw-white-level.js.map +1 -0
  82. package/dist/capture/release-sequence.d.ts +5 -7
  83. package/dist/capture/release-sequence.js +15 -13
  84. package/dist/capture/release-sequence.js.map +1 -1
  85. package/dist/capture/sensor-raw-frame.d.ts +5 -6
  86. package/dist/capture/sensor-raw-frame.js +26 -9
  87. package/dist/capture/sensor-raw-frame.js.map +1 -1
  88. package/dist/capture/sensor-raw-producer.d.ts +21 -13
  89. package/dist/capture/sensor-raw-producer.js +86 -25
  90. package/dist/capture/sensor-raw-producer.js.map +1 -1
  91. package/dist/capture/simulated-capture.d.ts +15 -16
  92. package/dist/capture/simulated-capture.js +22 -12
  93. package/dist/capture/simulated-capture.js.map +1 -1
  94. package/dist/color/camera-color-matrix.d.ts +69 -0
  95. package/dist/color/camera-color-matrix.js +132 -0
  96. package/dist/color/camera-color-matrix.js.map +1 -0
  97. package/dist/color/capture-color.d.ts +17 -10
  98. package/dist/color/capture-color.js +50 -17
  99. package/dist/color/capture-color.js.map +1 -1
  100. package/dist/color/chromatic-adaptation.d.ts +63 -0
  101. package/dist/color/chromatic-adaptation.js +91 -0
  102. package/dist/color/chromatic-adaptation.js.map +1 -0
  103. package/dist/color/color-difference.d.ts +104 -0
  104. package/dist/color/color-difference.js +205 -0
  105. package/dist/color/color-difference.js.map +1 -0
  106. package/dist/color/color-matching-functions.d.ts +168 -0
  107. package/dist/color/color-matching-functions.js +309 -0
  108. package/dist/color/color-matching-functions.js.map +1 -0
  109. package/dist/color/colorimetry-math.d.ts +52 -0
  110. package/dist/color/colorimetry-math.js +144 -0
  111. package/dist/color/colorimetry-math.js.map +1 -0
  112. package/dist/color/gamut-mapping.d.ts +54 -0
  113. package/dist/color/gamut-mapping.js +107 -0
  114. package/dist/color/gamut-mapping.js.map +1 -0
  115. package/dist/color/illuminants.d.ts +182 -0
  116. package/dist/color/illuminants.js +434 -0
  117. package/dist/color/illuminants.js.map +1 -0
  118. package/dist/color/rgb-color-spaces.d.ts +79 -0
  119. package/dist/color/rgb-color-spaces.js +115 -0
  120. package/dist/color/rgb-color-spaces.js.map +1 -0
  121. package/dist/color/sensor-color-development.d.ts +33 -11
  122. package/dist/color/sensor-color-development.js +104 -30
  123. package/dist/color/sensor-color-development.js.map +1 -1
  124. package/dist/color/srgb-icc.d.ts +9 -2
  125. package/dist/color/srgb-icc.js +16 -5
  126. package/dist/color/srgb-icc.js.map +1 -1
  127. package/dist/color/srgb-transfer.d.ts +1 -2
  128. package/dist/color/srgb-transfer.js +1 -1
  129. package/dist/color/srgb-transfer.js.map +1 -1
  130. package/dist/color/white-balance.d.ts +68 -19
  131. package/dist/color/white-balance.js +168 -35
  132. package/dist/color/white-balance.js.map +1 -1
  133. package/dist/composition/image-formation-plan.d.ts +152 -128
  134. package/dist/composition/image-formation-plan.js +292 -138
  135. package/dist/composition/image-formation-plan.js.map +1 -1
  136. package/dist/composition/plan-consumer.d.ts +6 -7
  137. package/dist/composition/plan-consumer.js +14 -11
  138. package/dist/composition/plan-consumer.js.map +1 -1
  139. package/dist/core/calculation-result.d.ts +21 -14
  140. package/dist/core/calculation-result.js +209 -11
  141. package/dist/core/calculation-result.js.map +1 -1
  142. package/dist/core/canonical-json.d.ts +13 -8
  143. package/dist/core/canonical-json.js +34 -15
  144. package/dist/core/canonical-json.js.map +1 -1
  145. package/dist/core/configuration-error.d.ts +5 -4
  146. package/dist/core/configuration-error.js +5 -3
  147. package/dist/core/configuration-error.js.map +1 -1
  148. package/dist/core/evidence-provenance.d.ts +12 -12
  149. package/dist/core/evidence-provenance.js +10 -9
  150. package/dist/core/evidence-provenance.js.map +1 -1
  151. package/dist/core/image-formation.d.ts +11 -10
  152. package/dist/core/image-formation.js +11 -9
  153. package/dist/core/image-formation.js.map +1 -1
  154. package/dist/core/owned-data.d.ts +9 -17
  155. package/dist/core/owned-data.js +9 -16
  156. package/dist/core/owned-data.js.map +1 -1
  157. package/dist/core/portable-math.d.ts +15 -0
  158. package/dist/core/portable-math.js +56 -0
  159. package/dist/core/portable-math.js.map +1 -0
  160. package/dist/core/record-validation.d.ts +48 -9
  161. package/dist/core/record-validation.js +93 -19
  162. package/dist/core/record-validation.js.map +1 -1
  163. package/dist/core/scientific-assurance.d.ts +16 -14
  164. package/dist/core/scientific-assurance.js +22 -18
  165. package/dist/core/scientific-assurance.js.map +1 -1
  166. package/dist/core/spectral-composition.d.ts +13 -14
  167. package/dist/core/spectral-composition.js +30 -27
  168. package/dist/core/spectral-composition.js.map +1 -1
  169. package/dist/core/spectral.d.ts +5 -6
  170. package/dist/core/spectral.js +9 -7
  171. package/dist/core/spectral.js.map +1 -1
  172. package/dist/core/validation.d.ts +3 -6
  173. package/dist/core/validation.js +3 -5
  174. package/dist/core/validation.js.map +1 -1
  175. package/dist/core/version.d.ts +6 -6
  176. package/dist/core/version.js +6 -5
  177. package/dist/core/version.js.map +1 -1
  178. package/dist/equipment/exposure-capabilities.d.ts +10 -10
  179. package/dist/equipment/exposure-capabilities.js +40 -30
  180. package/dist/equipment/exposure-capabilities.js.map +1 -1
  181. package/dist/equipment/generic-tier-assets.d.ts +13 -6
  182. package/dist/equipment/generic-tier-assets.js +34 -15
  183. package/dist/equipment/generic-tier-assets.js.map +1 -1
  184. package/dist/equipment/generic-tier-presets.d.ts +5 -6
  185. package/dist/equipment/generic-tier-presets.js +15 -13
  186. package/dist/equipment/generic-tier-presets.js.map +1 -1
  187. package/dist/equipment/iso-capabilities.d.ts +21 -22
  188. package/dist/equipment/iso-capabilities.js +49 -44
  189. package/dist/equipment/iso-capabilities.js.map +1 -1
  190. package/dist/equipment/metering-capabilities.d.ts +5 -6
  191. package/dist/equipment/metering-capabilities.js +22 -19
  192. package/dist/equipment/metering-capabilities.js.map +1 -1
  193. package/dist/equipment/release-capabilities.d.ts +3 -4
  194. package/dist/equipment/release-capabilities.js +18 -14
  195. package/dist/equipment/release-capabilities.js.map +1 -1
  196. package/dist/exposure/exposure-duration-control.d.ts +19 -17
  197. package/dist/exposure/exposure-duration-control.js +27 -23
  198. package/dist/exposure/exposure-duration-control.js.map +1 -1
  199. package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
  200. package/dist/exposure/exposure-mode-resolver.js +127 -82
  201. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  202. package/dist/exposure/exposure.d.ts +17 -16
  203. package/dist/exposure/exposure.js +22 -15
  204. package/dist/exposure/exposure.js.map +1 -1
  205. package/dist/exposure/flash-ttl.d.ts +135 -0
  206. package/dist/exposure/flash-ttl.js +193 -0
  207. package/dist/exposure/flash-ttl.js.map +1 -0
  208. package/dist/exposure/flash.d.ts +144 -36
  209. package/dist/exposure/flash.js +259 -59
  210. package/dist/exposure/flash.js.map +1 -1
  211. package/dist/exposure/metering-scene-radiance.d.ts +10 -10
  212. package/dist/exposure/metering-scene-radiance.js +42 -23
  213. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  214. package/dist/exposure/metering-target.d.ts +8 -8
  215. package/dist/exposure/metering-target.js +30 -20
  216. package/dist/exposure/metering-target.js.map +1 -1
  217. package/dist/exposure/metering-temporal.d.ts +16 -15
  218. package/dist/exposure/metering-temporal.js +41 -19
  219. package/dist/exposure/metering-temporal.js.map +1 -1
  220. package/dist/exposure/metering.d.ts +64 -17
  221. package/dist/exposure/metering.js +159 -30
  222. package/dist/exposure/metering.js.map +1 -1
  223. package/dist/exposure/program-line.d.ts +5 -5
  224. package/dist/exposure/program-line.js +20 -13
  225. package/dist/exposure/program-line.js.map +1 -1
  226. package/dist/facade/camera-preset.d.ts +8 -0
  227. package/dist/facade/camera-preset.js +102 -0
  228. package/dist/facade/camera-preset.js.map +1 -0
  229. package/dist/facade/chart-radiance-batch.d.ts +57 -0
  230. package/dist/facade/chart-radiance-batch.js +121 -0
  231. package/dist/facade/chart-radiance-batch.js.map +1 -0
  232. package/dist/facade/chart-scenes.d.ts +177 -0
  233. package/dist/facade/chart-scenes.js +232 -0
  234. package/dist/facade/chart-scenes.js.map +1 -0
  235. package/dist/facade/host-yield.d.ts +7 -0
  236. package/dist/facade/host-yield.js +23 -0
  237. package/dist/facade/host-yield.js.map +1 -0
  238. package/dist/facade/scene-radiance.d.ts +117 -0
  239. package/dist/facade/scene-radiance.js +205 -0
  240. package/dist/facade/scene-radiance.js.map +1 -0
  241. package/dist/facade/simulate-capture.d.ts +284 -0
  242. package/dist/facade/simulate-capture.js +1026 -0
  243. package/dist/facade/simulate-capture.js.map +1 -0
  244. package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
  245. package/dist/gpu/chart-radiance-gpu.js +176 -0
  246. package/dist/gpu/chart-radiance-gpu.js.map +1 -0
  247. package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
  248. package/dist/gpu/image-kernel-accelerator.js +720 -0
  249. package/dist/gpu/image-kernel-accelerator.js.map +1 -0
  250. package/dist/gpu/image-kernel-execution.d.ts +92 -0
  251. package/dist/gpu/image-kernel-execution.js +84 -0
  252. package/dist/gpu/image-kernel-execution.js.map +1 -0
  253. package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
  254. package/dist/gpu/sensor-stage-gpu.js +317 -0
  255. package/dist/gpu/sensor-stage-gpu.js.map +1 -0
  256. package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
  257. package/dist/gpu/temporal-sum-gpu.js +150 -0
  258. package/dist/gpu/temporal-sum-gpu.js.map +1 -0
  259. package/dist/gpu/webgpu-runtime.d.ts +63 -0
  260. package/dist/gpu/webgpu-runtime.js +215 -0
  261. package/dist/gpu/webgpu-runtime.js.map +1 -0
  262. package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
  263. package/dist/gpu/wgsl-chart-kernel.js +165 -0
  264. package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
  265. package/dist/gpu/wgsl-kernels.d.ts +53 -0
  266. package/dist/gpu/wgsl-kernels.js +365 -0
  267. package/dist/gpu/wgsl-kernels.js.map +1 -0
  268. package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
  269. package/dist/gpu/wgsl-sensor-kernel.js +409 -0
  270. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
  271. package/dist/index.d.ts +89 -25
  272. package/dist/index.js +59 -15
  273. package/dist/index.js.map +1 -1
  274. package/dist/motion/camera-rotation.d.ts +92 -40
  275. package/dist/motion/camera-rotation.js +84 -47
  276. package/dist/motion/camera-rotation.js.map +1 -1
  277. package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
  278. package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
  279. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  280. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
  281. package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
  282. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  283. package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
  284. package/dist/motion/capture-rotation-trajectory.js +36 -26
  285. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  286. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
  287. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
  288. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  289. package/dist/motion/extended-object-projection.d.ts +19 -16
  290. package/dist/motion/extended-object-projection.js +38 -18
  291. package/dist/motion/extended-object-projection.js.map +1 -1
  292. package/dist/motion/projected-motion.d.ts +18 -17
  293. package/dist/motion/projected-motion.js +25 -17
  294. package/dist/motion/projected-motion.js.map +1 -1
  295. package/dist/motion/temporal-exposure-sum.d.ts +55 -0
  296. package/dist/motion/temporal-exposure-sum.js +141 -0
  297. package/dist/motion/temporal-exposure-sum.js.map +1 -0
  298. package/dist/motion/video-sequence.d.ts +111 -0
  299. package/dist/motion/video-sequence.js +179 -0
  300. package/dist/motion/video-sequence.js.map +1 -0
  301. package/dist/optics/aperture.d.ts +14 -15
  302. package/dist/optics/aperture.js +13 -11
  303. package/dist/optics/aperture.js.map +1 -1
  304. package/dist/optics/atmospheric-haze.d.ts +83 -0
  305. package/dist/optics/atmospheric-haze.js +113 -0
  306. package/dist/optics/atmospheric-haze.js.map +1 -0
  307. package/dist/optics/brown-conrady-distortion.d.ts +116 -0
  308. package/dist/optics/brown-conrady-distortion.js +291 -0
  309. package/dist/optics/brown-conrady-distortion.js.map +1 -0
  310. package/dist/optics/circle-of-confusion.d.ts +10 -10
  311. package/dist/optics/circle-of-confusion.js +15 -11
  312. package/dist/optics/circle-of-confusion.js.map +1 -1
  313. package/dist/optics/complex-pupil-psf.d.ts +64 -33
  314. package/dist/optics/complex-pupil-psf.js +190 -98
  315. package/dist/optics/complex-pupil-psf.js.map +1 -1
  316. package/dist/optics/depth-of-field.d.ts +25 -15
  317. package/dist/optics/depth-of-field.js +67 -27
  318. package/dist/optics/depth-of-field.js.map +1 -1
  319. package/dist/optics/diffraction.d.ts +14 -13
  320. package/dist/optics/diffraction.js +14 -10
  321. package/dist/optics/diffraction.js.map +1 -1
  322. package/dist/optics/focus-breathing.d.ts +88 -27
  323. package/dist/optics/focus-breathing.js +114 -23
  324. package/dist/optics/focus-breathing.js.map +1 -1
  325. package/dist/optics/focus-state.d.ts +18 -18
  326. package/dist/optics/focus-state.js +21 -15
  327. package/dist/optics/focus-state.js.map +1 -1
  328. package/dist/optics/front-of-lens-filter.d.ts +45 -14
  329. package/dist/optics/front-of-lens-filter.js +259 -88
  330. package/dist/optics/front-of-lens-filter.js.map +1 -1
  331. package/dist/optics/illumination-vignetting.d.ts +16 -17
  332. package/dist/optics/illumination-vignetting.js +40 -17
  333. package/dist/optics/illumination-vignetting.js.map +1 -1
  334. package/dist/optics/irradiance-convolution.d.ts +59 -0
  335. package/dist/optics/irradiance-convolution.js +138 -0
  336. package/dist/optics/irradiance-convolution.js.map +1 -0
  337. package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
  338. package/dist/optics/lateral-chromatic-aberration.js +33 -23
  339. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  340. package/dist/optics/lens-psf-kernels.d.ts +89 -0
  341. package/dist/optics/lens-psf-kernels.js +175 -0
  342. package/dist/optics/lens-psf-kernels.js.map +1 -0
  343. package/dist/optics/lens-psf-profile.d.ts +78 -46
  344. package/dist/optics/lens-psf-profile.js +335 -124
  345. package/dist/optics/lens-psf-profile.js.map +1 -1
  346. package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
  347. package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
  348. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
  349. package/dist/optics/polygon-diffraction.d.ts +80 -23
  350. package/dist/optics/polygon-diffraction.js +130 -25
  351. package/dist/optics/polygon-diffraction.js.map +1 -1
  352. package/dist/optics/profile-contract.d.ts +5 -6
  353. package/dist/optics/profile-contract.js +14 -11
  354. package/dist/optics/profile-contract.js.map +1 -1
  355. package/dist/optics/psf-foundation.d.ts +23 -23
  356. package/dist/optics/psf-foundation.js +24 -21
  357. package/dist/optics/psf-foundation.js.map +1 -1
  358. package/dist/optics/pupil-vignetting.d.ts +118 -0
  359. package/dist/optics/pupil-vignetting.js +264 -0
  360. package/dist/optics/pupil-vignetting.js.map +1 -0
  361. package/dist/optics/radial-distortion.d.ts +34 -33
  362. package/dist/optics/radial-distortion.js +37 -30
  363. package/dist/optics/radial-distortion.js.map +1 -1
  364. package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
  365. package/dist/optics/scene-to-sensor-irradiance.js +73 -45
  366. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  367. package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
  368. package/dist/optics/scene-to-sensor-quadrature.js +16 -11
  369. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
  370. package/dist/optics/sensor-aperture-rays.d.ts +20 -4
  371. package/dist/optics/sensor-aperture-rays.js +32 -14
  372. package/dist/optics/sensor-aperture-rays.js.map +1 -1
  373. package/dist/optics/sensor-environment-query.d.ts +81 -16
  374. package/dist/optics/sensor-environment-query.js +145 -12
  375. package/dist/optics/sensor-environment-query.js.map +1 -1
  376. package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
  377. package/dist/optics/sensor-psf-quadrature.js +18 -11
  378. package/dist/optics/sensor-psf-quadrature.js.map +1 -1
  379. package/dist/optics/sensor-psf-support.d.ts +8 -6
  380. package/dist/optics/sensor-psf-support.js +8 -5
  381. package/dist/optics/sensor-psf-support.js.map +1 -1
  382. package/dist/optics/stray-light.d.ts +22 -19
  383. package/dist/optics/stray-light.js +18 -12
  384. package/dist/optics/stray-light.js.map +1 -1
  385. package/dist/optics/thin-lens.d.ts +10 -9
  386. package/dist/optics/thin-lens.js +12 -8
  387. package/dist/optics/thin-lens.js.map +1 -1
  388. package/dist/optics/zernike-wavefront.d.ts +154 -0
  389. package/dist/optics/zernike-wavefront.js +352 -0
  390. package/dist/optics/zernike-wavefront.js.map +1 -0
  391. package/dist/output/capture-corrected-sdr.d.ts +16 -8
  392. package/dist/output/capture-corrected-sdr.js +16 -8
  393. package/dist/output/capture-corrected-sdr.js.map +1 -1
  394. package/dist/output/capture-geometry.d.ts +34 -36
  395. package/dist/output/capture-geometry.js +52 -32
  396. package/dist/output/capture-geometry.js.map +1 -1
  397. package/dist/output/capture-sdr.d.ts +7 -6
  398. package/dist/output/capture-sdr.js +11 -8
  399. package/dist/output/capture-sdr.js.map +1 -1
  400. package/dist/output/crop.d.ts +22 -6
  401. package/dist/output/crop.js +40 -6
  402. package/dist/output/crop.js.map +1 -1
  403. package/dist/output/geometric-transforms.d.ts +60 -23
  404. package/dist/output/geometric-transforms.js +111 -24
  405. package/dist/output/geometric-transforms.js.map +1 -1
  406. package/dist/output/lens-corrections.d.ts +27 -19
  407. package/dist/output/lens-corrections.js +29 -13
  408. package/dist/output/lens-corrections.js.map +1 -1
  409. package/dist/output/native-capture-sdr.d.ts +71 -16
  410. package/dist/output/native-capture-sdr.js +190 -33
  411. package/dist/output/native-capture-sdr.js.map +1 -1
  412. package/dist/output/png-encoder.d.ts +65 -0
  413. package/dist/output/png-encoder.js +461 -0
  414. package/dist/output/png-encoder.js.map +1 -0
  415. package/dist/output/print-contrast-reference.d.ts +10 -9
  416. package/dist/output/print-contrast-reference.js +10 -8
  417. package/dist/output/print-contrast-reference.js.map +1 -1
  418. package/dist/output/print-detail.d.ts +18 -17
  419. package/dist/output/print-detail.js +12 -10
  420. package/dist/output/print-detail.js.map +1 -1
  421. package/dist/output/print-jpeg.d.ts +26 -5
  422. package/dist/output/print-jpeg.js +117 -50
  423. package/dist/output/print-jpeg.js.map +1 -1
  424. package/dist/output/print-plan.d.ts +19 -19
  425. package/dist/output/print-plan.js +11 -10
  426. package/dist/output/print-plan.js.map +1 -1
  427. package/dist/output/print-region-statistics.d.ts +14 -15
  428. package/dist/output/print-region-statistics.js +11 -11
  429. package/dist/output/print-region-statistics.js.map +1 -1
  430. package/dist/output/sdr-rendering.d.ts +48 -10
  431. package/dist/output/sdr-rendering.js +114 -25
  432. package/dist/output/sdr-rendering.js.map +1 -1
  433. package/dist/output/subject-framing-crop.d.ts +6 -10
  434. package/dist/output/subject-framing-crop.js +23 -13
  435. package/dist/output/subject-framing-crop.js.map +1 -1
  436. package/dist/processing/demosaic.d.ts +90 -0
  437. package/dist/processing/demosaic.js +275 -0
  438. package/dist/processing/demosaic.js.map +1 -0
  439. package/dist/processing/denoise.d.ts +68 -0
  440. package/dist/processing/denoise.js +214 -0
  441. package/dist/processing/denoise.js.map +1 -0
  442. package/dist/processing/focus-stacking.d.ts +17 -0
  443. package/dist/processing/focus-stacking.js +80 -0
  444. package/dist/processing/focus-stacking.js.map +1 -0
  445. package/dist/processing/hdr.d.ts +54 -0
  446. package/dist/processing/hdr.js +172 -0
  447. package/dist/processing/hdr.js.map +1 -0
  448. package/dist/processing/image-ops.d.ts +66 -0
  449. package/dist/processing/image-ops.js +192 -0
  450. package/dist/processing/image-ops.js.map +1 -0
  451. package/dist/processing/panorama.d.ts +51 -0
  452. package/dist/processing/panorama.js +305 -0
  453. package/dist/processing/panorama.js.map +1 -0
  454. package/dist/processing/processing-task.d.ts +85 -0
  455. package/dist/processing/processing-task.js +164 -0
  456. package/dist/processing/processing-task.js.map +1 -0
  457. package/dist/processing/tone-mapping.d.ts +69 -0
  458. package/dist/processing/tone-mapping.js +310 -0
  459. package/dist/processing/tone-mapping.js.map +1 -0
  460. package/dist/schema/camera.d.ts +5 -4
  461. package/dist/schema/illumination-spectral.d.ts +13 -19
  462. package/dist/schema/illumination-spectral.js +23 -19
  463. package/dist/schema/illumination-spectral.js.map +1 -1
  464. package/dist/schema/illumination-temporal.d.ts +12 -15
  465. package/dist/schema/illumination-temporal.js +43 -28
  466. package/dist/schema/illumination-temporal.js.map +1 -1
  467. package/dist/schema/illumination.d.ts +5 -4
  468. package/dist/schema/illumination.js +55 -20
  469. package/dist/schema/illumination.js.map +1 -1
  470. package/dist/schema/scene-radiance-temporal.d.ts +9 -11
  471. package/dist/schema/scene-radiance-temporal.js +26 -23
  472. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  473. package/dist/schema/scene-radiance.d.ts +17 -17
  474. package/dist/schema/scene-radiance.js +56 -34
  475. package/dist/schema/scene-radiance.js.map +1 -1
  476. package/dist/schema/scene.d.ts +14 -13
  477. package/dist/schema/validation.d.ts +0 -1
  478. package/dist/schema/validation.js +17 -15
  479. package/dist/schema/validation.js.map +1 -1
  480. package/dist/sensor/accumulated-charge.d.ts +45 -64
  481. package/dist/sensor/accumulated-charge.js +41 -47
  482. package/dist/sensor/accumulated-charge.js.map +1 -1
  483. package/dist/sensor/architecture.d.ts +22 -25
  484. package/dist/sensor/architecture.js +17 -16
  485. package/dist/sensor/architecture.js.map +1 -1
  486. package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
  487. package/dist/sensor/camera-saturation-capacity.js +36 -34
  488. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  489. package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
  490. package/dist/sensor/capture-color-sampling-binding.js +39 -41
  491. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  492. package/dist/sensor/capture-mode-timing.d.ts +8 -9
  493. package/dist/sensor/capture-mode-timing.js +24 -21
  494. package/dist/sensor/capture-mode-timing.js.map +1 -1
  495. package/dist/sensor/capture-mode.d.ts +28 -30
  496. package/dist/sensor/capture-mode.js +33 -31
  497. package/dist/sensor/capture-mode.js.map +1 -1
  498. package/dist/sensor/color-sampling.d.ts +30 -33
  499. package/dist/sensor/color-sampling.js +32 -37
  500. package/dist/sensor/color-sampling.js.map +1 -1
  501. package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
  502. package/dist/sensor/constant-rate-temporal-integration.js +28 -26
  503. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  504. package/dist/sensor/dark-current.d.ts +53 -49
  505. package/dist/sensor/dark-current.js +87 -46
  506. package/dist/sensor/dark-current.js.map +1 -1
  507. package/dist/sensor/environment-photo-signal.d.ts +71 -30
  508. package/dist/sensor/environment-photo-signal.js +127 -46
  509. package/dist/sensor/environment-photo-signal.js.map +1 -1
  510. package/dist/sensor/eqe-electron-rate.d.ts +14 -13
  511. package/dist/sensor/eqe-electron-rate.js +34 -14
  512. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  513. package/dist/sensor/eqe-local-exposure.d.ts +24 -24
  514. package/dist/sensor/eqe-local-exposure.js +15 -11
  515. package/dist/sensor/eqe-local-exposure.js.map +1 -1
  516. package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
  517. package/dist/sensor/eqe-temporal-exposure.js +15 -10
  518. package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
  519. package/dist/sensor/exposure-window.d.ts +48 -34
  520. package/dist/sensor/exposure-window.js +77 -36
  521. package/dist/sensor/exposure-window.js.map +1 -1
  522. package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
  523. package/dist/sensor/fixed-pattern-noise.js +166 -0
  524. package/dist/sensor/fixed-pattern-noise.js.map +1 -0
  525. package/dist/sensor/iso-gain.d.ts +44 -0
  526. package/dist/sensor/iso-gain.js +119 -0
  527. package/dist/sensor/iso-gain.js.map +1 -0
  528. package/dist/sensor/iso-signal-chain.d.ts +25 -48
  529. package/dist/sensor/iso-signal-chain.js +52 -66
  530. package/dist/sensor/iso-signal-chain.js.map +1 -1
  531. package/dist/sensor/local-exposure-binding.d.ts +21 -21
  532. package/dist/sensor/local-exposure-binding.js +22 -18
  533. package/dist/sensor/local-exposure-binding.js.map +1 -1
  534. package/dist/sensor/optical-stack.d.ts +36 -40
  535. package/dist/sensor/optical-stack.js +34 -37
  536. package/dist/sensor/optical-stack.js.map +1 -1
  537. package/dist/sensor/photon-energy.d.ts +22 -28
  538. package/dist/sensor/photon-energy.js +42 -34
  539. package/dist/sensor/photon-energy.js.map +1 -1
  540. package/dist/sensor/physical-charge-capacity.d.ts +20 -30
  541. package/dist/sensor/physical-charge-capacity.js +35 -36
  542. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  543. package/dist/sensor/pixel-pitch.d.ts +2 -3
  544. package/dist/sensor/pixel-pitch.js +4 -2
  545. package/dist/sensor/pixel-pitch.js.map +1 -1
  546. package/dist/sensor/radiometry-readiness.d.ts +13 -15
  547. package/dist/sensor/radiometry-readiness.js +20 -17
  548. package/dist/sensor/radiometry-readiness.js.map +1 -1
  549. package/dist/sensor/raw-readout.d.ts +173 -83
  550. package/dist/sensor/raw-readout.js +425 -160
  551. package/dist/sensor/raw-readout.js.map +1 -1
  552. package/dist/sensor/raw-reconstruction.d.ts +112 -44
  553. package/dist/sensor/raw-reconstruction.js +200 -47
  554. package/dist/sensor/raw-reconstruction.js.map +1 -1
  555. package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
  556. package/dist/sensor/readout-exposure-linkage.js +125 -27
  557. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  558. package/dist/sensor/readout-timing.d.ts +43 -44
  559. package/dist/sensor/readout-timing.js +38 -30
  560. package/dist/sensor/readout-timing.js.map +1 -1
  561. package/dist/sensor/response-application-compatibility.d.ts +21 -28
  562. package/dist/sensor/response-application-compatibility.js +35 -34
  563. package/dist/sensor/response-application-compatibility.js.map +1 -1
  564. package/dist/sensor/response-operating-range.d.ts +26 -35
  565. package/dist/sensor/response-operating-range.js +40 -39
  566. package/dist/sensor/response-operating-range.js.map +1 -1
  567. package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
  568. package/dist/sensor/responsivity-photocurrent.js +57 -40
  569. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  570. package/dist/sensor/sampling-aperture.d.ts +21 -25
  571. package/dist/sensor/sampling-aperture.js +29 -28
  572. package/dist/sensor/sampling-aperture.js.map +1 -1
  573. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
  574. package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
  575. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
  576. package/dist/sensor/sensor-geometry.d.ts +28 -32
  577. package/dist/sensor/sensor-geometry.js +35 -20
  578. package/dist/sensor/sensor-geometry.js.map +1 -1
  579. package/dist/sensor/signal-noise.d.ts +14 -16
  580. package/dist/sensor/signal-noise.js +15 -13
  581. package/dist/sensor/signal-noise.js.map +1 -1
  582. package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
  583. package/dist/sensor/spatial-sample-reduction.js +39 -48
  584. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  585. package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
  586. package/dist/sensor/spatial-sampling-quadrature.js +31 -36
  587. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  588. package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
  589. package/dist/sensor/spatio-spectral-reduction.js +24 -29
  590. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  591. package/dist/sensor/spectral-coverage.d.ts +6 -9
  592. package/dist/sensor/spectral-coverage.js +9 -6
  593. package/dist/sensor/spectral-coverage.js.map +1 -1
  594. package/dist/sensor/spectral-quadrature.d.ts +46 -60
  595. package/dist/sensor/spectral-quadrature.js +38 -48
  596. package/dist/sensor/spectral-quadrature.js.map +1 -1
  597. package/dist/sensor/spectral-response.d.ts +53 -41
  598. package/dist/sensor/spectral-response.js +80 -47
  599. package/dist/sensor/spectral-response.js.map +1 -1
  600. package/dist/sensor/stochastic-seed.d.ts +50 -0
  601. package/dist/sensor/stochastic-seed.js +123 -0
  602. package/dist/sensor/stochastic-seed.js.map +1 -0
  603. package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
  604. package/dist/sensor/temporal-eqe-sum.js +5 -6
  605. package/dist/sensor/temporal-eqe-sum.js.map +1 -1
  606. package/dist/sensor/temporal-photo-signal.d.ts +5 -6
  607. package/dist/sensor/temporal-photo-signal.js +11 -10
  608. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  609. package/dist/sensor/temporal-sample-binding.d.ts +1 -2
  610. package/dist/sensor/temporal-sample-binding.js +3 -3
  611. package/dist/sensor/temporal-sample-binding.js.map +1 -1
  612. package/dist/simulation/poc-simulation.d.ts +16 -16
  613. package/dist/simulation/poc-simulation.js +20 -15
  614. package/dist/simulation/poc-simulation.js.map +1 -1
  615. package/dist/stabilization/camera-shake.d.ts +42 -18
  616. package/dist/stabilization/camera-shake.js +43 -20
  617. package/dist/stabilization/camera-shake.js.map +1 -1
  618. package/dist/stabilization/system.d.ts +44 -41
  619. package/dist/stabilization/system.js +196 -108
  620. package/dist/stabilization/system.js.map +1 -1
  621. package/docs/AGENT_GUIDE.md +183 -0
  622. package/docs/API_REFERENCE.md +761 -2
  623. package/docs/QUICK_START.md +495 -0
  624. package/docs/USAGE.md +1719 -714
  625. package/docs/api/camera-equivalent-focal-length.md +6 -7
  626. package/docs/api/camera-field-of-view.md +16 -8
  627. package/docs/api/camera-lens-projection.md +246 -0
  628. package/docs/api/camera-projected-object-size.md +6 -5
  629. package/docs/api/capture-capture-export-metadata.md +10 -10
  630. package/docs/api/capture-dng-import.md +134 -0
  631. package/docs/api/capture-environment-raw-producer.md +17 -11
  632. package/docs/api/capture-export-jpeg.md +16 -0
  633. package/docs/api/capture-focus-control.md +25 -47
  634. package/docs/api/capture-linear-encoding.md +21 -12
  635. package/docs/api/capture-lossless-jpeg.md +49 -0
  636. package/docs/api/capture-native-environment-optical-stage.md +75 -0
  637. package/docs/api/capture-native-environment-raw.md +161 -4
  638. package/docs/api/capture-native-raw-development.md +69 -4
  639. package/docs/api/capture-native-raw-dng.md +84 -0
  640. package/docs/api/capture-native-raw.md +23 -8
  641. package/docs/api/capture-packed-sensor-raw.md +156 -0
  642. package/docs/api/capture-photographic-export.md +69 -31
  643. package/docs/api/capture-raw-frame-reconstruction.md +8 -8
  644. package/docs/api/capture-raw-white-level.md +37 -0
  645. package/docs/api/capture-release-sequence.md +6 -7
  646. package/docs/api/capture-sensor-raw-frame.md +6 -6
  647. package/docs/api/capture-sensor-raw-producer.md +17 -11
  648. package/docs/api/capture-simulated-capture.md +15 -15
  649. package/docs/api/color-camera-color-matrix.md +103 -0
  650. package/docs/api/color-capture-color.md +22 -11
  651. package/docs/api/color-chromatic-adaptation.md +82 -0
  652. package/docs/api/color-color-difference.md +134 -0
  653. package/docs/api/color-color-matching-functions.md +259 -0
  654. package/docs/api/color-colorimetry-math.md +54 -0
  655. package/docs/api/color-gamut-mapping.md +72 -0
  656. package/docs/api/color-illuminants.md +280 -0
  657. package/docs/api/color-rgb-color-spaces.md +151 -0
  658. package/docs/api/color-sensor-color-development.md +27 -0
  659. package/docs/api/color-srgb-icc.md +2 -4
  660. package/docs/api/color-white-balance.md +95 -19
  661. package/docs/api/composition-image-formation-plan.md +124 -95
  662. package/docs/api/composition-plan-consumer.md +7 -7
  663. package/docs/api/core-calculation-result.md +18 -14
  664. package/docs/api/core-configuration-error.md +1 -1
  665. package/docs/api/core-image-formation.md +7 -7
  666. package/docs/api/core-scientific-assurance.md +12 -10
  667. package/docs/api/core-spectral-composition.md +14 -14
  668. package/docs/api/core-spectral.md +6 -6
  669. package/docs/api/core-validation.md +3 -3
  670. package/docs/api/core-version.md +7 -6
  671. package/docs/api/equipment-exposure-capabilities.md +11 -10
  672. package/docs/api/equipment-generic-tier-assets.md +7 -2
  673. package/docs/api/equipment-generic-tier-presets.md +6 -6
  674. package/docs/api/equipment-iso-capabilities.md +18 -18
  675. package/docs/api/equipment-metering-capabilities.md +6 -6
  676. package/docs/api/equipment-release-capabilities.md +4 -4
  677. package/docs/api/exports.json +2213 -8
  678. package/docs/api/exposure-exposure-duration-control.md +9 -9
  679. package/docs/api/exposure-exposure-mode-resolver.md +35 -31
  680. package/docs/api/exposure-exposure.md +10 -10
  681. package/docs/api/exposure-flash-ttl.md +182 -0
  682. package/docs/api/exposure-flash.md +183 -28
  683. package/docs/api/exposure-metering-scene-radiance.md +11 -10
  684. package/docs/api/exposure-metering-target.md +9 -8
  685. package/docs/api/exposure-metering-temporal.md +8 -8
  686. package/docs/api/exposure-metering.md +69 -9
  687. package/docs/api/exposure-program-line.md +6 -5
  688. package/docs/api/facade-chart-radiance-batch.md +96 -0
  689. package/docs/api/facade-chart-scenes.md +240 -0
  690. package/docs/api/facade-scene-radiance.md +122 -0
  691. package/docs/api/facade-simulate-capture.md +324 -0
  692. package/docs/api/gpu-image-kernel-accelerator.md +157 -0
  693. package/docs/api/gpu-image-kernel-execution.md +152 -0
  694. package/docs/api/motion-camera-rotation.md +43 -26
  695. package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
  696. package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
  697. package/docs/api/motion-capture-rotation-trajectory.md +15 -15
  698. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
  699. package/docs/api/motion-extended-object-projection.md +10 -8
  700. package/docs/api/motion-projected-motion.md +8 -8
  701. package/docs/api/motion-temporal-exposure-sum.md +98 -0
  702. package/docs/api/motion-video-sequence.md +159 -0
  703. package/docs/api/optics-aperture.md +8 -8
  704. package/docs/api/optics-atmospheric-haze.md +104 -0
  705. package/docs/api/optics-brown-conrady-distortion.md +123 -0
  706. package/docs/api/optics-circle-of-confusion.md +5 -4
  707. package/docs/api/optics-complex-pupil-psf.md +57 -16
  708. package/docs/api/optics-depth-of-field.md +12 -6
  709. package/docs/api/optics-diffraction.md +8 -7
  710. package/docs/api/optics-focus-breathing.md +104 -16
  711. package/docs/api/optics-focus-state.md +9 -10
  712. package/docs/api/optics-front-of-lens-filter.md +72 -14
  713. package/docs/api/optics-illumination-vignetting.md +10 -10
  714. package/docs/api/optics-irradiance-convolution.md +95 -0
  715. package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
  716. package/docs/api/optics-lens-psf-kernels.md +72 -0
  717. package/docs/api/optics-lens-psf-profile.md +48 -26
  718. package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
  719. package/docs/api/optics-polygon-diffraction.md +78 -13
  720. package/docs/api/optics-profile-contract.md +4 -4
  721. package/docs/api/optics-psf-foundation.md +12 -12
  722. package/docs/api/optics-pupil-vignetting.md +132 -0
  723. package/docs/api/optics-radial-distortion.md +12 -12
  724. package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
  725. package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
  726. package/docs/api/optics-sensor-aperture-rays.md +3 -2
  727. package/docs/api/optics-sensor-environment-query.md +52 -9
  728. package/docs/api/optics-sensor-psf-quadrature.md +13 -10
  729. package/docs/api/optics-stray-light.md +12 -11
  730. package/docs/api/optics-thin-lens.md +4 -3
  731. package/docs/api/optics-zernike-wavefront.md +229 -0
  732. package/docs/api/output-capture-corrected-sdr.md +10 -7
  733. package/docs/api/output-capture-geometry.md +35 -36
  734. package/docs/api/output-capture-sdr.md +4 -4
  735. package/docs/api/output-crop.md +7 -4
  736. package/docs/api/output-geometric-transforms.md +65 -19
  737. package/docs/api/output-lens-corrections.md +17 -15
  738. package/docs/api/output-native-capture-sdr.md +26 -13
  739. package/docs/api/output-png-encoder.md +105 -0
  740. package/docs/api/output-print-contrast-reference.md +8 -8
  741. package/docs/api/output-print-detail.md +14 -14
  742. package/docs/api/output-print-jpeg.md +22 -5
  743. package/docs/api/output-print-plan.md +18 -18
  744. package/docs/api/output-print-region-statistics.md +14 -14
  745. package/docs/api/output-sdr-rendering.md +52 -10
  746. package/docs/api/output-subject-framing-crop.md +5 -6
  747. package/docs/api/processing-demosaic.md +120 -0
  748. package/docs/api/processing-denoise.md +148 -0
  749. package/docs/api/processing-focus-stacking.md +41 -0
  750. package/docs/api/processing-hdr.md +113 -0
  751. package/docs/api/processing-panorama.md +82 -0
  752. package/docs/api/processing-processing-task.md +107 -0
  753. package/docs/api/processing-tone-mapping.md +142 -0
  754. package/docs/api/schema-camera.md +6 -4
  755. package/docs/api/schema-illumination-spectral.md +10 -11
  756. package/docs/api/schema-illumination-temporal.md +13 -15
  757. package/docs/api/schema-illumination.md +4 -4
  758. package/docs/api/schema-scene-radiance-temporal.md +10 -11
  759. package/docs/api/schema-scene-radiance.md +18 -17
  760. package/docs/api/schema-scene.md +9 -9
  761. package/docs/api/schema-validation.md +1 -1
  762. package/docs/api/sensor-accumulated-charge.md +12 -20
  763. package/docs/api/sensor-architecture.md +15 -16
  764. package/docs/api/sensor-camera-saturation-capacity.md +9 -11
  765. package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
  766. package/docs/api/sensor-capture-mode-timing.md +9 -9
  767. package/docs/api/sensor-capture-mode.md +29 -30
  768. package/docs/api/sensor-color-sampling.md +31 -33
  769. package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
  770. package/docs/api/sensor-dark-current.md +30 -14
  771. package/docs/api/sensor-environment-photo-signal.md +13 -6
  772. package/docs/api/sensor-eqe-electron-rate.md +9 -8
  773. package/docs/api/sensor-eqe-local-exposure.md +18 -17
  774. package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
  775. package/docs/api/sensor-exposure-window.md +24 -24
  776. package/docs/api/sensor-fixed-pattern-noise.md +104 -0
  777. package/docs/api/sensor-iso-gain.md +63 -0
  778. package/docs/api/sensor-iso-signal-chain.md +13 -22
  779. package/docs/api/sensor-local-exposure-binding.md +12 -13
  780. package/docs/api/sensor-optical-stack.md +37 -40
  781. package/docs/api/sensor-photon-energy.md +10 -11
  782. package/docs/api/sensor-physical-charge-capacity.md +8 -13
  783. package/docs/api/sensor-pixel-pitch.md +1 -1
  784. package/docs/api/sensor-radiometry-readiness.md +9 -9
  785. package/docs/api/sensor-raw-readout.md +118 -52
  786. package/docs/api/sensor-raw-reconstruction.md +97 -20
  787. package/docs/api/sensor-readout-exposure-linkage.md +120 -24
  788. package/docs/api/sensor-readout-timing.md +33 -35
  789. package/docs/api/sensor-response-application-compatibility.md +9 -11
  790. package/docs/api/sensor-response-operating-range.md +14 -18
  791. package/docs/api/sensor-responsivity-photocurrent.md +9 -12
  792. package/docs/api/sensor-sampling-aperture.md +22 -25
  793. package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
  794. package/docs/api/sensor-sensor-geometry.md +23 -24
  795. package/docs/api/sensor-signal-noise.md +10 -10
  796. package/docs/api/sensor-spatial-sample-reduction.md +27 -30
  797. package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
  798. package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
  799. package/docs/api/sensor-spectral-coverage.md +5 -5
  800. package/docs/api/sensor-spectral-quadrature.md +33 -35
  801. package/docs/api/sensor-spectral-response.md +28 -16
  802. package/docs/api/sensor-temporal-photo-signal.md +6 -6
  803. package/docs/api/simulation-poc-simulation.md +17 -16
  804. package/docs/api/stabilization-camera-shake.md +29 -10
  805. package/docs/api/stabilization-system.md +25 -21
  806. package/docs/examples/production-request.json +3821 -2157
  807. package/docs/examples/simulate-capture.mjs +14 -0
  808. package/llms.txt +35 -0
  809. package/package.json +32 -12
  810. package/AGENTS.md +0 -674
  811. package/CONTRIBUTING.md +0 -76
  812. package/DCO +0 -33
  813. package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
  814. package/dist/camera/field-of-view.d.ts.map +0 -1
  815. package/dist/camera/projected-object-size.d.ts.map +0 -1
  816. package/dist/capture/capture-export-metadata.d.ts.map +0 -1
  817. package/dist/capture/environment-raw-producer.d.ts.map +0 -1
  818. package/dist/capture/export-jpeg.d.ts.map +0 -1
  819. package/dist/capture/export-tiff.d.ts.map +0 -1
  820. package/dist/capture/focus-control.d.ts.map +0 -1
  821. package/dist/capture/linear-encoding.d.ts.map +0 -1
  822. package/dist/capture/native-environment-raw.d.ts.map +0 -1
  823. package/dist/capture/native-raw-development.d.ts.map +0 -1
  824. package/dist/capture/native-raw.d.ts.map +0 -1
  825. package/dist/capture/photographic-export.d.ts.map +0 -1
  826. package/dist/capture/raw-frame-limits.d.ts.map +0 -1
  827. package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
  828. package/dist/capture/release-sequence.d.ts.map +0 -1
  829. package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
  830. package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
  831. package/dist/capture/simulated-capture.d.ts.map +0 -1
  832. package/dist/color/capture-color.d.ts.map +0 -1
  833. package/dist/color/sensor-color-development.d.ts.map +0 -1
  834. package/dist/color/srgb-icc.d.ts.map +0 -1
  835. package/dist/color/srgb-transfer.d.ts.map +0 -1
  836. package/dist/color/white-balance.d.ts.map +0 -1
  837. package/dist/composition/image-formation-plan.d.ts.map +0 -1
  838. package/dist/composition/plan-consumer.d.ts.map +0 -1
  839. package/dist/core/calculation-result.d.ts.map +0 -1
  840. package/dist/core/canonical-json.d.ts.map +0 -1
  841. package/dist/core/configuration-error.d.ts.map +0 -1
  842. package/dist/core/evidence-provenance.d.ts.map +0 -1
  843. package/dist/core/image-formation.d.ts.map +0 -1
  844. package/dist/core/owned-data.d.ts.map +0 -1
  845. package/dist/core/record-validation.d.ts.map +0 -1
  846. package/dist/core/scientific-assurance.d.ts.map +0 -1
  847. package/dist/core/spectral-composition.d.ts.map +0 -1
  848. package/dist/core/spectral.d.ts.map +0 -1
  849. package/dist/core/validation.d.ts.map +0 -1
  850. package/dist/core/version.d.ts.map +0 -1
  851. package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
  852. package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
  853. package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
  854. package/dist/equipment/iso-capabilities.d.ts.map +0 -1
  855. package/dist/equipment/metering-capabilities.d.ts.map +0 -1
  856. package/dist/equipment/release-capabilities.d.ts.map +0 -1
  857. package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
  858. package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
  859. package/dist/exposure/exposure.d.ts.map +0 -1
  860. package/dist/exposure/flash.d.ts.map +0 -1
  861. package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
  862. package/dist/exposure/metering-target.d.ts.map +0 -1
  863. package/dist/exposure/metering-temporal.d.ts.map +0 -1
  864. package/dist/exposure/metering.d.ts.map +0 -1
  865. package/dist/exposure/program-line.d.ts.map +0 -1
  866. package/dist/index.d.ts.map +0 -1
  867. package/dist/motion/camera-rotation.d.ts.map +0 -1
  868. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
  869. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
  870. package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
  871. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
  872. package/dist/motion/extended-object-projection.d.ts.map +0 -1
  873. package/dist/motion/projected-motion.d.ts.map +0 -1
  874. package/dist/optics/aperture.d.ts.map +0 -1
  875. package/dist/optics/circle-of-confusion.d.ts.map +0 -1
  876. package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
  877. package/dist/optics/depth-of-field.d.ts.map +0 -1
  878. package/dist/optics/diffraction.d.ts.map +0 -1
  879. package/dist/optics/focus-breathing.d.ts.map +0 -1
  880. package/dist/optics/focus-state.d.ts.map +0 -1
  881. package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
  882. package/dist/optics/illumination-vignetting.d.ts.map +0 -1
  883. package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
  884. package/dist/optics/lens-psf-profile.d.ts.map +0 -1
  885. package/dist/optics/polygon-diffraction.d.ts.map +0 -1
  886. package/dist/optics/profile-contract.d.ts.map +0 -1
  887. package/dist/optics/psf-foundation.d.ts.map +0 -1
  888. package/dist/optics/radial-distortion.d.ts.map +0 -1
  889. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
  890. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
  891. package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
  892. package/dist/optics/sensor-environment-query.d.ts.map +0 -1
  893. package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
  894. package/dist/optics/sensor-psf-support.d.ts.map +0 -1
  895. package/dist/optics/stray-light.d.ts.map +0 -1
  896. package/dist/optics/thin-lens.d.ts.map +0 -1
  897. package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
  898. package/dist/output/capture-geometry.d.ts.map +0 -1
  899. package/dist/output/capture-sdr.d.ts.map +0 -1
  900. package/dist/output/crop.d.ts.map +0 -1
  901. package/dist/output/geometric-transforms.d.ts.map +0 -1
  902. package/dist/output/lens-corrections.d.ts.map +0 -1
  903. package/dist/output/native-capture-sdr.d.ts.map +0 -1
  904. package/dist/output/print-contrast-reference.d.ts.map +0 -1
  905. package/dist/output/print-detail.d.ts.map +0 -1
  906. package/dist/output/print-jpeg.d.ts.map +0 -1
  907. package/dist/output/print-plan.d.ts.map +0 -1
  908. package/dist/output/print-region-statistics.d.ts.map +0 -1
  909. package/dist/output/sdr-rendering.d.ts.map +0 -1
  910. package/dist/output/subject-framing-crop.d.ts.map +0 -1
  911. package/dist/schema/camera.d.ts.map +0 -1
  912. package/dist/schema/camera.js +0 -3
  913. package/dist/schema/camera.js.map +0 -1
  914. package/dist/schema/illumination-spectral.d.ts.map +0 -1
  915. package/dist/schema/illumination-temporal.d.ts.map +0 -1
  916. package/dist/schema/illumination.d.ts.map +0 -1
  917. package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
  918. package/dist/schema/scene-radiance.d.ts.map +0 -1
  919. package/dist/schema/scene.d.ts.map +0 -1
  920. package/dist/schema/scene.js +0 -3
  921. package/dist/schema/scene.js.map +0 -1
  922. package/dist/schema/validation.d.ts.map +0 -1
  923. package/dist/sensor/accumulated-charge.d.ts.map +0 -1
  924. package/dist/sensor/architecture.d.ts.map +0 -1
  925. package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
  926. package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
  927. package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
  928. package/dist/sensor/capture-mode.d.ts.map +0 -1
  929. package/dist/sensor/color-sampling.d.ts.map +0 -1
  930. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
  931. package/dist/sensor/dark-current.d.ts.map +0 -1
  932. package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
  933. package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
  934. package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
  935. package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
  936. package/dist/sensor/exposure-window.d.ts.map +0 -1
  937. package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
  938. package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
  939. package/dist/sensor/optical-stack.d.ts.map +0 -1
  940. package/dist/sensor/photon-energy.d.ts.map +0 -1
  941. package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
  942. package/dist/sensor/pixel-pitch.d.ts.map +0 -1
  943. package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
  944. package/dist/sensor/raw-readout.d.ts.map +0 -1
  945. package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
  946. package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
  947. package/dist/sensor/readout-timing.d.ts.map +0 -1
  948. package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
  949. package/dist/sensor/response-operating-range.d.ts.map +0 -1
  950. package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
  951. package/dist/sensor/sampling-aperture.d.ts.map +0 -1
  952. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
  953. package/dist/sensor/sensor-geometry.d.ts.map +0 -1
  954. package/dist/sensor/signal-noise.d.ts.map +0 -1
  955. package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
  956. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
  957. package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
  958. package/dist/sensor/spectral-coverage.d.ts.map +0 -1
  959. package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
  960. package/dist/sensor/spectral-response.d.ts.map +0 -1
  961. package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
  962. package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
  963. package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
  964. package/dist/simulation/poc-simulation.d.ts.map +0 -1
  965. package/dist/stabilization/camera-shake.d.ts.map +0 -1
  966. package/dist/stabilization/system.d.ts.map +0 -1
  967. package/docs/API_STYLE.md +0 -235
  968. package/docs/ARCHITECTURE.md +0 -356
  969. package/docs/AUTOMATION_COORDINATION.md +0 -190
  970. package/docs/CAPTURE_COLOR.md +0 -25
  971. package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
  972. package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
  973. package/docs/CAPTURE_SDR.md +0 -22
  974. package/docs/DEVELOPERS.md +0 -68
  975. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  976. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  977. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  978. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  979. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  980. package/docs/IMAGE_FORMATION.md +0 -247
  981. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  982. package/docs/MOTION_AND_SIGNAL.md +0 -250
  983. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  984. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  985. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  986. package/docs/NATIVE_RAW_AND_PRINT.md +0 -47
  987. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  988. package/docs/PERFORMANCE_BASELINE.md +0 -56
  989. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  990. package/docs/PHYSICS_FOUNDATION.md +0 -426
  991. package/docs/POC_API.md +0 -278
  992. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  993. package/docs/POC_PROJECTION_REUSE.md +0 -124
  994. package/docs/PRINT_195_196_REVIEW.md +0 -93
  995. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  996. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  997. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  998. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  999. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1000. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1001. package/docs/PRINT_PLANNING.md +0 -75
  1002. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1003. package/docs/PROCESSED_OUTPUT.md +0 -157
  1004. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1005. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1006. package/docs/PROVENANCE.md +0 -115
  1007. package/docs/PSF_FOUNDATION.md +0 -165
  1008. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1009. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1010. package/docs/RELEASE_1_0.md +0 -66
  1011. package/docs/RELEASE_1_0_1.md +0 -61
  1012. package/docs/RELEASE_1_1_0.md +0 -25
  1013. package/docs/RELEASE_1_2_0.md +0 -51
  1014. package/docs/RELEASE_1_3_0.md +0 -15
  1015. package/docs/RELEASE_1_4_0.md +0 -23
  1016. package/docs/RELEASE_AUDIT.md +0 -39
  1017. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1018. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1019. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1020. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1021. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1022. package/docs/SDR_RENDERING.md +0 -33
  1023. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1024. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1025. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1026. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1027. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1028. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1029. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1030. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1031. package/docs/SIMULATED_CAPTURE.md +0 -65
  1032. package/docs/STABILIZATION.md +0 -234
  1033. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1034. package/docs/TIER_ACCEPTANCE.md +0 -129
  1035. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1036. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1037. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1038. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1039. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1040. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1041. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1042. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1043. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1044. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1045. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1046. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1047. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1048. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1049. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1050. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1051. package/docs/validation/documentation-fragments.json +0 -212
  1052. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1053. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1054. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1055. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1056. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1057. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1058. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1059. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1060. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1061. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1062. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1063. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1064. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1065. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1066. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1067. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1068. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1069. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1070. package/docs/validation/print-detail-capabilities.json +0 -103
  1071. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1072. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1073. package/docs/validation/release-audit-inventory.json +0 -1306
  1074. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -0,0 +1,720 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * Optional image-kernel accelerator (#277). One object runs work on the execution backend the caller
4
+ * asks for.
5
+ * - `cpu-reference` uses the unchanged float64 engine code.
6
+ * - `webgpu-f32` runs the project's own WGSL (WebGPU shader) kernels for the heaviest per-pixel loops.
7
+ * Every result is labelled as a float32 approximation, with an error bound worked out in advance.
8
+ * A requested WebGPU backend falls back to the CPU only if the caller chose
9
+ * `fallback: "cpu-reference"`. The result label then names the backend that actually ran, and why.
10
+ * See docs/WEBGPU.md.
11
+ */
12
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
13
+ import { InvalidScientificResultError } from "../core/validation.js";
14
+ import { requireAllowlistedRecord } from "../core/record-validation.js";
15
+ import { createHostYieldGate } from "../capture/host-yield-cadence.js";
16
+ import { checkNativeRawIntegrity, createNativeRawDevelopmentTask, prepareNativeRawDevelopment, takeNativeRawOwnership } from "../capture/native-raw-development.js";
17
+ import { resolveCaptureColorModel } from "../color/capture-color.js";
18
+ import { RAW_HIGHLIGHT_RECONSTRUCTION_START } from "../color/sensor-color-development.js";
19
+ import { transformOrientedRasterPointToNative } from "../output/capture-geometry.js";
20
+ import { calculateNativeCaptureSdrPlan, createNativeCaptureSdrTask, sdrOutputEncoding, validateNativeCaptureSdrTile, NATIVE_CAPTURE_SDR_LIMITS } from "../output/native-capture-sdr.js";
21
+ import { convolveIrradianceRows, calculateIrradianceConvolutionPlan } from "../optics/irradiance-convolution.js";
22
+ import { ImageKernelExecutionError, cpuExecution, float32Gamma, integerCodeBound, webGpuExecution } from "./image-kernel-execution.js";
23
+ import { BUFFER_USAGE, GpuResourceScope, abortedError, acquireWebGpuRuntime, createComputePipeline, linearDispatch, runComputePass } from "./webgpu-runtime.js";
24
+ import { CONVOLUTION_WORKGROUP_EDGE, IRRADIANCE_CONVOLUTION_WGSL, LINEAR_WORKGROUP_SIZE, RAW_DEVELOPMENT_WGSL, SDR_COUNTER, SDR_COUNTER_SLOTS, SDR_LUMINANCE_WGSL, SDR_TONE_MODE, SDR_WGSL } from "./wgsl-kernels.js";
25
+ import { simulateSensorRawOnCpu, simulateSensorRawOnGpu } from "./sensor-stage-gpu.js";
26
+ import { calculateTemporalExposureSumPlan } from "../motion/temporal-exposure-sum.js";
27
+ import { sumTemporalExposureOnCpu, sumTemporalExposureOnGpu } from "./temporal-sum-gpu.js";
28
+ import { evaluateChartRadianceOnCpu, evaluateChartRadianceOnGpu } from "./chart-radiance-gpu.js";
29
+ const DEFAULT_BAND_BYTES = 64 * 1024 * 1024;
30
+ const MINIMUM_BAND_BYTES = 4096;
31
+ /** Limit on multiply-adds per convolution dispatch, to stay clear of the GPU watchdog timeout. */
32
+ const MAXIMUM_CONVOLUTION_TAPS_PER_DISPATCH = 2 ** 30;
33
+ /** Inputs whose float64 product with the rendering scale exceeds this are outside the float32 domain. */
34
+ const FLOAT32_SAFE_MAGNITUDE = 2 ** 120;
35
+ const FLOAT32_SUBNORMAL_LIMIT = 2 ** -126;
36
+ const NO_COUNTERS = () => new Array(SDR_COUNTER_SLOTS).fill(0);
37
+ function runOptions(value) {
38
+ if (value === undefined)
39
+ return {};
40
+ const r = requireAllowlistedRecord(value, ["signal", "yieldControl"], "Invalid image-kernel run options.");
41
+ if ((r.signal !== undefined && (typeof r.signal !== "object" || r.signal === null || typeof r.signal.aborted !== "boolean")) ||
42
+ (r.yieldControl !== undefined && typeof r.yieldControl !== "function")) {
43
+ throw new InvalidConfigurationError("Invalid image-kernel run options.");
44
+ }
45
+ return value;
46
+ }
47
+ /** Links an optional caller signal to an internal controller; `dispose` removes the listener. */
48
+ function linkedAbort(signal) {
49
+ const controller = new AbortController();
50
+ if (!signal)
51
+ return { controller, dispose: () => undefined };
52
+ if (signal.aborted) {
53
+ controller.abort();
54
+ return { controller, dispose: () => undefined };
55
+ }
56
+ const listener = () => controller.abort();
57
+ signal.addEventListener("abort", listener, { once: true });
58
+ return { controller, dispose: () => signal.removeEventListener("abort", listener) };
59
+ }
60
+ /** Requests a backend. Never swaps backends silently: a fallback must be set in the options and is shown in every result label. */
61
+ export async function createImageKernelAccelerator(options) {
62
+ const r = requireAllowlistedRecord(options, ["backend", "fallback", "gpu", "powerPreference", "maximumBandBytes", "signal"], "Invalid image-kernel accelerator options.");
63
+ if ((r.backend !== "cpu-reference" && r.backend !== "webgpu-f32") ||
64
+ (r.backend === "webgpu-f32" && r.fallback !== "cpu-reference" && r.fallback !== "fail") ||
65
+ (r.backend === "cpu-reference" && r.fallback !== undefined) ||
66
+ (r.powerPreference !== undefined && r.powerPreference !== "low-power" && r.powerPreference !== "high-performance") ||
67
+ (r.maximumBandBytes !== undefined && (typeof r.maximumBandBytes !== "number" || !Number.isSafeInteger(r.maximumBandBytes) ||
68
+ r.maximumBandBytes < MINIMUM_BAND_BYTES)) ||
69
+ (r.signal !== undefined && (typeof r.signal !== "object" || r.signal === null || typeof r.signal.aborted !== "boolean"))) {
70
+ throw new InvalidConfigurationError("Invalid image-kernel accelerator options: backend, explicit WebGPU fallback, power preference or band size.");
71
+ }
72
+ const requested = r.backend;
73
+ if (requested === "cpu-reference")
74
+ return createAccelerator(requested, null, null, DEFAULT_BAND_BYTES);
75
+ const gpu = "gpu" in r ? r.gpu : globalThis.navigator?.gpu;
76
+ const acquired = await acquireWebGpuRuntime(gpu, options.powerPreference, options.signal);
77
+ if ("failure" in acquired) {
78
+ if (r.fallback === "fail")
79
+ throw new ImageKernelExecutionError(acquired.failure, acquired.message);
80
+ return createAccelerator(requested, acquired.failure, null, DEFAULT_BAND_BYTES);
81
+ }
82
+ const runtime = acquired.runtime;
83
+ const band = Math.min(options.maximumBandBytes ?? DEFAULT_BAND_BYTES, runtime.maximumStorageBindingBytes);
84
+ return createAccelerator(requested, null, runtime, band);
85
+ }
86
+ function createAccelerator(requested, fallbackReason, runtime, bandBytes) {
87
+ let disposed = false, busy = false;
88
+ const pipelines = new Map();
89
+ const backend = runtime ? "webgpu-f32" : "cpu-reference";
90
+ function state() { return disposed ? "disposed" : runtime?.isLost() ? "lost" : "ready"; }
91
+ function pipeline(gpu, label, code, signal) {
92
+ let pending = pipelines.get(label);
93
+ if (!pending) {
94
+ pending = createComputePipeline(gpu, label, code, undefined);
95
+ pipelines.set(label, pending);
96
+ pending.catch(() => pipelines.delete(label));
97
+ }
98
+ return gpu.guard(pending, signal);
99
+ }
100
+ /** Runs one operation at a time, and turns aborts, disposal and device loss into domain errors. */
101
+ async function operate(signal, body) {
102
+ if (disposed)
103
+ throw new ImageKernelExecutionError("disposed", "The image-kernel accelerator was disposed.");
104
+ if (runtime?.isLost())
105
+ throw new ImageKernelExecutionError("device-lost", "The WebGPU device was lost; create a new accelerator.");
106
+ if (busy)
107
+ throw new ImageKernelExecutionError("busy", "The image-kernel accelerator runs one operation at a time.");
108
+ busy = true;
109
+ const link = linkedAbort(signal);
110
+ try {
111
+ if (link.controller.signal.aborted)
112
+ throw abortedError();
113
+ return await body(link.controller);
114
+ }
115
+ catch (error) {
116
+ link.controller.abort();
117
+ if (disposed)
118
+ throw new ImageKernelExecutionError("disposed", "The image-kernel accelerator was disposed; no output is available.");
119
+ if (signal?.aborted && !(error instanceof ImageKernelExecutionError && error.reason === "device-lost"))
120
+ throw abortedError();
121
+ throw error;
122
+ }
123
+ finally {
124
+ link.dispose();
125
+ busy = false;
126
+ }
127
+ }
128
+ const cpuLabel = () => cpuExecution(requested, fallbackReason);
129
+ return {
130
+ backend, requestedBackend: requested, fallbackReason,
131
+ get state() { return state(); },
132
+ async renderNativeCaptureSdr(input, provider, options) {
133
+ const run = runOptions(options);
134
+ return operate(run.signal, async (abort) => {
135
+ if (!runtime) {
136
+ const task = createNativeCaptureSdrTask(input, provider);
137
+ const cancel = () => task.cancel();
138
+ abort.signal.addEventListener("abort", cancel, { once: true });
139
+ try {
140
+ await task.run();
141
+ return { ...task.takeOutput(), execution: cpuLabel() };
142
+ }
143
+ finally {
144
+ abort.signal.removeEventListener("abort", cancel);
145
+ task.dispose();
146
+ }
147
+ }
148
+ return renderSdrOnGpu(runtime, bandBytes, input, provider, abort, (label, code) => pipeline(runtime, label, code, abort.signal));
149
+ });
150
+ },
151
+ async developNativeRaw(input, provider, options) {
152
+ const run = runOptions(options);
153
+ return operate(run.signal, async (abort) => {
154
+ if (!runtime) {
155
+ const task = createNativeRawDevelopmentTask(input, provider);
156
+ const cancel = () => task.cancel();
157
+ abort.signal.addEventListener("abort", cancel, { once: true });
158
+ try {
159
+ await task.run();
160
+ return { ...task.takeOutput(), execution: cpuLabel() };
161
+ }
162
+ finally {
163
+ abort.signal.removeEventListener("abort", cancel);
164
+ task.dispose();
165
+ }
166
+ }
167
+ return developRawOnGpu(runtime, bandBytes, input, provider, abort, (label, code) => pipeline(runtime, label, code, abort.signal));
168
+ });
169
+ },
170
+ async convolveIrradiance(input, options) {
171
+ const run = runOptions(options);
172
+ return operate(run.signal, async (abort) => {
173
+ const plan = calculateIrradianceConvolutionPlan(input);
174
+ if (!runtime)
175
+ return convolveOnCpu(plan, input, abort, run.yieldControl, cpuLabel());
176
+ return convolveOnGpu(runtime, bandBytes, plan, input, abort, run.yieldControl, (label, code) => pipeline(runtime, label, code, abort.signal));
177
+ });
178
+ },
179
+ async simulateSensorRaw(input, options) {
180
+ const run = runOptions(options);
181
+ return operate(run.signal, async (abort) => {
182
+ if (!runtime)
183
+ return simulateSensorRawOnCpu(input, abort, run.yieldControl, cpuLabel());
184
+ return simulateSensorRawOnGpu(runtime, bandBytes, input, abort, run.yieldControl, (label, code) => pipeline(runtime, label, code, abort.signal));
185
+ });
186
+ },
187
+ async sumTemporalExposure(input, options) {
188
+ const run = runOptions(options);
189
+ return operate(run.signal, async (abort) => {
190
+ const plan = calculateTemporalExposureSumPlan(input);
191
+ if (!runtime)
192
+ return sumTemporalExposureOnCpu(plan, input, abort, run.yieldControl, cpuLabel());
193
+ return sumTemporalExposureOnGpu(runtime, bandBytes, plan, input, abort, run.yieldControl, (label, code) => pipeline(runtime, label, code, abort.signal));
194
+ });
195
+ },
196
+ async evaluateChartRadiance(input, options) {
197
+ const run = runOptions(options);
198
+ return operate(run.signal, async (abort) => {
199
+ if (!runtime)
200
+ return evaluateChartRadianceOnCpu(input, abort, run.yieldControl, cpuLabel());
201
+ return evaluateChartRadianceOnGpu(runtime, bandBytes, input, abort, run.yieldControl, (label, code) => pipeline(runtime, label, code, abort.signal));
202
+ });
203
+ },
204
+ dispose() {
205
+ if (disposed)
206
+ return;
207
+ disposed = true;
208
+ pipelines.clear();
209
+ runtime?.destroy();
210
+ }
211
+ };
212
+ }
213
+ function checkAbort(abort) {
214
+ if (abort.signal.aborted)
215
+ throw abortedError();
216
+ }
217
+ function sumOf(values) {
218
+ let sum = 0;
219
+ for (let i = 0; i < values.length; i++)
220
+ sum += values[i];
221
+ return sum;
222
+ }
223
+ async function convolveOnCpu(plan, input, abort, yieldControl, execution) {
224
+ // Snapshot so a caller mutation during host yields cannot change the reference.
225
+ const samples = input.samples.slice(), kernels = input.kernels.slice();
226
+ const values = new Float64Array(plan.width * plan.height);
227
+ const rowsPerChunk = Math.max(1, Math.floor(2_000_000 / Math.max(1, plan.width * plan.tapCount)));
228
+ const gate = createHostYieldGate();
229
+ for (let y = 0; y < plan.height; y += rowsPerChunk) {
230
+ checkAbort(abort);
231
+ const end = Math.min(plan.height, y + rowsPerChunk);
232
+ convolveIrradianceRows(plan, samples, kernels, y, end, values.subarray(y * plan.width, end * plan.width));
233
+ if (yieldControl && gate.due()) {
234
+ await yieldControl(abort.signal);
235
+ gate.restart();
236
+ }
237
+ }
238
+ checkAbort(abort);
239
+ return { plan, values, inputSum: sumOf(samples), outputSum: sumOf(values), execution };
240
+ }
241
+ async function convolveOnGpu(runtime, bandBytes, plan, input, abort, yieldControl, pipelines) {
242
+ const { width, height, kernelRadius: r, tapCount } = plan;
243
+ const samples = new Float32Array(input.samples), kernels = new Float32Array(input.kernels), inputSum = sumOf(input.samples);
244
+ const errorBound = irradianceConvolutionErrorBound(plan, input.kernels);
245
+ if (kernels.byteLength > runtime.maximumStorageBindingBytes) {
246
+ throw new ImageKernelExecutionError("insufficient-limits", "PSF kernels exceed the device's storage binding limit.");
247
+ }
248
+ const rowBytes = width * 4;
249
+ let rows = Math.min(height, Math.floor(bandBytes / rowBytes) - 2 * r, Math.floor(MAXIMUM_CONVOLUTION_TAPS_PER_DISPATCH / (width * tapCount)));
250
+ if (rows < 1) {
251
+ if ((1 + 2 * r) * rowBytes > runtime.maximumStorageBindingBytes) {
252
+ throw new ImageKernelExecutionError("insufficient-limits", "One convolution band exceeds the device's storage binding limit.");
253
+ }
254
+ rows = 1;
255
+ }
256
+ const values = new Float32Array(width * height);
257
+ const pipeline = await pipelines("photivra-irradiance-convolution", IRRADIANCE_CONVOLUTION_WGSL);
258
+ const scope = new GpuResourceScope(runtime);
259
+ try {
260
+ const kernelBuffer = scope.upload("photivra-psf-kernels", kernels, BUFFER_USAGE.STORAGE);
261
+ const gate = createHostYieldGate();
262
+ for (let y0 = 0; y0 < height; y0 += rows) {
263
+ checkAbort(abort);
264
+ const y1 = Math.min(height, y0 + rows), in0 = Math.max(0, y0 - r), in1 = Math.min(height, y1 + r);
265
+ const params = new Uint32Array([width, height, r, 2 * r + 1, plan.patchWidth, plan.patchHeight, plan.patchColumns, plan.patchRows,
266
+ y0, y1 - y0, in0, tapCount]);
267
+ // Per-band scope: every buffer of the band, its readback included, is destroyed before the next band.
268
+ const bandScope = new GpuResourceScope(runtime);
269
+ try {
270
+ const band = bandScope.upload("photivra-irradiance-band", samples.subarray(in0 * width, in1 * width), BUFFER_USAGE.STORAGE);
271
+ const result = bandScope.buffer("photivra-irradiance-result", (y1 - y0) * rowBytes, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);
272
+ const uniform = bandScope.upload("photivra-irradiance-params", params, BUFFER_USAGE.UNIFORM);
273
+ const bindGroup = runtime.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [
274
+ { binding: 0, resource: { buffer: uniform } }, { binding: 1, resource: { buffer: band } },
275
+ { binding: 2, resource: { buffer: kernelBuffer } }, { binding: 3, resource: { buffer: result } }
276
+ ] });
277
+ const groups = [Math.ceil(width / CONVOLUTION_WORKGROUP_EDGE), Math.ceil((y1 - y0) / CONVOLUTION_WORKGROUP_EDGE)];
278
+ const [data] = await runComputePass(runtime, bandScope, pipeline, bindGroup, groups, [{ buffer: result, bytes: (y1 - y0) * rowBytes }], abort.signal);
279
+ values.set(new Float32Array(data, 0, (y1 - y0) * width), y0 * width);
280
+ }
281
+ finally {
282
+ bandScope.release();
283
+ }
284
+ if (yieldControl && gate.due()) {
285
+ await yieldControl(abort.signal);
286
+ gate.restart();
287
+ }
288
+ }
289
+ }
290
+ finally {
291
+ scope.release();
292
+ }
293
+ checkAbort(abort);
294
+ const execution = webGpuExecution(errorBound, 0);
295
+ return { plan, values, inputSum, outputSum: sumOf(values), execution };
296
+ }
297
+ /**
298
+ * A-priori float32 bound for every convolution output (all terms are non-negative):
299
+ * |v_f32 − v_ref| ≤ (γ_{T+3} + 2^-40)·v_ref + 2T·2^-126 + 2·S_max·Σ_t max_p w_{p,t}·[0 < w_{p,t} < 2^-126].
300
+ * The last term covers weights below the float32 normal range: the host conversion may round them to zero or
301
+ * a subnormal (|f32(w) − w| ≤ w) and the GPU may flush them, so their whole product w·s (s ≤ S_max) is at risk,
302
+ * with a factor 2 for the conversion and the later roundings. It is zero when no such weight exists.
303
+ */
304
+ export function irradianceConvolutionErrorBound(plan, kernels) {
305
+ const { tapCount } = plan, patches = kernels.length / tapCount;
306
+ let atRisk = 0;
307
+ for (let t = 0; t < tapCount; t++) {
308
+ let largest = 0;
309
+ for (let p = 0; p < patches; p++) {
310
+ const w = kernels[p * tapCount + t];
311
+ if (w < FLOAT32_SUBNORMAL_LIMIT && w > largest)
312
+ largest = w;
313
+ }
314
+ atRisk += largest;
315
+ }
316
+ return { kind: "relative-to-reference", relative: float32Gamma(tapCount + 3) + 2 ** -40,
317
+ absolute: 2 * tapCount * FLOAT32_SUBNORMAL_LIMIT + 2 * plan.maximumSampleMagnitude * atRisk };
318
+ }
319
+ /**
320
+ * The tone curve's kernel constants. Luminance curves run on the GPU within this float32 domain:
321
+ * extended Reinhard with Lw ≥ 2^-20; Naka–Rushton with exponent n ≥ 1 (below 1 its ratio f(L)/L is
322
+ * unbounded as L → 0, so no useful bound exists near L = 0), 1/g(Lw) ≤ 2^60 and σⁿ ≥ 2^-60.
323
+ * @internal
324
+ */
325
+ export function toneUniform(profile) {
326
+ const [kr, kg, kb] = resolveCaptureColorModel().cameraRgbToXyz[1];
327
+ const p = profile.toneCurveParameters;
328
+ if (profile.toneCurve === "identity" || profile.toneCurve === "positive-reinhard-per-channel") {
329
+ return { mode: SDR_TONE_MODE.perChannel, tone: [0, 0, 0, 0], lum: [0, 0, 0, 0] };
330
+ }
331
+ if (profile.toneCurve === "extended-reinhard-luminance" && p && !("exponent" in p)) {
332
+ if (!(p.whiteLuminance >= 2 ** -20))
333
+ throw new ImageKernelExecutionError("unsupported-float32-domain", "Extended Reinhard white luminance below 2^-20 is outside the float32 domain.");
334
+ return { mode: SDR_TONE_MODE.extendedReinhard, tone: [1 / (p.whiteLuminance * p.whiteLuminance), 0, 0, 0], lum: [kr, kg, kb, 1] };
335
+ }
336
+ if (profile.toneCurve === "naka-rushton-luminance" && p && "exponent" in p) {
337
+ const q = p, n = q.exponent, sigma = q.semiSaturation;
338
+ if (!(n >= 1)) {
339
+ throw new ImageKernelExecutionError("unsupported-on-backend", "webgpu-f32 implements Naka–Rushton with exponent ≥ 1; use cpu-reference below 1.");
340
+ }
341
+ const white = 1 / (1 + (sigma / q.whiteLuminance) ** n), sigmaN = sigma ** n;
342
+ if (!(1 / white <= 2 ** 60 && sigmaN >= 2 ** -60)) {
343
+ throw new ImageKernelExecutionError("unsupported-float32-domain", "Naka–Rushton parameters are outside the float32 domain.");
344
+ }
345
+ return { mode: SDR_TONE_MODE.nakaRushton, tone: [sigma, n, 1 / white, sigmaN], lum: [kr, kg, kb, Math.max(1, n - 1)] };
346
+ }
347
+ throw new InvalidConfigurationError("Unsupported SDR rendering profile.");
348
+ }
349
+ /** Adds one band's counters into the run's; the luminance bound slot keeps the largest float32 value. */
350
+ function mergeCounters(counters, band) {
351
+ band.forEach((value, i) => {
352
+ if (i === SDR_COUNTER.linearBoundBits)
353
+ counters[i] = Math.max(counters[i], new Float32Array(new Uint32Array([value]).buffer)[0]);
354
+ else
355
+ counters[i] += value;
356
+ });
357
+ }
358
+ /** Fails closed when a luminance-toned sample left the float32 domain. */
359
+ function requireLuminanceDomain(counters) {
360
+ if (counters[SDR_COUNTER.luminanceDomain] > 0) {
361
+ throw new ImageKernelExecutionError("unsupported-float32-domain", "A luminance-toned sample is outside the float32 execution domain.");
362
+ }
363
+ }
364
+ function sdrDiagnostics(counters, captureSaturation) {
365
+ return { renderingNegativeSampleCount: counters[SDR_COUNTER.negative], renderingAboveReferenceSampleCount: counters[SDR_COUNTER.above],
366
+ toneChangedSampleCount: counters[SDR_COUNTER.changed], gamutClippedLowSampleCount: counters[SDR_COUNTER.low],
367
+ gamutClippedHighSampleCount: counters[SDR_COUNTER.high], captureSaturation };
368
+ }
369
+ /** Throws (fails closed) when a reject-mode gamut decision is out of range or cannot be decided in float32. */
370
+ function requireGamutDecision(reject, counters) {
371
+ if (counters[SDR_COUNTER.outOfGamut] > 0)
372
+ throw new InvalidConfigurationError("Tone output exceeds the declared SDR gamut range.");
373
+ if (reject && counters[SDR_COUNTER.gamutUncertain] > 0) {
374
+ throw new ImageKernelExecutionError("indeterminate-float32-classification", "Reject-out-of-range gamut handling is not decidable in float32 for at least one sample; use cpu-reference.");
375
+ }
376
+ }
377
+ async function dispatchSdrBand(runtime, pipeline, staging, count, params, abort, invocations) {
378
+ const scope = new GpuResourceScope(runtime);
379
+ try {
380
+ const source = scope.upload("photivra-sdr-source", staging.subarray(0, count), BUFFER_USAGE.STORAGE);
381
+ const codes = scope.buffer("photivra-sdr-codes", count * 4, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);
382
+ const counters = scope.upload("photivra-sdr-counters", new Uint32Array(SDR_COUNTER_SLOTS), BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);
383
+ const uniform = scope.upload("photivra-sdr-params", new Uint8Array(params), BUFFER_USAGE.UNIFORM);
384
+ const bindGroup = runtime.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [
385
+ { binding: 0, resource: { buffer: uniform } }, { binding: 1, resource: { buffer: source } },
386
+ { binding: 2, resource: { buffer: codes } }, { binding: 3, resource: { buffer: counters } }
387
+ ] });
388
+ const [codeData, counterData] = await runComputePass(runtime, scope, pipeline, bindGroup, linearDispatch(invocations, LINEAR_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension), [{ buffer: codes, bytes: count * 4 }, { buffer: counters, bytes: SDR_COUNTER_SLOTS * 4 }], abort.signal);
389
+ return { codes: new Uint32Array(codeData, 0, count), counters: new Uint32Array(counterData, 0, SDR_COUNTER_SLOTS) };
390
+ }
391
+ finally {
392
+ scope.release();
393
+ }
394
+ }
395
+ async function renderSdrOnGpu(runtime, bandBytes, input, provider, abort, pipelines) {
396
+ const plan = calculateNativeCaptureSdrPlan(input);
397
+ if (!provider || typeof provider.readTile !== "function" || typeof provider.yieldControl !== "function") {
398
+ throw new InvalidConfigurationError("Native SDR requires a tile reader and event-loop yield.");
399
+ }
400
+ if (provider.onProgress !== undefined && typeof provider.onProgress !== "function")
401
+ throw new InvalidConfigurationError("Native SDR onProgress must be a function.");
402
+ const readTile = provider.readTile.bind(provider), yieldControl = provider.yieldControl.bind(provider), onProgress = provider.onProgress?.bind(provider);
403
+ const tone = toneUniform(plan.profile), luminance = tone.mode !== SDR_TONE_MODE.perChannel;
404
+ const plane = plan.capture.planes.find(p => p.id === plan.sourcePlaneId);
405
+ if (plane.storage.kind === "inline-float64")
406
+ throw new InvalidConfigurationError("External native source required.");
407
+ const storage = plane.storage, profile = plan.profile, width = plane.pixelWidth, height = plane.pixelHeight;
408
+ const scale = 2 ** profile.renderingExposureEv / plane.referenceWhiteValue, maximum = 2 ** profile.bitDepth - 1;
409
+ const scale32 = Math.fround(scale);
410
+ if (!(scale32 > 0 && Number.isFinite(scale32)))
411
+ throw new ImageKernelExecutionError("unsupported-float32-domain", "SDR scale is outside float32.");
412
+ const tileHeight = NATIVE_CAPTURE_SDR_LIMITS.tileHeight, rowSamples = width * 3;
413
+ const bandRows = Math.max(tileHeight, Math.floor(bandBytes / (rowSamples * 4) / tileHeight) * tileHeight);
414
+ if (Math.min(bandRows, height) * rowSamples * 4 > runtime.maximumStorageBindingBytes) {
415
+ throw new ImageKernelExecutionError("insufficient-limits", "One SDR tile row exceeds the device's storage binding limit.");
416
+ }
417
+ const reinhard = profile.toneCurve === "positive-reinhard-per-channel", reject = profile.gamutHandling === "reject-out-of-range";
418
+ const params = new ArrayBuffer(luminance ? 64 : 32), words = new Uint32Array(params), floats = new Float32Array(params);
419
+ if (luminance) {
420
+ words[1] = reject ? 1 : 0;
421
+ words[2] = tone.mode;
422
+ floats[4] = scale32;
423
+ floats[5] = maximum;
424
+ floats[6] = 2 ** -20;
425
+ floats.set(tone.tone, 8);
426
+ floats.set(tone.lum, 12);
427
+ }
428
+ else {
429
+ words[1] = reinhard ? 1 : 0;
430
+ words[2] = reject ? 1 : 0;
431
+ floats[4] = scale32;
432
+ floats[5] = maximum;
433
+ floats[6] = 2 ** -20;
434
+ }
435
+ const pipeline = luminance ? await pipelines("photivra-sdr-luminance", SDR_LUMINANCE_WGSL) : await pipelines("photivra-sdr", SDR_WGSL);
436
+ const codes = profile.bitDepth === 8 ? new Uint8Array(plan.outputBytes) : new Uint16Array(plan.outputBytes / 2);
437
+ const staging = new Float32Array(Math.min(bandRows, height) * rowSamples);
438
+ const counters = NO_COUNTERS();
439
+ let hostUncertain = 0, bandStart = 0, completed = 0;
440
+ try {
441
+ for (let y = 0; y < height; y += tileHeight) {
442
+ for (let x = 0; x < width; x += NATIVE_CAPTURE_SDR_LIMITS.tileWidth) {
443
+ checkAbort(abort);
444
+ const request = Object.freeze({ captureId: plan.capture.captureId, sourcePlaneId: plane.id,
445
+ artifactId: storage.artifactId, sha256: storage.sha256, x, y,
446
+ width: Math.min(NATIVE_CAPTURE_SDR_LIMITS.tileWidth, width - x), height: Math.min(tileHeight, height - y) });
447
+ const tile = await readTile(request, abort.signal);
448
+ checkAbort(abort);
449
+ const { source, stride } = validateNativeCaptureSdrTile(tile, request, plane);
450
+ completed++;
451
+ for (let row = 0; row < request.height; row++) {
452
+ const out = (y + row - bandStart) * rowSamples + x * 3;
453
+ for (let i = 0, from = row * stride; i < request.width * 3; i++) {
454
+ const s = source[from + i], magnitude = Math.abs(s), exposed = magnitude * scale;
455
+ // The reference's own failure precedence first, then the float32 domain.
456
+ if (!Number.isFinite(exposed))
457
+ throw new InvalidScientificResultError("Rendering exposure produced a non-finite sample.");
458
+ if (magnitude > FLOAT32_SAFE_MAGNITUDE || exposed > FLOAT32_SAFE_MAGNITUDE) {
459
+ throw new ImageKernelExecutionError("unsupported-float32-domain", "SDR sample magnitude is outside the float32 execution domain.");
460
+ }
461
+ if (magnitude !== 0 && magnitude < FLOAT32_SUBNORMAL_LIMIT)
462
+ hostUncertain++;
463
+ staging[out + i] = s;
464
+ }
465
+ }
466
+ await yieldControl(abort.signal);
467
+ checkAbort(abort);
468
+ }
469
+ const bandEnd = Math.min(height, y + tileHeight);
470
+ if (bandEnd - bandStart >= bandRows || bandEnd === height) {
471
+ const count = (bandEnd - bandStart) * rowSamples;
472
+ words[0] = luminance ? count / 3 : count;
473
+ const result = await dispatchSdrBand(runtime, pipeline, staging, count, params, abort, words[0]);
474
+ mergeCounters(counters, result.counters);
475
+ requireLuminanceDomain(counters);
476
+ requireGamutDecision(reject, counters);
477
+ codes.set(result.codes, bandStart * rowSamples);
478
+ bandStart = bandEnd;
479
+ // Progress reports tiles whose codes are committed, in the reference's tile units.
480
+ onProgress?.({ completedTileCount: completed, totalTileCount: plan.tileCount });
481
+ }
482
+ }
483
+ }
484
+ catch (error) {
485
+ codes.fill(0);
486
+ throw error;
487
+ }
488
+ const uncertainty = counters[SDR_COUNTER.uncertain] + hostUncertain;
489
+ // Per-channel linear bound: source/scale/product rounding, Reinhard add/divide, plus float64 reference slack (L ≤ 1).
490
+ // Luminance curves: the largest per-sample bound the kernel evaluated from the a-priori formula (docs/WEBGPU.md).
491
+ const linearBound = luminance ? counters[SDR_COUNTER.linearBoundBits] * (1 + 2 ** -20) : float32Gamma(6);
492
+ const execution = webGpuExecution(integerCodeBound(maximum, linearBound), uncertainty);
493
+ return { plan, integerSamples: codes, diagnostics: sdrDiagnostics(counters, "not-consumed"), outputEncoding: sdrOutputEncoding(maximum),
494
+ displayAdaptation: { kind: "external-platform", applied: false, displayCapabilities: "unknown" }, execution };
495
+ }
496
+ /** Integer native-site affine map of oriented output pixels, mirroring the reference's centre-point transform. */
497
+ function orientedToNativeAffine(plan) {
498
+ const g = plan.exposure.resolvedGeometry, crop = g.output.cropRect, active = g.activeCapture.nativeRect;
499
+ const W = g.activeCapture.raster.pixelWidth, H = g.activeCapture.raster.pixelHeight, orientation = plan.exposure.geometry.orientation;
500
+ const m = orientation === "landscape" ? { ox: crop.x, oy: crop.y, axx: 1, axy: 0, ayx: 0, ayy: 1 }
501
+ : orientation === "portrait-clockwise" ? { ox: crop.y, oy: H - crop.x - 1, axx: 0, axy: 1, ayx: -1, ayy: 0 }
502
+ : orientation === "landscape-inverted" ? { ox: W - crop.x - 1, oy: H - crop.y - 1, axx: -1, axy: 0, ayx: 0, ayy: -1 }
503
+ : { ox: W - crop.y - 1, oy: crop.x, axx: 0, axy: -1, ayx: 1, ayy: 0 };
504
+ const affine = { ...m, ox: m.ox + active.x, oy: m.oy + active.y };
505
+ for (const [i, j] of [[0, 0], [crop.width - 1, 0], [0, crop.height - 1], [crop.width - 1, crop.height - 1]]) {
506
+ const q = transformOrientedRasterPointToNative({ point: { x: crop.x + i + .5, y: crop.y + j + .5 }, nativeRaster: g.activeCapture.raster, orientation });
507
+ if (Math.floor(q.x) + active.x !== affine.ox + affine.axx * i + affine.axy * j || Math.floor(q.y) + active.y !== affine.oy + affine.ayx * i + affine.ayy * j) {
508
+ throw new InvalidConfigurationError("Oriented output does not map affinely onto native sites.");
509
+ }
510
+ }
511
+ return affine;
512
+ }
513
+ function rowSumNorm(matrix) {
514
+ return Math.max(...matrix.map(row => row.reduce((sum, v) => sum + Math.abs(v), 0)));
515
+ }
516
+ /**
517
+ * Forward-error bounds (Higham γ_k, binary32) through the development chain: channel sums → gains →
518
+ * highlight clip/blend → camera→XYZ → XYZ→linear sRGB → rendering exposure. Returns the bound on the
519
+ * exposed value, and the classification bands for the white-balance clip and reconstruction-start
520
+ * decisions. Internal; exported only for unit tests.
521
+ */
522
+ export function rawDevelopmentErrorBounds(b) {
523
+ const C = b.maximumWeightSum * b.maximumSiteMagnitude, U = b.maximumGain * C, Bmax = Math.max(U, b.maximumGain);
524
+ const deltaC = float32Gamma(b.maximumTaps + 2) * C + float32Gamma(1);
525
+ const deltaU = b.maximumGain * deltaC + float32Gamma(2) * U;
526
+ const deltaT = (deltaC + float32Gamma(3)) / (1 - RAW_HIGHLIGHT_RECONSTRUCTION_START);
527
+ const deltaB = b.reconstruct ? 3 * deltaU + 2 * Bmax * deltaT + 2 * float32Gamma(4) * Bmax + float32Gamma(1) * b.maximumGain
528
+ : deltaU + float32Gamma(1) * b.maximumGain;
529
+ const deltaXyz = b.cameraToXyzNorm * (deltaB + float32Gamma(4) * Bmax);
530
+ const deltaRgb = b.xyzToRgbNorm * (deltaXyz + float32Gamma(4) * b.cameraToXyzNorm * Bmax);
531
+ const exposed = b.scale * (deltaRgb + float32Gamma(2) * b.xyzToRgbNorm * b.cameraToXyzNorm * Bmax);
532
+ return { exposed, gain: deltaU + float32Gamma(1) * b.maximumGain, channel: deltaC + float32Gamma(1) };
533
+ }
534
+ async function developRawOnGpu(runtime, bandBytes, input, provider, abort, pipelines) {
535
+ const hooks = typeof provider === "function" ? { yieldControl: provider } : provider;
536
+ if (!hooks || typeof hooks.yieldControl !== "function" || (hooks.onProgress !== undefined && typeof hooks.onProgress !== "function")) {
537
+ throw new InvalidConfigurationError("Development requires a host event-loop yield.");
538
+ }
539
+ const yieldControl = hooks.yieldControl.bind(hooks), onProgress = hooks.onProgress?.bind(hooks);
540
+ // Run the reference's own synchronous input-limit, halo and CFA checks, then the same RAW ownership transfer.
541
+ const v = prepareNativeRawDevelopment(input);
542
+ const tone = toneUniform(v.profile), luminance = tone.mode !== SDR_TONE_MODE.perChannel;
543
+ if (v.border !== "reject") {
544
+ throw new ImageKernelExecutionError("unsupported-on-backend", "webgpu-f32 develops with rejected borders only; use cpu-reference for borderHandling \"mirror\".");
545
+ }
546
+ const plan = v.plan, layout = plan.frame.colorSamplingProfile.layout, native = plan.exposure.geometry.nativeRaster;
547
+ if (layout.kind !== "periodic-mosaic")
548
+ throw new InvalidConfigurationError("Development requires periodic CFA.");
549
+ const affine = orientedToNativeAffine(plan);
550
+ const raw = takeNativeRawOwnership(input.raw, plan);
551
+ const rw = layout.repeatWidthSites, rh = layout.repeatHeightSites, nativeWidth = native.pixelWidth, nativeHeight = native.pixelHeight;
552
+ const outWidth = v.raster.pixelWidth, outHeight = v.raster.pixelHeight, profile = v.profile, development = v.development;
553
+ const tilesPerRow = Math.ceil(outWidth / 256), totalTileCount = tilesPerRow * outHeight;
554
+ let codes = null;
555
+ const release = () => {
556
+ raw.codes.fill(0);
557
+ raw.blackLevels.fill(0);
558
+ raw.digitalSaturationCodes.fill(0);
559
+ raw.saturationFlags.fill(0);
560
+ raw.effectiveSaturationCodes.fill(0);
561
+ codes?.fill(0);
562
+ };
563
+ const scope = new GpuResourceScope(runtime);
564
+ try {
565
+ // Reference integrity check (bounded chunks with host yields), then the largest normalized site magnitude.
566
+ const gate = createHostYieldGate(), rowsPerChunk = Math.max(1, Math.floor((1 << 18) / nativeWidth));
567
+ for (let y = 0; y < nativeHeight; y += rowsPerChunk) {
568
+ checkAbort(abort);
569
+ checkNativeRawIntegrity(raw, nativeWidth, rw, rh, y, Math.min(nativeHeight, y + rowsPerChunk));
570
+ if (gate.due()) {
571
+ await yieldControl(abort.signal);
572
+ checkAbort(abort);
573
+ gate.restart();
574
+ }
575
+ }
576
+ const white = raw.effectiveSaturationCodes;
577
+ // The reference's site normalization (raw-development-kernel.ts), evaluated in float64.
578
+ const normalizedSite = (i, x, y) => {
579
+ const code = raw.codes[i], top = white[(y % rh) * rw + x % rw], black = raw.blackLevels[i];
580
+ return raw.saturationFlags[i] !== 0 || code >= top ? 1 : (code - black) / (top - black);
581
+ };
582
+ let maximumSiteMagnitude = 0;
583
+ for (let y = 0, i = 0; y < nativeHeight; y++)
584
+ for (let x = 0; x < nativeWidth; x++, i++) {
585
+ const m = Math.abs(normalizedSite(i, x, y));
586
+ if (m > maximumSiteMagnitude)
587
+ maximumSiteMagnitude = m;
588
+ }
589
+ // CFA kernel table: phase-major, channel-minor (start, count) ranges into (offsetX, offsetY, weight) taps.
590
+ const tapList = [], ranges = new Uint32Array(v.phases.length * 6);
591
+ let halo = 0, maximumTaps = 0, maximumWeightSum = 0;
592
+ v.phases.forEach((phase, p) => phase.profile.kernels.forEach((kernel, c) => {
593
+ ranges[(p * 3 + c) * 2] = tapList.length;
594
+ ranges[(p * 3 + c) * 2 + 1] = kernel.contributions.length;
595
+ maximumTaps = Math.max(maximumTaps, kernel.contributions.length);
596
+ let weights = 0;
597
+ for (const t of kernel.contributions) {
598
+ tapList.push([t.offsetX, t.offsetY, t.weight]);
599
+ halo = Math.max(halo, Math.abs(t.offsetX), Math.abs(t.offsetY));
600
+ weights += Math.abs(t.weight);
601
+ }
602
+ maximumWeightSum = Math.max(maximumWeightSum, weights);
603
+ }));
604
+ const tapBuffer = new ArrayBuffer(Math.max(1, tapList.length) * 16), tapInts = new Int32Array(tapBuffer), tapFloats = new Float32Array(tapBuffer);
605
+ tapList.forEach(([ox, oy, w], i) => { tapInts[i * 4] = ox; tapInts[i * 4 + 1] = oy; tapFloats[i * 4 + 2] = w; });
606
+ const gains = development.appliedGains, clipLevel = Math.min(...gains), M = development.cameraToXyz, X = resolveCaptureColorModel().xyzToCameraRgb;
607
+ const reconstruct = development.highlightMode === "reconstruct";
608
+ const scale = 2 ** profile.renderingExposureEv, maximum = 2 ** profile.bitDepth - 1;
609
+ const bounds = rawDevelopmentErrorBounds({ maximumTaps, maximumWeightSum, maximumSiteMagnitude, maximumGain: Math.max(...gains),
610
+ reconstruct, cameraToXyzNorm: rowSumNorm(M), xyzToRgbNorm: rowSumNorm(X), scale });
611
+ const band = Math.fround(bounds.exposed * (1 + 2 ** -20));
612
+ if (!Number.isFinite(band) || bounds.exposed > 1 || maximumSiteMagnitude * maximumWeightSum * Math.max(...gains) * scale > FLOAT32_SAFE_MAGNITUDE) {
613
+ throw new ImageKernelExecutionError("unsupported-float32-domain", "Development values are outside the float32 execution domain.");
614
+ }
615
+ const reinhard = profile.toneCurve === "positive-reinhard-per-channel", reject = profile.gamutHandling === "reject-out-of-range";
616
+ const params = new ArrayBuffer(256), ints = new Int32Array(params), words = new Uint32Array(params), floats = new Float32Array(params);
617
+ words[52] = tone.mode;
618
+ floats.set(tone.tone, 56);
619
+ floats.set(tone.lum, 60);
620
+ words[0] = outWidth;
621
+ words[3] = reinhard ? 1 : 0;
622
+ words[4] = reject ? 1 : 0;
623
+ words[5] = rw;
624
+ words[6] = rh;
625
+ ints[8] = affine.ox;
626
+ ints[9] = affine.oy;
627
+ ints[10] = affine.axx;
628
+ ints[11] = affine.axy;
629
+ ints[12] = affine.ayx;
630
+ ints[13] = affine.ayy;
631
+ floats[16] = scale;
632
+ floats[17] = maximum;
633
+ floats[18] = band;
634
+ floats[19] = Math.max(band, 2 ** -20);
635
+ floats[20] = clipLevel;
636
+ words[21] = reconstruct ? 1 : 0;
637
+ floats[22] = Math.fround(bounds.gain * (1 + 2 ** -20));
638
+ floats[23] = Math.fround(bounds.channel * (1 + 2 ** -20));
639
+ floats.set(gains, 24);
640
+ for (let row = 0; row < 3; row++) {
641
+ floats.set(M[row], 28 + row * 4);
642
+ floats.set(X[row], 40 + row * 4);
643
+ }
644
+ const regionOf = (r0, r1) => {
645
+ const xs = [], ys = [];
646
+ for (const [i, j] of [[0, r0], [outWidth - 1, r0], [0, r1 - 1], [outWidth - 1, r1 - 1]]) {
647
+ xs.push(affine.ox + affine.axx * i + affine.axy * j);
648
+ ys.push(affine.oy + affine.ayx * i + affine.ayy * j);
649
+ }
650
+ const x = Math.max(0, Math.min(...xs) - halo), y = Math.max(0, Math.min(...ys) - halo);
651
+ return { x, y, width: Math.min(nativeWidth, Math.max(...xs) + halo + 1) - x, height: Math.min(nativeHeight, Math.max(...ys) + halo + 1) - y };
652
+ };
653
+ const regionBytes = (r0, r1) => { const r = regionOf(r0, r1); return r.width * r.height * 4; };
654
+ let bandRows = Math.max(1, Math.min(outHeight, Math.floor(bandBytes / (outWidth * 12))));
655
+ while (bandRows > 1 && regionBytes(0, bandRows) > bandBytes)
656
+ bandRows = Math.ceil(bandRows / 2);
657
+ if (Math.max(regionBytes(0, bandRows), bandRows * outWidth * 12) > runtime.maximumStorageBindingBytes) {
658
+ throw new ImageKernelExecutionError("insufficient-limits", "One development band exceeds the device's storage binding limit.");
659
+ }
660
+ const pipeline = await pipelines("photivra-raw-development", RAW_DEVELOPMENT_WGSL);
661
+ const output = profile.bitDepth === 8 ? new Uint8Array(outWidth * outHeight * 3) : new Uint16Array(outWidth * outHeight * 3);
662
+ codes = output;
663
+ const counters = NO_COUNTERS();
664
+ const taps = scope.upload("photivra-cfa-taps", new Uint8Array(tapBuffer), BUFFER_USAGE.STORAGE);
665
+ const phaseTable = scope.upload("photivra-cfa-phases", ranges, BUFFER_USAGE.STORAGE);
666
+ for (let r0 = 0; r0 < outHeight; r0 += bandRows) {
667
+ checkAbort(abort);
668
+ const r1 = Math.min(outHeight, r0 + bandRows), region = regionOf(r0, r1), count = (r1 - r0) * outWidth;
669
+ const normalized = new Float32Array(region.width * region.height);
670
+ for (let y = 0; y < region.height; y++) {
671
+ for (let x = 0, i = (region.y + y) * nativeWidth + region.x; x < region.width; x++, i++) {
672
+ normalized[y * region.width + x] = normalizedSite(i, region.x + x, region.y + y);
673
+ }
674
+ }
675
+ words[1] = count;
676
+ words[2] = r0;
677
+ words[7] = region.width;
678
+ ints[14] = region.x;
679
+ ints[15] = region.y;
680
+ const bandScope = new GpuResourceScope(runtime);
681
+ try {
682
+ const source = bandScope.upload("photivra-raw-normalized", normalized, BUFFER_USAGE.STORAGE);
683
+ const out = bandScope.buffer("photivra-raw-codes", count * 12, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);
684
+ const counterBuffer = bandScope.upload("photivra-raw-counters", new Uint32Array(SDR_COUNTER_SLOTS), BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);
685
+ const uniform = bandScope.upload("photivra-raw-params", new Uint8Array(params), BUFFER_USAGE.UNIFORM);
686
+ const bindGroup = runtime.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [
687
+ { binding: 0, resource: { buffer: uniform } }, { binding: 1, resource: { buffer: source } }, { binding: 2, resource: { buffer: taps } },
688
+ { binding: 3, resource: { buffer: phaseTable } }, { binding: 4, resource: { buffer: out } }, { binding: 5, resource: { buffer: counterBuffer } }
689
+ ] });
690
+ const [codeData, counterData] = await runComputePass(runtime, bandScope, pipeline, bindGroup, linearDispatch(count, LINEAR_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension), [{ buffer: out, bytes: count * 12 }, { buffer: counterBuffer, bytes: SDR_COUNTER_SLOTS * 4 }], abort.signal);
691
+ mergeCounters(counters, new Uint32Array(counterData, 0, SDR_COUNTER_SLOTS));
692
+ requireLuminanceDomain(counters);
693
+ requireGamutDecision(reject, counters);
694
+ output.set(new Uint32Array(codeData, 0, count * 3), r0 * outWidth * 3);
695
+ }
696
+ finally {
697
+ bandScope.release();
698
+ }
699
+ onProgress?.({ completedTileCount: r1 * tilesPerRow, totalTileCount });
700
+ await yieldControl(abort.signal);
701
+ checkAbort(abort);
702
+ }
703
+ const highlight = { mode: development.highlightMode, saturatedPixelCount: counters[SDR_COUNTER.saturatedPixels],
704
+ whiteBalanceClippedSampleCount: counters[SDR_COUNTER.whiteBalanceClipped], reconstructedPixelCount: counters[SDR_COUNTER.reconstructedPixels] };
705
+ const linearBound = luminance ? counters[SDR_COUNTER.linearBoundBits] * (1 + 2 ** -20) : bounds.exposed + float32Gamma(3);
706
+ const execution = webGpuExecution(integerCodeBound(maximum, linearBound), counters[SDR_COUNTER.uncertain]);
707
+ return { raw, phaseProfiles: v.phases, colorProfile: v.color, whiteBalance: v.whiteBalance, borderHandling: v.border, width: outWidth, height: outHeight, integerSamples: output,
708
+ diagnostics: sdrDiagnostics(counters, "consumed-in-raw-development"), highlight, outputEncoding: sdrOutputEncoding(maximum), rendering: profile,
709
+ displayAdaptation: { kind: "external-platform", applied: false, displayCapabilities: "unknown" },
710
+ imageDataPairing: "derived-from-exact-packed-native-raw", producerOriginVerified: false, execution };
711
+ }
712
+ catch (error) {
713
+ release();
714
+ throw error;
715
+ }
716
+ finally {
717
+ scope.release();
718
+ }
719
+ }
720
+ //# sourceMappingURL=image-kernel-accelerator.js.map