@photivra/engine 1.5.0 → 2.1.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 (1085) hide show
  1. package/CHANGELOG.md +414 -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/diffraction-provider.d.ts +30 -0
  236. package/dist/facade/diffraction-provider.js +127 -0
  237. package/dist/facade/diffraction-provider.js.map +1 -0
  238. package/dist/facade/host-yield.d.ts +7 -0
  239. package/dist/facade/host-yield.js +19 -0
  240. package/dist/facade/host-yield.js.map +1 -0
  241. package/dist/facade/scene-radiance.d.ts +117 -0
  242. package/dist/facade/scene-radiance.js +205 -0
  243. package/dist/facade/scene-radiance.js.map +1 -0
  244. package/dist/facade/simulate-capture.d.ts +363 -0
  245. package/dist/facade/simulate-capture.js +1281 -0
  246. package/dist/facade/simulate-capture.js.map +1 -0
  247. package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
  248. package/dist/gpu/chart-radiance-gpu.js +176 -0
  249. package/dist/gpu/chart-radiance-gpu.js.map +1 -0
  250. package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
  251. package/dist/gpu/image-kernel-accelerator.js +720 -0
  252. package/dist/gpu/image-kernel-accelerator.js.map +1 -0
  253. package/dist/gpu/image-kernel-execution.d.ts +92 -0
  254. package/dist/gpu/image-kernel-execution.js +84 -0
  255. package/dist/gpu/image-kernel-execution.js.map +1 -0
  256. package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
  257. package/dist/gpu/sensor-stage-gpu.js +317 -0
  258. package/dist/gpu/sensor-stage-gpu.js.map +1 -0
  259. package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
  260. package/dist/gpu/temporal-sum-gpu.js +150 -0
  261. package/dist/gpu/temporal-sum-gpu.js.map +1 -0
  262. package/dist/gpu/webgpu-runtime.d.ts +63 -0
  263. package/dist/gpu/webgpu-runtime.js +215 -0
  264. package/dist/gpu/webgpu-runtime.js.map +1 -0
  265. package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
  266. package/dist/gpu/wgsl-chart-kernel.js +165 -0
  267. package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
  268. package/dist/gpu/wgsl-kernels.d.ts +53 -0
  269. package/dist/gpu/wgsl-kernels.js +365 -0
  270. package/dist/gpu/wgsl-kernels.js.map +1 -0
  271. package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
  272. package/dist/gpu/wgsl-sensor-kernel.js +409 -0
  273. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
  274. package/dist/index.d.ts +91 -25
  275. package/dist/index.js +60 -15
  276. package/dist/index.js.map +1 -1
  277. package/dist/motion/camera-rotation.d.ts +92 -40
  278. package/dist/motion/camera-rotation.js +84 -47
  279. package/dist/motion/camera-rotation.js.map +1 -1
  280. package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
  281. package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
  282. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  283. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
  284. package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
  285. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  286. package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
  287. package/dist/motion/capture-rotation-trajectory.js +36 -26
  288. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  289. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
  290. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
  291. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  292. package/dist/motion/extended-object-projection.d.ts +19 -16
  293. package/dist/motion/extended-object-projection.js +38 -18
  294. package/dist/motion/extended-object-projection.js.map +1 -1
  295. package/dist/motion/projected-motion.d.ts +18 -17
  296. package/dist/motion/projected-motion.js +25 -17
  297. package/dist/motion/projected-motion.js.map +1 -1
  298. package/dist/motion/temporal-exposure-sum.d.ts +55 -0
  299. package/dist/motion/temporal-exposure-sum.js +141 -0
  300. package/dist/motion/temporal-exposure-sum.js.map +1 -0
  301. package/dist/motion/video-sequence.d.ts +111 -0
  302. package/dist/motion/video-sequence.js +179 -0
  303. package/dist/motion/video-sequence.js.map +1 -0
  304. package/dist/optics/aperture.d.ts +14 -15
  305. package/dist/optics/aperture.js +13 -11
  306. package/dist/optics/aperture.js.map +1 -1
  307. package/dist/optics/atmospheric-haze.d.ts +83 -0
  308. package/dist/optics/atmospheric-haze.js +113 -0
  309. package/dist/optics/atmospheric-haze.js.map +1 -0
  310. package/dist/optics/brown-conrady-distortion.d.ts +116 -0
  311. package/dist/optics/brown-conrady-distortion.js +291 -0
  312. package/dist/optics/brown-conrady-distortion.js.map +1 -0
  313. package/dist/optics/circle-of-confusion.d.ts +10 -10
  314. package/dist/optics/circle-of-confusion.js +15 -11
  315. package/dist/optics/circle-of-confusion.js.map +1 -1
  316. package/dist/optics/complex-pupil-psf.d.ts +64 -33
  317. package/dist/optics/complex-pupil-psf.js +190 -98
  318. package/dist/optics/complex-pupil-psf.js.map +1 -1
  319. package/dist/optics/depth-of-field.d.ts +25 -15
  320. package/dist/optics/depth-of-field.js +67 -27
  321. package/dist/optics/depth-of-field.js.map +1 -1
  322. package/dist/optics/diffraction-psf-profile.d.ts +118 -0
  323. package/dist/optics/diffraction-psf-profile.js +252 -0
  324. package/dist/optics/diffraction-psf-profile.js.map +1 -0
  325. package/dist/optics/diffraction.d.ts +14 -13
  326. package/dist/optics/diffraction.js +14 -10
  327. package/dist/optics/diffraction.js.map +1 -1
  328. package/dist/optics/focus-breathing.d.ts +88 -27
  329. package/dist/optics/focus-breathing.js +114 -23
  330. package/dist/optics/focus-breathing.js.map +1 -1
  331. package/dist/optics/focus-state.d.ts +18 -18
  332. package/dist/optics/focus-state.js +21 -15
  333. package/dist/optics/focus-state.js.map +1 -1
  334. package/dist/optics/front-of-lens-filter.d.ts +45 -14
  335. package/dist/optics/front-of-lens-filter.js +259 -88
  336. package/dist/optics/front-of-lens-filter.js.map +1 -1
  337. package/dist/optics/illumination-vignetting.d.ts +16 -17
  338. package/dist/optics/illumination-vignetting.js +40 -17
  339. package/dist/optics/illumination-vignetting.js.map +1 -1
  340. package/dist/optics/irradiance-convolution.d.ts +59 -0
  341. package/dist/optics/irradiance-convolution.js +138 -0
  342. package/dist/optics/irradiance-convolution.js.map +1 -0
  343. package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
  344. package/dist/optics/lateral-chromatic-aberration.js +33 -23
  345. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  346. package/dist/optics/lens-psf-kernels.d.ts +89 -0
  347. package/dist/optics/lens-psf-kernels.js +175 -0
  348. package/dist/optics/lens-psf-kernels.js.map +1 -0
  349. package/dist/optics/lens-psf-profile.d.ts +78 -46
  350. package/dist/optics/lens-psf-profile.js +335 -124
  351. package/dist/optics/lens-psf-profile.js.map +1 -1
  352. package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
  353. package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
  354. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
  355. package/dist/optics/polygon-diffraction.d.ts +80 -23
  356. package/dist/optics/polygon-diffraction.js +130 -25
  357. package/dist/optics/polygon-diffraction.js.map +1 -1
  358. package/dist/optics/profile-contract.d.ts +5 -6
  359. package/dist/optics/profile-contract.js +14 -11
  360. package/dist/optics/profile-contract.js.map +1 -1
  361. package/dist/optics/psf-foundation.d.ts +23 -23
  362. package/dist/optics/psf-foundation.js +24 -21
  363. package/dist/optics/psf-foundation.js.map +1 -1
  364. package/dist/optics/pupil-vignetting.d.ts +118 -0
  365. package/dist/optics/pupil-vignetting.js +264 -0
  366. package/dist/optics/pupil-vignetting.js.map +1 -0
  367. package/dist/optics/radial-distortion.d.ts +34 -33
  368. package/dist/optics/radial-distortion.js +37 -30
  369. package/dist/optics/radial-distortion.js.map +1 -1
  370. package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
  371. package/dist/optics/scene-to-sensor-irradiance.js +73 -45
  372. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  373. package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
  374. package/dist/optics/scene-to-sensor-quadrature.js +16 -11
  375. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
  376. package/dist/optics/sensor-aperture-rays.d.ts +20 -4
  377. package/dist/optics/sensor-aperture-rays.js +32 -14
  378. package/dist/optics/sensor-aperture-rays.js.map +1 -1
  379. package/dist/optics/sensor-environment-query.d.ts +81 -16
  380. package/dist/optics/sensor-environment-query.js +145 -12
  381. package/dist/optics/sensor-environment-query.js.map +1 -1
  382. package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
  383. package/dist/optics/sensor-psf-quadrature.js +18 -11
  384. package/dist/optics/sensor-psf-quadrature.js.map +1 -1
  385. package/dist/optics/sensor-psf-support.d.ts +8 -6
  386. package/dist/optics/sensor-psf-support.js +8 -5
  387. package/dist/optics/sensor-psf-support.js.map +1 -1
  388. package/dist/optics/stray-light.d.ts +22 -19
  389. package/dist/optics/stray-light.js +18 -12
  390. package/dist/optics/stray-light.js.map +1 -1
  391. package/dist/optics/thin-lens.d.ts +10 -9
  392. package/dist/optics/thin-lens.js +12 -8
  393. package/dist/optics/thin-lens.js.map +1 -1
  394. package/dist/optics/zernike-wavefront.d.ts +154 -0
  395. package/dist/optics/zernike-wavefront.js +352 -0
  396. package/dist/optics/zernike-wavefront.js.map +1 -0
  397. package/dist/output/capture-corrected-sdr.d.ts +16 -8
  398. package/dist/output/capture-corrected-sdr.js +16 -8
  399. package/dist/output/capture-corrected-sdr.js.map +1 -1
  400. package/dist/output/capture-geometry.d.ts +34 -36
  401. package/dist/output/capture-geometry.js +52 -32
  402. package/dist/output/capture-geometry.js.map +1 -1
  403. package/dist/output/capture-sdr.d.ts +7 -6
  404. package/dist/output/capture-sdr.js +11 -8
  405. package/dist/output/capture-sdr.js.map +1 -1
  406. package/dist/output/crop.d.ts +22 -6
  407. package/dist/output/crop.js +40 -6
  408. package/dist/output/crop.js.map +1 -1
  409. package/dist/output/geometric-transforms.d.ts +60 -23
  410. package/dist/output/geometric-transforms.js +111 -24
  411. package/dist/output/geometric-transforms.js.map +1 -1
  412. package/dist/output/lens-corrections.d.ts +27 -19
  413. package/dist/output/lens-corrections.js +29 -13
  414. package/dist/output/lens-corrections.js.map +1 -1
  415. package/dist/output/native-capture-sdr.d.ts +71 -16
  416. package/dist/output/native-capture-sdr.js +190 -33
  417. package/dist/output/native-capture-sdr.js.map +1 -1
  418. package/dist/output/png-encoder.d.ts +65 -0
  419. package/dist/output/png-encoder.js +461 -0
  420. package/dist/output/png-encoder.js.map +1 -0
  421. package/dist/output/print-contrast-reference.d.ts +10 -9
  422. package/dist/output/print-contrast-reference.js +10 -8
  423. package/dist/output/print-contrast-reference.js.map +1 -1
  424. package/dist/output/print-detail.d.ts +18 -17
  425. package/dist/output/print-detail.js +12 -10
  426. package/dist/output/print-detail.js.map +1 -1
  427. package/dist/output/print-jpeg.d.ts +26 -5
  428. package/dist/output/print-jpeg.js +117 -50
  429. package/dist/output/print-jpeg.js.map +1 -1
  430. package/dist/output/print-plan.d.ts +19 -19
  431. package/dist/output/print-plan.js +11 -10
  432. package/dist/output/print-plan.js.map +1 -1
  433. package/dist/output/print-region-statistics.d.ts +14 -15
  434. package/dist/output/print-region-statistics.js +11 -11
  435. package/dist/output/print-region-statistics.js.map +1 -1
  436. package/dist/output/sdr-rendering.d.ts +48 -10
  437. package/dist/output/sdr-rendering.js +114 -25
  438. package/dist/output/sdr-rendering.js.map +1 -1
  439. package/dist/output/subject-framing-crop.d.ts +6 -10
  440. package/dist/output/subject-framing-crop.js +23 -13
  441. package/dist/output/subject-framing-crop.js.map +1 -1
  442. package/dist/processing/demosaic.d.ts +90 -0
  443. package/dist/processing/demosaic.js +275 -0
  444. package/dist/processing/demosaic.js.map +1 -0
  445. package/dist/processing/denoise.d.ts +68 -0
  446. package/dist/processing/denoise.js +214 -0
  447. package/dist/processing/denoise.js.map +1 -0
  448. package/dist/processing/focus-stacking.d.ts +17 -0
  449. package/dist/processing/focus-stacking.js +80 -0
  450. package/dist/processing/focus-stacking.js.map +1 -0
  451. package/dist/processing/hdr.d.ts +54 -0
  452. package/dist/processing/hdr.js +172 -0
  453. package/dist/processing/hdr.js.map +1 -0
  454. package/dist/processing/image-ops.d.ts +66 -0
  455. package/dist/processing/image-ops.js +192 -0
  456. package/dist/processing/image-ops.js.map +1 -0
  457. package/dist/processing/panorama.d.ts +51 -0
  458. package/dist/processing/panorama.js +305 -0
  459. package/dist/processing/panorama.js.map +1 -0
  460. package/dist/processing/processing-task.d.ts +85 -0
  461. package/dist/processing/processing-task.js +164 -0
  462. package/dist/processing/processing-task.js.map +1 -0
  463. package/dist/processing/tone-mapping.d.ts +69 -0
  464. package/dist/processing/tone-mapping.js +310 -0
  465. package/dist/processing/tone-mapping.js.map +1 -0
  466. package/dist/schema/camera.d.ts +5 -4
  467. package/dist/schema/illumination-spectral.d.ts +13 -19
  468. package/dist/schema/illumination-spectral.js +23 -19
  469. package/dist/schema/illumination-spectral.js.map +1 -1
  470. package/dist/schema/illumination-temporal.d.ts +12 -15
  471. package/dist/schema/illumination-temporal.js +43 -28
  472. package/dist/schema/illumination-temporal.js.map +1 -1
  473. package/dist/schema/illumination.d.ts +5 -4
  474. package/dist/schema/illumination.js +55 -20
  475. package/dist/schema/illumination.js.map +1 -1
  476. package/dist/schema/scene-radiance-temporal.d.ts +9 -11
  477. package/dist/schema/scene-radiance-temporal.js +26 -23
  478. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  479. package/dist/schema/scene-radiance.d.ts +17 -17
  480. package/dist/schema/scene-radiance.js +56 -34
  481. package/dist/schema/scene-radiance.js.map +1 -1
  482. package/dist/schema/scene.d.ts +14 -13
  483. package/dist/schema/validation.d.ts +0 -1
  484. package/dist/schema/validation.js +17 -15
  485. package/dist/schema/validation.js.map +1 -1
  486. package/dist/sensor/accumulated-charge.d.ts +45 -64
  487. package/dist/sensor/accumulated-charge.js +41 -47
  488. package/dist/sensor/accumulated-charge.js.map +1 -1
  489. package/dist/sensor/architecture.d.ts +22 -25
  490. package/dist/sensor/architecture.js +17 -16
  491. package/dist/sensor/architecture.js.map +1 -1
  492. package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
  493. package/dist/sensor/camera-saturation-capacity.js +36 -34
  494. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  495. package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
  496. package/dist/sensor/capture-color-sampling-binding.js +39 -41
  497. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  498. package/dist/sensor/capture-mode-timing.d.ts +8 -9
  499. package/dist/sensor/capture-mode-timing.js +24 -21
  500. package/dist/sensor/capture-mode-timing.js.map +1 -1
  501. package/dist/sensor/capture-mode.d.ts +28 -30
  502. package/dist/sensor/capture-mode.js +33 -31
  503. package/dist/sensor/capture-mode.js.map +1 -1
  504. package/dist/sensor/color-sampling.d.ts +30 -33
  505. package/dist/sensor/color-sampling.js +32 -37
  506. package/dist/sensor/color-sampling.js.map +1 -1
  507. package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
  508. package/dist/sensor/constant-rate-temporal-integration.js +28 -26
  509. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  510. package/dist/sensor/dark-current.d.ts +53 -49
  511. package/dist/sensor/dark-current.js +87 -46
  512. package/dist/sensor/dark-current.js.map +1 -1
  513. package/dist/sensor/environment-photo-signal.d.ts +71 -30
  514. package/dist/sensor/environment-photo-signal.js +127 -46
  515. package/dist/sensor/environment-photo-signal.js.map +1 -1
  516. package/dist/sensor/eqe-electron-rate.d.ts +14 -13
  517. package/dist/sensor/eqe-electron-rate.js +34 -14
  518. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  519. package/dist/sensor/eqe-local-exposure.d.ts +24 -24
  520. package/dist/sensor/eqe-local-exposure.js +15 -11
  521. package/dist/sensor/eqe-local-exposure.js.map +1 -1
  522. package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
  523. package/dist/sensor/eqe-temporal-exposure.js +15 -10
  524. package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
  525. package/dist/sensor/exposure-window.d.ts +48 -34
  526. package/dist/sensor/exposure-window.js +77 -36
  527. package/dist/sensor/exposure-window.js.map +1 -1
  528. package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
  529. package/dist/sensor/fixed-pattern-noise.js +166 -0
  530. package/dist/sensor/fixed-pattern-noise.js.map +1 -0
  531. package/dist/sensor/iso-gain.d.ts +44 -0
  532. package/dist/sensor/iso-gain.js +119 -0
  533. package/dist/sensor/iso-gain.js.map +1 -0
  534. package/dist/sensor/iso-signal-chain.d.ts +25 -48
  535. package/dist/sensor/iso-signal-chain.js +52 -66
  536. package/dist/sensor/iso-signal-chain.js.map +1 -1
  537. package/dist/sensor/local-exposure-binding.d.ts +21 -21
  538. package/dist/sensor/local-exposure-binding.js +22 -18
  539. package/dist/sensor/local-exposure-binding.js.map +1 -1
  540. package/dist/sensor/optical-stack.d.ts +36 -40
  541. package/dist/sensor/optical-stack.js +34 -37
  542. package/dist/sensor/optical-stack.js.map +1 -1
  543. package/dist/sensor/photon-energy.d.ts +22 -28
  544. package/dist/sensor/photon-energy.js +42 -34
  545. package/dist/sensor/photon-energy.js.map +1 -1
  546. package/dist/sensor/physical-charge-capacity.d.ts +20 -30
  547. package/dist/sensor/physical-charge-capacity.js +35 -36
  548. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  549. package/dist/sensor/pixel-pitch.d.ts +2 -3
  550. package/dist/sensor/pixel-pitch.js +4 -2
  551. package/dist/sensor/pixel-pitch.js.map +1 -1
  552. package/dist/sensor/radiometry-readiness.d.ts +13 -15
  553. package/dist/sensor/radiometry-readiness.js +20 -17
  554. package/dist/sensor/radiometry-readiness.js.map +1 -1
  555. package/dist/sensor/raw-readout.d.ts +173 -83
  556. package/dist/sensor/raw-readout.js +425 -160
  557. package/dist/sensor/raw-readout.js.map +1 -1
  558. package/dist/sensor/raw-reconstruction.d.ts +112 -44
  559. package/dist/sensor/raw-reconstruction.js +200 -47
  560. package/dist/sensor/raw-reconstruction.js.map +1 -1
  561. package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
  562. package/dist/sensor/readout-exposure-linkage.js +125 -27
  563. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  564. package/dist/sensor/readout-timing.d.ts +43 -44
  565. package/dist/sensor/readout-timing.js +38 -30
  566. package/dist/sensor/readout-timing.js.map +1 -1
  567. package/dist/sensor/response-application-compatibility.d.ts +21 -28
  568. package/dist/sensor/response-application-compatibility.js +35 -34
  569. package/dist/sensor/response-application-compatibility.js.map +1 -1
  570. package/dist/sensor/response-operating-range.d.ts +26 -35
  571. package/dist/sensor/response-operating-range.js +40 -39
  572. package/dist/sensor/response-operating-range.js.map +1 -1
  573. package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
  574. package/dist/sensor/responsivity-photocurrent.js +57 -40
  575. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  576. package/dist/sensor/sampling-aperture.d.ts +21 -25
  577. package/dist/sensor/sampling-aperture.js +29 -28
  578. package/dist/sensor/sampling-aperture.js.map +1 -1
  579. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
  580. package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
  581. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
  582. package/dist/sensor/sensor-geometry.d.ts +28 -32
  583. package/dist/sensor/sensor-geometry.js +35 -20
  584. package/dist/sensor/sensor-geometry.js.map +1 -1
  585. package/dist/sensor/signal-noise.d.ts +14 -16
  586. package/dist/sensor/signal-noise.js +15 -13
  587. package/dist/sensor/signal-noise.js.map +1 -1
  588. package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
  589. package/dist/sensor/spatial-sample-reduction.js +39 -48
  590. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  591. package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
  592. package/dist/sensor/spatial-sampling-quadrature.js +31 -36
  593. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  594. package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
  595. package/dist/sensor/spatio-spectral-reduction.js +24 -29
  596. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  597. package/dist/sensor/spectral-coverage.d.ts +6 -9
  598. package/dist/sensor/spectral-coverage.js +9 -6
  599. package/dist/sensor/spectral-coverage.js.map +1 -1
  600. package/dist/sensor/spectral-quadrature.d.ts +46 -60
  601. package/dist/sensor/spectral-quadrature.js +38 -48
  602. package/dist/sensor/spectral-quadrature.js.map +1 -1
  603. package/dist/sensor/spectral-response.d.ts +53 -41
  604. package/dist/sensor/spectral-response.js +80 -47
  605. package/dist/sensor/spectral-response.js.map +1 -1
  606. package/dist/sensor/stochastic-seed.d.ts +50 -0
  607. package/dist/sensor/stochastic-seed.js +123 -0
  608. package/dist/sensor/stochastic-seed.js.map +1 -0
  609. package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
  610. package/dist/sensor/temporal-eqe-sum.js +5 -6
  611. package/dist/sensor/temporal-eqe-sum.js.map +1 -1
  612. package/dist/sensor/temporal-photo-signal.d.ts +5 -6
  613. package/dist/sensor/temporal-photo-signal.js +11 -10
  614. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  615. package/dist/sensor/temporal-sample-binding.d.ts +1 -2
  616. package/dist/sensor/temporal-sample-binding.js +3 -3
  617. package/dist/sensor/temporal-sample-binding.js.map +1 -1
  618. package/dist/simulation/poc-simulation.d.ts +16 -16
  619. package/dist/simulation/poc-simulation.js +20 -15
  620. package/dist/simulation/poc-simulation.js.map +1 -1
  621. package/dist/stabilization/camera-shake.d.ts +42 -18
  622. package/dist/stabilization/camera-shake.js +43 -20
  623. package/dist/stabilization/camera-shake.js.map +1 -1
  624. package/dist/stabilization/system.d.ts +44 -41
  625. package/dist/stabilization/system.js +196 -108
  626. package/dist/stabilization/system.js.map +1 -1
  627. package/docs/AGENT_GUIDE.md +183 -0
  628. package/docs/API_REFERENCE.md +777 -2
  629. package/docs/QUICK_START.md +663 -0
  630. package/docs/USAGE.md +1719 -714
  631. package/docs/api/camera-equivalent-focal-length.md +6 -7
  632. package/docs/api/camera-field-of-view.md +16 -8
  633. package/docs/api/camera-lens-projection.md +246 -0
  634. package/docs/api/camera-projected-object-size.md +6 -5
  635. package/docs/api/capture-capture-export-metadata.md +10 -10
  636. package/docs/api/capture-dng-import.md +134 -0
  637. package/docs/api/capture-environment-raw-producer.md +17 -11
  638. package/docs/api/capture-export-jpeg.md +16 -0
  639. package/docs/api/capture-focus-control.md +25 -47
  640. package/docs/api/capture-linear-encoding.md +21 -12
  641. package/docs/api/capture-lossless-jpeg.md +49 -0
  642. package/docs/api/capture-native-environment-optical-stage.md +75 -0
  643. package/docs/api/capture-native-environment-raw.md +161 -4
  644. package/docs/api/capture-native-raw-development.md +69 -8
  645. package/docs/api/capture-native-raw-dng.md +84 -0
  646. package/docs/api/capture-native-raw.md +21 -10
  647. package/docs/api/capture-packed-sensor-raw.md +156 -0
  648. package/docs/api/capture-photographic-export.md +69 -31
  649. package/docs/api/capture-raw-frame-reconstruction.md +8 -8
  650. package/docs/api/capture-raw-white-level.md +37 -0
  651. package/docs/api/capture-release-sequence.md +6 -7
  652. package/docs/api/capture-sensor-raw-frame.md +6 -6
  653. package/docs/api/capture-sensor-raw-producer.md +17 -11
  654. package/docs/api/capture-simulated-capture.md +15 -15
  655. package/docs/api/color-camera-color-matrix.md +103 -0
  656. package/docs/api/color-capture-color.md +22 -11
  657. package/docs/api/color-chromatic-adaptation.md +82 -0
  658. package/docs/api/color-color-difference.md +134 -0
  659. package/docs/api/color-color-matching-functions.md +259 -0
  660. package/docs/api/color-colorimetry-math.md +54 -0
  661. package/docs/api/color-gamut-mapping.md +72 -0
  662. package/docs/api/color-illuminants.md +280 -0
  663. package/docs/api/color-rgb-color-spaces.md +151 -0
  664. package/docs/api/color-sensor-color-development.md +27 -0
  665. package/docs/api/color-srgb-icc.md +2 -4
  666. package/docs/api/color-white-balance.md +95 -19
  667. package/docs/api/composition-image-formation-plan.md +124 -95
  668. package/docs/api/composition-plan-consumer.md +7 -7
  669. package/docs/api/core-calculation-result.md +18 -14
  670. package/docs/api/core-configuration-error.md +1 -1
  671. package/docs/api/core-image-formation.md +7 -7
  672. package/docs/api/core-scientific-assurance.md +12 -10
  673. package/docs/api/core-spectral-composition.md +14 -14
  674. package/docs/api/core-spectral.md +6 -6
  675. package/docs/api/core-validation.md +3 -3
  676. package/docs/api/core-version.md +7 -6
  677. package/docs/api/equipment-exposure-capabilities.md +11 -10
  678. package/docs/api/equipment-generic-tier-assets.md +7 -2
  679. package/docs/api/equipment-generic-tier-presets.md +6 -6
  680. package/docs/api/equipment-iso-capabilities.md +18 -18
  681. package/docs/api/equipment-metering-capabilities.md +6 -6
  682. package/docs/api/equipment-release-capabilities.md +4 -4
  683. package/docs/api/exports.json +2253 -3
  684. package/docs/api/exposure-exposure-duration-control.md +9 -9
  685. package/docs/api/exposure-exposure-mode-resolver.md +35 -31
  686. package/docs/api/exposure-exposure.md +10 -10
  687. package/docs/api/exposure-flash-ttl.md +182 -0
  688. package/docs/api/exposure-flash.md +183 -28
  689. package/docs/api/exposure-metering-scene-radiance.md +11 -10
  690. package/docs/api/exposure-metering-target.md +9 -8
  691. package/docs/api/exposure-metering-temporal.md +8 -8
  692. package/docs/api/exposure-metering.md +69 -9
  693. package/docs/api/exposure-program-line.md +6 -5
  694. package/docs/api/facade-chart-radiance-batch.md +96 -0
  695. package/docs/api/facade-chart-scenes.md +240 -0
  696. package/docs/api/facade-scene-radiance.md +122 -0
  697. package/docs/api/facade-simulate-capture.md +397 -0
  698. package/docs/api/gpu-image-kernel-accelerator.md +157 -0
  699. package/docs/api/gpu-image-kernel-execution.md +152 -0
  700. package/docs/api/motion-camera-rotation.md +43 -26
  701. package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
  702. package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
  703. package/docs/api/motion-capture-rotation-trajectory.md +15 -15
  704. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
  705. package/docs/api/motion-extended-object-projection.md +10 -8
  706. package/docs/api/motion-projected-motion.md +8 -8
  707. package/docs/api/motion-temporal-exposure-sum.md +98 -0
  708. package/docs/api/motion-video-sequence.md +159 -0
  709. package/docs/api/optics-aperture.md +8 -8
  710. package/docs/api/optics-atmospheric-haze.md +104 -0
  711. package/docs/api/optics-brown-conrady-distortion.md +123 -0
  712. package/docs/api/optics-circle-of-confusion.md +5 -4
  713. package/docs/api/optics-complex-pupil-psf.md +57 -16
  714. package/docs/api/optics-depth-of-field.md +12 -6
  715. package/docs/api/optics-diffraction-psf-profile.md +96 -0
  716. package/docs/api/optics-diffraction.md +8 -7
  717. package/docs/api/optics-focus-breathing.md +104 -16
  718. package/docs/api/optics-focus-state.md +9 -10
  719. package/docs/api/optics-front-of-lens-filter.md +72 -14
  720. package/docs/api/optics-illumination-vignetting.md +10 -10
  721. package/docs/api/optics-irradiance-convolution.md +95 -0
  722. package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
  723. package/docs/api/optics-lens-psf-kernels.md +72 -0
  724. package/docs/api/optics-lens-psf-profile.md +48 -26
  725. package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
  726. package/docs/api/optics-polygon-diffraction.md +78 -13
  727. package/docs/api/optics-profile-contract.md +4 -4
  728. package/docs/api/optics-psf-foundation.md +12 -12
  729. package/docs/api/optics-pupil-vignetting.md +132 -0
  730. package/docs/api/optics-radial-distortion.md +12 -12
  731. package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
  732. package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
  733. package/docs/api/optics-sensor-aperture-rays.md +3 -2
  734. package/docs/api/optics-sensor-environment-query.md +52 -9
  735. package/docs/api/optics-sensor-psf-quadrature.md +13 -10
  736. package/docs/api/optics-stray-light.md +12 -11
  737. package/docs/api/optics-thin-lens.md +4 -3
  738. package/docs/api/optics-zernike-wavefront.md +229 -0
  739. package/docs/api/output-capture-corrected-sdr.md +10 -7
  740. package/docs/api/output-capture-geometry.md +35 -36
  741. package/docs/api/output-capture-sdr.md +4 -4
  742. package/docs/api/output-crop.md +7 -4
  743. package/docs/api/output-geometric-transforms.md +65 -19
  744. package/docs/api/output-lens-corrections.md +17 -15
  745. package/docs/api/output-native-capture-sdr.md +26 -13
  746. package/docs/api/output-png-encoder.md +105 -0
  747. package/docs/api/output-print-contrast-reference.md +8 -8
  748. package/docs/api/output-print-detail.md +14 -14
  749. package/docs/api/output-print-jpeg.md +22 -5
  750. package/docs/api/output-print-plan.md +18 -18
  751. package/docs/api/output-print-region-statistics.md +14 -14
  752. package/docs/api/output-sdr-rendering.md +52 -10
  753. package/docs/api/output-subject-framing-crop.md +5 -6
  754. package/docs/api/processing-demosaic.md +120 -0
  755. package/docs/api/processing-denoise.md +148 -0
  756. package/docs/api/processing-focus-stacking.md +41 -0
  757. package/docs/api/processing-hdr.md +113 -0
  758. package/docs/api/processing-panorama.md +82 -0
  759. package/docs/api/processing-processing-task.md +107 -0
  760. package/docs/api/processing-tone-mapping.md +142 -0
  761. package/docs/api/schema-camera.md +6 -4
  762. package/docs/api/schema-illumination-spectral.md +10 -11
  763. package/docs/api/schema-illumination-temporal.md +13 -15
  764. package/docs/api/schema-illumination.md +4 -4
  765. package/docs/api/schema-scene-radiance-temporal.md +10 -11
  766. package/docs/api/schema-scene-radiance.md +18 -17
  767. package/docs/api/schema-scene.md +9 -9
  768. package/docs/api/schema-validation.md +1 -1
  769. package/docs/api/sensor-accumulated-charge.md +12 -20
  770. package/docs/api/sensor-architecture.md +15 -16
  771. package/docs/api/sensor-camera-saturation-capacity.md +9 -11
  772. package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
  773. package/docs/api/sensor-capture-mode-timing.md +9 -9
  774. package/docs/api/sensor-capture-mode.md +29 -30
  775. package/docs/api/sensor-color-sampling.md +31 -33
  776. package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
  777. package/docs/api/sensor-dark-current.md +30 -14
  778. package/docs/api/sensor-environment-photo-signal.md +13 -6
  779. package/docs/api/sensor-eqe-electron-rate.md +9 -8
  780. package/docs/api/sensor-eqe-local-exposure.md +18 -17
  781. package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
  782. package/docs/api/sensor-exposure-window.md +24 -24
  783. package/docs/api/sensor-fixed-pattern-noise.md +104 -0
  784. package/docs/api/sensor-iso-gain.md +63 -0
  785. package/docs/api/sensor-iso-signal-chain.md +13 -22
  786. package/docs/api/sensor-local-exposure-binding.md +12 -13
  787. package/docs/api/sensor-optical-stack.md +37 -40
  788. package/docs/api/sensor-photon-energy.md +10 -11
  789. package/docs/api/sensor-physical-charge-capacity.md +8 -13
  790. package/docs/api/sensor-pixel-pitch.md +1 -1
  791. package/docs/api/sensor-radiometry-readiness.md +9 -9
  792. package/docs/api/sensor-raw-readout.md +118 -52
  793. package/docs/api/sensor-raw-reconstruction.md +97 -20
  794. package/docs/api/sensor-readout-exposure-linkage.md +120 -24
  795. package/docs/api/sensor-readout-timing.md +33 -35
  796. package/docs/api/sensor-response-application-compatibility.md +9 -11
  797. package/docs/api/sensor-response-operating-range.md +14 -18
  798. package/docs/api/sensor-responsivity-photocurrent.md +9 -12
  799. package/docs/api/sensor-sampling-aperture.md +22 -25
  800. package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
  801. package/docs/api/sensor-sensor-geometry.md +23 -24
  802. package/docs/api/sensor-signal-noise.md +10 -10
  803. package/docs/api/sensor-spatial-sample-reduction.md +27 -30
  804. package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
  805. package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
  806. package/docs/api/sensor-spectral-coverage.md +5 -5
  807. package/docs/api/sensor-spectral-quadrature.md +33 -35
  808. package/docs/api/sensor-spectral-response.md +28 -16
  809. package/docs/api/sensor-temporal-photo-signal.md +6 -6
  810. package/docs/api/simulation-poc-simulation.md +17 -16
  811. package/docs/api/stabilization-camera-shake.md +29 -10
  812. package/docs/api/stabilization-system.md +25 -21
  813. package/docs/examples/production-request.json +3821 -2157
  814. package/docs/examples/simulate-capture.mjs +14 -0
  815. package/llms.txt +35 -0
  816. package/package.json +32 -11
  817. package/AGENTS.md +0 -674
  818. package/CONTRIBUTING.md +0 -76
  819. package/DCO +0 -33
  820. package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
  821. package/dist/camera/field-of-view.d.ts.map +0 -1
  822. package/dist/camera/projected-object-size.d.ts.map +0 -1
  823. package/dist/capture/capture-export-metadata.d.ts.map +0 -1
  824. package/dist/capture/environment-raw-producer.d.ts.map +0 -1
  825. package/dist/capture/export-jpeg.d.ts.map +0 -1
  826. package/dist/capture/export-tiff.d.ts.map +0 -1
  827. package/dist/capture/focus-control.d.ts.map +0 -1
  828. package/dist/capture/linear-encoding.d.ts.map +0 -1
  829. package/dist/capture/native-environment-raw.d.ts.map +0 -1
  830. package/dist/capture/native-raw-development.d.ts.map +0 -1
  831. package/dist/capture/native-raw.d.ts.map +0 -1
  832. package/dist/capture/photographic-export.d.ts.map +0 -1
  833. package/dist/capture/raw-frame-limits.d.ts.map +0 -1
  834. package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
  835. package/dist/capture/release-sequence.d.ts.map +0 -1
  836. package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
  837. package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
  838. package/dist/capture/simulated-capture.d.ts.map +0 -1
  839. package/dist/color/capture-color.d.ts.map +0 -1
  840. package/dist/color/sensor-color-development.d.ts.map +0 -1
  841. package/dist/color/srgb-icc.d.ts.map +0 -1
  842. package/dist/color/srgb-transfer.d.ts.map +0 -1
  843. package/dist/color/white-balance.d.ts.map +0 -1
  844. package/dist/composition/image-formation-plan.d.ts.map +0 -1
  845. package/dist/composition/plan-consumer.d.ts.map +0 -1
  846. package/dist/core/calculation-result.d.ts.map +0 -1
  847. package/dist/core/canonical-json.d.ts.map +0 -1
  848. package/dist/core/configuration-error.d.ts.map +0 -1
  849. package/dist/core/evidence-provenance.d.ts.map +0 -1
  850. package/dist/core/image-formation.d.ts.map +0 -1
  851. package/dist/core/owned-data.d.ts.map +0 -1
  852. package/dist/core/record-validation.d.ts.map +0 -1
  853. package/dist/core/scientific-assurance.d.ts.map +0 -1
  854. package/dist/core/spectral-composition.d.ts.map +0 -1
  855. package/dist/core/spectral.d.ts.map +0 -1
  856. package/dist/core/validation.d.ts.map +0 -1
  857. package/dist/core/version.d.ts.map +0 -1
  858. package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
  859. package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
  860. package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
  861. package/dist/equipment/iso-capabilities.d.ts.map +0 -1
  862. package/dist/equipment/metering-capabilities.d.ts.map +0 -1
  863. package/dist/equipment/release-capabilities.d.ts.map +0 -1
  864. package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
  865. package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
  866. package/dist/exposure/exposure.d.ts.map +0 -1
  867. package/dist/exposure/flash.d.ts.map +0 -1
  868. package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
  869. package/dist/exposure/metering-target.d.ts.map +0 -1
  870. package/dist/exposure/metering-temporal.d.ts.map +0 -1
  871. package/dist/exposure/metering.d.ts.map +0 -1
  872. package/dist/exposure/program-line.d.ts.map +0 -1
  873. package/dist/index.d.ts.map +0 -1
  874. package/dist/motion/camera-rotation.d.ts.map +0 -1
  875. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
  876. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
  877. package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
  878. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
  879. package/dist/motion/extended-object-projection.d.ts.map +0 -1
  880. package/dist/motion/projected-motion.d.ts.map +0 -1
  881. package/dist/optics/aperture.d.ts.map +0 -1
  882. package/dist/optics/circle-of-confusion.d.ts.map +0 -1
  883. package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
  884. package/dist/optics/depth-of-field.d.ts.map +0 -1
  885. package/dist/optics/diffraction.d.ts.map +0 -1
  886. package/dist/optics/focus-breathing.d.ts.map +0 -1
  887. package/dist/optics/focus-state.d.ts.map +0 -1
  888. package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
  889. package/dist/optics/illumination-vignetting.d.ts.map +0 -1
  890. package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
  891. package/dist/optics/lens-psf-profile.d.ts.map +0 -1
  892. package/dist/optics/polygon-diffraction.d.ts.map +0 -1
  893. package/dist/optics/profile-contract.d.ts.map +0 -1
  894. package/dist/optics/psf-foundation.d.ts.map +0 -1
  895. package/dist/optics/radial-distortion.d.ts.map +0 -1
  896. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
  897. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
  898. package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
  899. package/dist/optics/sensor-environment-query.d.ts.map +0 -1
  900. package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
  901. package/dist/optics/sensor-psf-support.d.ts.map +0 -1
  902. package/dist/optics/stray-light.d.ts.map +0 -1
  903. package/dist/optics/thin-lens.d.ts.map +0 -1
  904. package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
  905. package/dist/output/capture-geometry.d.ts.map +0 -1
  906. package/dist/output/capture-sdr.d.ts.map +0 -1
  907. package/dist/output/crop.d.ts.map +0 -1
  908. package/dist/output/geometric-transforms.d.ts.map +0 -1
  909. package/dist/output/lens-corrections.d.ts.map +0 -1
  910. package/dist/output/native-capture-sdr.d.ts.map +0 -1
  911. package/dist/output/print-contrast-reference.d.ts.map +0 -1
  912. package/dist/output/print-detail.d.ts.map +0 -1
  913. package/dist/output/print-jpeg.d.ts.map +0 -1
  914. package/dist/output/print-plan.d.ts.map +0 -1
  915. package/dist/output/print-region-statistics.d.ts.map +0 -1
  916. package/dist/output/sdr-rendering.d.ts.map +0 -1
  917. package/dist/output/subject-framing-crop.d.ts.map +0 -1
  918. package/dist/schema/camera.d.ts.map +0 -1
  919. package/dist/schema/camera.js +0 -3
  920. package/dist/schema/camera.js.map +0 -1
  921. package/dist/schema/illumination-spectral.d.ts.map +0 -1
  922. package/dist/schema/illumination-temporal.d.ts.map +0 -1
  923. package/dist/schema/illumination.d.ts.map +0 -1
  924. package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
  925. package/dist/schema/scene-radiance.d.ts.map +0 -1
  926. package/dist/schema/scene.d.ts.map +0 -1
  927. package/dist/schema/scene.js +0 -3
  928. package/dist/schema/scene.js.map +0 -1
  929. package/dist/schema/validation.d.ts.map +0 -1
  930. package/dist/sensor/accumulated-charge.d.ts.map +0 -1
  931. package/dist/sensor/architecture.d.ts.map +0 -1
  932. package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
  933. package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
  934. package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
  935. package/dist/sensor/capture-mode.d.ts.map +0 -1
  936. package/dist/sensor/color-sampling.d.ts.map +0 -1
  937. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
  938. package/dist/sensor/dark-current.d.ts.map +0 -1
  939. package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
  940. package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
  941. package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
  942. package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
  943. package/dist/sensor/exposure-window.d.ts.map +0 -1
  944. package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
  945. package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
  946. package/dist/sensor/optical-stack.d.ts.map +0 -1
  947. package/dist/sensor/photon-energy.d.ts.map +0 -1
  948. package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
  949. package/dist/sensor/pixel-pitch.d.ts.map +0 -1
  950. package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
  951. package/dist/sensor/raw-readout.d.ts.map +0 -1
  952. package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
  953. package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
  954. package/dist/sensor/readout-timing.d.ts.map +0 -1
  955. package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
  956. package/dist/sensor/response-operating-range.d.ts.map +0 -1
  957. package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
  958. package/dist/sensor/sampling-aperture.d.ts.map +0 -1
  959. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
  960. package/dist/sensor/sensor-geometry.d.ts.map +0 -1
  961. package/dist/sensor/signal-noise.d.ts.map +0 -1
  962. package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
  963. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
  964. package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
  965. package/dist/sensor/spectral-coverage.d.ts.map +0 -1
  966. package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
  967. package/dist/sensor/spectral-response.d.ts.map +0 -1
  968. package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
  969. package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
  970. package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
  971. package/dist/simulation/poc-simulation.d.ts.map +0 -1
  972. package/dist/stabilization/camera-shake.d.ts.map +0 -1
  973. package/dist/stabilization/system.d.ts.map +0 -1
  974. package/docs/API_STYLE.md +0 -235
  975. package/docs/ARCHITECTURE.md +0 -356
  976. package/docs/AUTOMATION_COORDINATION.md +0 -190
  977. package/docs/CAPTURE_COLOR.md +0 -25
  978. package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
  979. package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
  980. package/docs/CAPTURE_SDR.md +0 -22
  981. package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
  982. package/docs/DEVELOPERS.md +0 -68
  983. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  984. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  985. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  986. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  987. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  988. package/docs/IMAGE_FORMATION.md +0 -247
  989. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  990. package/docs/MOTION_AND_SIGNAL.md +0 -250
  991. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  992. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  993. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  994. package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
  995. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  996. package/docs/PERFORMANCE_BASELINE.md +0 -56
  997. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  998. package/docs/PHYSICS_FOUNDATION.md +0 -426
  999. package/docs/POC_API.md +0 -278
  1000. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  1001. package/docs/POC_PROJECTION_REUSE.md +0 -124
  1002. package/docs/PRINT_195_196_REVIEW.md +0 -93
  1003. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  1004. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  1005. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  1006. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  1007. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1008. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1009. package/docs/PRINT_PLANNING.md +0 -75
  1010. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1011. package/docs/PROCESSED_OUTPUT.md +0 -157
  1012. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1013. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1014. package/docs/PROVENANCE.md +0 -115
  1015. package/docs/PSF_FOUNDATION.md +0 -165
  1016. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1017. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1018. package/docs/RELEASE_1_0.md +0 -66
  1019. package/docs/RELEASE_1_0_1.md +0 -61
  1020. package/docs/RELEASE_1_1_0.md +0 -25
  1021. package/docs/RELEASE_1_2_0.md +0 -51
  1022. package/docs/RELEASE_1_3_0.md +0 -15
  1023. package/docs/RELEASE_1_4_0.md +0 -23
  1024. package/docs/RELEASE_1_5_0.md +0 -105
  1025. package/docs/RELEASE_AUDIT.md +0 -39
  1026. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1027. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1028. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1029. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1030. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1031. package/docs/SDR_RENDERING.md +0 -33
  1032. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1033. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1034. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1035. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1036. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1037. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1038. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1039. package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
  1040. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1041. package/docs/SIMULATED_CAPTURE.md +0 -65
  1042. package/docs/STABILIZATION.md +0 -234
  1043. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1044. package/docs/TIER_ACCEPTANCE.md +0 -129
  1045. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1046. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1047. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1048. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1049. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1050. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1051. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1052. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1053. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1054. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1055. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1056. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1057. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1058. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1059. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1060. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1061. package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
  1062. package/docs/validation/documentation-fragments.json +0 -212
  1063. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1064. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1065. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1066. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1067. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1068. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1069. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1070. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1071. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1072. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1073. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1074. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1075. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1076. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1077. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1078. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1079. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1080. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1081. package/docs/validation/print-detail-capabilities.json +0 -103
  1082. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1083. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1084. package/docs/validation/release-audit-inventory.json +0 -1306
  1085. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -0,0 +1,115 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * Wide-gamut output primitives (standalone; output wiring belongs to the SDR/export stages):
4
+ * - RGB ↔ XYZ matrices derived numerically from primary and white chromaticities: RGB (1, 1, 1)
5
+ * is the white (W3C CSS Color 4 §2, free), never copied matrices. They equal the CSS Color 4
6
+ * sample-code matrices to about 1e-15 (test/colorimetry-output-and-camera.test.ts).
7
+ * sRGB / BT.709: ITU-R BT.709-6 and W3C CSS Color 4 `srgb` (also IEC 61966-2-1:1999); Display P3:
8
+ * P3 primaries with D65 white as specified for `display-p3` in W3C CSS Color 4 (also SMPTE EG 432-1:2010);
9
+ * BT.2020: ITU-R BT.2020-2. All use D65 (0.3127, 0.3290).
10
+ * - Transfer functions: sRGB (W3C CSS Color 4; also IEC 61966-2-1; also Display P3), BT.709 OETF, BT.1886 EOTF
11
+ * (ITU-R BT.1886). The BT.2100 PQ and HLG transfer functions are not part of 2.0 (owner decision,
12
+ * 2026-10-17: their patent holders offer only licence-on-request declarations; see THIRD_PARTY.md).
13
+ * Constants are the published values of those standards.
14
+ * @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.
15
+ */
16
+ import { calculatedResult } from "../core/calculation-result.js";
17
+ import { InvalidScientificInputError } from "../core/validation.js";
18
+ import { decodeSrgbComponent, encodeSrgbComponent } from "./srgb-transfer.js";
19
+ import { COLORIMETRY_MODEL_VERSION } from "./color-matching-functions.js";
20
+ import { copyMatrix, invertMatrix3x3, multiplyMatrixVector, parseChromaticity, requireFiniteNumber, requireFiniteResult, requireNonNegativeNumber, requirePositiveNumber, requireRecordValue, xyzOfChromaticity } from "./colorimetry-math.js";
21
+ import { rejectUnknownFields, requireInputKeys } from "../core/record-validation.js";
22
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
23
+ /** Internal: derivation from primaries and white (see {@link calculateRgbToXyzMatrices}) without an envelope. */
24
+ export function rgbToXyzMatrices(primaries, white) {
25
+ const p = requireRecordValue(primaries, "primaries");
26
+ rejectUnknownFields(p, ["red", "green", "blue"], "primaries");
27
+ const columns = ["red", "green", "blue"].map((k) => xyzOfChromaticity(parseChromaticity(p[k], "primaries." + k)));
28
+ const basis = [
29
+ [columns[0].x, columns[1].x, columns[2].x],
30
+ [columns[0].y, columns[1].y, columns[2].y],
31
+ [columns[0].z, columns[1].z, columns[2].z]
32
+ ];
33
+ const whiteXyz = xyzOfChromaticity(parseChromaticity(white, "whiteChromaticity"));
34
+ const s = multiplyMatrixVector(invertMatrix3x3(basis, "primary matrix"), [whiteXyz.x, whiteXyz.y, whiteXyz.z]);
35
+ if (s.some((v) => !(v > 0)))
36
+ throw new InvalidScientificInputError("The white point must lie strictly inside the primary triangle.");
37
+ const rgbToXyz = basis.map((row) => row.map((v, i) => v * s[i]));
38
+ return { rgbToXyz, xyzToRgb: invertMatrix3x3(rgbToXyz, "rgbToXyz"), whiteXyz };
39
+ }
40
+ /**
41
+ * Derives RGB ↔ XYZ matrices from primaries and white chromaticity: columns are the primaries'
42
+ * XYZ (Y = 1) scaled so that RGB (1, 1, 1) maps to the white (W3C CSS Color 4, free; also SMPTE
43
+ * RP 177). The derivation is written out in docs/COLORIMETRY.md.
44
+ */
45
+ export function calculateRgbToXyzMatrices(input) {
46
+ requireInputKeys(input, "calculateRgbToXyzMatrices", ["primaries", "whiteChromaticity"]);
47
+ const value = rgbToXyzMatrices(input.primaries, input.whiteChromaticity);
48
+ requireFiniteResult([...value.rgbToXyz.flat(), ...value.xyzToRgb.flat()], "RGB matrix derivation");
49
+ return calculatedResult(value, "rgb-xyz-matrix-smpte-rp177", COLORIMETRY_MODEL_VERSION);
50
+ }
51
+ const D65_CHROMATICITY = Object.freeze({ x: 0.3127, y: 0.3290 });
52
+ const BT709_PRIMARIES = { red: { x: 0.64, y: 0.33 }, green: { x: 0.30, y: 0.60 }, blue: { x: 0.15, y: 0.06 } };
53
+ const SPACES = {
54
+ srgb: { primaries: BT709_PRIMARIES, transferFunction: "srgb", sources: ["W3C CSS Color Module Level 4 srgb", "ITU-R BT.709-6"] },
55
+ rec709: { primaries: BT709_PRIMARIES, transferFunction: "bt709-oetf-bt1886-eotf", sources: ["ITU-R BT.709-6", "ITU-R BT.1886"] },
56
+ "display-p3": {
57
+ primaries: { red: { x: 0.680, y: 0.320 }, green: { x: 0.265, y: 0.690 }, blue: { x: 0.150, y: 0.060 } },
58
+ transferFunction: "srgb", sources: ["W3C CSS Color Module Level 4 display-p3 (P3 primaries, D65, sRGB transfer)", "ITU-T H.273 ColourPrimaries 12"]
59
+ },
60
+ rec2020: {
61
+ primaries: { red: { x: 0.708, y: 0.292 }, green: { x: 0.170, y: 0.797 }, blue: { x: 0.131, y: 0.046 } },
62
+ transferFunction: "bt2020-oetf", sources: ["ITU-R BT.2020-2"]
63
+ }
64
+ };
65
+ /** Resolves a named RGB colour space with numerically derived matrices (all D65). */
66
+ export function resolveRgbColorSpace(id) {
67
+ const space = typeof id === "string" && Object.hasOwn(SPACES, id) ? SPACES[id] : undefined;
68
+ if (space === undefined)
69
+ throw new InvalidConfigurationError("Unknown RGB colour space.");
70
+ const matrices = rgbToXyzMatrices(space.primaries, D65_CHROMATICITY);
71
+ const value = {
72
+ id, primaries: JSON.parse(JSON.stringify(space.primaries)), whiteChromaticity: { ...D65_CHROMATICITY },
73
+ transferFunction: space.transferFunction, sources: [...space.sources],
74
+ rgbToXyz: copyMatrix(matrices.rgbToXyz), xyzToRgb: copyMatrix(matrices.xyzToRgb), whiteXyz: matrices.whiteXyz
75
+ };
76
+ return calculatedResult(value, "rgb-color-space-" + id, COLORIMETRY_MODEL_VERSION, ["Matrices derived from primaries and D65 white so that RGB (1, 1, 1) is the white (W3C CSS Color 4)"]);
77
+ }
78
+ // ---------------------------------------------------------------- transfers
79
+ /** sRGB / Display P3 encoding (W3C CSS Color 4; also IEC 61966-2-1) of one linear component; negative values use the linear segment. */
80
+ export function evaluateSrgbEncoding(linear) {
81
+ return encodeSrgbComponent(requireFiniteNumber(linear, "linear"));
82
+ }
83
+ /** sRGB / Display P3 decoding of one non-linear component. */
84
+ export function evaluateSrgbDecoding(encoded) {
85
+ return decodeSrgbComponent(requireFiniteNumber(encoded, "encoded"));
86
+ }
87
+ /**
88
+ * ITU-R BT.709-6 / BT.2020-2 (10-bit) OETF: V = 4.5 L for L < 0.018, otherwise
89
+ * 1.099 L^0.45 − 0.099. Scene-referred camera encoding, not a display EOTF.
90
+ */
91
+ export function evaluateBt709Oetf(sceneLinear) {
92
+ const l = requireFiniteNumber(sceneLinear, "sceneLinear");
93
+ return l < 0.018 ? 4.5 * l : 1.099 * l ** 0.45 - 0.099;
94
+ }
95
+ /** Inverse of the BT.709 OETF: L = V/4.5 for V < 0.081, otherwise ((V + 0.099)/1.099)^(1/0.45). */
96
+ export function evaluateBt709InverseOetf(encoded) {
97
+ const v = requireFiniteNumber(encoded, "encoded");
98
+ return v < 4.5 * 0.018 ? v / 4.5 : ((v + 0.099) / 1.099) ** (1 / 0.45);
99
+ }
100
+ /** Prepares the ITU-R BT.1886 reference EOTF (γ = 2.4) for a display's white and black luminance. */
101
+ export function prepareBt1886Eotf(input) {
102
+ requireInputKeys(input, "prepareBt1886Eotf", ["whiteLuminanceCdPerSquareMeter", "blackLuminanceCdPerSquareMeter"]);
103
+ const lw = requirePositiveNumber(input.whiteLuminanceCdPerSquareMeter, "whiteLuminanceCdPerSquareMeter");
104
+ const lb = requireNonNegativeNumber(input.blackLuminanceCdPerSquareMeter, "blackLuminanceCdPerSquareMeter");
105
+ if (!(lb < lw))
106
+ throw new InvalidScientificInputError("blackLuminanceCdPerSquareMeter must be below the white luminance.");
107
+ const g = 2.4, root = lw ** (1 / g) - lb ** (1 / g);
108
+ const a = root ** g, b = lb ** (1 / g) / root;
109
+ return Object.freeze({
110
+ whiteLuminanceCdPerSquareMeter: lw, blackLuminanceCdPerSquareMeter: lb, a, b,
111
+ decode: (signal) => a * Math.max(requireFiniteNumber(signal, "signal") + b, 0) ** g,
112
+ encode: (luminance) => (requireNonNegativeNumber(luminance, "luminanceCdPerSquareMeter") / a) ** (1 / g) - b
113
+ });
114
+ }
115
+ //# sourceMappingURL=rgb-color-spaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rgb-color-spaces.js","sourceRoot":"","sources":["../../src/color/rgb-color-spaces.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Wide-gamut output primitives (standalone; output wiring belongs to the SDR/export stages):\n * - RGB ↔ XYZ matrices derived numerically from primary and white chromaticities: RGB (1, 1, 1)\n * is the white (W3C CSS Color 4 §2, free), never copied matrices. They equal the CSS Color 4\n * sample-code matrices to about 1e-15 (test/colorimetry-output-and-camera.test.ts).\n * sRGB / BT.709: ITU-R BT.709-6 and W3C CSS Color 4 `srgb` (also IEC 61966-2-1:1999); Display P3:\n * P3 primaries with D65 white as specified for `display-p3` in W3C CSS Color 4 (also SMPTE EG 432-1:2010);\n * BT.2020: ITU-R BT.2020-2. All use D65 (0.3127, 0.3290).\n * - Transfer functions: sRGB (W3C CSS Color 4; also IEC 61966-2-1; also Display P3), BT.709 OETF, BT.1886 EOTF\n * (ITU-R BT.1886). The BT.2100 PQ and HLG transfer functions are not part of 2.0 (owner decision,\n * 2026-10-17: their patent holders offer only licence-on-request declarations; see THIRD_PARTY.md).\n * Constants are the published values of those standards.\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 { decodeSrgbComponent, encodeSrgbComponent } from \"./srgb-transfer.js\";\nimport { COLORIMETRY_MODEL_VERSION } from \"./color-matching-functions.js\";\nimport {\n copyMatrix,\n invertMatrix3x3,\n multiplyMatrixVector,\n parseChromaticity,\n requireFiniteNumber,\n requireFiniteResult,\n requireNonNegativeNumber,\n requirePositiveNumber,\n requireRecordValue,\n xyzOfChromaticity,\n type CieXyChromaticity,\n type CieXyzTristimulus,\n type ColorMatrix3x3\n} from \"./colorimetry-math.js\";\nimport { rejectUnknownFields, requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\n/** RGB primaries as CIE 1931 xy chromaticities. */\nexport interface RgbPrimaryChromaticities {\n red: CieXyChromaticity;\n green: CieXyChromaticity;\n blue: CieXyChromaticity;\n}\n\nexport interface RgbToXyzMatrices {\n /** Linear RGB (white = 1, 1, 1) → XYZ with white Y = 1. */\n rgbToXyz: ColorMatrix3x3;\n xyzToRgb: ColorMatrix3x3;\n whiteXyz: CieXyzTristimulus;\n}\n\n/** Internal: derivation from primaries and white (see {@link calculateRgbToXyzMatrices}) without an envelope. */\nexport function rgbToXyzMatrices(primaries: RgbPrimaryChromaticities, white: CieXyChromaticity): RgbToXyzMatrices {\n const p = requireRecordValue(primaries, \"primaries\");\n rejectUnknownFields(p, [\"red\", \"green\", \"blue\"], \"primaries\");\n const columns = ([\"red\", \"green\", \"blue\"] as const).map((k) => xyzOfChromaticity(parseChromaticity(p[k], \"primaries.\" + k)));\n const basis: ColorMatrix3x3 = [\n [columns[0]!.x, columns[1]!.x, columns[2]!.x],\n [columns[0]!.y, columns[1]!.y, columns[2]!.y],\n [columns[0]!.z, columns[1]!.z, columns[2]!.z]\n ];\n const whiteXyz = xyzOfChromaticity(parseChromaticity(white, \"whiteChromaticity\"));\n const s = multiplyMatrixVector(invertMatrix3x3(basis, \"primary matrix\"), [whiteXyz.x, whiteXyz.y, whiteXyz.z]);\n if (s.some((v) => !(v > 0))) throw new InvalidScientificInputError(\"The white point must lie strictly inside the primary triangle.\");\n const rgbToXyz = basis.map((row) => row.map((v, i) => v * s[i]!)) as unknown as ColorMatrix3x3;\n return { rgbToXyz, xyzToRgb: invertMatrix3x3(rgbToXyz, \"rgbToXyz\"), whiteXyz };\n}\n\n/**\n * Derives RGB ↔ XYZ matrices from primaries and white chromaticity: columns are the primaries'\n * XYZ (Y = 1) scaled so that RGB (1, 1, 1) maps to the white (W3C CSS Color 4, free; also SMPTE\n * RP 177). The derivation is written out in docs/COLORIMETRY.md.\n */\nexport function calculateRgbToXyzMatrices(input: { primaries: RgbPrimaryChromaticities; whiteChromaticity: CieXyChromaticity }): CalculationResult<RgbToXyzMatrices> {\n requireInputKeys(input, \"calculateRgbToXyzMatrices\", [\"primaries\", \"whiteChromaticity\"]);\n const value = rgbToXyzMatrices(input.primaries, input.whiteChromaticity);\n requireFiniteResult([...value.rgbToXyz.flat(), ...value.xyzToRgb.flat()], \"RGB matrix derivation\");\n return calculatedResult(value, \"rgb-xyz-matrix-smpte-rp177\", COLORIMETRY_MODEL_VERSION);\n}\n\nexport type RgbColorSpaceId = \"srgb\" | \"display-p3\" | \"rec709\" | \"rec2020\";\nexport type RgbTransferFunctionId = \"srgb\" | \"bt709-oetf-bt1886-eotf\" | \"bt2020-oetf\";\n\nexport interface RgbColorSpaceDefinition extends RgbToXyzMatrices {\n id: RgbColorSpaceId;\n primaries: RgbPrimaryChromaticities;\n whiteChromaticity: CieXyChromaticity;\n /** Conventional non-linear (SDR) encoding of this space. */\n transferFunction: RgbTransferFunctionId;\n sources: readonly string[];\n}\n\nconst D65_CHROMATICITY: CieXyChromaticity = Object.freeze({ x: 0.3127, y: 0.3290 });\nconst BT709_PRIMARIES: RgbPrimaryChromaticities = { red: { x: 0.64, y: 0.33 }, green: { x: 0.30, y: 0.60 }, blue: { x: 0.15, y: 0.06 } };\nconst SPACES: Readonly<Record<RgbColorSpaceId, { primaries: RgbPrimaryChromaticities; transferFunction: RgbTransferFunctionId; sources: readonly string[] }>> = {\n srgb: { primaries: BT709_PRIMARIES, transferFunction: \"srgb\", sources: [\"W3C CSS Color Module Level 4 srgb\", \"ITU-R BT.709-6\"] },\n rec709: { primaries: BT709_PRIMARIES, transferFunction: \"bt709-oetf-bt1886-eotf\", sources: [\"ITU-R BT.709-6\", \"ITU-R BT.1886\"] },\n \"display-p3\": {\n primaries: { red: { x: 0.680, y: 0.320 }, green: { x: 0.265, y: 0.690 }, blue: { x: 0.150, y: 0.060 } },\n transferFunction: \"srgb\", sources: [\"W3C CSS Color Module Level 4 display-p3 (P3 primaries, D65, sRGB transfer)\", \"ITU-T H.273 ColourPrimaries 12\"]\n },\n rec2020: {\n primaries: { red: { x: 0.708, y: 0.292 }, green: { x: 0.170, y: 0.797 }, blue: { x: 0.131, y: 0.046 } },\n transferFunction: \"bt2020-oetf\", sources: [\"ITU-R BT.2020-2\"]\n }\n};\n\n/** Resolves a named RGB colour space with numerically derived matrices (all D65). */\nexport function resolveRgbColorSpace(id: RgbColorSpaceId): CalculationResult<RgbColorSpaceDefinition> {\n const space = typeof id === \"string\" && Object.hasOwn(SPACES, id) ? SPACES[id] : undefined;\n if (space === undefined) throw new InvalidConfigurationError(\"Unknown RGB colour space.\");\n const matrices = rgbToXyzMatrices(space.primaries, D65_CHROMATICITY);\n const value: RgbColorSpaceDefinition = {\n id, primaries: JSON.parse(JSON.stringify(space.primaries)) as RgbPrimaryChromaticities, whiteChromaticity: { ...D65_CHROMATICITY },\n transferFunction: space.transferFunction, sources: [...space.sources],\n rgbToXyz: copyMatrix(matrices.rgbToXyz), xyzToRgb: copyMatrix(matrices.xyzToRgb), whiteXyz: matrices.whiteXyz\n };\n return calculatedResult(value, \"rgb-color-space-\" + id, COLORIMETRY_MODEL_VERSION, [\"Matrices derived from primaries and D65 white so that RGB (1, 1, 1) is the white (W3C CSS Color 4)\"]);\n}\n\n// ---------------------------------------------------------------- transfers\n\n/** sRGB / Display P3 encoding (W3C CSS Color 4; also IEC 61966-2-1) of one linear component; negative values use the linear segment. */\nexport function evaluateSrgbEncoding(linear: number): number {\n return encodeSrgbComponent(requireFiniteNumber(linear, \"linear\"));\n}\n\n/** sRGB / Display P3 decoding of one non-linear component. */\nexport function evaluateSrgbDecoding(encoded: number): number {\n return decodeSrgbComponent(requireFiniteNumber(encoded, \"encoded\"));\n}\n\n/**\n * ITU-R BT.709-6 / BT.2020-2 (10-bit) OETF: V = 4.5 L for L < 0.018, otherwise\n * 1.099 L^0.45 − 0.099. Scene-referred camera encoding, not a display EOTF.\n */\nexport function evaluateBt709Oetf(sceneLinear: number): number {\n const l = requireFiniteNumber(sceneLinear, \"sceneLinear\");\n return l < 0.018 ? 4.5 * l : 1.099 * l ** 0.45 - 0.099;\n}\n\n/** Inverse of the BT.709 OETF: L = V/4.5 for V < 0.081, otherwise ((V + 0.099)/1.099)^(1/0.45). */\nexport function evaluateBt709InverseOetf(encoded: number): number {\n const v = requireFiniteNumber(encoded, \"encoded\");\n return v < 4.5 * 0.018 ? v / 4.5 : ((v + 0.099) / 1.099) ** (1 / 0.45);\n}\n\nexport interface Bt1886Eotf {\n whiteLuminanceCdPerSquareMeter: number;\n blackLuminanceCdPerSquareMeter: number;\n /** a = (Lw^(1/γ) − Lb^(1/γ))^γ */\n a: number;\n /** b = Lb^(1/γ) / (Lw^(1/γ) − Lb^(1/γ)) */\n b: number;\n /** L = a · max(V + b, 0)^2.4 in cd/m². */\n decode(signal: number): number;\n /** Inverse: V = (L/a)^(1/2.4) − b. */\n encode(luminanceCdPerSquareMeter: number): number;\n}\n\n/** Prepares the ITU-R BT.1886 reference EOTF (γ = 2.4) for a display's white and black luminance. */\nexport function prepareBt1886Eotf(input: { whiteLuminanceCdPerSquareMeter: number; blackLuminanceCdPerSquareMeter: number }): Bt1886Eotf {\n requireInputKeys(input, \"prepareBt1886Eotf\", [\"whiteLuminanceCdPerSquareMeter\", \"blackLuminanceCdPerSquareMeter\"]);\n const lw = requirePositiveNumber(input.whiteLuminanceCdPerSquareMeter, \"whiteLuminanceCdPerSquareMeter\");\n const lb = requireNonNegativeNumber(input.blackLuminanceCdPerSquareMeter, \"blackLuminanceCdPerSquareMeter\");\n if (!(lb < lw)) throw new InvalidScientificInputError(\"blackLuminanceCdPerSquareMeter must be below the white luminance.\");\n const g = 2.4, root = lw ** (1 / g) - lb ** (1 / g);\n const a = root ** g, b = lb ** (1 / g) / root;\n return Object.freeze({\n whiteLuminanceCdPerSquareMeter: lw, blackLuminanceCdPerSquareMeter: lb, a, b,\n decode: (signal: number) => a * Math.max(requireFiniteNumber(signal, \"signal\") + b, 0) ** g,\n encode: (luminance: number) => (requireNonNegativeNumber(luminance, \"luminanceCdPerSquareMeter\") / a) ** (1 / g) - b\n });\n}\n"]}
@@ -1,23 +1,45 @@
1
1
  type Matrix = readonly (readonly number[])[];
2
- /** Validated 3×3 matrices only; retains the declared determinant/inverse bounds. */
2
+ export declare const SENSOR_COLOR_DEVELOPMENT_MODEL: Readonly<{
3
+ readonly id: "sensor-color-development";
4
+ readonly version: "2.0.0";
5
+ }>;
6
+ /** RAW development highlight policy; see the module notes. */
7
+ export type RawHighlightMode = "clip" | "reconstruct";
8
+ /** Normalized channel level where `reconstruct` starts blending toward neutral. */
9
+ export declare const RAW_HIGHLIGHT_RECONSTRUCTION_START = 0.8;
10
+ /** Accepts validated 3×3 matrices only, and keeps their declared determinant and inverse bounds. */
3
11
  export declare function invertSensorColorMatrix(m: Matrix): number[][];
4
- interface SensorColorDevelopment {
12
+ /** Camera coordinates of the declared D65 white (not normalized). The caller decides container policy. */
13
+ export declare function sensorColorReferenceWhite(xyzToCamera: Matrix): number[];
14
+ /** Per-pixel highlight/WB counters accumulated by {@link SensorColorDevelopment.developInto}. */
15
+ export interface SensorColorDevelopmentCounts {
16
+ whiteBalanceClippedSampleCount: number;
17
+ reconstructedPixelCount: number;
18
+ }
19
+ export interface SensorColorDevelopment {
5
20
  referenceWhiteXyz: {
6
21
  x: number;
7
22
  y: 1;
8
23
  z: number;
9
24
  };
25
+ /** Green-normalized camera-neutral coordinates of D65 (exactly [1,1,1] for white-normalized profiles). */
26
+ cameraNeutralD65: readonly number[];
27
+ /** Applied channel gains: the resolved WB gains, or 1/cameraNeutralD65 when WB is not required. */
28
+ appliedGains: readonly number[];
29
+ /** Green-normalized camera neutral of the assumed scene white: g_green/g (DNG AsShotNeutral). */
30
+ asShotNeutral: readonly number[];
31
+ /** X·M·diag(w) rows, applied as two products in the documented order. */
32
+ cameraToXyz: readonly (readonly number[])[];
33
+ highlightMode: RawHighlightMode;
34
+ /** Develops one normalized camera pixel into out[offset..offset+2] (linear sRGB/D65); updates counts. */
35
+ developInto(c0: number, c1: number, c2: number, out: Float64Array | number[], offset: number, counts: SensorColorDevelopmentCounts): void;
36
+ /** Convenience array form of developInto (counts discarded). */
10
37
  develop(values: readonly number[]): number[];
11
38
  }
12
39
  /**
13
- * Internal adapter for validated normalized sensor RGB and declared D65 profile.
14
- * The caller owns profile evidence, CFA/basis binding and one-time WB authorization.
15
- * This is distinct from the ideal virtual-camera transform: gains act in sensor
16
- * channels before camera-to-XYZ, followed by XYZ-to-linear-sRGB. No clipping,
17
- * adaptation, calibration inference, geometry or container metadata is performed.
40
+ * Internal development of validated, normalized sensor RGB with a declared D65 profile.
41
+ * `gains` is the resolved WB intent, or null when WB is not required. Both the packed native path and
42
+ * the bounded reference path use the returned operator, so there is one implementation.
18
43
  */
19
- export declare function prepareSensorColorDevelopment(cameraChannelsToXyz: Matrix, gains: readonly number[]): SensorColorDevelopment;
20
- /** Camera coordinates of the declared D65 white; container policy remains caller-owned. */
21
- export declare function sensorColorReferenceWhite(xyzToCamera: Matrix): number[];
44
+ export declare function prepareSensorColorDevelopment(cameraChannelsToXyz: Matrix, gains: readonly number[] | null, highlightMode?: RawHighlightMode): SensorColorDevelopment;
22
45
  export {};
23
- //# sourceMappingURL=sensor-color-development.d.ts.map
@@ -1,27 +1,55 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Validated 3×3 matrices only; retains the declared determinant/inverse bounds.
5
- * Internal adapter for validated normalized sensor RGB and declared D65 profile. The caller owns
6
- * profile evidence, CFA/basis binding and one-time WB authorization. This is distinct from the ideal
7
- * virtual-camera transform: gains act in sensor channels before camera-to-XYZ, followed by
8
- * XYZ-to-linear-sRGB. No clipping, adaptation, calibration inference, geometry or container metadata
9
- * is performed.
10
- * @see docs/PHOTOGRAPHIC_EXPORT.md for equations, coordinate/unit conventions, blockers and support
11
- * limits.
3
+ * RAW colour development: turns normalized sensor RGB into linear sRGB, using a declared D65 camera
4
+ * profile. Internal.
5
+ *
6
+ * The caller is responsible for the profile's evidence, for binding it to the CFA (colour filter
7
+ * array) and colour basis, and for applying white balance (WB) only once. Only validated 3×3 matrices
8
+ * are accepted, and their declared determinant and inverse bounds are kept.
9
+ *
10
+ * Development model (`sensor-color-development` 2.0.0). The input c is the normalized camera
11
+ * channels: black level subtracted, divided by the effective white level and clipped at 1 per site,
12
+ * all earlier in the pipeline.
13
+ *
14
+ * b = highlight(diag(g)·c), linear sRGB = X · M · diag(w) · b
15
+ *
16
+ * Where:
17
+ * - M is the profile's camera→XYZ matrix and X is the XYZ→linear-sRGB matrix.
18
+ * - w = M⁻¹·XYZ(D65), normalized to green. These are the camera-neutral coordinates of D65
19
+ * (DNG 1.7 "camera neutral").
20
+ * - The WB gains g map the scene white to equal channel values. diag(w) then maps equal channel values
21
+ * to D65, for any invertible M. So a grey card lit by the gains' illuminant comes out neutral,
22
+ * whether or not M is white-normalized.
23
+ * - Without a resolved WB intent, g = 1/w, and development reduces to X·M·c (a D65 scene white).
24
+ * - The camera neutral of the scene white, written to DNG `AsShotNeutral`, is g_green/g.
25
+ * This module does not chromatically adapt the scene, infer calibration, change geometry or write
26
+ * container metadata.
27
+ *
28
+ * Highlight handling (after each site is clipped at the sensor white level):
29
+ * - `clip` (default): every WB-scaled channel is clipped at the smallest gain. That is the level at
30
+ * which the least-amplified channel saturates, so fully clipped pixels stay neutral. This is the
31
+ * documented default of dcraw (`-H 0`, "clip all highlights to solid white") and of most raw
32
+ * converters.
33
+ * - `reconstruct`: a desaturation blend defined by this engine. Let s be the largest normalized
34
+ * channel. The weight t = clamp((s − 0.8)/0.2, 0, 1) blends the unclipped WB result u toward the
35
+ * neutral n = max_k min(u_k, g_min): b = (1 − t)·u + t·n. Below 0.8 of white, colour is unchanged
36
+ * and unclipped; at white it is neutral. This approximation follows the idea of highlight
37
+ * desaturation (Guo, Cheng & Hu, "Correcting over-exposure in photographs", CVPR 2010). It does not
38
+ * recover the clipped scene signal.
39
+ * @see docs/PHOTOGRAPHIC_EXPORT.md and docs/NATIVE_RAW_AND_PRINT.md for equations and limits.
12
40
  */
13
41
  import { InvalidConfigurationError } from "../core/configuration-error.js";
14
42
  import { resolveCaptureColorModel } from "./capture-color.js";
15
- /**
16
- * Multiply the validated channel vector in its declared basis. Preserve operation
17
- * order: sensor gains precede camera-to-XYZ, then XYZ-to-linear-sRGB. This internal
18
- * path accepts neither arbitrary spectral channels nor the ideal virtual-camera
19
- * basis by implication, and performs no clipping or chromatic adaptation.
20
- */
43
+ export const SENSOR_COLOR_DEVELOPMENT_MODEL = Object.freeze({ id: "sensor-color-development", version: "2.0.0" });
44
+ /** Normalized channel level where `reconstruct` starts blending toward neutral. */
45
+ export const RAW_HIGHLIGHT_RECONSTRUCTION_START = 0.8;
46
+ /** Profiles whose camera neutral is within this relative distance of [1,1,1] are white-normalized. */
47
+ const WHITE_NORMALIZED_TOLERANCE = 1e-12;
48
+ /** Multiply in declared row order: ((0 + m0·v0) + m1·v1) + m2·v2. */
21
49
  function multiply(m, values) {
22
50
  return m.map((row) => row.reduce((sum, v, i) => sum + v * values[i], 0));
23
51
  }
24
- /** Validated 3×3 matrices only; retains the declared determinant/inverse bounds. */
52
+ /** Accepts validated 3×3 matrices only, and keeps their declared determinant and inverse bounds. */
25
53
  export function invertSensorColorMatrix(m) {
26
54
  const [a, b, c, d, e, f, g, h, i] = m.flat(), det = a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);
27
55
  if (!Number.isFinite(det) || Math.abs(det) < 1e-9)
@@ -31,26 +59,72 @@ export function invertSensorColorMatrix(m) {
31
59
  throw new InvalidConfigurationError("Export inverse color matrix exceeds supported range.");
32
60
  return result;
33
61
  }
62
+ /** Camera coordinates of the declared D65 white (not normalized). The caller decides container policy. */
63
+ export function sensorColorReferenceWhite(xyzToCamera) {
64
+ const white = resolveCaptureColorModel().referenceWhiteXyz;
65
+ return multiply(xyzToCamera, [white.x, 1, white.z]);
66
+ }
34
67
  /**
35
- * Internal adapter for validated normalized sensor RGB and declared D65 profile.
36
- * The caller owns profile evidence, CFA/basis binding and one-time WB authorization.
37
- * This is distinct from the ideal virtual-camera transform: gains act in sensor
38
- * channels before camera-to-XYZ, followed by XYZ-to-linear-sRGB. No clipping,
39
- * adaptation, calibration inference, geometry or container metadata is performed.
68
+ * Internal development of validated, normalized sensor RGB with a declared D65 profile.
69
+ * `gains` is the resolved WB intent, or null when WB is not required. Both the packed native path and
70
+ * the bounded reference path use the returned operator, so there is one implementation.
40
71
  */
41
- export function prepareSensorColorDevelopment(cameraChannelsToXyz, gains) {
72
+ export function prepareSensorColorDevelopment(cameraChannelsToXyz, gains, highlightMode = "clip") {
73
+ if (highlightMode !== "clip" && highlightMode !== "reconstruct")
74
+ throw new InvalidConfigurationError("Unsupported RAW highlight mode.");
42
75
  const model = resolveCaptureColorModel();
76
+ const raw = sensorColorReferenceWhite(invertSensorColorMatrix(cameraChannelsToXyz));
77
+ if (raw.some((x) => !(x > 0) || !Number.isFinite(x)))
78
+ throw new InvalidConfigurationError("Reference white requires positive camera coordinates.");
79
+ let neutral = raw.map((x) => x / raw[1]);
80
+ if (neutral.every((x) => Math.abs(x - 1) <= WHITE_NORMALIZED_TOLERANCE))
81
+ neutral = [1, 1, 1];
82
+ if (gains && (gains.length !== 3 || gains.some((x) => !(x > 0) || !Number.isFinite(x))))
83
+ throw new InvalidConfigurationError("White-balance gains must be positive and finite.");
84
+ const applied = gains ? [...gains] : neutral.map((x) => 1 / x);
85
+ const asShot = applied.map((x) => applied[1] / x), clipLevel = Math.min(...applied);
86
+ const m = cameraChannelsToXyz.map((row) => row.map((v, i) => v * neutral[i])), x = model.xyzToCameraRgb;
87
+ const m0 = m[0], m1 = m[1], m2 = m[2], x0 = x[0], x1 = x[1], x2 = x[2];
88
+ const g0 = applied[0], g1 = applied[1], g2 = applied[2], reconstruct = highlightMode === "reconstruct";
89
+ const start = RAW_HIGHLIGHT_RECONSTRUCTION_START;
90
+ function developInto(c0, c1, c2, out, offset, counts) {
91
+ const u0 = c0 * g0, u1 = c1 * g1, u2 = c2 * g2;
92
+ let b0, b1, b2;
93
+ const k0 = u0 > clipLevel ? clipLevel : u0, k1 = u1 > clipLevel ? clipLevel : u1, k2 = u2 > clipLevel ? clipLevel : u2;
94
+ if (!reconstruct) {
95
+ b0 = k0;
96
+ b1 = k1;
97
+ b2 = k2;
98
+ counts.whiteBalanceClippedSampleCount += Number(u0 > clipLevel) + Number(u1 > clipLevel) + Number(u2 > clipLevel);
99
+ }
100
+ else {
101
+ const s = c0 > c1 ? (c0 > c2 ? c0 : c2) : (c1 > c2 ? c1 : c2);
102
+ if (s > start) {
103
+ const t = s >= 1 ? 1 : (s - start) / (1 - start), n = k0 > k1 ? (k0 > k2 ? k0 : k2) : (k1 > k2 ? k1 : k2);
104
+ b0 = (1 - t) * u0 + t * n;
105
+ b1 = (1 - t) * u1 + t * n;
106
+ b2 = (1 - t) * u2 + t * n;
107
+ counts.reconstructedPixelCount++;
108
+ }
109
+ else {
110
+ b0 = u0;
111
+ b1 = u1;
112
+ b2 = u2;
113
+ }
114
+ }
115
+ const X = ((0 + m0[0] * b0) + m0[1] * b1) + m0[2] * b2, Y = ((0 + m1[0] * b0) + m1[1] * b1) + m1[2] * b2, Z = ((0 + m2[0] * b0) + m2[1] * b1) + m2[2] * b2;
116
+ out[offset] = ((0 + x0[0] * X) + x0[1] * Y) + x0[2] * Z;
117
+ out[offset + 1] = ((0 + x1[0] * X) + x1[1] * Y) + x1[2] * Z;
118
+ out[offset + 2] = ((0 + x2[0] * X) + x2[1] * Y) + x2[2] * Z;
119
+ }
43
120
  return {
44
- referenceWhiteXyz: model.referenceWhiteXyz,
121
+ referenceWhiteXyz: model.referenceWhiteXyz, cameraNeutralD65: Object.freeze(neutral), appliedGains: Object.freeze(applied),
122
+ asShotNeutral: Object.freeze(asShot), cameraToXyz: m, highlightMode, developInto,
45
123
  develop(values) {
46
- const balanced = values.map((n, i) => n * gains[i]);
47
- return multiply(model.xyzToCameraRgb, multiply(cameraChannelsToXyz, balanced));
124
+ const out = [0, 0, 0];
125
+ developInto(values[0], values[1], values[2], out, 0, { whiteBalanceClippedSampleCount: 0, reconstructedPixelCount: 0 });
126
+ return out;
48
127
  }
49
128
  };
50
129
  }
51
- /** Camera coordinates of the declared D65 white; container policy remains caller-owned. */
52
- export function sensorColorReferenceWhite(xyzToCamera) {
53
- const white = resolveCaptureColorModel().referenceWhiteXyz;
54
- return multiply(xyzToCamera, [white.x, 1, white.z]);
55
- }
56
130
  //# sourceMappingURL=sensor-color-development.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sensor-color-development.js","sourceRoot":"","sources":["../../src/color/sensor-color-development.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sensor-color-development.js","sourceRoot":"","sources":["../../src/color/sensor-color-development.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * RAW colour development: turns normalized sensor RGB into linear sRGB, using a declared D65 camera\n * profile. Internal.\n *\n * The caller is responsible for the profile's evidence, for binding it to the CFA (colour filter\n * array) and colour basis, and for applying white balance (WB) only once. Only validated 3×3 matrices\n * are accepted, and their declared determinant and inverse bounds are kept.\n *\n * Development model (`sensor-color-development` 2.0.0). The input c is the normalized camera\n * channels: black level subtracted, divided by the effective white level and clipped at 1 per site,\n * all earlier in the pipeline.\n *\n * b = highlight(diag(g)·c), linear sRGB = X · M · diag(w) · b\n *\n * Where:\n * - M is the profile's camera→XYZ matrix and X is the XYZ→linear-sRGB matrix.\n * - w = M⁻¹·XYZ(D65), normalized to green. These are the camera-neutral coordinates of D65\n * (DNG 1.7 \"camera neutral\").\n * - The WB gains g map the scene white to equal channel values. diag(w) then maps equal channel values\n * to D65, for any invertible M. So a grey card lit by the gains' illuminant comes out neutral,\n * whether or not M is white-normalized.\n * - Without a resolved WB intent, g = 1/w, and development reduces to X·M·c (a D65 scene white).\n * - The camera neutral of the scene white, written to DNG `AsShotNeutral`, is g_green/g.\n * This module does not chromatically adapt the scene, infer calibration, change geometry or write\n * container metadata.\n *\n * Highlight handling (after each site is clipped at the sensor white level):\n * - `clip` (default): every WB-scaled channel is clipped at the smallest gain. That is the level at\n * which the least-amplified channel saturates, so fully clipped pixels stay neutral. This is the\n * documented default of dcraw (`-H 0`, \"clip all highlights to solid white\") and of most raw\n * converters.\n * - `reconstruct`: a desaturation blend defined by this engine. Let s be the largest normalized\n * channel. The weight t = clamp((s − 0.8)/0.2, 0, 1) blends the unclipped WB result u toward the\n * neutral n = max_k min(u_k, g_min): b = (1 − t)·u + t·n. Below 0.8 of white, colour is unchanged\n * and unclipped; at white it is neutral. This approximation follows the idea of highlight\n * desaturation (Guo, Cheng & Hu, \"Correcting over-exposure in photographs\", CVPR 2010). It does not\n * recover the clipped scene signal.\n * @see docs/PHOTOGRAPHIC_EXPORT.md and docs/NATIVE_RAW_AND_PRINT.md for equations and limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { resolveCaptureColorModel } from \"./capture-color.js\";\n\ntype Matrix = readonly (readonly number[])[];\nexport const SENSOR_COLOR_DEVELOPMENT_MODEL = Object.freeze({ id: \"sensor-color-development\", version: \"2.0.0\" } as const);\n/** RAW development highlight policy; see the module notes. */\nexport type RawHighlightMode = \"clip\" | \"reconstruct\";\n/** Normalized channel level where `reconstruct` starts blending toward neutral. */\nexport const RAW_HIGHLIGHT_RECONSTRUCTION_START = 0.8;\n/** Profiles whose camera neutral is within this relative distance of [1,1,1] are white-normalized. */\nconst WHITE_NORMALIZED_TOLERANCE = 1e-12;\n\n/** Multiply in declared row order: ((0 + m0·v0) + m1·v1) + m2·v2. */\nfunction multiply(m: Matrix, values: readonly number[]): number[] {\n return m.map((row) => row.reduce((sum, v, i) => sum+v*values[i]!, 0));\n}\n/** Accepts validated 3×3 matrices only, and keeps their declared determinant and inverse bounds. */\nexport function invertSensorColorMatrix(m: Matrix): number[][] {\n const [a,b,c,d,e,f,g,h,i]=m.flat() as number[], det=a!*(e!*i!-f!*h!)-b!*(d!*i!-f!*g!)+c!*(d!*h!-e!*g!);\n if (!Number.isFinite(det) || Math.abs(det)<1e-9) throw new InvalidConfigurationError(\"Export color matrix is singular or outside supported conditioning.\");\n const result=[[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!]].map((r) => r.map((v) => v/det));\n if (result.flat().some((v) => !Number.isFinite(v) || Math.abs(v)>100)) throw new InvalidConfigurationError(\"Export inverse color matrix exceeds supported range.\");\n return result;\n}\n\n/** Camera coordinates of the declared D65 white (not normalized). The caller decides container policy. */\nexport function sensorColorReferenceWhite(xyzToCamera: Matrix): number[] {\n const white = resolveCaptureColorModel().referenceWhiteXyz;\n return multiply(xyzToCamera, [white.x, 1, white.z]);\n}\n\n/** Per-pixel highlight/WB counters accumulated by {@link SensorColorDevelopment.developInto}. */\nexport interface SensorColorDevelopmentCounts { whiteBalanceClippedSampleCount: number; reconstructedPixelCount: number }\n\nexport interface SensorColorDevelopment {\n referenceWhiteXyz: { x: number; y: 1; z: number };\n /** Green-normalized camera-neutral coordinates of D65 (exactly [1,1,1] for white-normalized profiles). */\n cameraNeutralD65: readonly number[];\n /** Applied channel gains: the resolved WB gains, or 1/cameraNeutralD65 when WB is not required. */\n appliedGains: readonly number[];\n /** Green-normalized camera neutral of the assumed scene white: g_green/g (DNG AsShotNeutral). */\n asShotNeutral: readonly number[];\n /** X·M·diag(w) rows, applied as two products in the documented order. */\n cameraToXyz: readonly (readonly number[])[];\n highlightMode: RawHighlightMode;\n /** Develops one normalized camera pixel into out[offset..offset+2] (linear sRGB/D65); updates counts. */\n developInto(c0: number, c1: number, c2: number, out: Float64Array | number[], offset: number, counts: SensorColorDevelopmentCounts): void;\n /** Convenience array form of developInto (counts discarded). */\n develop(values: readonly number[]): number[];\n}\n\n/**\n * Internal development of validated, normalized sensor RGB with a declared D65 profile.\n * `gains` is the resolved WB intent, or null when WB is not required. Both the packed native path and\n * the bounded reference path use the returned operator, so there is one implementation.\n */\nexport function prepareSensorColorDevelopment(cameraChannelsToXyz: Matrix, gains: readonly number[] | null,\n highlightMode: RawHighlightMode = \"clip\"): SensorColorDevelopment {\n if (highlightMode !== \"clip\" && highlightMode !== \"reconstruct\") throw new InvalidConfigurationError(\"Unsupported RAW highlight mode.\");\n const model = resolveCaptureColorModel();\n const raw = sensorColorReferenceWhite(invertSensorColorMatrix(cameraChannelsToXyz));\n if (raw.some((x) => !(x > 0) || !Number.isFinite(x))) throw new InvalidConfigurationError(\"Reference white requires positive camera coordinates.\");\n let neutral = raw.map((x) => x/raw[1]!);\n if (neutral.every((x) => Math.abs(x-1) <= WHITE_NORMALIZED_TOLERANCE)) neutral = [1, 1, 1];\n if (gains && (gains.length !== 3 || gains.some((x) => !(x > 0) || !Number.isFinite(x)))) throw new InvalidConfigurationError(\"White-balance gains must be positive and finite.\");\n const applied = gains ? [...gains] : neutral.map((x) => 1/x);\n const asShot = applied.map((x) => applied[1]!/x), clipLevel = Math.min(...applied);\n const m = cameraChannelsToXyz.map((row) => row.map((v, i) => v*neutral[i]!)), x = model.xyzToCameraRgb;\n const m0 = m[0]!, m1 = m[1]!, m2 = m[2]!, x0 = x[0]!, x1 = x[1]!, x2 = x[2]!;\n const g0 = applied[0]!, g1 = applied[1]!, g2 = applied[2]!, reconstruct = highlightMode === \"reconstruct\";\n const start = RAW_HIGHLIGHT_RECONSTRUCTION_START;\n function developInto(c0: number, c1: number, c2: number, out: Float64Array | number[], offset: number, counts: SensorColorDevelopmentCounts): void {\n const u0 = c0*g0, u1 = c1*g1, u2 = c2*g2;\n let b0: number, b1: number, b2: number;\n const k0 = u0 > clipLevel ? clipLevel : u0, k1 = u1 > clipLevel ? clipLevel : u1, k2 = u2 > clipLevel ? clipLevel : u2;\n if (!reconstruct) {\n b0 = k0; b1 = k1; b2 = k2;\n counts.whiteBalanceClippedSampleCount += Number(u0 > clipLevel)+Number(u1 > clipLevel)+Number(u2 > clipLevel);\n } else {\n const s = c0 > c1 ? (c0 > c2 ? c0 : c2) : (c1 > c2 ? c1 : c2);\n if (s > start) {\n const t = s >= 1 ? 1 : (s-start)/(1-start), n = k0 > k1 ? (k0 > k2 ? k0 : k2) : (k1 > k2 ? k1 : k2);\n b0 = (1-t)*u0+t*n; b1 = (1-t)*u1+t*n; b2 = (1-t)*u2+t*n; counts.reconstructedPixelCount++;\n } else { b0 = u0; b1 = u1; b2 = u2; }\n }\n const X = ((0+m0[0]!*b0)+m0[1]!*b1)+m0[2]!*b2, Y = ((0+m1[0]!*b0)+m1[1]!*b1)+m1[2]!*b2, Z = ((0+m2[0]!*b0)+m2[1]!*b1)+m2[2]!*b2;\n out[offset] = ((0+x0[0]!*X)+x0[1]!*Y)+x0[2]!*Z;\n out[offset+1] = ((0+x1[0]!*X)+x1[1]!*Y)+x1[2]!*Z;\n out[offset+2] = ((0+x2[0]!*X)+x2[1]!*Y)+x2[2]!*Z;\n }\n return {\n referenceWhiteXyz: model.referenceWhiteXyz, cameraNeutralD65: Object.freeze(neutral), appliedGains: Object.freeze(applied),\n asShotNeutral: Object.freeze(asShot), cameraToXyz: m, highlightMode, developInto,\n develop(values: readonly number[]): number[] {\n const out = [0, 0, 0]; developInto(values[0]!, values[1]!, values[2]!, out, 0, { whiteBalanceClippedSampleCount: 0, reconstructedPixelCount: 0 }); return out;\n }\n };\n}\n"]}
@@ -2,7 +2,14 @@ export declare const SRGB_ICC_PROFILE_VERSION: "0.1.0";
2
2
  /**
3
3
  * Reference: https://registry.color.org/rgb-registry/files/sRGB.pdf and ICC.1:2022.
4
4
  * This is an original Photivra profile, not a redistributed ICC or operating-system profile.
5
- * Bradford here encodes the D50 profile-connection space; it does not apply shooting WB.
5
+ * The Bradford step here only converts to the D50 profile connection space. It does not apply the
6
+ * white balance (WB) chosen when shooting.
6
7
  */
8
+ /** ICC/DNG D50 profile-connection white (ICC.1:2022 §7.2.16). */
9
+ export declare const ICC_D50_WHITE_XYZ: readonly [0.9642, 1, 0.8249];
10
+ /**
11
+ * Linear Bradford adaptation from the engine's D65 white to D50: M⁻¹·diag(LMS(D50)/LMS(D65))·M with the
12
+ * Bradford cone matrix M (Lam 1985; as tabulated in ICC.1:2022 Annex E). Internal; not a root export.
13
+ */
14
+ export declare function bradfordD65ToD50Matrix(): number[][];
7
15
  export declare function createSrgbIccProfile(): Uint8Array;
8
- //# sourceMappingURL=srgb-icc.d.ts.map
@@ -1,19 +1,30 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- /** Original ICC v4 matrix/TRC serialization from public sRGB/ICC numeric specifications. */
2
+ /** Writes an original ICC v4 matrix/TRC (tone reproduction curve) profile from the public sRGB and ICC numeric specifications. */
3
3
  import { resolveCaptureColorModel } from "./capture-color.js";
4
4
  import { invertSensorColorMatrix } from "./sensor-color-development.js";
5
5
  export const SRGB_ICC_PROFILE_VERSION = "0.1.0";
6
6
  /**
7
7
  * Reference: https://registry.color.org/rgb-registry/files/sRGB.pdf and ICC.1:2022.
8
8
  * This is an original Photivra profile, not a redistributed ICC or operating-system profile.
9
- * Bradford here encodes the D50 profile-connection space; it does not apply shooting WB.
9
+ * The Bradford step here only converts to the D50 profile connection space. It does not apply the
10
+ * white balance (WB) chosen when shooting.
10
11
  */
11
- export function createSrgbIccProfile() {
12
- const model = resolveCaptureColorModel(), d65 = [model.referenceWhiteXyz.x, 1, model.referenceWhiteXyz.z], d50 = [.9642, 1, .8249];
12
+ /** ICC/DNG D50 profile-connection white (ICC.1:2022 §7.2.16). */
13
+ export const ICC_D50_WHITE_XYZ = [.9642, 1, .8249];
14
+ /**
15
+ * Linear Bradford adaptation from the engine's D65 white to D50: M⁻¹·diag(LMS(D50)/LMS(D65))·M with the
16
+ * Bradford cone matrix M (Lam 1985; as tabulated in ICC.1:2022 Annex E). Internal; not a root export.
17
+ */
18
+ export function bradfordD65ToD50Matrix() {
19
+ const model = resolveCaptureColorModel(), d65 = [model.referenceWhiteXyz.x, 1, model.referenceWhiteXyz.z], d50 = ICC_D50_WHITE_XYZ;
13
20
  const bradford = [[.8951, .2664, -.1614], [-.7502, 1.7135, .0367], [.0389, -.0685, 1.0296]];
14
21
  const lms = (v) => bradford.map(row => row.reduce((sum, x, i) => sum + x * v[i], 0));
15
22
  const a = lms(d65), b = lms(d50), inverse = invertSensorColorMatrix(bradford);
16
- const chad = inverse.map(row => [0, 1, 2].map(j => row.reduce((sum, x, i) => sum + x * b[i] / a[i] * bradford[i][j], 0)));
23
+ return inverse.map(row => [0, 1, 2].map(j => row.reduce((sum, x, i) => sum + x * b[i] / a[i] * bradford[i][j], 0)));
24
+ }
25
+ export function createSrgbIccProfile() {
26
+ const model = resolveCaptureColorModel(), d50 = ICC_D50_WHITE_XYZ;
27
+ const chad = bradfordD65ToD50Matrix();
17
28
  const colorants = chad.map(row => [0, 1, 2].map(j => row.reduce((sum, x, i) => sum + x * model.cameraRgbToXyz[i][j], 0)));
18
29
  const signature = (value) => new TextEncoder().encode(value);
19
30
  function xyz(v) {
@@ -1 +1 @@
1
- {"version":3,"file":"srgb-icc.js","sourceRoot":"","sources":["../../src/color/srgb-icc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"srgb-icc.js","sourceRoot":"","sources":["../../src/color/srgb-icc.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/** Writes an original ICC v4 matrix/TRC (tone reproduction curve) profile from the public sRGB and ICC numeric specifications. */\nimport { resolveCaptureColorModel } from \"./capture-color.js\";\nimport { invertSensorColorMatrix } from \"./sensor-color-development.js\";\nexport const SRGB_ICC_PROFILE_VERSION=\"0.1.0\" as const;\n/**\n * Reference: https://registry.color.org/rgb-registry/files/sRGB.pdf and ICC.1:2022.\n * This is an original Photivra profile, not a redistributed ICC or operating-system profile.\n * The Bradford step here only converts to the D50 profile connection space. It does not apply the\n * white balance (WB) chosen when shooting.\n */\n/** ICC/DNG D50 profile-connection white (ICC.1:2022 §7.2.16). */\nexport const ICC_D50_WHITE_XYZ=[.9642,1,.8249] as const;\n/**\n * Linear Bradford adaptation from the engine's D65 white to D50: M⁻¹·diag(LMS(D50)/LMS(D65))·M with the\n * Bradford cone matrix M (Lam 1985; as tabulated in ICC.1:2022 Annex E). Internal; not a root export.\n */\nexport function bradfordD65ToD50Matrix():number[][] {\n const model=resolveCaptureColorModel(),d65=[model.referenceWhiteXyz.x,1,model.referenceWhiteXyz.z],d50=ICC_D50_WHITE_XYZ;\n const bradford=[[.8951,.2664,-.1614],[-.7502,1.7135,.0367],[.0389,-.0685,1.0296]];\n const lms=(v:readonly number[]):number[]=>bradford.map(row=>row.reduce((sum,x,i)=>sum+x*v[i]!,0));\n const a=lms(d65),b=lms(d50),inverse=invertSensorColorMatrix(bradford);\n return inverse.map(row=>[0,1,2].map(j=>row.reduce((sum,x,i)=>sum+x*b[i]!/a[i]!*bradford[i]![j]!,0)));\n}\nexport function createSrgbIccProfile():Uint8Array {\n const model=resolveCaptureColorModel(),d50=ICC_D50_WHITE_XYZ;\n const chad=bradfordD65ToD50Matrix();\n const colorants=chad.map(row=>[0,1,2].map(j=>row.reduce((sum,x,i)=>sum+x*model.cameraRgbToXyz[i]![j]!,0)));\n const signature=(value:string):Uint8Array=>new TextEncoder().encode(value);\n function xyz(v:readonly number[]):Uint8Array {\n const bytes=new Uint8Array(20),view=new DataView(bytes.buffer);bytes.set(signature(\"XYZ \"));\n v.forEach((x,i)=>view.setInt32(8+4*i,Math.round(x*65536),false));return bytes;\n }\n function text(value:string):Uint8Array {\n const bytes=new Uint8Array(28+2*value.length),view=new DataView(bytes.buffer);bytes.set(signature(\"mluc\"));\n view.setUint32(8,1,false);view.setUint32(12,12,false);bytes.set(signature(\"enUS\"),16);view.setUint32(20,value.length*2,false);view.setUint32(24,28,false);\n for(let i=0;i<value.length;i++)view.setUint16(28+2*i,value.charCodeAt(i),false);return bytes;\n }\n const curve=new Uint8Array(40),cv=new DataView(curve.buffer);curve.set(signature(\"para\"));cv.setUint16(8,4,false);\n [2.4,1/1.055,.055/1.055,1/12.92,.04045,0,0].forEach((x,i)=>cv.setInt32(12+4*i,Math.round(x*65536),false));\n const adaptation=new Uint8Array(44),av=new DataView(adaptation.buffer);adaptation.set(signature(\"sf32\"));chad.flat().forEach((x,i)=>av.setInt32(8+4*i,Math.round(x*65536),false));\n const tags:[string,Uint8Array][]=[\n [\"desc\",text(\"Photivra sRGB matrix/TRC v4\")],[\"cprt\",text(\"Copyright Photivra contributors. Apache-2.0.\")],\n [\"wtpt\",xyz(d50)],[\"rXYZ\",xyz(colorants.map(row=>row[0]!))],[\"gXYZ\",xyz(colorants.map(row=>row[1]!))],[\"bXYZ\",xyz(colorants.map(row=>row[2]!))],\n [\"rTRC\",curve],[\"gTRC\",curve],[\"bTRC\",curve],[\"chad\",adaptation]\n ];\n const aligned=(n:number):number=>Math.ceil(n/4)*4;\n const size=132+12*tags.length+tags.reduce((sum,[,bytes])=>sum+aligned(bytes.length),0);\n const output=new Uint8Array(size),view=new DataView(output.buffer);view.setUint32(0,size,false);view.setUint32(8,0x04300000,false);\n output.set(signature(\"mntr\"),12);output.set(signature(\"RGB \"),16);output.set(signature(\"XYZ \"),20);\n [2000,1,1,0,0,0].forEach((x,i)=>view.setUint16(24+2*i,x,false));output.set(signature(\"acsp\"),36);\n view.setUint32(64,1,false);d50.forEach((x,i)=>view.setInt32(68+4*i,Math.round(x*65536),false));output.set(signature(\"PHTV\"),80);\n view.setUint32(128,tags.length,false);let offset=132+12*tags.length;\n tags.forEach(([name,bytes],i)=>{const p=132+12*i;output.set(signature(name),p);view.setUint32(p+4,offset,false);view.setUint32(p+8,bytes.length,false);output.set(bytes,offset);offset+=aligned(bytes.length);});\n return output;\n}\n"]}
@@ -1,4 +1,3 @@
1
- /** Internal component transfer shared by SDR rendering and explicitly staged Print filtering. */
1
+ /** Internal sRGB transfer function for one component. Shared by SDR rendering and the staged Print filter. */
2
2
  export declare function encodeSrgbComponent(sample: number): number;
3
3
  export declare function decodeSrgbComponent(sample: number): number;
4
- //# sourceMappingURL=srgb-transfer.d.ts.map
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- /** Internal component transfer shared by SDR rendering and explicitly staged Print filtering. */
2
+ /** Internal sRGB transfer function for one component. Shared by SDR rendering and the staged Print filter. */
3
3
  export function encodeSrgbComponent(sample) {
4
4
  return sample === 1 ? 1 : sample <= .0031308 ? sample * 12.92 : 1.055 * sample ** (1 / 2.4) - .055;
5
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"srgb-transfer.js","sourceRoot":"","sources":["../../src/color/srgb-transfer.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iGAAiG;AACjG,MAAM,UAAU,mBAAmB,CAAC,MAAa;IAC/C,OAAO,MAAM,KAAG,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,MAAM,IAAE,QAAQ,CAAA,CAAC,CAAA,MAAM,GAAC,KAAK,CAAA,CAAC,CAAA,KAAK,GAAC,MAAM,IAAE,CAAC,CAAC,GAAC,GAAG,CAAC,GAAC,IAAI,CAAC;AAC/E,CAAC;AACD,MAAM,UAAU,mBAAmB,CAAC,MAAa;IAC/C,OAAO,MAAM,KAAG,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,MAAM,IAAE,MAAM,CAAA,CAAC,CAAA,MAAM,GAAC,KAAK,CAAA,CAAC,CAAA,CAAC,CAAC,MAAM,GAAC,IAAI,CAAC,GAAC,KAAK,CAAC,IAAE,GAAG,CAAC;AAC7E,CAAC"}
1
+ {"version":3,"file":"srgb-transfer.js","sourceRoot":"","sources":["../../src/color/srgb-transfer.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,8GAA8G;AAC9G,MAAM,UAAU,mBAAmB,CAAC,MAAa;IAC/C,OAAO,MAAM,KAAG,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,MAAM,IAAE,QAAQ,CAAA,CAAC,CAAA,MAAM,GAAC,KAAK,CAAA,CAAC,CAAA,KAAK,GAAC,MAAM,IAAE,CAAC,CAAC,GAAC,GAAG,CAAC,GAAC,IAAI,CAAC;AAC/E,CAAC;AACD,MAAM,UAAU,mBAAmB,CAAC,MAAa;IAC/C,OAAO,MAAM,KAAG,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,MAAM,IAAE,MAAM,CAAA,CAAC,CAAA,MAAM,GAAC,KAAK,CAAA,CAAC,CAAA,CAAC,CAAC,MAAM,GAAC,IAAI,CAAC,GAAC,KAAK,CAAC,IAAE,GAAG,CAAC;AAC7E,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n/** Internal sRGB transfer function for one component. Shared by SDR rendering and the staged Print filter. */\nexport function encodeSrgbComponent(sample:number):number {\n return sample===1?1:sample<=.0031308?sample*12.92:1.055*sample**(1/2.4)-.055;\n}\nexport function decodeSrgbComponent(sample:number):number {\n return sample===1?1:sample<=.04045?sample/12.92:((sample+.055)/1.055)**2.4;\n}\n"]}