@photivra/engine 1.5.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 (1078) hide show
  1. package/CHANGELOG.md +393 -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 +116 -9
  56. package/dist/capture/native-raw-development.js +221 -62
  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 +65 -12
  62. package/dist/capture/native-raw.js +81 -19
  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 -8
  639. package/docs/api/capture-native-raw-dng.md +84 -0
  640. package/docs/api/capture-native-raw.md +21 -10
  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/DENSE_PUPIL_QUALIFICATION.md +0 -121
  975. package/docs/DEVELOPERS.md +0 -68
  976. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  977. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  978. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  979. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  980. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  981. package/docs/IMAGE_FORMATION.md +0 -247
  982. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  983. package/docs/MOTION_AND_SIGNAL.md +0 -250
  984. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  985. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  986. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  987. package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
  988. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  989. package/docs/PERFORMANCE_BASELINE.md +0 -56
  990. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  991. package/docs/PHYSICS_FOUNDATION.md +0 -426
  992. package/docs/POC_API.md +0 -278
  993. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  994. package/docs/POC_PROJECTION_REUSE.md +0 -124
  995. package/docs/PRINT_195_196_REVIEW.md +0 -93
  996. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  997. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  998. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  999. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  1000. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1001. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1002. package/docs/PRINT_PLANNING.md +0 -75
  1003. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1004. package/docs/PROCESSED_OUTPUT.md +0 -157
  1005. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1006. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1007. package/docs/PROVENANCE.md +0 -115
  1008. package/docs/PSF_FOUNDATION.md +0 -165
  1009. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1010. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1011. package/docs/RELEASE_1_0.md +0 -66
  1012. package/docs/RELEASE_1_0_1.md +0 -61
  1013. package/docs/RELEASE_1_1_0.md +0 -25
  1014. package/docs/RELEASE_1_2_0.md +0 -51
  1015. package/docs/RELEASE_1_3_0.md +0 -15
  1016. package/docs/RELEASE_1_4_0.md +0 -23
  1017. package/docs/RELEASE_1_5_0.md +0 -105
  1018. package/docs/RELEASE_AUDIT.md +0 -39
  1019. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1020. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1021. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1022. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1023. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1024. package/docs/SDR_RENDERING.md +0 -33
  1025. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1026. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1027. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1028. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1029. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1030. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1031. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1032. package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
  1033. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1034. package/docs/SIMULATED_CAPTURE.md +0 -65
  1035. package/docs/STABILIZATION.md +0 -234
  1036. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1037. package/docs/TIER_ACCEPTANCE.md +0 -129
  1038. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1039. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1040. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1041. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1042. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1043. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1044. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1045. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1046. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1047. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1048. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1049. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1050. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1051. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1052. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1053. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1054. package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
  1055. package/docs/validation/documentation-fragments.json +0 -212
  1056. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1057. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1058. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1059. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1060. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1061. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1062. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1063. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1064. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1065. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1066. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1067. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1068. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1069. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1070. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1071. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1072. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1073. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1074. package/docs/validation/print-detail-capabilities.json +0 -103
  1075. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1076. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1077. package/docs/validation/release-audit-inventory.json +0 -1306
  1078. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -3,7 +3,7 @@ import { type ResolvedWhiteBalanceState, type WhiteBalanceChannelGains } from ".
3
3
  import { type FocusPlane } from "../optics/focus-state.js";
4
4
  import { type ResolveCaptureGeometryInput, type ResolvedCaptureGeometry } from "../output/capture-geometry.js";
5
5
  export declare const SIMULATED_CAPTURE_SCHEMA_VERSION: "0.2.0";
6
- /** Distinct linear domains, not one interchangeable 'linear' flag. */
6
+ /** Which kind of linear data a plane holds. These are different domains, not one interchangeable "linear" flag. */
7
7
  export type CaptureLinearImageState = "scene-referred-xyz" | "virtual-sensor-channels" | "color-transformed-linear-rgb";
8
8
  export interface CapturePublicProfileReference {
9
9
  id: string;
@@ -15,7 +15,7 @@ export interface CaptureWhiteXyz {
15
15
  y: 1;
16
16
  z: number;
17
17
  }
18
- /** A resolved #108 choice, sanitized for public metadata. No estimator is rerun. */
18
+ /** A resolved white-balance state (ResolvedWhiteBalanceState), cleaned for public metadata. No WB estimator is rerun. */
19
19
  export interface CaptureWhiteBalanceIntent {
20
20
  stateId: string;
21
21
  source: ResolvedWhiteBalanceState["source"];
@@ -23,7 +23,7 @@ export interface CaptureWhiteBalanceIntent {
23
23
  channelGains: WhiteBalanceChannelGains;
24
24
  sourceProfile: CapturePublicProfileReference | null;
25
25
  }
26
- /** External bytes are caller-owned; the engine never reads a path or URL. */
26
+ /** External bytes belong to the caller. The engine never reads a path or URL. */
27
27
  export type CaptureFloatStorage = {
28
28
  kind: "inline-float64";
29
29
  samples: readonly number[];
@@ -34,7 +34,7 @@ export type CaptureFloatStorage = {
34
34
  sha256: string;
35
35
  sampleCount: number;
36
36
  };
37
- /** Linear float plane; all channels are co-sited and interleaved in row-major order. */
37
+ /** Linear float plane. All channels are sampled at the same positions and interleaved in row-major order. */
38
38
  export interface CaptureLinearPlane {
39
39
  id: string;
40
40
  imageStateId: string;
@@ -44,9 +44,9 @@ export interface CaptureLinearPlane {
44
44
  pixelHeight: number;
45
45
  channelIds: readonly string[];
46
46
  colorProfile: CapturePublicProfileReference | null;
47
- /** Defined for colorimetric/RGB encodings; null for unresolved sensor channels. */
47
+ /** Set for colorimetric (RGB) encodings; null for raw sensor channels with no colour meaning yet. */
48
48
  encodingReferenceWhiteXyz: CaptureWhiteXyz | null;
49
- /** Value normalization, independent of capture saturation or eventual integer white. */
49
+ /** How values are normalized. Independent of capture saturation and of any later integer white level. */
50
50
  referenceWhiteValue: number;
51
51
  whiteBalanceApplication: "intent-only" | "applied-rgb-gains" | "applied-chromatic-adaptation" | "not-applicable";
52
52
  captureSaturation: {
@@ -62,7 +62,7 @@ export interface CaptureLinearPlane {
62
62
  }[];
63
63
  storage: CaptureFloatStorage;
64
64
  }
65
- /** Format-neutral input from an upstream master/capture provider, not a preview image. */
65
+ /** Input from an upstream master or capture provider, independent of file format. Not a preview image. */
66
66
  export interface SimulatedCaptureInput {
67
67
  captureId: string;
68
68
  sceneStateId: string;
@@ -88,7 +88,7 @@ export interface SimulatedCaptureInput {
88
88
  dynamicRangeHistory: "unknown" | "no-loss-declared" | "upstream-clipped";
89
89
  };
90
90
  whiteBalanceIntent: CaptureWhiteBalanceIntent | null;
91
- /** Adopted/WB white is a camera choice, not automatically the encoding white. */
91
+ /** The adopted (WB) white is a camera choice. It is not automatically the encoding white. */
92
92
  adoptedWhiteXyz: CaptureWhiteXyz | null;
93
93
  models: readonly {
94
94
  profile: CapturePublicProfileReference;
@@ -97,37 +97,36 @@ export interface SimulatedCaptureInput {
97
97
  }[];
98
98
  planes: readonly CaptureLinearPlane[];
99
99
  }
100
- /** Immutable committed value. Geometry/focal equivalence are derived, never caller overrides. */
100
+ /** The immutable committed capture. Geometry and equivalent focal length are computed, never taken from the caller. */
101
101
  export interface SimulatedCapture extends SimulatedCaptureInput {
102
102
  schemaVersion: typeof SIMULATED_CAPTURE_SCHEMA_VERSION;
103
103
  engineApiVersion: string;
104
104
  resolvedGeometry: ResolvedCaptureGeometry;
105
105
  equivalentFocalLength35Mm: number;
106
106
  }
107
- /** Converts validated shooting WB into a public metadata allowlist, discarding private extras. */
107
+ /** Converts the validated shooting WB to the allowed public metadata fields, dropping private extras. */
108
108
  export declare function createCaptureWhiteBalanceIntent(input: {
109
109
  state: ResolvedWhiteBalanceState;
110
110
  }): CaptureWhiteBalanceIntent;
111
- /** A procedural/physical source identity without a manufactured linear-master plane. */
111
+ /** Identifies a procedural or physical source, without making up a linear master plane. */
112
112
  export type CaptureExposureSource = SimulatedCaptureInput["source"] | (Omit<SimulatedCaptureInput["source"], "kind"> & {
113
113
  kind: "scene-radiance-source";
114
114
  });
115
- /** Internal shared exposure metadata parser. It does not commit or invent float planes. */
115
+ /** Internal: shared parser for exposure metadata. It does not commit or make up float planes. */
116
116
  export declare function normalizeCaptureExposureMetadata(value: unknown, apiVersion: string, allowRadianceSource?: boolean): Omit<SimulatedCapture, "schemaVersion" | "planes" | "source"> & {
117
117
  source: CaptureExposureSource;
118
118
  };
119
- /** Commits a format-neutral float master manifest; no radiance generation, clamp, WB or export encoding. */
119
+ /** Commits a capture with a manifest of float master planes. No radiance generation, clipping, WB or file encoding. */
120
120
  export declare function createSimulatedCapture(input: SimulatedCaptureInput): CalculationResult<SimulatedCapture>;
121
121
  /** Parses an archived capture, recomputing and checking all derived geometry/focal metadata. */
122
122
  export declare function parseSimulatedCapture(value: unknown): SimulatedCapture;
123
- /** Canonical allowlisted JSON, including semantic samples/IDs, not private caches or file layout. */
123
+ /** Canonical JSON of the allowed fields, including sample values and IDs. Excludes private caches and file layout. */
124
124
  export declare function serializeSimulatedCapture(input: {
125
125
  capture: SimulatedCapture;
126
126
  }): string;
127
- /** Requires an exact plane image state; callers may not substitute another kind of 'linear'. */
127
+ /** Requires the exact image state of the plane. Callers cannot substitute another kind of "linear". */
128
128
  export declare function resolveSimulatedCapturePlane(input: {
129
129
  capture: SimulatedCapture;
130
130
  planeId: string;
131
131
  requiredImageState: CaptureLinearImageState;
132
132
  }): CaptureLinearPlane;
133
- //# sourceMappingURL=simulated-capture.d.ts.map
@@ -1,15 +1,16 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Converts validated shooting WB into a public metadata allowlist, discarding private extras.
5
- * Commits a format-neutral float master manifest; no radiance generation, clamp, WB or export
6
- * encoding.
3
+ * Simulated captures: the committed record of one exposure, with its settings, geometry, white-balance
4
+ * (WB) choice and a manifest of linear float image planes, independent of any file format.
5
+ *
6
+ * Committing a capture does not generate radiance, clip, apply WB or encode a file.
7
7
  * @see docs/SIMULATED_CAPTURE.md for equations, coordinate/unit conventions, blockers and support
8
8
  * limits.
9
9
  */
10
- import { requireAllowlistedRecord, requirePublicOpaqueId } from "../core/record-validation.js";
10
+ import { requireAllowlistedRecord, requirePublicOpaqueId, requireInputKeys } from "../core/record-validation.js";
11
11
  import { stringifyCanonicalJson } from "../core/canonical-json.js";
12
12
  import { freezeOwnedData } from "../core/owned-data.js";
13
+ import { equalWithinUlps } from "../core/portable-math.js";
13
14
  import { calculatedResult } from "../core/calculation-result.js";
14
15
  import { InvalidConfigurationError } from "../core/configuration-error.js";
15
16
  import { ENGINE_API_VERSION } from "../core/version.js";
@@ -70,12 +71,13 @@ function wb(value) {
70
71
  const g = object(r.channelGains, ["red", "green", "blue"]);
71
72
  if (typeof r.locked !== "boolean")
72
73
  throw new InvalidConfigurationError("WB lock must be boolean.");
73
- return { stateId: id(r.stateId), source: enumValue(r.source, ["preset", "manual-gains", "custom-measurement", "auto-white-balance"]),
74
+ return { stateId: id(r.stateId), source: enumValue(r.source, ["preset", "manual-gains", "custom-measurement", "auto-white-balance", "color-temperature"]),
74
75
  locked: r.locked, channelGains: { red: number(g.red, true), green: number(g.green, true), blue: number(g.blue, true) },
75
76
  sourceProfile: r.sourceProfile === null ? null : profile(r.sourceProfile) };
76
77
  }
77
- /** Converts validated shooting WB into a public metadata allowlist, discarding private extras. */
78
+ /** Converts the validated shooting WB to the allowed public metadata fields, dropping private extras. */
78
79
  export function createCaptureWhiteBalanceIntent(input) {
80
+ requireInputKeys(input, "createCaptureWhiteBalanceIntent", ["state"]);
79
81
  const state = parseResolvedWhiteBalanceState(input.state);
80
82
  return wb({ stateId: state.stateId, source: state.source, locked: state.locked, channelGains: state.channelGains,
81
83
  sourceProfile: state.sourceProfile ? { id: state.sourceProfile.profileId, version: state.sourceProfile.profileVersion } : null });
@@ -164,7 +166,7 @@ function plane(value, resolved, intent) {
164
166
  channelIds: channels, colorProfile, encodingReferenceWhiteXyz: referenceWhite, referenceWhiteValue: number(r.referenceWhiteValue, true),
165
167
  whiteBalanceApplication: application, captureSaturation, appliedTransforms: transforms, storage };
166
168
  }
167
- /** Internal shared exposure metadata parser. It does not commit or invent float planes. */
169
+ /** Internal: shared parser for exposure metadata. It does not commit or make up float planes. */
168
170
  export function normalizeCaptureExposureMetadata(value, apiVersion, allowRadianceSource = false) {
169
171
  const r = object(value, ["captureId", "sceneStateId", "sceneTimeSeconds", "geometry", "exposure", "focus", "noise", "source",
170
172
  "whiteBalanceIntent", "adoptedWhiteXyz", "models"]);
@@ -214,10 +216,12 @@ function normalize(value, apiVersion) {
214
216
  }
215
217
  return freezeOwnedData({ ...metadata, source: metadata.source, schemaVersion: SIMULATED_CAPTURE_SCHEMA_VERSION, planes });
216
218
  }
217
- /** Commits a format-neutral float master manifest; no radiance generation, clamp, WB or export encoding. */
219
+ /** Commits a capture with a manifest of float master planes. No radiance generation, clipping, WB or file encoding. */
218
220
  export function createSimulatedCapture(input) {
219
221
  return calculatedResult(normalize(input, ENGINE_API_VERSION), "authoritative-linear-capture-container", "0.1.0", ["Structural commitment only; upstream scientific statuses remain independent", "Master/source declarations do not prove source fidelity", "No tone mapping, recovered headroom, physical sensor calibration or serializer inferred"]);
220
222
  }
223
+ /** Tolerance, in ULPs (units in the last place), when re-checking an archived 35 mm-equivalent focal length (see NUMERICAL_CORRECTNESS.md). */
224
+ const DERIVED_FOCAL_LENGTH_ULPS = 8;
221
225
  /** Parses an archived capture, recomputing and checking all derived geometry/focal metadata. */
222
226
  export function parseSimulatedCapture(value) {
223
227
  const r = object(value, ["schemaVersion", "engineApiVersion", "captureId", "sceneStateId", "sceneTimeSeconds", "geometry", "resolvedGeometry",
@@ -229,7 +233,11 @@ export function parseSimulatedCapture(value) {
229
233
  }
230
234
  const { schemaVersion: _schemaVersion, engineApiVersion, resolvedGeometry, equivalentFocalLength35Mm, ...input } = r;
231
235
  const result = normalize(input, id(engineApiVersion));
232
- if (canonical(resolvedGeometry) !== canonical(result.resolvedGeometry) || equivalentFocalLength35Mm !== result.equivalentFocalLength35Mm) {
236
+ // The equivalent focal length is recomputed. An archived value within a few ULPs is accepted, so records
237
+ // written by another JavaScript engine or by releases before 2.0.0 (which used Math.hypot) still parse.
238
+ if (canonical(resolvedGeometry) !== canonical(result.resolvedGeometry) ||
239
+ typeof equivalentFocalLength35Mm !== "number" ||
240
+ !equalWithinUlps(equivalentFocalLength35Mm, result.equivalentFocalLength35Mm, DERIVED_FOCAL_LENGTH_ULPS)) {
233
241
  throw new InvalidConfigurationError("Archived derived capture metadata is inconsistent.");
234
242
  }
235
243
  // _schemaVersion is already checked, not copied as an unchecked discriminator.
@@ -243,12 +251,14 @@ function canonical(value) {
243
251
  unsupportedValueMessage: "Derived capture metadata must be finite JSON."
244
252
  });
245
253
  }
246
- /** Canonical allowlisted JSON, including semantic samples/IDs, not private caches or file layout. */
254
+ /** Canonical JSON of the allowed fields, including sample values and IDs. Excludes private caches and file layout. */
247
255
  export function serializeSimulatedCapture(input) {
256
+ requireInputKeys(input, "serializeSimulatedCapture", ["capture"]);
248
257
  return JSON.stringify(parseSimulatedCapture(input.capture));
249
258
  }
250
- /** Requires an exact plane image state; callers may not substitute another kind of 'linear'. */
259
+ /** Requires the exact image state of the plane. Callers cannot substitute another kind of "linear". */
251
260
  export function resolveSimulatedCapturePlane(input) {
261
+ requireInputKeys(input, "resolveSimulatedCapturePlane", ["capture", "planeId", "requiredImageState"]);
252
262
  const capture = parseSimulatedCapture(input.capture);
253
263
  const state = enumValue(input.requiredImageState, ["scene-referred-xyz", "virtual-sensor-channels", "color-transformed-linear-rgb"]);
254
264
  const result = capture.planes.find((p) => p.id === id(input.planeId));
@@ -1 +1 @@
1
- {"version":3,"file":"simulated-capture.js","sourceRoot":"","sources":["../../src/capture/simulated-capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"simulated-capture.js","sourceRoot":"","sources":["../../src/capture/simulated-capture.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;GAOG;AAEH,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACjH,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAA+C,MAAM,+BAA+B,CAAC;AAC9G,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,8BAA8B,EAAiE,MAAM,2BAA2B,CAAC;AAC1I,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAmB,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAkE,MAAM,+BAA+B,CAAC;AAEvI,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAgB,CAAC;AAqEjE,SAAS,MAAM,CAAC,KAAc,EAAE,IAAuB;IACrD,OAAO,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,8CAA8C,CAAC,CAAC;AAC/F,CAAC;AACD,SAAS,SAAS,CAAmB,KAAc,EAAE,MAAoB;IACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAU,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,CAAC,CAAC;IAChG,OAAO,KAAU,CAAC;AACpB,CAAC;AACD,SAAS,MAAM,CAAC,KAAc,EAAE,QAAQ,GAAG,KAAK;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,gDAAgD,CAAC,CAAC;IAC5K,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1C,CAAC;AACD,SAAS,OAAO,CAAC,KAAc,EAAE,OAAO,GAAG,CAAC;IAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO;QAAE,MAAM,IAAI,yBAAyB,CAAC,0BAA0B,CAAC,CAAC;IAC7G,OAAO,CAAC,CAAC;AACX,CAAC;AACD,SAAS,KAAK,CAAC,KAAc,EAAE,OAAe;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,yCAAyC,CAAC,CAAC;IAC/J,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,EAAE,CAAC,KAAc;IACxB,OAAO,qBAAqB,CAAC,KAAK,EAAE,iDAAiD,CAAC,CAAC;AACzF,CAAC;AACD,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,sCAAsC,CAAC,CAAC;IAC5I,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,OAAO,CAAC,KAAc;IAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;AAC9F,CAAC;AACD,SAAS,KAAK,CAAC,KAAc;IAC3B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,yBAAyB,CAAC,CAAC;IAC9E,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;AAC9D,CAAC;AACD,SAAS,EAAE,CAAC,KAAc;IACxB,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;IAC1F,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,yBAAyB,CAAC,0BAA0B,CAAC,CAAC;IACnG,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;QACvJ,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;QACtH,aAAa,EAAE,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;AAChF,CAAC;AACD,yGAAyG;AACzG,MAAM,UAAU,+BAA+B,CAAC,KAA2C;IACzF,gBAAgB,CAAC,KAAK,EAAE,iCAAiC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,8BAA8B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1D,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY;QAC9G,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAE,CAAC;AACvI,CAAC;AACD,SAAS,QAAQ,CAAC,KAAc;IAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/H,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IAC5H,MAAM,IAAI,GAAG,CAAC,KAAc,EAA2D,EAAE;QACvF,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QACvD,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACxG,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IAChH,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE;QAClG,YAAY,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;QAClG,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,4BAA4B,CAAC,CAAC;QAC9H,GAAG,CAAC,CAAC,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC9F,GAAG,CAAC,CAAC,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC9I,CAAC;AACD,SAAS,KAAK,CAAC,KAAc,EAAE,QAAiC,EAAE,MAAwC;IACxG,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc;QACrI,2BAA2B,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC,CAAC;IACvI,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,8BAA8B,CAAC,CAAC,CAAC;IACzH,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClF,MAAM,UAAU,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC;IACnG,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjH,MAAM,KAAK,GAAG,KAAK,GAAC,MAAM,GAAC,QAAQ,CAAC,MAAM,CAAC;IAC3C,IAAI,KAAK,KAAK,UAAU,CAAC,UAAU,IAAI,MAAM,KAAK,UAAU,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,MAAM;QACxF,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,yCAAyC,CAAC,CAAC;IAC/J,MAAM,gBAAgB,GAAG,KAAK,KAAK,oBAAoB,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,8BAA8B,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvJ,IAAI,gBAAgB,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,oCAAoC,CAAC,CAAC;IACjK,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;IACnI,IAAI,KAAK,KAAK,yBAAyB,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC9I,MAAM,IAAI,yBAAyB,CAAC,4CAA4C,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,KAAK,KAAK,oBAAoB,IAAI,CAAC,YAAa,CAAC,EAAE,KAAK,uBAAuB,IAAI,YAAa,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;QAC1H,MAAM,IAAI,yBAAyB,CAAC,6DAA6D,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC,aAAa,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACjJ,IAAI,CAAC,CAAC,WAAW,KAAK,aAAa,IAAI,WAAW,KAAK,mBAAmB,CAAC,IAAI,MAAM,KAAK,IAAI,CAAC;QAC3F,CAAC,WAAW,KAAK,mBAAmB,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACnH,MAAM,IAAI,yBAAyB,CAAC,gEAAgE,CAAC,CAAC;IACxG,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;IACrG,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC3F,IAAI,OAA4B,CAAC;IACjC,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS;YAAE,MAAM,IAAI,yBAAyB,CAAC,sDAAsD,CAAC,CAAC;QAClN,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;YAAE,MAAM,IAAI,yBAAyB,CAAC,8BAA8B,CAAC,CAAC;QAClG,OAAO,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,KAAK;YAAE,MAAM,IAAI,yBAAyB,CAAC,8CAA8C,CAAC,CAAC;QACrJ,OAAO,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACvJ,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,4BAA4B,CAAC,CAAC,CAAC;IACrG,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAC7F,IAAI,iBAA0D,CAAC;IAC/D,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;QACrC,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,0BAA0B,KAAK,SAAS;YAAE,MAAM,IAAI,yBAAyB,CAAC,mDAAmD,CAAC,CAAC;QACzL,iBAAiB,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;QAClE,IAAI,OAAO,GAAG,KAAK;YAAE,MAAM,IAAI,yBAAyB,CAAC,+BAA+B,CAAC,CAAC;QAC1F,iBAAiB,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,0BAA0B,EAAE,OAAO,EAAE,CAAC;IACrI,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAmD,EAAE;QAC/G,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7C,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,cAAc,EAAE,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,EAAE,CAAC;IACvI,CAAC,CAAC,CAAC;IACH,IAAI,KAAK,KAAK,8BAA8B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,4DAA4D,CAAC,CAAC;IACtM,IAAI,WAAW,KAAK,8BAA8B,IAAI,CAAC,KAAK,KAAK,8BAA8B;QAC3F,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,qEAAqE,CAAC,CAAC;IAC5K,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM;QACxI,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,yBAAyB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,mBAAmB,EAAE,IAAI,CAAC;QACvI,uBAAuB,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACtG,CAAC;AAGD,iGAAiG;AACjG,MAAM,UAAU,gCAAgC,CAAC,KAAc,EAAE,UAAkB,EAAE,mBAAmB,GAAC,KAAK;IAC5G,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ;QAC1H,oBAAoB,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3E,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC;QACjG,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;IAC7E,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC7G,IAAI,IAAI,GAAG,UAAU;QAAE,MAAM,IAAI,yBAAyB,CAAC,4BAA4B,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACzF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC3E,IAAI,IAAI,GAAG,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,iCAAiC,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAsC,EAAE;QACpF,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM;YAAE,MAAM,IAAI,yBAAyB,CAAC,8CAA8C,CAAC,CAAC;QACxJ,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC;IACnL,CAAC,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QACtF,MAAM,IAAI,yBAAyB,CAAC,uCAAuC,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,eAAe,CAAC,EAAE,gBAAgB,EAAE,EAAE,CAAC,UAAU,CAAC;QACvD,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,gBAAgB,EAAE,QAAQ;QAC7H,QAAQ,EAAE,yBAAyB,EAAE,kCAAkC,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,iBAAiB,EAAE,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,yBAAyB;QACzM,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACvG,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,iCAAiC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,iCAAiC,CAAC,CAAC;YAC9P,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,mBAAmB,EAAE,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,EAAE;QACrL,kBAAkB,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;AACzE,CAAC;AACD,SAAS,SAAS,CAAC,KAAc,EAAE,UAAkB;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ;QAC1H,oBAAoB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,aAAa,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,gCAAgC,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/G,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,KAAK,8BAA8B,CAAC,IAAI,QAAQ,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;QACxH,MAAM,IAAI,yBAAyB,CAAC,+CAA+C,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;QACvE,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;QACjH,MAAM,IAAI,yBAAyB,CAAC,+EAA+E,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,eAAe,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAC,QAAQ,CAAC,MAAoC,EAAE,aAAa,EAAE,gCAAgC,EAAE,MAAM,EAAE,CAAC,CAAC;AACzJ,CAAC;AACD,uHAAuH;AACvH,MAAM,UAAU,sBAAsB,CAAC,KAA4B;IACjE,OAAO,gBAAgB,CAAC,SAAS,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAAE,wCAAwC,EAAE,OAAO,EAC7G,CAAC,6EAA6E,EAAE,yDAAyD,EAAE,yFAAyF,CAAC,CAAC,CAAC;AAC3O,CAAC;AACD,+IAA+I;AAC/I,MAAM,yBAAyB,GAAG,CAAC,CAAC;AACpC,gGAAgG;AAChG,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB;QAC3I,2BAA2B,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrI,IAAI,CAAC,CAAC,aAAa,KAAK,gCAAgC,IAAI,CAAC,CAAC,aAAa,KAAK,OAAO;QAAE,MAAM,IAAI,yBAAyB,CAAC,6BAA6B,CAAC,CAAC;IAC5J,IAAI,CAAC,CAAC,aAAa,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,uBAAuB,KAAK,8BAA8B,CAAC,EAAE,CAAC;QACtK,MAAM,IAAI,yBAAyB,CAAC,gEAAgE,CAAC,CAAC;IACxG,CAAC;IACD,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;IACrH,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACtD,yGAAyG;IACzG,wGAAwG;IACxG,IAAI,SAAS,CAAC,gBAAgB,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAClE,OAAO,yBAAyB,KAAK,QAAQ;QAC7C,CAAC,eAAe,CAAC,yBAAyB,EAAE,MAAM,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,EAAE,CAAC;QAC7G,MAAM,IAAI,yBAAyB,CAAC,oDAAoD,CAAC,CAAC;IAC5F,CAAC;IACD,+EAA+E;IAC/E,KAAK,cAAc,CAAC;IACpB,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,sBAAsB,CAAC,KAAK,EAAE;QACnC,yBAAyB,EAAE,QAAQ;QACnC,sBAAsB,EAAE,gDAAgD;QACxE,uBAAuB,EAAE,+CAA+C;KACzE,CAAC,CAAC;AACL,CAAC;AAED,sHAAsH;AACtH,MAAM,UAAU,yBAAyB,CAAC,KAAoC;IAC5E,gBAAgB,CAAC,KAAK,EAAE,2BAA2B,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9D,CAAC;AACD,uGAAuG;AACvG,MAAM,UAAU,4BAA4B,CAAC,KAE5C;IACC,gBAAgB,CAAC,KAAK,EAAE,8BAA8B,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACtG,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,8BAA8B,CAAC,CAAC,CAAC;IACrI,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK;QAAE,MAAM,IAAI,yBAAyB,CAAC,oDAAoD,CAAC,CAAC;IACtI,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Simulated captures: the committed record of one exposure, with its settings, geometry, white-balance\n * (WB) choice and a manifest of linear float image planes, independent of any file format.\n *\n * Committing a capture does not generate radiance, clip, apply WB or encode a file.\n * @see docs/SIMULATED_CAPTURE.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport { requireAllowlistedRecord, requirePublicOpaqueId, requireInputKeys } from \"../core/record-validation.js\";\nimport { stringifyCanonicalJson } from \"../core/canonical-json.js\";\nimport { freezeOwnedData } from \"../core/owned-data.js\";\nimport { equalWithinUlps } from \"../core/portable-math.js\";\nimport { calculatedResult, type CalculationResult, type ProvenanceKind } from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { ENGINE_API_VERSION } from \"../core/version.js\";\nimport { parseResolvedWhiteBalanceState, type ResolvedWhiteBalanceState, type WhiteBalanceChannelGains } from \"../color/white-balance.js\";\nimport { calculateEquivalentFocalLength35Mm } from \"../camera/equivalent-focal-length.js\";\nimport { parseFocusPlane, type FocusPlane } from \"../optics/focus-state.js\";\nimport { resolveCaptureGeometry, type ResolveCaptureGeometryInput, type ResolvedCaptureGeometry } from \"../output/capture-geometry.js\";\n\nexport const SIMULATED_CAPTURE_SCHEMA_VERSION = \"0.2.0\" as const;\n/** Which kind of linear data a plane holds. These are different domains, not one interchangeable \"linear\" flag. */\nexport type CaptureLinearImageState = \"scene-referred-xyz\" | \"virtual-sensor-channels\" | \"color-transformed-linear-rgb\";\nexport interface CapturePublicProfileReference { id: string; version: string }\n/** Normalized tristimulus white; Y=1. This is not a spectrum or Kelvin value. */\nexport interface CaptureWhiteXyz { x: number; y: 1; z: number }\n/** A resolved white-balance state (ResolvedWhiteBalanceState), cleaned for public metadata. No WB estimator is rerun. */\nexport interface CaptureWhiteBalanceIntent {\n stateId: string;\n source: ResolvedWhiteBalanceState[\"source\"];\n locked: boolean;\n channelGains: WhiteBalanceChannelGains;\n sourceProfile: CapturePublicProfileReference | null;\n}\n/** External bytes belong to the caller. The engine never reads a path or URL. */\nexport type CaptureFloatStorage =\n | { kind: \"inline-float64\"; samples: readonly number[] }\n | { kind: \"external-float32\" | \"external-float64\"; byteOrder: \"little-endian\"; artifactId: string; sha256: string; sampleCount: number };\n/** Linear float plane. All channels are sampled at the same positions and interleaved in row-major order. */\nexport interface CaptureLinearPlane {\n id: string;\n imageStateId: string;\n imageState: CaptureLinearImageState;\n rasterBinding: \"oriented-active-capture\" | \"output\";\n pixelWidth: number;\n pixelHeight: number;\n channelIds: readonly string[];\n colorProfile: CapturePublicProfileReference | null;\n /** Set for colorimetric (RGB) encodings; null for raw sensor channels with no colour meaning yet. */\n encodingReferenceWhiteXyz: CaptureWhiteXyz | null;\n /** How values are normalized. Independent of capture saturation and of any later integer white level. */\n referenceWhiteValue: number;\n whiteBalanceApplication: \"intent-only\" | \"applied-rgb-gains\" | \"applied-chromatic-adaptation\" | \"not-applicable\";\n captureSaturation:\n | { kind: \"not-modeled\" }\n | { kind: \"declared-virtual-white\"; whiteLevel: number; upstreamClippedSampleCount: number };\n appliedTransforms: readonly { profile: CapturePublicProfileReference; kind: \"linear-color\" | \"chromatic-adaptation\" | \"digital-lens-correction\" }[];\n storage: CaptureFloatStorage;\n}\n/** Input from an upstream master or capture provider, independent of file format. Not a preview image. */\nexport interface SimulatedCaptureInput {\n captureId: string;\n sceneStateId: string;\n /** Seconds on the declared scene clock, not an embedded wall-clock timestamp. */\n sceneTimeSeconds: number;\n geometry: ResolveCaptureGeometryInput;\n exposure: { focalLengthMm: number; aperture: number; shutterSeconds: number; iso: number };\n focus: FocusPlane;\n noise: { seedUint32: number; realizationId: string; model: CapturePublicProfileReference };\n source: {\n kind: \"scene-linear-master\" | \"sensor-derived-linear\" | \"color-transformed-linear-master\";\n artifactId: string;\n sha256: string;\n dynamicRangeHistory: \"unknown\" | \"no-loss-declared\" | \"upstream-clipped\";\n };\n whiteBalanceIntent: CaptureWhiteBalanceIntent | null;\n /** The adopted (WB) white is a camera choice. It is not automatically the encoding white. */\n adoptedWhiteXyz: CaptureWhiteXyz | null;\n models: readonly { profile: CapturePublicProfileReference; scientificStatus: ProvenanceKind; publicEvidenceIds: readonly string[] }[];\n planes: readonly CaptureLinearPlane[];\n}\n/** The immutable committed capture. Geometry and equivalent focal length are computed, never taken from the caller. */\nexport interface SimulatedCapture extends SimulatedCaptureInput {\n schemaVersion: typeof SIMULATED_CAPTURE_SCHEMA_VERSION;\n engineApiVersion: string;\n resolvedGeometry: ResolvedCaptureGeometry;\n equivalentFocalLength35Mm: number;\n}\n\nfunction object(value: unknown, keys: readonly string[]): Record<string, unknown> {\n return requireAllowlistedRecord(value, keys, \"Invalid or non-allowlisted capture metadata.\");\n}\nfunction enumValue<T extends string>(value: unknown, values: readonly T[]): T {\n if (!values.includes(value as T)) throw new InvalidConfigurationError(\"Unknown capture state.\");\n return value as T;\n}\nfunction number(value: unknown, positive = false): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || (positive && value <= 0)) throw new InvalidConfigurationError(\"Capture number must be finite with valid sign.\");\n return Object.is(value, -0) ? 0 : value;\n}\nfunction integer(value: unknown, minimum = 1): number {\n const n = number(value);\n if (!Number.isSafeInteger(n) || n < minimum) throw new InvalidConfigurationError(\"Invalid capture integer.\");\n return n;\n}\nfunction array(value: unknown, maximum: number): unknown[] {\n if (!Array.isArray(value) || value.length > maximum ||\n Array.from({ length: value.length }, (_, i) => i in value).includes(false)) throw new InvalidConfigurationError(\"Expected a bounded dense capture array.\");\n return value;\n}\nfunction id(value: unknown): string {\n return requirePublicOpaqueId(value, \"Expected a public opaque ID, not a path or URL.\");\n}\nfunction digest(value: unknown): string {\n if (typeof value !== \"string\" || !/^[a-f0-9]{64}$/.test(value)) throw new InvalidConfigurationError(\"Expected a lowercase SHA-256 digest.\");\n return value;\n}\nfunction profile(value: unknown): CapturePublicProfileReference {\n const r = object(value, [\"id\", \"version\"]); return { id: id(r.id), version: id(r.version) };\n}\nfunction white(value: unknown): CaptureWhiteXyz | null {\n if (value === null) return null;\n const r = object(value, [\"x\", \"y\", \"z\"]);\n if (r.y !== 1) throw new InvalidConfigurationError(\"White XYZ requires Y=1.\");\n return { x: number(r.x, true), y: 1, z: number(r.z, true) };\n}\nfunction wb(value: unknown): CaptureWhiteBalanceIntent | null {\n if (value === null) return null;\n const r = object(value, [\"stateId\", \"source\", \"locked\", \"channelGains\", \"sourceProfile\"]);\n const g = object(r.channelGains, [\"red\", \"green\", \"blue\"]);\n if (typeof r.locked !== \"boolean\") throw new InvalidConfigurationError(\"WB lock must be boolean.\");\n return { stateId: id(r.stateId), source: enumValue(r.source, [\"preset\", \"manual-gains\", \"custom-measurement\", \"auto-white-balance\", \"color-temperature\"]),\n locked: r.locked, channelGains: { red: number(g.red, true), green: number(g.green, true), blue: number(g.blue, true) },\n sourceProfile: r.sourceProfile === null ? null : profile(r.sourceProfile) };\n}\n/** Converts the validated shooting WB to the allowed public metadata fields, dropping private extras. */\nexport function createCaptureWhiteBalanceIntent(input: { state: ResolvedWhiteBalanceState }): CaptureWhiteBalanceIntent {\n requireInputKeys(input, \"createCaptureWhiteBalanceIntent\", [\"state\"]);\n const state = parseResolvedWhiteBalanceState(input.state);\n return wb({ stateId: state.stateId, source: state.source, locked: state.locked, channelGains: state.channelGains,\n sourceProfile: state.sourceProfile ? { id: state.sourceProfile.profileId, version: state.sourceProfile.profileVersion } : null })!;\n}\nfunction geometry(value: unknown): ResolveCaptureGeometryInput {\n const r = object(value, [\"imagingArea\", \"nativeRaster\", \"orientation\", \"activeCaptureRect\", \"outputCropRect\", \"outputRaster\"]);\n const area = object(r.imagingArea, [\"widthMm\", \"heightMm\"]), native = object(r.nativeRaster, [\"pixelWidth\", \"pixelHeight\"]);\n const rect = (value: unknown): { x: number; y: number; width: number; height: number } => {\n const p = object(value, [\"x\", \"y\", \"width\", \"height\"]);\n return { x: integer(p.x, 0), y: integer(p.y, 0), width: integer(p.width), height: integer(p.height) };\n };\n const output = r.outputRaster === undefined ? undefined : object(r.outputRaster, [\"pixelWidth\", \"pixelHeight\"]);\n return { imagingArea: { widthMm: number(area.widthMm, true), heightMm: number(area.heightMm, true) },\n nativeRaster: { pixelWidth: integer(native.pixelWidth), pixelHeight: integer(native.pixelHeight) },\n orientation: enumValue(r.orientation, [\"landscape\", \"portrait-clockwise\", \"landscape-inverted\", \"portrait-counter-clockwise\"]),\n ...(r.activeCaptureRect === undefined ? {} : { activeCaptureRect: rect(r.activeCaptureRect) }),\n ...(r.outputCropRect === undefined ? {} : { outputCropRect: rect(r.outputCropRect) }),\n ...(output === undefined ? {} : { outputRaster: { pixelWidth: integer(output.pixelWidth), pixelHeight: integer(output.pixelHeight) } }) };\n}\nfunction plane(value: unknown, resolved: ResolvedCaptureGeometry, intent: CaptureWhiteBalanceIntent | null): CaptureLinearPlane {\n const r = object(value, [\"id\", \"imageStateId\", \"imageState\", \"rasterBinding\", \"pixelWidth\", \"pixelHeight\", \"channelIds\", \"colorProfile\",\n \"encodingReferenceWhiteXyz\", \"referenceWhiteValue\", \"whiteBalanceApplication\", \"captureSaturation\", \"appliedTransforms\", \"storage\"]);\n const state = enumValue(r.imageState, [\"scene-referred-xyz\", \"virtual-sensor-channels\", \"color-transformed-linear-rgb\"]);\n const binding = enumValue(r.rasterBinding, [\"oriented-active-capture\", \"output\"]);\n const dimensions = binding === \"output\" ? resolved.output.raster : resolved.orientedCapture.raster;\n const width = integer(r.pixelWidth), height = integer(r.pixelHeight), channels = array(r.channelIds, 32).map(id);\n const count = width*height*channels.length;\n if (width !== dimensions.pixelWidth || height !== dimensions.pixelHeight || !channels.length ||\n new Set(channels).size !== channels.length || !Number.isSafeInteger(count)) throw new InvalidConfigurationError(\"Plane raster/channel identity mismatch.\");\n const requiredChannels = state === \"scene-referred-xyz\" ? [\"X\", \"Y\", \"Z\"] : state === \"color-transformed-linear-rgb\" ? [\"red\", \"green\", \"blue\"] : null;\n if (requiredChannels && JSON.stringify(channels) !== JSON.stringify(requiredChannels)) throw new InvalidConfigurationError(\"Channels do not match image state.\");\n const colorProfile = r.colorProfile === null ? null : profile(r.colorProfile), referenceWhite = white(r.encodingReferenceWhiteXyz);\n if (state === \"virtual-sensor-channels\" ? referenceWhite !== null || colorProfile === null : referenceWhite === null || colorProfile === null) {\n throw new InvalidConfigurationError(\"Color metadata does not match image state.\");\n }\n if (state === \"scene-referred-xyz\" && (colorProfile!.id !== \"cie-1931-2-degree-xyz\" || colorProfile!.version !== \"1.0.0\")) {\n throw new InvalidConfigurationError(\"XYZ planes require the explicit CIE 1931 2-degree identity.\");\n }\n const application = enumValue(r.whiteBalanceApplication, [\"intent-only\", \"applied-rgb-gains\", \"applied-chromatic-adaptation\", \"not-applicable\"]);\n if (((application === \"intent-only\" || application === \"applied-rgb-gains\") && intent === null) ||\n (application === \"applied-rgb-gains\" && JSON.stringify(channels) !== JSON.stringify([\"red\", \"green\", \"blue\"]))) {\n throw new InvalidConfigurationError(\"WB application must refer to a resolved compatible RGB intent.\");\n }\n const s = object(r.storage, [\"kind\", \"samples\", \"artifactId\", \"sha256\", \"sampleCount\", \"byteOrder\"]);\n const kind = enumValue(s.kind, [\"inline-float64\", \"external-float32\", \"external-float64\"]);\n let storage: CaptureFloatStorage;\n if (kind === \"inline-float64\") {\n if (s.artifactId !== undefined || s.sha256 !== undefined || s.sampleCount !== undefined || s.byteOrder !== undefined) throw new InvalidConfigurationError(\"Inline plane cannot contain external storage fields.\");\n const samples = array(s.samples, 1_000_000).map((v) => number(v));\n if (samples.length !== count) throw new InvalidConfigurationError(\"Plane sample count mismatch.\");\n storage = { kind, samples };\n } else {\n if (s.samples !== undefined || integer(s.sampleCount) !== count) throw new InvalidConfigurationError(\"External plane sample count/fields mismatch.\");\n storage = { kind, byteOrder: enumValue(s.byteOrder, [\"little-endian\"]), artifactId: id(s.artifactId), sha256: digest(s.sha256), sampleCount: count };\n }\n const saturation = object(r.captureSaturation, [\"kind\", \"whiteLevel\", \"upstreamClippedSampleCount\"]);\n const saturationKind = enumValue(saturation.kind, [\"not-modeled\", \"declared-virtual-white\"]);\n let captureSaturation: CaptureLinearPlane[\"captureSaturation\"];\n if (saturationKind === \"not-modeled\") {\n if (saturation.whiteLevel !== undefined || saturation.upstreamClippedSampleCount !== undefined) throw new InvalidConfigurationError(\"Unmodeled saturation cannot assert a white level.\");\n captureSaturation = { kind: saturationKind };\n } else {\n const clipped = integer(saturation.upstreamClippedSampleCount, 0);\n if (clipped > count) throw new InvalidConfigurationError(\"Invalid clipped sample count.\");\n captureSaturation = { kind: saturationKind, whiteLevel: number(saturation.whiteLevel, true), upstreamClippedSampleCount: clipped };\n }\n const transforms = array(r.appliedTransforms, 64).map((value): CaptureLinearPlane[\"appliedTransforms\"][number] => {\n const t = object(value, [\"profile\", \"kind\"]);\n return { profile: profile(t.profile), kind: enumValue(t.kind, [\"linear-color\", \"chromatic-adaptation\", \"digital-lens-correction\"]) };\n });\n if (state === \"color-transformed-linear-rgb\" && !transforms.some((t) => t.kind === \"linear-color\")) throw new InvalidConfigurationError(\"Transformed RGB requires explicit color-transform history.\");\n if (application === \"applied-chromatic-adaptation\" && (state !== \"color-transformed-linear-rgb\" ||\n !transforms.some((t) => t.kind === \"chromatic-adaptation\"))) throw new InvalidConfigurationError(\"Applied adaptation requires transformed RGB and adaptation history.\");\n return { id: id(r.id), imageStateId: id(r.imageStateId), imageState: state, rasterBinding: binding, pixelWidth: width, pixelHeight: height,\n channelIds: channels, colorProfile, encodingReferenceWhiteXyz: referenceWhite, referenceWhiteValue: number(r.referenceWhiteValue, true),\n whiteBalanceApplication: application, captureSaturation, appliedTransforms: transforms, storage };\n}\n/** Identifies a procedural or physical source, without making up a linear master plane. */\nexport type CaptureExposureSource = SimulatedCaptureInput[\"source\"] | (Omit<SimulatedCaptureInput[\"source\"], \"kind\"> & {kind:\"scene-radiance-source\"});\n/** Internal: shared parser for exposure metadata. It does not commit or make up float planes. */\nexport function normalizeCaptureExposureMetadata(value: unknown, apiVersion: string, allowRadianceSource=false): Omit<SimulatedCapture, \"schemaVersion\" | \"planes\" | \"source\"> & {source:CaptureExposureSource} {\n const r = object(value, [\"captureId\", \"sceneStateId\", \"sceneTimeSeconds\", \"geometry\", \"exposure\", \"focus\", \"noise\", \"source\",\n \"whiteBalanceIntent\", \"adoptedWhiteXyz\", \"models\"]);\n const g = geometry(r.geometry), resolved = resolveCaptureGeometry(g).value;\n const e = object(r.exposure, [\"focalLengthMm\", \"aperture\", \"shutterSeconds\", \"iso\"]);\n const exposure = { focalLengthMm: number(e.focalLengthMm, true), aperture: number(e.aperture, true),\n shutterSeconds: number(e.shutterSeconds, true), iso: number(e.iso, true) };\n const f = object(r.focus, [\"kind\", \"distanceM\"]), focus = parseFocusPlane(f);\n const noise = object(r.noise, [\"seedUint32\", \"realizationId\", \"model\"]), seed = integer(noise.seedUint32, 0);\n if (seed > 0xffffffff) throw new InvalidConfigurationError(\"Noise seed must be uint32.\");\n const source = object(r.source, [\"kind\", \"artifactId\", \"sha256\", \"dynamicRangeHistory\"]);\n const time = number(r.sceneTimeSeconds), intent = wb(r.whiteBalanceIntent);\n if (time < 0) throw new InvalidConfigurationError(\"Scene time must be nonnegative.\");\n const models = array(r.models, 128).map((value): SimulatedCapture[\"models\"][number] => {\n const m = object(value, [\"profile\", \"scientificStatus\", \"publicEvidenceIds\"]), evidence = array(m.publicEvidenceIds, 128).map(id);\n if (!evidence.length || new Set(evidence).size !== evidence.length) throw new InvalidConfigurationError(\"Public evidence IDs must be nonempty/unique.\");\n return { profile: profile(m.profile), scientificStatus: enumValue(m.scientificStatus, [\"calculated\", \"calibrated\", \"estimated\", \"approximation\"]), publicEvidenceIds: evidence };\n });\n const adoptedWhite = white(r.adoptedWhiteXyz);\n if (!models.length || new Set(models.map((m) => m.profile.id)).size !== models.length) {\n throw new InvalidConfigurationError(\"Capture needs unique nonempty models.\");\n }\n return freezeOwnedData({ engineApiVersion: id(apiVersion),\n captureId: id(r.captureId), sceneStateId: id(r.sceneStateId), sceneTimeSeconds: time, geometry: g, resolvedGeometry: resolved,\n exposure, equivalentFocalLength35Mm: calculateEquivalentFocalLength35Mm({ focalLengthMm: exposure.focalLengthMm, activeImagingArea: resolved.activeCapture.imagingArea }).value.equivalentFocalLength35Mm,\n focus, noise: { seedUint32: seed, realizationId: id(noise.realizationId), model: profile(noise.model) },\n source: { kind: enumValue(source.kind, allowRadianceSource ? [\"scene-linear-master\", \"sensor-derived-linear\", \"color-transformed-linear-master\", \"scene-radiance-source\"] : [\"scene-linear-master\", \"sensor-derived-linear\", \"color-transformed-linear-master\"]),\n artifactId: id(source.artifactId), sha256: digest(source.sha256), dynamicRangeHistory: enumValue(source.dynamicRangeHistory, [\"unknown\", \"no-loss-declared\", \"upstream-clipped\"]) },\n whiteBalanceIntent: intent, adoptedWhiteXyz: adoptedWhite, models });\n}\nfunction normalize(value: unknown, apiVersion: string): SimulatedCapture {\n const r = object(value, [\"captureId\", \"sceneStateId\", \"sceneTimeSeconds\", \"geometry\", \"exposure\", \"focus\", \"noise\", \"source\",\n \"whiteBalanceIntent\", \"adoptedWhiteXyz\", \"models\", \"planes\"]);\n const { planes: rawPlanes, ...metadataInput } = r;\n const metadata = normalizeCaptureExposureMetadata(metadataInput, apiVersion);\n const planes = array(rawPlanes, 32).map(p => plane(p, metadata.resolvedGeometry, metadata.whiteBalanceIntent));\n if (planes.some(p => p.whiteBalanceApplication === \"applied-chromatic-adaptation\") && metadata.adoptedWhiteXyz === null) {\n throw new InvalidConfigurationError(\"Applied adaptation requires an adopted white.\");\n }\n if (!planes.length || new Set(planes.map(p => p.id)).size !== planes.length ||\n new Set(planes.map(p => p.imageStateId)).size !== planes.length ||\n planes.reduce((n,p) => n+(p.storage.kind === \"inline-float64\" ? p.storage.samples.length : 0),0) > 1_000_000) {\n throw new InvalidConfigurationError(\"Capture needs unique models/planes/states and a bounded inline sample budget.\");\n }\n return freezeOwnedData({ ...metadata, source:metadata.source as SimulatedCapture[\"source\"], schemaVersion: SIMULATED_CAPTURE_SCHEMA_VERSION, planes });\n}\n/** Commits a capture with a manifest of float master planes. No radiance generation, clipping, WB or file encoding. */\nexport function createSimulatedCapture(input: SimulatedCaptureInput): CalculationResult<SimulatedCapture> {\n return calculatedResult(normalize(input, ENGINE_API_VERSION), \"authoritative-linear-capture-container\", \"0.1.0\",\n [\"Structural commitment only; upstream scientific statuses remain independent\", \"Master/source declarations do not prove source fidelity\", \"No tone mapping, recovered headroom, physical sensor calibration or serializer inferred\"]);\n}\n/** Tolerance, in ULPs (units in the last place), when re-checking an archived 35 mm-equivalent focal length (see NUMERICAL_CORRECTNESS.md). */\nconst DERIVED_FOCAL_LENGTH_ULPS = 8;\n/** Parses an archived capture, recomputing and checking all derived geometry/focal metadata. */\nexport function parseSimulatedCapture(value: unknown): SimulatedCapture {\n const r = object(value, [\"schemaVersion\", \"engineApiVersion\", \"captureId\", \"sceneStateId\", \"sceneTimeSeconds\", \"geometry\", \"resolvedGeometry\",\n \"equivalentFocalLength35Mm\", \"exposure\", \"focus\", \"noise\", \"source\", \"whiteBalanceIntent\", \"adoptedWhiteXyz\", \"models\", \"planes\"]);\n if (r.schemaVersion !== SIMULATED_CAPTURE_SCHEMA_VERSION && r.schemaVersion !== \"0.1.0\") throw new InvalidConfigurationError(\"Unsupported capture schema.\");\n if (r.schemaVersion === \"0.1.0\" && Array.isArray(r.planes) && r.planes.some((p: CaptureLinearPlane) => p?.whiteBalanceApplication === \"applied-chromatic-adaptation\")) {\n throw new InvalidConfigurationError(\"Legacy capture schema cannot declare the new adaptation state.\");\n }\n const { schemaVersion: _schemaVersion, engineApiVersion, resolvedGeometry, equivalentFocalLength35Mm, ...input } = r;\n const result = normalize(input, id(engineApiVersion));\n // The equivalent focal length is recomputed. An archived value within a few ULPs is accepted, so records\n // written by another JavaScript engine or by releases before 2.0.0 (which used Math.hypot) still parse.\n if (canonical(resolvedGeometry) !== canonical(result.resolvedGeometry) ||\n typeof equivalentFocalLength35Mm !== \"number\" ||\n !equalWithinUlps(equivalentFocalLength35Mm, result.equivalentFocalLength35Mm, DERIVED_FOCAL_LENGTH_ULPS)) {\n throw new InvalidConfigurationError(\"Archived derived capture metadata is inconsistent.\");\n }\n // _schemaVersion is already checked, not copied as an unchecked discriminator.\n void _schemaVersion;\n return result;\n}\nfunction canonical(value: unknown): string {\n return stringifyCanonicalJson(value, {\n undefinedObjectProperties: \"reject\",\n nonFiniteNumberMessage: \"Capture number must be finite with valid sign.\",\n unsupportedValueMessage: \"Derived capture metadata must be finite JSON.\"\n });\n}\n\n/** Canonical JSON of the allowed fields, including sample values and IDs. Excludes private caches and file layout. */\nexport function serializeSimulatedCapture(input: { capture: SimulatedCapture }): string {\n requireInputKeys(input, \"serializeSimulatedCapture\", [\"capture\"]);\n return JSON.stringify(parseSimulatedCapture(input.capture));\n}\n/** Requires the exact image state of the plane. Callers cannot substitute another kind of \"linear\". */\nexport function resolveSimulatedCapturePlane(input: {\n capture: SimulatedCapture; planeId: string; requiredImageState: CaptureLinearImageState;\n}): CaptureLinearPlane {\n requireInputKeys(input, \"resolveSimulatedCapturePlane\", [\"capture\", \"planeId\", \"requiredImageState\"]);\n const capture = parseSimulatedCapture(input.capture);\n const state = enumValue(input.requiredImageState, [\"scene-referred-xyz\", \"virtual-sensor-channels\", \"color-transformed-linear-rgb\"]);\n const result = capture.planes.find((p) => p.id === id(input.planeId));\n if (!result || result.imageState !== state) throw new InvalidConfigurationError(\"Capture plane missing or incompatible image state.\");\n return result;\n}\n"]}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Fits a 3×3 camera-RGB → CIE XYZ matrix from caller-supplied spectral data.
3
+ *
4
+ * For each training reflectance R_j under illuminant S:
5
+ * camera ρ_j,c = k_c Σ S(λ) R_j(λ) s_c(λ) Δλ, target X_j = k Σ S(λ) R_j(λ) x̄(λ) Δλ
6
+ * k is chosen so the perfect diffuser has Y = 1. k_c (the same for all channels) is chosen so
7
+ * the camera's response to the perfect diffuser has green = 1.
8
+ *
9
+ * Two fits are available:
10
+ * - Ordinary least squares: M minimizes Σ_j ‖M ρ_j − X_j‖², so M = X Pᵀ (P Pᵀ)⁻¹.
11
+ * - White-point-preserving least squares: the same, subject to M ρ_white = X_white exactly
12
+ * (Finlayson & Drew 1997, "White-point preserving color correction", IS&T/SID CIC5). It is
13
+ * solved in closed form with one Lagrange multiplier per row.
14
+ *
15
+ * Residual errors are reported per patch as CIEDE2000, with CIELAB relative to the illuminant
16
+ * white (no chromatic adaptation). A 3×3 matrix is exact only if the camera meets the
17
+ * Luther–Ives condition. Otherwise the result is an estimate, and its error depends on the
18
+ * training set. No camera, reflectance or ColorChecker data is bundled. Reflectance tables with an
19
+ * unclear licence must come from the caller.
20
+ * @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.
21
+ */
22
+ import { type CalculationResult } from "../core/calculation-result.js";
23
+ import { type ColorMatchingFunctionsSource, type ColorimetricQuadratureNode, type ColorimetricSpectrum } from "./color-matching-functions.js";
24
+ import { type CieXyzTristimulus, type ColorMatrix3x3, type ColorVector3 } from "./colorimetry-math.js";
25
+ export declare const MAX_CAMERA_MATRIX_TRAINING_PATCHES = 10000;
26
+ export interface CameraSpectralSensitivities {
27
+ red: ColorimetricSpectrum;
28
+ green: ColorimetricSpectrum;
29
+ blue: ColorimetricSpectrum;
30
+ }
31
+ export interface CameraMatrixTrainingPatch {
32
+ patchId: string;
33
+ reflectance: ColorimetricSpectrum;
34
+ }
35
+ export type CameraMatrixFitConstraint = "least-squares" | "white-point-preserving-least-squares";
36
+ export interface EstimateCameraColorMatrixInput {
37
+ quadratureNodes: readonly ColorimetricQuadratureNode[];
38
+ illuminant: ColorimetricSpectrum;
39
+ cameraSpectralSensitivities: CameraSpectralSensitivities;
40
+ patches: readonly CameraMatrixTrainingPatch[];
41
+ colorMatchingFunctions: ColorMatchingFunctionsSource;
42
+ constraint: CameraMatrixFitConstraint;
43
+ }
44
+ export interface CameraMatrixPatchReport {
45
+ patchId: string;
46
+ cameraRgb: ColorVector3;
47
+ targetXyz: CieXyzTristimulus;
48
+ predictedXyz: CieXyzTristimulus;
49
+ deltaE2000: number;
50
+ }
51
+ export interface CameraColorMatrixFit {
52
+ constraint: CameraMatrixFitConstraint;
53
+ /** Row-major camera RGB → XYZ (XYZ white Y = 1; camera white green = 1). */
54
+ cameraRgbToXyz: ColorMatrix3x3;
55
+ xyzToCameraRgb: ColorMatrix3x3;
56
+ illuminantWhiteXyz: CieXyzTristimulus;
57
+ /** Camera response to the perfect diffuser (green = 1); its reciprocal gives neutral WB gains. */
58
+ cameraWhiteRgb: ColorVector3;
59
+ patches: readonly CameraMatrixPatchReport[];
60
+ meanDeltaE2000: number;
61
+ maximumDeltaE2000: number;
62
+ /** Root-mean-square XYZ residual over all patches and components. */
63
+ rmsXyzResidual: number;
64
+ }
65
+ /**
66
+ * Fits a camera-RGB → XYZ matrix from spectral sensitivities, training reflectances,
67
+ * an illuminant and CMFs, and reports the per-patch CIEDE2000 residual.
68
+ */
69
+ export declare function estimateCameraColorMatrix(input: EstimateCameraColorMatrixInput): CalculationResult<CameraColorMatrixFit>;
@@ -0,0 +1,132 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * Fits a 3×3 camera-RGB → CIE XYZ matrix from caller-supplied spectral data.
4
+ *
5
+ * For each training reflectance R_j under illuminant S:
6
+ * camera ρ_j,c = k_c Σ S(λ) R_j(λ) s_c(λ) Δλ, target X_j = k Σ S(λ) R_j(λ) x̄(λ) Δλ
7
+ * k is chosen so the perfect diffuser has Y = 1. k_c (the same for all channels) is chosen so
8
+ * the camera's response to the perfect diffuser has green = 1.
9
+ *
10
+ * Two fits are available:
11
+ * - Ordinary least squares: M minimizes Σ_j ‖M ρ_j − X_j‖², so M = X Pᵀ (P Pᵀ)⁻¹.
12
+ * - White-point-preserving least squares: the same, subject to M ρ_white = X_white exactly
13
+ * (Finlayson & Drew 1997, "White-point preserving color correction", IS&T/SID CIC5). It is
14
+ * solved in closed form with one Lagrange multiplier per row.
15
+ *
16
+ * Residual errors are reported per patch as CIEDE2000, with CIELAB relative to the illuminant
17
+ * white (no chromatic adaptation). A 3×3 matrix is exact only if the camera meets the
18
+ * Luther–Ives condition. Otherwise the result is an estimate, and its error depends on the
19
+ * training set. No camera, reflectance or ColorChecker data is bundled. Reflectance tables with an
20
+ * unclear licence must come from the caller.
21
+ * @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.
22
+ */
23
+ import { estimatedResult } from "../core/calculation-result.js";
24
+ import { InvalidScientificInputError } from "../core/validation.js";
25
+ import { COLORIMETRY_MODEL_VERSION, integrateSampledXyz, prepareColorMatchingFunctions, prepareColorimetricSpectrum, sampleColorimetricBasis, sampleFactor } from "./color-matching-functions.js";
26
+ import { cielabOfXyz, deltaE2000 } from "./color-difference.js";
27
+ import { invertMatrix3x3, multiplyMatrixVector, requireFiniteResult, vectorToXyz, xyzToVector } from "./colorimetry-math.js";
28
+ import { requireInputKeys } from "../core/record-validation.js";
29
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
30
+ export const MAX_CAMERA_MATRIX_TRAINING_PATCHES = 10_000;
31
+ function solveRow(aInv, rhs, white, whiteTarget) {
32
+ // Unconstrained normal equations: m = A⁻¹ b with A = P Pᵀ, b = P xᵀ.
33
+ const m = multiplyMatrixVector(aInv, rhs);
34
+ if (white === undefined)
35
+ return m;
36
+ const aInvW = multiplyMatrixVector(aInv, white);
37
+ const wAw = white[0] * aInvW[0] + white[1] * aInvW[1] + white[2] * aInvW[2];
38
+ const residual = whiteTarget - (m[0] * white[0] + m[1] * white[1] + m[2] * white[2]);
39
+ return [m[0] + (aInvW[0] * residual) / wAw, m[1] + (aInvW[1] * residual) / wAw, m[2] + (aInvW[2] * residual) / wAw];
40
+ }
41
+ /**
42
+ * Fits a camera-RGB → XYZ matrix from spectral sensitivities, training reflectances,
43
+ * an illuminant and CMFs, and reports the per-patch CIEDE2000 residual.
44
+ */
45
+ export function estimateCameraColorMatrix(input) {
46
+ requireInputKeys(input, "estimateCameraColorMatrix", ["quadratureNodes", "illuminant", "cameraSpectralSensitivities", "patches", "colorMatchingFunctions", "constraint"]);
47
+ if (input.constraint !== "least-squares" && input.constraint !== "white-point-preserving-least-squares") {
48
+ throw new InvalidConfigurationError("constraint is not supported.");
49
+ }
50
+ if (!Array.isArray(input.patches) || input.patches.length < 3 || input.patches.length > MAX_CAMERA_MATRIX_TRAINING_PATCHES) {
51
+ throw new InvalidScientificInputError("patches must contain between 3 and " + MAX_CAMERA_MATRIX_TRAINING_PATCHES + " entries.");
52
+ }
53
+ const cmf = prepareColorMatchingFunctions(input.colorMatchingFunctions);
54
+ const illuminant = prepareColorimetricSpectrum(input.illuminant, "illuminant");
55
+ const basis = sampleColorimetricBasis(input.quadratureNodes, illuminant, cmf);
56
+ const sens = input.cameraSpectralSensitivities;
57
+ if (typeof sens !== "object" || sens === null)
58
+ throw new InvalidConfigurationError("cameraSpectralSensitivities must be an object.");
59
+ const channel = ["red", "green", "blue"].map((c) => sampleFactor(basis, prepareColorimetricSpectrum(sens[c], "cameraSpectralSensitivities." + c)));
60
+ const ids = new Set();
61
+ const n = basis.nodes.length;
62
+ const cameraOf = (factor) => {
63
+ const out = [0, 0, 0];
64
+ for (let i = 0; i < n; i++) {
65
+ const w = basis.weights[i] * factor[i];
66
+ for (let c = 0; c < 3; c++)
67
+ out[c] += w * channel[c][i];
68
+ }
69
+ return out;
70
+ };
71
+ const ones = sampleFactor(basis, undefined);
72
+ const rawWhiteXyz = integrateSampledXyz(basis, ones);
73
+ const rawWhiteRgb = cameraOf(ones);
74
+ if (!(rawWhiteXyz.y > 0) || !(rawWhiteRgb[1] > 0))
75
+ throw new InvalidScientificInputError("The illuminant must give positive Y and positive camera green for the perfect diffuser.");
76
+ const kXyz = 1 / rawWhiteXyz.y, kRgb = 1 / rawWhiteRgb[1];
77
+ const scale = (v, k) => [v[0] * k, v[1] * k, v[2] * k];
78
+ const whiteXyz = scale(xyzToVector(rawWhiteXyz), kXyz);
79
+ const whiteRgb = scale(rawWhiteRgb, kRgb);
80
+ const rows = input.patches.map((patch, j) => {
81
+ if (typeof patch !== "object" || patch === null || typeof patch.patchId !== "string" || patch.patchId.trim().length === 0) {
82
+ throw new InvalidConfigurationError("patches[" + j + "].patchId must be a non-empty string.");
83
+ }
84
+ if (ids.has(patch.patchId))
85
+ throw new InvalidScientificInputError("patches must not repeat patchId.");
86
+ ids.add(patch.patchId);
87
+ const factor = sampleFactor(basis, prepareColorimetricSpectrum(patch.reflectance, "patches[" + j + "].reflectance"));
88
+ return { patchId: patch.patchId, rgb: scale(cameraOf(factor), kRgb), xyz: scale(xyzToVector(integrateSampledXyz(basis, factor)), kXyz) };
89
+ });
90
+ const a = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
91
+ const b = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; // b[outputRow][cameraChannel]
92
+ for (const r of rows) {
93
+ for (let p = 0; p < 3; p++) {
94
+ for (let q = 0; q < 3; q++)
95
+ a[p][q] += r.rgb[p] * r.rgb[q];
96
+ for (let o = 0; o < 3; o++)
97
+ b[o][p] += r.xyz[o] * r.rgb[p];
98
+ }
99
+ }
100
+ const aMatrix = a;
101
+ const aInv = invertMatrix3x3(aMatrix, "Camera training Gram matrix (patches must span three independent camera responses)");
102
+ const constrained = input.constraint === "white-point-preserving-least-squares";
103
+ const m = [0, 1, 2].map((o) => solveRow(aInv, b[o], constrained ? whiteRgb : undefined, whiteXyz[o]));
104
+ requireFiniteResult(m.flat(), "Camera matrix fit");
105
+ const whiteXyzRecord = vectorToXyz(whiteXyz);
106
+ let sumDe = 0, maxDe = 0, sumSq = 0;
107
+ const patches = rows.map((r) => {
108
+ const predicted = multiplyMatrixVector(m, r.rgb);
109
+ const de = deltaE2000(cielabOfXyz(vectorToXyz(r.xyz), whiteXyzRecord), cielabOfXyz(vectorToXyz(predicted), whiteXyzRecord));
110
+ sumDe += de;
111
+ maxDe = Math.max(maxDe, de);
112
+ for (let o = 0; o < 3; o++)
113
+ sumSq += (predicted[o] - r.xyz[o]) ** 2;
114
+ return { patchId: r.patchId, cameraRgb: r.rgb, targetXyz: vectorToXyz(r.xyz), predictedXyz: vectorToXyz(predicted), deltaE2000: de };
115
+ });
116
+ const value = {
117
+ constraint: input.constraint, cameraRgbToXyz: m, xyzToCameraRgb: invertMatrix3x3(m, "Fitted camera matrix"),
118
+ illuminantWhiteXyz: whiteXyzRecord, cameraWhiteRgb: whiteRgb, patches,
119
+ meanDeltaE2000: sumDe / rows.length, maximumDeltaE2000: maxDe, rmsXyzResidual: Math.sqrt(sumSq / (3 * rows.length))
120
+ };
121
+ requireFiniteResult([value.meanDeltaE2000, value.maximumDeltaE2000, value.rmsXyzResidual], "Camera matrix report");
122
+ return estimatedResult(value, "camera-color-matrix-least-squares", COLORIMETRY_MODEL_VERSION, [
123
+ "Linear 3×3 model fitted to caller training reflectances under one illuminant; exact only under the Luther–Ives condition",
124
+ "ΔE2000 uses CIELAB relative to the illuminant white without chromatic adaptation",
125
+ "CMF source: " + cmf.datasetId
126
+ ], {
127
+ notes: [
128
+ "Training-set residuals are reported per patch in value.patches (CIEDE2000) and value.rmsXyzResidual; they do not bound the error for spectra outside the training set."
129
+ ]
130
+ });
131
+ }
132
+ //# sourceMappingURL=camera-color-matrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera-color-matrix.js","sourceRoot":"","sources":["../../src/color/camera-color-matrix.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Fits a 3×3 camera-RGB → CIE XYZ matrix from caller-supplied spectral data.\n *\n * For each training reflectance R_j under illuminant S:\n * camera ρ_j,c = k_c Σ S(λ) R_j(λ) s_c(λ) Δλ, target X_j = k Σ S(λ) R_j(λ) x̄(λ) Δλ\n * k is chosen so the perfect diffuser has Y = 1. k_c (the same for all channels) is chosen so\n * the camera's response to the perfect diffuser has green = 1.\n *\n * Two fits are available:\n * - Ordinary least squares: M minimizes Σ_j ‖M ρ_j − X_j‖², so M = X Pᵀ (P Pᵀ)⁻¹.\n * - White-point-preserving least squares: the same, subject to M ρ_white = X_white exactly\n * (Finlayson & Drew 1997, \"White-point preserving color correction\", IS&T/SID CIC5). It is\n * solved in closed form with one Lagrange multiplier per row.\n *\n * Residual errors are reported per patch as CIEDE2000, with CIELAB relative to the illuminant\n * white (no chromatic adaptation). A 3×3 matrix is exact only if the camera meets the\n * Luther–Ives condition. Otherwise the result is an estimate, and its error depends on the\n * training set. No camera, reflectance or ColorChecker data is bundled. Reflectance tables with an\n * unclear licence must come from the caller.\n * @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.\n */\n\nimport { estimatedResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport {\n COLORIMETRY_MODEL_VERSION,\n integrateSampledXyz,\n prepareColorMatchingFunctions,\n prepareColorimetricSpectrum,\n sampleColorimetricBasis,\n sampleFactor,\n type ColorMatchingFunctionsSource,\n type ColorimetricQuadratureNode,\n type ColorimetricSpectrum,\n type SampledColorimetricBasis\n} from \"./color-matching-functions.js\";\nimport { cielabOfXyz, deltaE2000 } from \"./color-difference.js\";\nimport {\n invertMatrix3x3,\n multiplyMatrixVector,\n requireFiniteResult,\n vectorToXyz,\n xyzToVector,\n type CieXyzTristimulus,\n type ColorMatrix3x3,\n type ColorVector3\n} from \"./colorimetry-math.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nexport const MAX_CAMERA_MATRIX_TRAINING_PATCHES = 10_000;\n\nexport interface CameraSpectralSensitivities {\n red: ColorimetricSpectrum;\n green: ColorimetricSpectrum;\n blue: ColorimetricSpectrum;\n}\n\nexport interface CameraMatrixTrainingPatch {\n patchId: string;\n reflectance: ColorimetricSpectrum;\n}\n\nexport type CameraMatrixFitConstraint = \"least-squares\" | \"white-point-preserving-least-squares\";\n\nexport interface EstimateCameraColorMatrixInput {\n quadratureNodes: readonly ColorimetricQuadratureNode[];\n illuminant: ColorimetricSpectrum;\n cameraSpectralSensitivities: CameraSpectralSensitivities;\n patches: readonly CameraMatrixTrainingPatch[];\n colorMatchingFunctions: ColorMatchingFunctionsSource;\n constraint: CameraMatrixFitConstraint;\n}\n\nexport interface CameraMatrixPatchReport {\n patchId: string;\n cameraRgb: ColorVector3;\n targetXyz: CieXyzTristimulus;\n predictedXyz: CieXyzTristimulus;\n deltaE2000: number;\n}\n\nexport interface CameraColorMatrixFit {\n constraint: CameraMatrixFitConstraint;\n /** Row-major camera RGB → XYZ (XYZ white Y = 1; camera white green = 1). */\n cameraRgbToXyz: ColorMatrix3x3;\n xyzToCameraRgb: ColorMatrix3x3;\n illuminantWhiteXyz: CieXyzTristimulus;\n /** Camera response to the perfect diffuser (green = 1); its reciprocal gives neutral WB gains. */\n cameraWhiteRgb: ColorVector3;\n patches: readonly CameraMatrixPatchReport[];\n meanDeltaE2000: number;\n maximumDeltaE2000: number;\n /** Root-mean-square XYZ residual over all patches and components. */\n rmsXyzResidual: number;\n}\n\ntype Matrix = number[][];\n\nfunction solveRow(aInv: ColorMatrix3x3, rhs: ColorVector3, white: ColorVector3 | undefined, whiteTarget: number): ColorVector3 {\n // Unconstrained normal equations: m = A⁻¹ b with A = P Pᵀ, b = P xᵀ.\n const m = multiplyMatrixVector(aInv, rhs);\n if (white === undefined) return m;\n const aInvW = multiplyMatrixVector(aInv, white);\n const wAw = white[0] * aInvW[0] + white[1] * aInvW[1] + white[2] * aInvW[2];\n const residual = whiteTarget - (m[0] * white[0] + m[1] * white[1] + m[2] * white[2]);\n return [m[0] + (aInvW[0] * residual) / wAw, m[1] + (aInvW[1] * residual) / wAw, m[2] + (aInvW[2] * residual) / wAw];\n}\n\n/**\n * Fits a camera-RGB → XYZ matrix from spectral sensitivities, training reflectances,\n * an illuminant and CMFs, and reports the per-patch CIEDE2000 residual.\n */\nexport function estimateCameraColorMatrix(input: EstimateCameraColorMatrixInput): CalculationResult<CameraColorMatrixFit> {\n requireInputKeys(input, \"estimateCameraColorMatrix\", [\"quadratureNodes\", \"illuminant\", \"cameraSpectralSensitivities\", \"patches\", \"colorMatchingFunctions\", \"constraint\"]);\n if (input.constraint !== \"least-squares\" && input.constraint !== \"white-point-preserving-least-squares\") {\n throw new InvalidConfigurationError(\"constraint is not supported.\");\n }\n if (!Array.isArray(input.patches) || input.patches.length < 3 || input.patches.length > MAX_CAMERA_MATRIX_TRAINING_PATCHES) {\n throw new InvalidScientificInputError(\"patches must contain between 3 and \" + MAX_CAMERA_MATRIX_TRAINING_PATCHES + \" entries.\");\n }\n const cmf = prepareColorMatchingFunctions(input.colorMatchingFunctions);\n const illuminant = prepareColorimetricSpectrum(input.illuminant, \"illuminant\");\n const basis: SampledColorimetricBasis = sampleColorimetricBasis(input.quadratureNodes, illuminant, cmf);\n const sens = input.cameraSpectralSensitivities;\n if (typeof sens !== \"object\" || sens === null) throw new InvalidConfigurationError(\"cameraSpectralSensitivities must be an object.\");\n const channel = ([\"red\", \"green\", \"blue\"] as const).map((c) => sampleFactor(basis, prepareColorimetricSpectrum(sens[c], \"cameraSpectralSensitivities.\" + c)));\n const ids = new Set<string>();\n const n = basis.nodes.length;\n const cameraOf = (factor: Float64Array): ColorVector3 => {\n const out = [0, 0, 0];\n for (let i = 0; i < n; i++) {\n const w = basis.weights[i]! * factor[i]!;\n for (let c = 0; c < 3; c++) out[c]! += w * channel[c]![i]!;\n }\n return out as unknown as ColorVector3;\n };\n const ones = sampleFactor(basis, undefined);\n const rawWhiteXyz = integrateSampledXyz(basis, ones);\n const rawWhiteRgb = cameraOf(ones);\n if (!(rawWhiteXyz.y > 0) || !(rawWhiteRgb[1] > 0)) throw new InvalidScientificInputError(\"The illuminant must give positive Y and positive camera green for the perfect diffuser.\");\n const kXyz = 1 / rawWhiteXyz.y, kRgb = 1 / rawWhiteRgb[1];\n const scale = (v: ColorVector3, k: number): ColorVector3 => [v[0] * k, v[1] * k, v[2] * k];\n const whiteXyz = scale(xyzToVector(rawWhiteXyz), kXyz);\n const whiteRgb = scale(rawWhiteRgb, kRgb);\n\n const rows = input.patches.map((patch, j) => {\n if (typeof patch !== \"object\" || patch === null || typeof patch.patchId !== \"string\" || patch.patchId.trim().length === 0) {\n throw new InvalidConfigurationError(\"patches[\" + j + \"].patchId must be a non-empty string.\");\n }\n if (ids.has(patch.patchId)) throw new InvalidScientificInputError(\"patches must not repeat patchId.\");\n ids.add(patch.patchId);\n const factor = sampleFactor(basis, prepareColorimetricSpectrum(patch.reflectance, \"patches[\" + j + \"].reflectance\"));\n return { patchId: patch.patchId, rgb: scale(cameraOf(factor), kRgb), xyz: scale(xyzToVector(integrateSampledXyz(basis, factor)), kXyz) };\n });\n\n const a: Matrix = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];\n const b: Matrix = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; // b[outputRow][cameraChannel]\n for (const r of rows) {\n for (let p = 0; p < 3; p++) {\n for (let q = 0; q < 3; q++) a[p]![q]! += r.rgb[p]! * r.rgb[q]!;\n for (let o = 0; o < 3; o++) b[o]![p]! += r.xyz[o]! * r.rgb[p]!;\n }\n }\n const aMatrix = a as unknown as ColorMatrix3x3;\n const aInv = invertMatrix3x3(aMatrix, \"Camera training Gram matrix (patches must span three independent camera responses)\");\n const constrained = input.constraint === \"white-point-preserving-least-squares\";\n const m = [0, 1, 2].map((o) => solveRow(aInv, b[o] as unknown as ColorVector3, constrained ? whiteRgb : undefined, whiteXyz[o]!)) as unknown as ColorMatrix3x3;\n requireFiniteResult(m.flat(), \"Camera matrix fit\");\n\n const whiteXyzRecord = vectorToXyz(whiteXyz);\n let sumDe = 0, maxDe = 0, sumSq = 0;\n const patches: CameraMatrixPatchReport[] = rows.map((r) => {\n const predicted = multiplyMatrixVector(m, r.rgb);\n const de = deltaE2000(cielabOfXyz(vectorToXyz(r.xyz), whiteXyzRecord), cielabOfXyz(vectorToXyz(predicted), whiteXyzRecord));\n sumDe += de; maxDe = Math.max(maxDe, de);\n for (let o = 0; o < 3; o++) sumSq += (predicted[o]! - r.xyz[o]!) ** 2;\n return { patchId: r.patchId, cameraRgb: r.rgb, targetXyz: vectorToXyz(r.xyz), predictedXyz: vectorToXyz(predicted), deltaE2000: de };\n });\n const value: CameraColorMatrixFit = {\n constraint: input.constraint, cameraRgbToXyz: m, xyzToCameraRgb: invertMatrix3x3(m, \"Fitted camera matrix\"),\n illuminantWhiteXyz: whiteXyzRecord, cameraWhiteRgb: whiteRgb, patches,\n meanDeltaE2000: sumDe / rows.length, maximumDeltaE2000: maxDe, rmsXyzResidual: Math.sqrt(sumSq / (3 * rows.length))\n };\n requireFiniteResult([value.meanDeltaE2000, value.maximumDeltaE2000, value.rmsXyzResidual], \"Camera matrix report\");\n return estimatedResult(value, \"camera-color-matrix-least-squares\", COLORIMETRY_MODEL_VERSION, [\n \"Linear 3×3 model fitted to caller training reflectances under one illuminant; exact only under the Luther–Ives condition\",\n \"ΔE2000 uses CIELAB relative to the illuminant white without chromatic adaptation\",\n \"CMF source: \" + cmf.datasetId\n ], {\n notes: [\n \"Training-set residuals are reported per patch in value.patches (CIEDE2000) and value.rmsXyzResidual; they do not bound the error for spectra outside the training set.\"\n ]\n });\n}\n"]}