@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
@@ -6,14 +6,19 @@ export declare const VIRTUAL_COLOR_CAMERA_PROFILE: Readonly<{
6
6
  id: "photivra-colorimetric-rgb-d65";
7
7
  version: "0.1.0";
8
8
  }>;
9
- /** Linear light, sRGB primaries/D65; no sRGB transfer curve is applied. */
9
+ /** Linear light with sRGB primaries and a D65 white. No sRGB transfer curve is applied. */
10
10
  export declare const LINEAR_CAPTURE_RGB_PROFILE: Readonly<{
11
11
  id: "linear-srgb-d65";
12
12
  version: "0.1.0";
13
13
  }>;
14
14
  type Vector = readonly [number, number, number];
15
15
  type Matrix = readonly [Vector, Vector, Vector];
16
- /** One explicit color interpretation; gains and adaptation cannot silently double-apply WB. */
16
+ /**
17
+ * Cone-space transform for adapting to the adopted white. If omitted, the original
18
+ * XYZ-diagonal scaling (model id `photivra-xyz-diagonal-adaptation`) is used unchanged.
19
+ */
20
+ export type CaptureChromaticAdaptationTransform = "bradford" | "cat16";
21
+ /** One explicit colour interpretation. Gains and adaptation cannot both apply white balance by accident. */
17
22
  export type CaptureColorWhiteBalance = {
18
23
  kind: "preserve-intent";
19
24
  } | {
@@ -21,8 +26,9 @@ export type CaptureColorWhiteBalance = {
21
26
  channelBasis: CapturePublicProfileReference;
22
27
  } | {
23
28
  kind: "adopted-white-xyz-scaling";
29
+ transform?: CaptureChromaticAdaptationTransform;
24
30
  };
25
- /** IDs identify a new derived plane; source capture stays immutable. */
31
+ /** IDs name a new derived plane. The source capture is never changed. */
26
32
  export interface CaptureColorTransformInput {
27
33
  capture: SimulatedCapture;
28
34
  sourcePlaneId: string;
@@ -30,7 +36,7 @@ export interface CaptureColorTransformInput {
30
36
  outputImageStateId: string;
31
37
  whiteBalance: CaptureColorWhiteBalance;
32
38
  }
33
- /** Profile data exposes complete row-major matrices and domain conditions to consumers. */
39
+ /** Profile data gives callers the complete row-major matrices and the conditions where they apply. */
34
40
  export interface CaptureColorModel {
35
41
  version: typeof CAPTURE_COLOR_MODEL_VERSION;
36
42
  cameraProfile: CapturePublicProfileReference;
@@ -50,7 +56,7 @@ export interface CaptureColorModel {
50
56
  }
51
57
  /** Returns the versioned ideal camera basis, independent of rendering/serializer state. */
52
58
  export declare function resolveCaptureColorModel(): CaptureColorModel;
53
- /** Validates the entire capture and explicit transform policy across untrusted JSON boundaries. */
59
+ /** Validates the whole capture and its explicit transform policy, read from untrusted JSON. */
54
60
  export declare function parseCaptureColorTransformInput(value: unknown): CaptureColorTransformInput;
55
61
  export interface CaptureColorTransformResult {
56
62
  plane: CaptureLinearPlane;
@@ -60,14 +66,15 @@ export interface CaptureColorTransformResult {
60
66
  whiteBalance: CaptureColorWhiteBalance;
61
67
  /** Matrix on CIE XYZ, identity when no adaptation; row-major, dimensionless. */
62
68
  chromaticAdaptationMatrix: Matrix;
63
- /** False: even adopted-white scaling is a camera choice under mixed illumination. */
69
+ /** False: under mixed lighting, even scaling to the adopted white is a choice the camera makes. */
64
70
  claimsUniqueSceneWhite: false;
65
71
  }
66
72
  /**
67
- * Converts a bounded inline XYZ/ideal-camera plane to unclamped linear sRGB.
68
- * Reuses resolved WB intent; never estimates illumination or changes exposure/noise.
69
- * XYZ diagonal adaptation is explicitly an approximation, distinct from RGB gains.
73
+ * Converts a bounded inline XYZ (ideal-camera) plane to unclamped linear sRGB.
74
+ * It reuses the resolved white-balance intent. It never estimates the lighting and never changes
75
+ * exposure or noise. Adapting to the adopted white (XYZ diagonal by default, or an explicit
76
+ * Bradford or CAT16 cone-space transform) is labelled an approximation, and
77
+ * is separate from RGB gains.
70
78
  */
71
79
  export declare function calculateCaptureColorTransform(input: CaptureColorTransformInput): CalculationResult<CaptureColorTransformResult>;
72
80
  export {};
73
- //# sourceMappingURL=capture-color.d.ts.map
@@ -1,19 +1,22 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Returns the versioned ideal camera basis, independent of rendering/serializer state.
5
- * Validates the entire capture and explicit transform policy across untrusted JSON boundaries.
6
- * @see docs/CAPTURE_COLOR.md for equations, coordinate/unit conventions, blockers and support limits.
3
+ * Colour for an ideal colorimetric capture: the versioned ideal camera basis, parsing of a capture
4
+ * and its colour transform policy from untrusted JSON, and conversion to linear sRGB.
5
+ *
6
+ * The basis does not depend on rendering or serializer state.
7
+ * @see docs/CAPTURE_COLOR.md for the equations, units, coordinate conventions, known blockers and
8
+ * support limits.
7
9
  */
8
10
  import { requireAllowlistedRecord, requirePublicOpaqueId } from "../core/record-validation.js";
9
11
  import { calculatedResult, approximationResult } from "../core/calculation-result.js";
10
12
  import { InvalidConfigurationError } from "../core/configuration-error.js";
11
13
  import { InvalidScientificResultError } from "../core/validation.js";
14
+ import { chromaticAdaptationMatrix } from "./chromatic-adaptation.js";
12
15
  import { parseSimulatedCapture } from "../capture/simulated-capture.js";
13
16
  export const CAPTURE_COLOR_MODEL_VERSION = "0.1.0";
14
17
  /** Explicit ideal colorimetric camera, not measured spectral sensor channels. */
15
18
  export const VIRTUAL_COLOR_CAMERA_PROFILE = Object.freeze({ id: "photivra-colorimetric-rgb-d65", version: CAPTURE_COLOR_MODEL_VERSION });
16
- /** Linear light, sRGB primaries/D65; no sRGB transfer curve is applied. */
19
+ /** Linear light with sRGB primaries and a D65 white. No sRGB transfer curve is applied. */
17
20
  export const LINEAR_CAPTURE_RGB_PROFILE = Object.freeze({ id: "linear-srgb-d65", version: CAPTURE_COLOR_MODEL_VERSION });
18
21
  const D65 = Object.freeze({ x: .3127 / .3290, y: 1, z: (1 - .3127 - .3290) / .3290 });
19
22
  const IDENTITY = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];
@@ -26,13 +29,14 @@ function inverse(m) {
26
29
  return [[e * i - f * h, c * h - b * i, b * f - c * e], [f * g - d * i, a * i - c * g, c * d - a * f], [d * h - e * g, b * g - a * h, a * e - b * d]]
27
30
  .map((r) => r.map((v) => v / determinant));
28
31
  }
29
- // Independently derive the basis from public primary chromaticities, not a copied matrix.
32
+ // Derive the basis independently from the published primary chromaticities, not from a copied matrix.
30
33
  const primaries = [[.64, .33], [.30, .60], [.15, .06]];
31
34
  const columns = primaries.map(([x, y]) => [x / y, 1, (1 - x - y) / y]);
32
35
  const basis = [0, 1, 2].map((i) => columns.map((c) => c[i]));
33
36
  const scales = multiply(inverse(basis), [D65.x, 1, D65.z]);
34
37
  const RGB_TO_XYZ = basis.map((row) => row.map((v, i) => v * scales[i]));
35
38
  const XYZ_TO_RGB = inverse(RGB_TO_XYZ);
39
+ const CAPTURE_ADAPTATION_TRANSFORMS = ["bradford", "cat16"];
36
40
  /** Returns the versioned ideal camera basis, independent of rendering/serializer state. */
37
41
  export function resolveCaptureColorModel() {
38
42
  return { version: CAPTURE_COLOR_MODEL_VERSION, cameraProfile: { ...VIRTUAL_COLOR_CAMERA_PROFILE },
@@ -50,16 +54,22 @@ function record(v, keys) {
50
54
  function publicId(v) {
51
55
  return requirePublicOpaqueId(v, "Invalid public color ID.");
52
56
  }
53
- /** Validates the entire capture and explicit transform policy across untrusted JSON boundaries. */
57
+ /** Validates the whole capture and its explicit transform policy, read from untrusted JSON. */
54
58
  export function parseCaptureColorTransformInput(value) {
55
59
  const r = record(value, ["capture", "sourcePlaneId", "outputPlaneId", "outputImageStateId", "whiteBalance"]);
56
- const w = record(r.whiteBalance, ["kind", "channelBasis"]);
60
+ const w = record(r.whiteBalance, ["kind", "channelBasis", "transform"]);
57
61
  let whiteBalance;
58
- if (w.kind === "apply-resolved-rgb-gains") {
62
+ if (w.kind === "apply-resolved-rgb-gains" && w.transform === undefined) {
59
63
  const p = record(w.channelBasis, ["id", "version"]);
60
64
  whiteBalance = { kind: w.kind, channelBasis: { id: publicId(p.id), version: publicId(p.version) } };
61
65
  }
62
- else if ((w.kind === "preserve-intent" || w.kind === "adopted-white-xyz-scaling") && w.channelBasis === undefined) {
66
+ else if (w.kind === "adopted-white-xyz-scaling" && w.channelBasis === undefined && w.transform !== undefined) {
67
+ if (typeof w.transform !== "string" || !CAPTURE_ADAPTATION_TRANSFORMS.includes(w.transform)) {
68
+ throw new InvalidConfigurationError("Unsupported chromatic-adaptation transform.");
69
+ }
70
+ whiteBalance = { kind: w.kind, transform: w.transform };
71
+ }
72
+ else if ((w.kind === "preserve-intent" || w.kind === "adopted-white-xyz-scaling") && w.channelBasis === undefined && w.transform === undefined) {
63
73
  whiteBalance = { kind: w.kind };
64
74
  }
65
75
  else
@@ -67,10 +77,17 @@ export function parseCaptureColorTransformInput(value) {
67
77
  return { capture: parseSimulatedCapture(r.capture), sourcePlaneId: publicId(r.sourcePlaneId),
68
78
  outputPlaneId: publicId(r.outputPlaneId), outputImageStateId: publicId(r.outputImageStateId), whiteBalance };
69
79
  }
80
+ function adaptationProfileId(whiteBalance) {
81
+ return whiteBalance.kind === "adopted-white-xyz-scaling" && whiteBalance.transform !== undefined
82
+ ? "photivra-" + whiteBalance.transform + "-adaptation"
83
+ : "photivra-xyz-diagonal-adaptation";
84
+ }
70
85
  /**
71
- * Converts a bounded inline XYZ/ideal-camera plane to unclamped linear sRGB.
72
- * Reuses resolved WB intent; never estimates illumination or changes exposure/noise.
73
- * XYZ diagonal adaptation is explicitly an approximation, distinct from RGB gains.
86
+ * Converts a bounded inline XYZ (ideal-camera) plane to unclamped linear sRGB.
87
+ * It reuses the resolved white-balance intent. It never estimates the lighting and never changes
88
+ * exposure or noise. Adapting to the adopted white (XYZ diagonal by default, or an explicit
89
+ * Bradford or CAT16 cone-space transform) is labelled an approximation, and
90
+ * is separate from RGB gains.
74
91
  */
75
92
  export function calculateCaptureColorTransform(input) {
76
93
  const { capture, sourcePlaneId, outputPlaneId, outputImageStateId, whiteBalance } = parseCaptureColorTransformInput(input);
@@ -107,7 +124,20 @@ export function calculateCaptureColorTransform(input) {
107
124
  if (!Number.isFinite(x) || !Number.isFinite(z) || x < 1e-6 || x > 1e6 || z < 1e-6 || z > 1e6) {
108
125
  throw new InvalidConfigurationError("Adopted-white scaling is outside the declared numerical domain.");
109
126
  }
110
- adaptation = [[x, 0, 0], [0, 1, 0], [0, 0, z]];
127
+ if (whiteBalance.transform === undefined)
128
+ adaptation = [[x, 0, 0], [0, 1, 0], [0, 0, z]];
129
+ else {
130
+ let m;
131
+ try {
132
+ m = chromaticAdaptationMatrix({ transform: whiteBalance.transform, sourceWhiteXyz: white, destinationWhiteXyz: D65 }).matrix;
133
+ }
134
+ catch {
135
+ throw new InvalidConfigurationError("Adopted-white adaptation is outside the transform's numerical domain.");
136
+ }
137
+ if (m.flat().some((v) => Math.abs(v) > 1e6))
138
+ throw new InvalidConfigurationError("Adopted-white adaptation is outside the declared numerical domain.");
139
+ adaptation = m;
140
+ }
111
141
  }
112
142
  const samples = [], values = source.storage.samples;
113
143
  for (let i = 0; i < values.length; i += 3) {
@@ -123,7 +153,7 @@ export function calculateCaptureColorTransform(input) {
123
153
  }
124
154
  const transforms = [...source.appliedTransforms];
125
155
  if (adapt)
126
- transforms.push({ profile: { id: "photivra-xyz-diagonal-adaptation", version: CAPTURE_COLOR_MODEL_VERSION }, kind: "chromatic-adaptation" });
156
+ transforms.push({ profile: { id: adaptationProfileId(whiteBalance), version: CAPTURE_COLOR_MODEL_VERSION }, kind: "chromatic-adaptation" });
127
157
  transforms.push({ profile: { ...LINEAR_CAPTURE_RGB_PROFILE }, kind: "linear-color" });
128
158
  if (gains)
129
159
  transforms.push({ profile: { id: capture.whiteBalanceIntent.stateId, version: CAPTURE_COLOR_MODEL_VERSION }, kind: "linear-color" });
@@ -132,14 +162,17 @@ export function calculateCaptureColorTransform(input) {
132
162
  encodingReferenceWhiteXyz: { ...D65 }, appliedTransforms: transforms,
133
163
  whiteBalanceApplication: gains ? "applied-rgb-gains" : adapt ? "applied-chromatic-adaptation" : capture.whiteBalanceIntent ? "intent-only" : "not-applicable",
134
164
  storage: { kind: "inline-float64", samples } };
135
- // Validation enforces capture-wide sample budget, identities and output finiteness.
165
+ // Validation enforces the capture-wide sample budget, the identities and finite output.
136
166
  const checked = parseSimulatedCapture({ ...capture, planes: [plane] }).planes[0];
137
167
  const result = { plane: checked, colorModel: resolveCaptureColorModel(), sourcePlaneId,
138
168
  sourceImageStateId: source.imageStateId, whiteBalance, chromaticAdaptationMatrix: adaptation.map((r) => [...r]),
139
169
  claimsUniqueSceneWhite: false };
140
170
  const assumptions = ["Ideal CIE colorimetric virtual camera only; no sensor calibration inferred", "Source exposure/noise/saturation history retained; float samples never clipped",
141
171
  "WB intent, applied RGB gains and adopted-white adaptation are independent choices; no scene-white oracle"];
142
- return adapt ? approximationResult(result, "capture-color-xyz-diagonal-adaptation", CAPTURE_COLOR_MODEL_VERSION, [...assumptions, "XYZ diagonal scaling is a limited chromatic-adaptation approximation, not Bradford or a color-appearance model"])
172
+ const transform = whiteBalance.kind === "adopted-white-xyz-scaling" ? whiteBalance.transform : undefined;
173
+ return adapt ? transform === undefined
174
+ ? approximationResult(result, "capture-color-xyz-diagonal-adaptation", CAPTURE_COLOR_MODEL_VERSION, [...assumptions, "XYZ diagonal scaling is a limited chromatic-adaptation approximation, not Bradford or a color-appearance model"])
175
+ : approximationResult(result, "capture-color-" + transform + "-adaptation", CAPTURE_COLOR_MODEL_VERSION, [...assumptions, "Complete (D = 1) linear " + transform + " von Kries-type adaptation to D65; corresponding-colour prediction is approximate and no color-appearance model is applied"])
143
176
  : calculatedResult(result, "capture-colorimetric-linear-rgb", CAPTURE_COLOR_MODEL_VERSION, assumptions);
144
177
  }
145
178
  //# sourceMappingURL=capture-color.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"capture-color.js","sourceRoot":"","sources":["../../src/color/capture-color.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capture-color.js","sourceRoot":"","sources":["../../src/color/capture-color.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Colour for an ideal colorimetric capture: the versioned ideal camera basis, parsing of a capture\n * and its colour transform policy from untrusted JSON, and conversion to linear sRGB.\n *\n * The basis does not depend on rendering or serializer state.\n * @see docs/CAPTURE_COLOR.md for the equations, units, coordinate conventions, known blockers and\n * support limits.\n */\n\nimport { requireAllowlistedRecord, requirePublicOpaqueId } from \"../core/record-validation.js\";\nimport { calculatedResult, approximationResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { InvalidScientificResultError } from \"../core/validation.js\";\nimport { chromaticAdaptationMatrix } from \"./chromatic-adaptation.js\";\nimport { parseSimulatedCapture, type SimulatedCapture, type CaptureLinearPlane, type CapturePublicProfileReference } from \"../capture/simulated-capture.js\";\n\nexport const CAPTURE_COLOR_MODEL_VERSION = \"0.1.0\" as const;\n/** Explicit ideal colorimetric camera, not measured spectral sensor channels. */\nexport const VIRTUAL_COLOR_CAMERA_PROFILE = Object.freeze({ id: \"photivra-colorimetric-rgb-d65\", version: CAPTURE_COLOR_MODEL_VERSION });\n/** Linear light with sRGB primaries and a D65 white. No sRGB transfer curve is applied. */\nexport const LINEAR_CAPTURE_RGB_PROFILE = Object.freeze({ id: \"linear-srgb-d65\", version: CAPTURE_COLOR_MODEL_VERSION });\nconst D65 = Object.freeze({ x: .3127/.3290, y: 1 as const, z: (1-.3127-.3290)/.3290 });\ntype Vector = readonly [number, number, number];\ntype Matrix = readonly [Vector, Vector, Vector];\nconst IDENTITY: Matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\nfunction multiply(m: Matrix, v: Vector): Vector {\n return m.map((r) => r[0]*v[0]+r[1]*v[1]+r[2]*v[2]) as unknown as Vector;\n}\nfunction inverse(m: Matrix): Matrix {\n const [[a, b, c], [d, e, f], [g, h, i]] = m;\n const determinant = a*(e*i-f*h)-b*(d*i-f*g)+c*(d*h-e*g);\n return [[e*i-f*h, c*h-b*i, b*f-c*e], [f*g-d*i, a*i-c*g, c*d-a*f], [d*h-e*g, b*g-a*h, a*e-b*d]]\n .map((r) => r.map((v) => v/determinant)) as unknown as Matrix;\n}\n// Derive the basis independently from the published primary chromaticities, not from a copied matrix.\nconst primaries: readonly (readonly [number, number])[] = [[.64, .33], [.30, .60], [.15, .06]];\nconst columns = primaries.map(([x, y]): Vector => [x/y, 1, (1-x-y)/y]);\nconst basis = [0, 1, 2].map((i) => columns.map((c) => c[i]!)) as unknown as Matrix;\nconst scales = multiply(inverse(basis), [D65.x, 1, D65.z]);\nconst RGB_TO_XYZ = basis.map((row) => row.map((v, i) => v*scales[i]!)) as unknown as Matrix;\nconst XYZ_TO_RGB = inverse(RGB_TO_XYZ);\n\n/**\n * Cone-space transform for adapting to the adopted white. If omitted, the original\n * XYZ-diagonal scaling (model id `photivra-xyz-diagonal-adaptation`) is used unchanged.\n */\nexport type CaptureChromaticAdaptationTransform = \"bradford\" | \"cat16\";\nconst CAPTURE_ADAPTATION_TRANSFORMS: readonly string[] = [\"bradford\", \"cat16\"];\n/** One explicit colour interpretation. Gains and adaptation cannot both apply white balance by accident. */\nexport type CaptureColorWhiteBalance =\n | { kind: \"preserve-intent\" }\n | { kind: \"apply-resolved-rgb-gains\"; channelBasis: CapturePublicProfileReference }\n | { kind: \"adopted-white-xyz-scaling\"; transform?: CaptureChromaticAdaptationTransform };\n/** IDs name a new derived plane. The source capture is never changed. */\nexport interface CaptureColorTransformInput {\n capture: SimulatedCapture;\n sourcePlaneId: string;\n outputPlaneId: string;\n outputImageStateId: string;\n whiteBalance: CaptureColorWhiteBalance;\n}\n/** Profile data gives callers the complete row-major matrices and the conditions where they apply. */\nexport interface CaptureColorModel {\n version: typeof CAPTURE_COLOR_MODEL_VERSION;\n cameraProfile: CapturePublicProfileReference;\n outputProfile: CapturePublicProfileReference;\n referenceIlluminant: \"D65\";\n observer: \"cie-1931-2-degree\";\n referenceWhiteXyz: { x: number; y: 1; z: number };\n cameraRgbToXyz: Matrix;\n xyzToCameraRgb: Matrix;\n scientificStatus: \"calculated\";\n validConditions: readonly string[];\n publicEvidenceIds: readonly string[];\n}\n/** Returns the versioned ideal camera basis, independent of rendering/serializer state. */\nexport function resolveCaptureColorModel(): CaptureColorModel {\n return { version: CAPTURE_COLOR_MODEL_VERSION, cameraProfile: { ...VIRTUAL_COLOR_CAMERA_PROFILE },\n outputProfile: { ...LINEAR_CAPTURE_RGB_PROFILE }, referenceIlluminant: \"D65\", observer: \"cie-1931-2-degree\",\n referenceWhiteXyz: { ...D65 }, cameraRgbToXyz: RGB_TO_XYZ.map((r) => [...r]) as unknown as Matrix,\n xyzToCameraRgb: XYZ_TO_RGB.map((r) => [...r]) as unknown as Matrix, scientificStatus: \"calculated\",\n validConditions: [\"Ideal colorimetric basis only; virtual RGB is an invertible encoding of CIE XYZ\",\n \"Not spectral channels, electrons, commercial-camera RGB or a sensor calibration\",\n \"Signed finite scene-linear values; co-sited RGB; no transfer curve, gamut mapping or clipping\"],\n publicEvidenceIds: [\"w3c:css-color-4:srgb-primaries-d65\"] };\n}\nfunction record(v: unknown, keys: readonly string[]): Record<string, unknown> {\n return requireAllowlistedRecord(v, keys, \"Invalid color-transform fields.\");\n}\nfunction publicId(v: unknown): string {\n return requirePublicOpaqueId(v, \"Invalid public color ID.\");\n}\n/** Validates the whole capture and its explicit transform policy, read from untrusted JSON. */\nexport function parseCaptureColorTransformInput(value: unknown): CaptureColorTransformInput {\n const r = record(value, [\"capture\", \"sourcePlaneId\", \"outputPlaneId\", \"outputImageStateId\", \"whiteBalance\"]);\n const w = record(r.whiteBalance, [\"kind\", \"channelBasis\", \"transform\"]);\n let whiteBalance: CaptureColorWhiteBalance;\n if (w.kind === \"apply-resolved-rgb-gains\" && w.transform === undefined) {\n const p = record(w.channelBasis, [\"id\", \"version\"]);\n whiteBalance = { kind: w.kind, channelBasis: { id: publicId(p.id), version: publicId(p.version) } };\n } else if (w.kind === \"adopted-white-xyz-scaling\" && w.channelBasis === undefined && w.transform !== undefined) {\n if (typeof w.transform !== \"string\" || !CAPTURE_ADAPTATION_TRANSFORMS.includes(w.transform)) {\n throw new InvalidConfigurationError(\"Unsupported chromatic-adaptation transform.\");\n }\n whiteBalance = { kind: w.kind, transform: w.transform as CaptureChromaticAdaptationTransform };\n } else if ((w.kind === \"preserve-intent\" || w.kind === \"adopted-white-xyz-scaling\") && w.channelBasis === undefined && w.transform === undefined) {\n whiteBalance = { kind: w.kind };\n } else throw new InvalidConfigurationError(\"Unsupported or contradictory color WB policy.\");\n return { capture: parseSimulatedCapture(r.capture), sourcePlaneId: publicId(r.sourcePlaneId),\n outputPlaneId: publicId(r.outputPlaneId), outputImageStateId: publicId(r.outputImageStateId), whiteBalance };\n}\nexport interface CaptureColorTransformResult {\n plane: CaptureLinearPlane;\n colorModel: CaptureColorModel;\n sourcePlaneId: string;\n sourceImageStateId: string;\n whiteBalance: CaptureColorWhiteBalance;\n /** Matrix on CIE XYZ, identity when no adaptation; row-major, dimensionless. */\n chromaticAdaptationMatrix: Matrix;\n /** False: under mixed lighting, even scaling to the adopted white is a choice the camera makes. */\n claimsUniqueSceneWhite: false;\n}\nfunction adaptationProfileId(whiteBalance: CaptureColorWhiteBalance): string {\n return whiteBalance.kind === \"adopted-white-xyz-scaling\" && whiteBalance.transform !== undefined\n ? \"photivra-\" + whiteBalance.transform + \"-adaptation\"\n : \"photivra-xyz-diagonal-adaptation\";\n}\n/**\n * Converts a bounded inline XYZ (ideal-camera) plane to unclamped linear sRGB.\n * It reuses the resolved white-balance intent. It never estimates the lighting and never changes\n * exposure or noise. Adapting to the adopted white (XYZ diagonal by default, or an explicit\n * Bradford or CAT16 cone-space transform) is labelled an approximation, and\n * is separate from RGB gains.\n */\nexport function calculateCaptureColorTransform(input: CaptureColorTransformInput): CalculationResult<CaptureColorTransformResult> {\n const { capture, sourcePlaneId, outputPlaneId, outputImageStateId, whiteBalance } = parseCaptureColorTransformInput(input);\n const source = capture.planes.find((p) => p.id === sourcePlaneId);\n if (!source || source.storage.kind !== \"inline-float64\" || source.imageState === \"color-transformed-linear-rgb\" ||\n source.whiteBalanceApplication === \"applied-rgb-gains\" || source.whiteBalanceApplication === \"applied-chromatic-adaptation\" ||\n source.appliedTransforms.some((t) => t.kind !== \"digital-lens-correction\")) {\n throw new InvalidConfigurationError(\"Color requires an untreated inline XYZ or supported virtual camera plane.\");\n }\n if (capture.planes.some((p) => p.id === outputPlaneId || p.imageStateId === outputImageStateId)) {\n throw new InvalidConfigurationError(\"Derived color plane/state IDs must be new.\");\n }\n const virtual = source.imageState === \"virtual-sensor-channels\";\n if (virtual && (source.colorProfile?.id !== VIRTUAL_COLOR_CAMERA_PROFILE.id || source.colorProfile.version !== CAPTURE_COLOR_MODEL_VERSION ||\n JSON.stringify(source.channelIds) !== JSON.stringify([\"red\", \"green\", \"blue\"]))) {\n throw new InvalidConfigurationError(\"Unresolved spectral/sensor RGB cannot use the ideal colorimetric transform.\");\n }\n const adapt = whiteBalance.kind === \"adopted-white-xyz-scaling\";\n const reference = source.encodingReferenceWhiteXyz;\n if (!virtual && !adapt && (reference!.x !== D65.x || reference!.z !== D65.z)) {\n throw new InvalidConfigurationError(\"A different XYZ reference white requires an explicit adaptation choice.\");\n }\n const gains = whiteBalance.kind === \"apply-resolved-rgb-gains\";\n if (gains && (!capture.whiteBalanceIntent || whiteBalance.channelBasis.id !== VIRTUAL_COLOR_CAMERA_PROFILE.id ||\n whiteBalance.channelBasis.version !== CAPTURE_COLOR_MODEL_VERSION)) {\n throw new InvalidConfigurationError(\"Resolved WB gains require an explicit matching camera channel-basis binding.\");\n }\n let adaptation: Matrix = IDENTITY;\n if (adapt) {\n const white = capture.adoptedWhiteXyz;\n if (!white) throw new InvalidConfigurationError(\"Adopted-white adaptation requires an explicit adopted XYZ white.\");\n const x = D65.x/white.x, z = D65.z/white.z;\n if (!Number.isFinite(x) || !Number.isFinite(z) || x < 1e-6 || x > 1e6 || z < 1e-6 || z > 1e6) {\n throw new InvalidConfigurationError(\"Adopted-white scaling is outside the declared numerical domain.\");\n }\n if (whiteBalance.transform === undefined) adaptation = [[x, 0, 0], [0, 1, 0], [0, 0, z]];\n else {\n let m: Matrix;\n try {\n m = chromaticAdaptationMatrix({ transform: whiteBalance.transform, sourceWhiteXyz: white, destinationWhiteXyz: D65 }).matrix;\n } catch {\n throw new InvalidConfigurationError(\"Adopted-white adaptation is outside the transform's numerical domain.\");\n }\n if (m.flat().some((v) => Math.abs(v) > 1e6)) throw new InvalidConfigurationError(\"Adopted-white adaptation is outside the declared numerical domain.\");\n adaptation = m;\n }\n }\n const samples: number[] = [], values = source.storage.samples;\n for (let i = 0; i < values.length; i += 3) {\n const v: Vector = [values[i]!, values[i+1]!, values[i+2]!];\n let rgb = virtual && !adapt ? v : multiply(XYZ_TO_RGB, multiply(adaptation, virtual ? multiply(RGB_TO_XYZ, v) : v));\n if (gains) {\n const g = capture.whiteBalanceIntent!.channelGains;\n rgb = [rgb[0]*g.red, rgb[1]*g.green, rgb[2]*g.blue];\n }\n if (rgb.some((v) => !Number.isFinite(v))) throw new InvalidScientificResultError(\"Color transform produced a non-finite sample.\");\n samples.push(...rgb.map((v) => Object.is(v, -0) ? 0 : v));\n }\n const transforms: CaptureLinearPlane[\"appliedTransforms\"][number][] = [...source.appliedTransforms];\n if (adapt) transforms.push({ profile: { id: adaptationProfileId(whiteBalance), version: CAPTURE_COLOR_MODEL_VERSION }, kind: \"chromatic-adaptation\" });\n transforms.push({ profile: { ...LINEAR_CAPTURE_RGB_PROFILE }, kind: \"linear-color\" });\n if (gains) transforms.push({ profile: { id: capture.whiteBalanceIntent!.stateId, version: CAPTURE_COLOR_MODEL_VERSION }, kind: \"linear-color\" });\n const plane: CaptureLinearPlane = { ...source, id: outputPlaneId, imageStateId: outputImageStateId,\n imageState: \"color-transformed-linear-rgb\", channelIds: [\"red\", \"green\", \"blue\"], colorProfile: { ...LINEAR_CAPTURE_RGB_PROFILE },\n encodingReferenceWhiteXyz: { ...D65 }, appliedTransforms: transforms,\n whiteBalanceApplication: gains ? \"applied-rgb-gains\" : adapt ? \"applied-chromatic-adaptation\" : capture.whiteBalanceIntent ? \"intent-only\" : \"not-applicable\",\n storage: { kind: \"inline-float64\", samples } };\n // Validation enforces the capture-wide sample budget, the identities and finite output.\n const checked = parseSimulatedCapture({ ...capture, planes: [plane] }).planes[0]!;\n const result: CaptureColorTransformResult = { plane: checked, colorModel: resolveCaptureColorModel(), sourcePlaneId,\n sourceImageStateId: source.imageStateId, whiteBalance, chromaticAdaptationMatrix: adaptation.map((r) => [...r]) as unknown as Matrix,\n claimsUniqueSceneWhite: false };\n const assumptions = [\"Ideal CIE colorimetric virtual camera only; no sensor calibration inferred\", \"Source exposure/noise/saturation history retained; float samples never clipped\",\n \"WB intent, applied RGB gains and adopted-white adaptation are independent choices; no scene-white oracle\"];\n const transform = whiteBalance.kind === \"adopted-white-xyz-scaling\" ? whiteBalance.transform : undefined;\n return adapt ? transform === undefined\n ? approximationResult(result, \"capture-color-xyz-diagonal-adaptation\", CAPTURE_COLOR_MODEL_VERSION,\n [...assumptions, \"XYZ diagonal scaling is a limited chromatic-adaptation approximation, not Bradford or a color-appearance model\"])\n : approximationResult(result, \"capture-color-\" + transform + \"-adaptation\", CAPTURE_COLOR_MODEL_VERSION,\n [...assumptions, \"Complete (D = 1) linear \" + transform + \" von Kries-type adaptation to D65; corresponding-colour prediction is approximate and no color-appearance model is applied\"])\n : calculatedResult(result, \"capture-colorimetric-linear-rgb\", CAPTURE_COLOR_MODEL_VERSION, assumptions);\n}\n"]}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Von Kries-type linear chromatic adaptation transforms (CATs) on CIE XYZ:
3
+ * M = C⁻¹ · diag(Dᵢ) · C, Dᵢ = D · (Y_s / Y_d) · (ρᵢ,d / ρᵢ,s) + 1 − D
4
+ * where C maps XYZ to a cone-like ("sharpened") space, ρ_s and ρ_d are the source and
5
+ * destination whites in that space, and D ∈ [0, 1] is the degree of adaptation. This is
6
+ * the one-step, two-illuminant form of Li et al. (2017) for CAT16; it is used for every
7
+ * transform here. With D = 1 and equal white luminance, the source white maps exactly to
8
+ * the destination white.
9
+ *
10
+ * Cone matrices (published factual constants):
11
+ * - Bradford (linearized): Lam (1985) thesis, University of Bradford; Luo & Rhodes
12
+ * (1999); as used in ICC.1:2010 Annex E. The original blue-channel non-linearity is
13
+ * omitted, as in common practice.
14
+ * - CAT16: Li, Li, Wang, Xu, Luo, Cui, Melgosa & Pointer (2016), "A Revision of CIECAM02
15
+ * and its CAT and UCS", IS&T CIC24, pp. 208–212, Eq. (15) (M16),
16
+ * doi:10.2352/ISSN.2169-2629.2017.32.208 (free from the IS&T library). Journal version:
17
+ * Li et al. (2017), "Comprehensive color solutions: CAM16, CAT16, and CAM16-UCS",
18
+ * Color Res. Appl. 42(6):703–718.
19
+ * - XYZ scaling: identity cone matrix (diagonal scaling in XYZ; the weakest model).
20
+ * The degree of adaptation D is supplied by the caller (default 1, complete adaptation).
21
+ * CAT02, the von Kries Hunt–Pointer–Estévez matrix and the CIECAM02 formula for D are not
22
+ * part of 2.0: no free source we could confirm prints them (owner decisions, 2026-10-17).
23
+ * @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.
24
+ */
25
+ import { type CalculationResult } from "../core/calculation-result.js";
26
+ import { type CieXyzTristimulus, type ColorMatrix3x3 } from "./colorimetry-math.js";
27
+ /** Supported linear chromatic-adaptation transforms. */
28
+ export type ChromaticAdaptationTransform = "bradford" | "cat16" | "xyz-scaling";
29
+ export declare const CHROMATIC_ADAPTATION_TRANSFORMS: readonly ChromaticAdaptationTransform[];
30
+ /** Returns a copy of the XYZ → cone-space matrix of a transform. */
31
+ export declare function resolveChromaticAdaptationConeMatrix(transform: ChromaticAdaptationTransform): ColorMatrix3x3;
32
+ export interface CalculateChromaticAdaptationMatrixInput {
33
+ transform: ChromaticAdaptationTransform;
34
+ /** White of the source viewing/illumination condition (relative XYZ, Y > 0). */
35
+ sourceWhiteXyz: CieXyzTristimulus;
36
+ /** White of the destination condition (relative XYZ, Y > 0). */
37
+ destinationWhiteXyz: CieXyzTristimulus;
38
+ /** Degree of adaptation D in [0, 1]; defaults to 1 (complete adaptation). */
39
+ degreeOfAdaptation?: number;
40
+ }
41
+ export interface ChromaticAdaptationMatrix {
42
+ transform: ChromaticAdaptationTransform;
43
+ degreeOfAdaptation: number;
44
+ /** Row-major XYZ_source → XYZ_destination matrix. */
45
+ matrix: ColorMatrix3x3;
46
+ /** The per-channel cone-space gains Dᵢ. */
47
+ coneGains: readonly [number, number, number];
48
+ }
49
+ /** Internal: builds the adaptation matrix without an envelope. */
50
+ export declare function chromaticAdaptationMatrix(input: CalculateChromaticAdaptationMatrixInput): ChromaticAdaptationMatrix;
51
+ /**
52
+ * Calculates a linear chromatic-adaptation matrix between two whites. Linear CATs are
53
+ * standard models, but they predict corresponding colours only approximately. The matrix
54
+ * itself is calculated exactly from the declared transform.
55
+ */
56
+ export declare function calculateChromaticAdaptationMatrix(input: CalculateChromaticAdaptationMatrixInput): CalculationResult<ChromaticAdaptationMatrix>;
57
+ /** Adapts one XYZ colour between whites with the selected transform. */
58
+ export declare function calculateChromaticallyAdaptedXyz(input: CalculateChromaticAdaptationMatrixInput & {
59
+ xyz: CieXyzTristimulus;
60
+ }): CalculationResult<{
61
+ xyz: CieXyzTristimulus;
62
+ matrix: ColorMatrix3x3;
63
+ }>;
@@ -0,0 +1,91 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * Von Kries-type linear chromatic adaptation transforms (CATs) on CIE XYZ:
4
+ * M = C⁻¹ · diag(Dᵢ) · C, Dᵢ = D · (Y_s / Y_d) · (ρᵢ,d / ρᵢ,s) + 1 − D
5
+ * where C maps XYZ to a cone-like ("sharpened") space, ρ_s and ρ_d are the source and
6
+ * destination whites in that space, and D ∈ [0, 1] is the degree of adaptation. This is
7
+ * the one-step, two-illuminant form of Li et al. (2017) for CAT16; it is used for every
8
+ * transform here. With D = 1 and equal white luminance, the source white maps exactly to
9
+ * the destination white.
10
+ *
11
+ * Cone matrices (published factual constants):
12
+ * - Bradford (linearized): Lam (1985) thesis, University of Bradford; Luo & Rhodes
13
+ * (1999); as used in ICC.1:2010 Annex E. The original blue-channel non-linearity is
14
+ * omitted, as in common practice.
15
+ * - CAT16: Li, Li, Wang, Xu, Luo, Cui, Melgosa & Pointer (2016), "A Revision of CIECAM02
16
+ * and its CAT and UCS", IS&T CIC24, pp. 208–212, Eq. (15) (M16),
17
+ * doi:10.2352/ISSN.2169-2629.2017.32.208 (free from the IS&T library). Journal version:
18
+ * Li et al. (2017), "Comprehensive color solutions: CAM16, CAT16, and CAM16-UCS",
19
+ * Color Res. Appl. 42(6):703–718.
20
+ * - XYZ scaling: identity cone matrix (diagonal scaling in XYZ; the weakest model).
21
+ * The degree of adaptation D is supplied by the caller (default 1, complete adaptation).
22
+ * CAT02, the von Kries Hunt–Pointer–Estévez matrix and the CIECAM02 formula for D are not
23
+ * part of 2.0: no free source we could confirm prints them (owner decisions, 2026-10-17).
24
+ * @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.
25
+ */
26
+ import { calculatedResult } from "../core/calculation-result.js";
27
+ import { InvalidScientificInputError } from "../core/validation.js";
28
+ import { COLORIMETRY_MODEL_VERSION } from "./color-matching-functions.js";
29
+ import { copyMatrix, diagonalMatrix, invertMatrix3x3, multiplyMatrices, multiplyMatrixVector, parseWhiteXyz, parseXyz, requireFiniteResult, requireNonNegativeNumber, vectorToXyz, xyzToVector } from "./colorimetry-math.js";
30
+ import { requireInputKeys } from "../core/record-validation.js";
31
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
32
+ export const CHROMATIC_ADAPTATION_TRANSFORMS = Object.freeze(["bradford", "cat16", "xyz-scaling"]);
33
+ const CONE_MATRICES = Object.freeze({
34
+ bradford: [[0.8951, 0.2664, -0.1614], [-0.7502, 1.7135, 0.0367], [0.0389, -0.0685, 1.0296]],
35
+ cat16: [[0.401288, 0.650173, -0.051461], [-0.250268, 1.204414, 0.045854], [-0.002079, 0.048952, 0.953127]],
36
+ "xyz-scaling": [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
37
+ });
38
+ function requireTransform(value) {
39
+ if (typeof value !== "string" || !CHROMATIC_ADAPTATION_TRANSFORMS.includes(value)) {
40
+ throw new InvalidConfigurationError("transform must be one of: " + CHROMATIC_ADAPTATION_TRANSFORMS.join(", ") + ".");
41
+ }
42
+ return value;
43
+ }
44
+ /** Returns a copy of the XYZ → cone-space matrix of a transform. */
45
+ export function resolveChromaticAdaptationConeMatrix(transform) {
46
+ return copyMatrix(CONE_MATRICES[requireTransform(transform)]);
47
+ }
48
+ /** Internal: builds the adaptation matrix without an envelope. */
49
+ export function chromaticAdaptationMatrix(input) {
50
+ const transform = requireTransform(input.transform);
51
+ const source = parseWhiteXyz(input.sourceWhiteXyz, "sourceWhiteXyz");
52
+ const destination = parseWhiteXyz(input.destinationWhiteXyz, "destinationWhiteXyz");
53
+ const d = input.degreeOfAdaptation === undefined ? 1 : requireNonNegativeNumber(input.degreeOfAdaptation, "degreeOfAdaptation");
54
+ if (d > 1)
55
+ throw new InvalidScientificInputError("degreeOfAdaptation must lie in [0, 1].");
56
+ const cone = CONE_MATRICES[transform];
57
+ const rs = multiplyMatrixVector(cone, xyzToVector(source));
58
+ const rd = multiplyMatrixVector(cone, xyzToVector(destination));
59
+ if (rs.some((v) => !(v > 0)) || rd.some((v) => !(v > 0))) {
60
+ throw new InvalidScientificInputError("Both whites must have positive cone responses in the selected transform.");
61
+ }
62
+ const yRatio = source.y / destination.y;
63
+ const gains = [0, 1, 2].map((i) => d * yRatio * (rd[i] / rs[i]) + 1 - d);
64
+ const matrix = multiplyMatrices(multiplyMatrices(invertMatrix3x3(cone, "cone matrix"), diagonalMatrix(gains)), cone);
65
+ requireFiniteResult(matrix.flat(), "Chromatic adaptation");
66
+ return { transform, degreeOfAdaptation: d, matrix, coneGains: gains };
67
+ }
68
+ /**
69
+ * Calculates a linear chromatic-adaptation matrix between two whites. Linear CATs are
70
+ * standard models, but they predict corresponding colours only approximately. The matrix
71
+ * itself is calculated exactly from the declared transform.
72
+ */
73
+ export function calculateChromaticAdaptationMatrix(input) {
74
+ requireInputKeys(input, "calculateChromaticAdaptationMatrix", ["transform", "sourceWhiteXyz", "destinationWhiteXyz", "degreeOfAdaptation"]);
75
+ const value = chromaticAdaptationMatrix(input);
76
+ return calculatedResult(value, "chromatic-adaptation-" + value.transform, COLORIMETRY_MODEL_VERSION, [
77
+ "Linear von Kries-type transform M = C⁻¹·diag(D·(Ys/Yd)·ρd/ρs + 1 − D)·C",
78
+ "A linear CAT predicts corresponding colours only approximately; no colour-appearance model is applied"
79
+ ]);
80
+ }
81
+ /** Adapts one XYZ colour between whites with the selected transform. */
82
+ export function calculateChromaticallyAdaptedXyz(input) {
83
+ requireInputKeys(input, "calculateChromaticallyAdaptedXyz", ["transform", "sourceWhiteXyz", "destinationWhiteXyz", "degreeOfAdaptation", "xyz"]);
84
+ const adaptation = chromaticAdaptationMatrix(input);
85
+ const xyz = vectorToXyz(multiplyMatrixVector(adaptation.matrix, xyzToVector(parseXyz(input.xyz, "xyz"))));
86
+ requireFiniteResult([xyz.x, xyz.y, xyz.z], "Chromatic adaptation");
87
+ return calculatedResult({ xyz, matrix: adaptation.matrix }, "chromatic-adaptation-" + adaptation.transform, COLORIMETRY_MODEL_VERSION, [
88
+ "Linear von Kries-type transform; degree of adaptation " + adaptation.degreeOfAdaptation
89
+ ]);
90
+ }
91
+ //# sourceMappingURL=chromatic-adaptation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chromatic-adaptation.js","sourceRoot":"","sources":["../../src/color/chromatic-adaptation.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Von Kries-type linear chromatic adaptation transforms (CATs) on CIE XYZ:\n * M = C⁻¹ · diag(Dᵢ) · C, Dᵢ = D · (Y_s / Y_d) · (ρᵢ,d / ρᵢ,s) + 1 − D\n * where C maps XYZ to a cone-like (\"sharpened\") space, ρ_s and ρ_d are the source and\n * destination whites in that space, and D ∈ [0, 1] is the degree of adaptation. This is\n * the one-step, two-illuminant form of Li et al. (2017) for CAT16; it is used for every\n * transform here. With D = 1 and equal white luminance, the source white maps exactly to\n * the destination white.\n *\n * Cone matrices (published factual constants):\n * - Bradford (linearized): Lam (1985) thesis, University of Bradford; Luo & Rhodes\n * (1999); as used in ICC.1:2010 Annex E. The original blue-channel non-linearity is\n * omitted, as in common practice.\n * - CAT16: Li, Li, Wang, Xu, Luo, Cui, Melgosa & Pointer (2016), \"A Revision of CIECAM02\n * and its CAT and UCS\", IS&T CIC24, pp. 208–212, Eq. (15) (M16),\n * doi:10.2352/ISSN.2169-2629.2017.32.208 (free from the IS&T library). Journal version:\n * Li et al. (2017), \"Comprehensive color solutions: CAM16, CAT16, and CAM16-UCS\",\n * Color Res. Appl. 42(6):703–718.\n * - XYZ scaling: identity cone matrix (diagonal scaling in XYZ; the weakest model).\n * The degree of adaptation D is supplied by the caller (default 1, complete adaptation).\n * CAT02, the von Kries Hunt–Pointer–Estévez matrix and the CIECAM02 formula for D are not\n * part of 2.0: no free source we could confirm prints them (owner decisions, 2026-10-17).\n * @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.\n */\n\nimport { calculatedResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport { COLORIMETRY_MODEL_VERSION } from \"./color-matching-functions.js\";\nimport {\n copyMatrix,\n diagonalMatrix,\n invertMatrix3x3,\n multiplyMatrices,\n multiplyMatrixVector,\n parseWhiteXyz,\n parseXyz,\n requireFiniteResult,\n requireNonNegativeNumber,\n vectorToXyz,\n xyzToVector,\n type CieXyzTristimulus,\n type ColorMatrix3x3\n} from \"./colorimetry-math.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\n/** Supported linear chromatic-adaptation transforms. */\nexport type ChromaticAdaptationTransform = \"bradford\" | \"cat16\" | \"xyz-scaling\";\n\nexport const CHROMATIC_ADAPTATION_TRANSFORMS: readonly ChromaticAdaptationTransform[] = Object.freeze([\"bradford\", \"cat16\", \"xyz-scaling\"]);\n\nconst CONE_MATRICES: Readonly<Record<ChromaticAdaptationTransform, ColorMatrix3x3>> = Object.freeze({\n bradford: [[0.8951, 0.2664, -0.1614], [-0.7502, 1.7135, 0.0367], [0.0389, -0.0685, 1.0296]],\n cat16: [[0.401288, 0.650173, -0.051461], [-0.250268, 1.204414, 0.045854], [-0.002079, 0.048952, 0.953127]],\n \"xyz-scaling\": [[1, 0, 0], [0, 1, 0], [0, 0, 1]]\n});\n\nfunction requireTransform(value: unknown): ChromaticAdaptationTransform {\n if (typeof value !== \"string\" || !(CHROMATIC_ADAPTATION_TRANSFORMS as readonly string[]).includes(value)) {\n throw new InvalidConfigurationError(\"transform must be one of: \" + CHROMATIC_ADAPTATION_TRANSFORMS.join(\", \") + \".\");\n }\n return value as ChromaticAdaptationTransform;\n}\n\n/** Returns a copy of the XYZ → cone-space matrix of a transform. */\nexport function resolveChromaticAdaptationConeMatrix(transform: ChromaticAdaptationTransform): ColorMatrix3x3 {\n return copyMatrix(CONE_MATRICES[requireTransform(transform)]);\n}\n\nexport interface CalculateChromaticAdaptationMatrixInput {\n transform: ChromaticAdaptationTransform;\n /** White of the source viewing/illumination condition (relative XYZ, Y > 0). */\n sourceWhiteXyz: CieXyzTristimulus;\n /** White of the destination condition (relative XYZ, Y > 0). */\n destinationWhiteXyz: CieXyzTristimulus;\n /** Degree of adaptation D in [0, 1]; defaults to 1 (complete adaptation). */\n degreeOfAdaptation?: number;\n}\n\nexport interface ChromaticAdaptationMatrix {\n transform: ChromaticAdaptationTransform;\n degreeOfAdaptation: number;\n /** Row-major XYZ_source → XYZ_destination matrix. */\n matrix: ColorMatrix3x3;\n /** The per-channel cone-space gains Dᵢ. */\n coneGains: readonly [number, number, number];\n}\n\n/** Internal: builds the adaptation matrix without an envelope. */\nexport function chromaticAdaptationMatrix(input: CalculateChromaticAdaptationMatrixInput): ChromaticAdaptationMatrix {\n const transform = requireTransform(input.transform);\n const source = parseWhiteXyz(input.sourceWhiteXyz, \"sourceWhiteXyz\");\n const destination = parseWhiteXyz(input.destinationWhiteXyz, \"destinationWhiteXyz\");\n const d = input.degreeOfAdaptation === undefined ? 1 : requireNonNegativeNumber(input.degreeOfAdaptation, \"degreeOfAdaptation\");\n if (d > 1) throw new InvalidScientificInputError(\"degreeOfAdaptation must lie in [0, 1].\");\n const cone = CONE_MATRICES[transform];\n const rs = multiplyMatrixVector(cone, xyzToVector(source));\n const rd = multiplyMatrixVector(cone, xyzToVector(destination));\n if (rs.some((v) => !(v > 0)) || rd.some((v) => !(v > 0))) {\n throw new InvalidScientificInputError(\"Both whites must have positive cone responses in the selected transform.\");\n }\n const yRatio = source.y / destination.y;\n const gains = [0, 1, 2].map((i) => d * yRatio * (rd[i]! / rs[i]!) + 1 - d) as unknown as readonly [number, number, number];\n const matrix = multiplyMatrices(multiplyMatrices(invertMatrix3x3(cone, \"cone matrix\"), diagonalMatrix(gains)), cone);\n requireFiniteResult(matrix.flat(), \"Chromatic adaptation\");\n return { transform, degreeOfAdaptation: d, matrix, coneGains: gains };\n}\n\n/**\n * Calculates a linear chromatic-adaptation matrix between two whites. Linear CATs are\n * standard models, but they predict corresponding colours only approximately. The matrix\n * itself is calculated exactly from the declared transform.\n */\nexport function calculateChromaticAdaptationMatrix(input: CalculateChromaticAdaptationMatrixInput): CalculationResult<ChromaticAdaptationMatrix> {\n requireInputKeys(input, \"calculateChromaticAdaptationMatrix\", [\"transform\", \"sourceWhiteXyz\", \"destinationWhiteXyz\", \"degreeOfAdaptation\"]);\n const value = chromaticAdaptationMatrix(input);\n return calculatedResult(value, \"chromatic-adaptation-\" + value.transform, COLORIMETRY_MODEL_VERSION, [\n \"Linear von Kries-type transform M = C⁻¹·diag(D·(Ys/Yd)·ρd/ρs + 1 − D)·C\",\n \"A linear CAT predicts corresponding colours only approximately; no colour-appearance model is applied\"\n ]);\n}\n\n/** Adapts one XYZ colour between whites with the selected transform. */\nexport function calculateChromaticallyAdaptedXyz(input: CalculateChromaticAdaptationMatrixInput & { xyz: CieXyzTristimulus }): CalculationResult<{ xyz: CieXyzTristimulus; matrix: ColorMatrix3x3 }> {\n requireInputKeys(input, \"calculateChromaticallyAdaptedXyz\", [\"transform\", \"sourceWhiteXyz\", \"destinationWhiteXyz\", \"degreeOfAdaptation\", \"xyz\"]);\n const adaptation = chromaticAdaptationMatrix(input);\n const xyz = vectorToXyz(multiplyMatrixVector(adaptation.matrix, xyzToVector(parseXyz(input.xyz, \"xyz\"))));\n requireFiniteResult([xyz.x, xyz.y, xyz.z], \"Chromatic adaptation\");\n return calculatedResult({ xyz, matrix: adaptation.matrix }, \"chromatic-adaptation-\" + adaptation.transform, COLORIMETRY_MODEL_VERSION, [\n \"Linear von Kries-type transform; degree of adaptation \" + adaptation.degreeOfAdaptation\n ]);\n}\n"]}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * CIELAB / CIELCh(ab) conversions and colour-difference formulae.
3
+ *
4
+ * - CIELAB (W3C CSS Color 4 Lab; also CIE 15:2018 §8.2.1) with the exact rational constants ε = (6/29)³ and
5
+ * κ = (29/3)³ in the linear segment.
6
+ * - ΔE*ab 1976: Euclidean CIELAB distance.
7
+ * - ΔE*94: asymmetric (first colour is the reference: S_L = 1, S_C = 1 + K₁C*₁, S_H = 1 + K₂C*₁). The
8
+ * default is the formula's published reference conditions (k_L = k_C = k_H = 1, K₁ = 0.045,
9
+ * K₂ = 0.015, often called "graphic arts"); callers may pass their own factors in `cie94Factors`.
10
+ * The engine ships no other preset. The primary source, CIE 116-1995, is not free. The tests check
11
+ * the closed forms for pure lightness, chroma and hue differences and the reference asymmetry.
12
+ * - CIEDE2000, implemented from the formula and implementation notes in Sharma, Wu & Dalal
13
+ * (2005), Color Res. Appl. 30(1):21–30 (paper free at
14
+ * https://hajim.rochester.edu/ece/sites/gsharma/ciede2000/; also CIE 142-2001, ISO/CIE 11664-6).
15
+ * This includes the hue-angle averaging and the handling of the hue discontinuity. The tests check
16
+ * its closed forms for pure lightness, chroma and hue differences (computed in the test), symmetry
17
+ * and identity; the published test pairs are not used (their data file has no licence).
18
+ * @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.
19
+ */
20
+ import { type CalculationResult } from "../core/calculation-result.js";
21
+ import { type CieXyzTristimulus } from "./colorimetry-math.js";
22
+ /** CIE 1976 L*a*b* coordinates. */
23
+ export interface CielabColor {
24
+ lStar: number;
25
+ aStar: number;
26
+ bStar: number;
27
+ }
28
+ /** CIE 1976 L*C*h(ab) coordinates; hue in degrees [0, 360). */
29
+ export interface CielchColor {
30
+ lStar: number;
31
+ chromaStar: number;
32
+ hueDegrees: number;
33
+ }
34
+ /** Internal: XYZ → CIELAB with a validated white (no envelope). */
35
+ export declare function cielabOfXyz(xyz: CieXyzTristimulus, white: CieXyzTristimulus): CielabColor;
36
+ /** Internal: CIELAB → XYZ. */
37
+ export declare function xyzOfCielab(lab: CielabColor, white: CieXyzTristimulus): CieXyzTristimulus;
38
+ /** CIE XYZ → CIELAB relative to a reference white (same XYZ scale). */
39
+ export declare function calculateCielabFromXyz(input: {
40
+ xyz: CieXyzTristimulus;
41
+ referenceWhiteXyz: CieXyzTristimulus;
42
+ }): CalculationResult<CielabColor>;
43
+ /** CIELAB → CIE XYZ relative to a reference white. */
44
+ export declare function calculateXyzFromCielab(input: {
45
+ lab: CielabColor;
46
+ referenceWhiteXyz: CieXyzTristimulus;
47
+ }): CalculationResult<CieXyzTristimulus>;
48
+ /** Internal: CIELAB → LCh(ab). */
49
+ export declare function cielchOfCielab(lab: CielabColor): CielchColor;
50
+ /** Internal: LCh(ab) → CIELAB. */
51
+ export declare function cielabOfCielch(lch: CielchColor): CielabColor;
52
+ /** CIELAB → CIE LCh(ab): C*ab = √(a*² + b*²), h_ab = atan2(b*, a*) in degrees. */
53
+ export declare function calculateCielchFromCielab(input: {
54
+ lab: CielabColor;
55
+ }): CalculationResult<CielchColor>;
56
+ /** CIE LCh(ab) → CIELAB. */
57
+ export declare function calculateCielabFromCielch(input: {
58
+ lch: CielchColor;
59
+ }): CalculationResult<CielabColor>;
60
+ /** Colour-difference formula. */
61
+ export type ColorDifferenceFormula = "cie76" | "cie94" | "ciede2000";
62
+ /** CIEDE2000 parametric factors (default 1, 1, 1 for reference conditions). */
63
+ export interface Ciede2000ParametricFactors {
64
+ lightness: number;
65
+ chroma: number;
66
+ hue: number;
67
+ }
68
+ /**
69
+ * CIE94 parametric factors k_L, k_C, k_H and weighting constants K₁, K₂ (S_C = 1 + K₁C*₁,
70
+ * S_H = 1 + K₂C*₁). The default is the reference conditions: 1, 1, 1, 0.045, 0.015.
71
+ */
72
+ export interface Cie94ParametricFactors {
73
+ /** k_L, greater than zero. */
74
+ lightness: number;
75
+ /** k_C, greater than zero. */
76
+ chroma: number;
77
+ /** k_H, greater than zero. */
78
+ hue: number;
79
+ /** K₁ in S_C = 1 + K₁C*₁; finite and not negative. */
80
+ k1: number;
81
+ /** K₂ in S_H = 1 + K₂C*₁; finite and not negative. */
82
+ k2: number;
83
+ }
84
+ /** Internal: ΔE*ab 1976. */
85
+ export declare function deltaE76(a: CielabColor, b: CielabColor): number;
86
+ /** Internal: ΔE*94 with reference colour `reference`. */
87
+ export declare function deltaE94(reference: CielabColor, sample: CielabColor, factors?: Cie94ParametricFactors): number;
88
+ /** Internal: CIEDE2000 (Sharma, Wu & Dalal 2005 implementation notes). */
89
+ export declare function deltaE2000(lab1: CielabColor, lab2: CielabColor, k?: Ciede2000ParametricFactors): number;
90
+ export interface CalculateColorDifferenceInput {
91
+ /** Reference (standard) colour; ΔE94 is asymmetric in it. */
92
+ reference: CielabColor;
93
+ sample: CielabColor;
94
+ formula: ColorDifferenceFormula;
95
+ /** CIEDE2000 only; defaults to 1, 1, 1. */
96
+ parametricFactors?: Ciede2000ParametricFactors;
97
+ /** CIE94 only; all five fields are required when given. Defaults to the reference conditions 1, 1, 1, 0.045, 0.015. */
98
+ cie94Factors?: Cie94ParametricFactors;
99
+ }
100
+ /** Colour difference between two CIELAB colours with an explicit formula. */
101
+ export declare function calculateColorDifference(input: CalculateColorDifferenceInput): CalculationResult<{
102
+ deltaE: number;
103
+ formula: ColorDifferenceFormula;
104
+ }>;