@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
@@ -1,25 +1,31 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Parses one generic relative exposure-metering profile. Schema 0.1.0 is approximation-only and
5
- * consumes relative pre-exposure linear signal. It deliberately does not claim luminance, spectral
6
- * radiance, sensor-plane irradiance, or a specific manufacturer's meter calibration.
7
- * Meters relative pre-exposure linear signal over the actual oriented active capture frame. The first
8
- * contract is an educational/relative approximation. It is intentionally independent of final output
9
- * crop, display/tone mapping, exposure compensation, and automatic exposure setting resolution.
10
- * @see docs/USAGE.md for equations, coordinate/unit conventions, blockers and support limits.
3
+ * Generic relative exposure metering.
4
+ *
5
+ * The profile parser reads one metering profile. Schema 0.1.0 is an approximation only. It works on
6
+ * relative linear signal measured before the exposure (pre-exposure). It deliberately does not claim
7
+ * luminance, spectral radiance, sensor-plane irradiance or any manufacturer's meter calibration.
8
+ *
9
+ * The meter works over the actual active capture frame, in its capture orientation. This first
10
+ * contract is an educational, relative approximation. It deliberately ignores the final output crop,
11
+ * display and tone mapping, exposure compensation and the choice of automatic exposure settings.
12
+ * @see docs/USAGE.md for the equations, units, coordinate conventions, known blockers and support
13
+ * limits.
11
14
  */
12
15
  import { approximationResult } from "../core/calculation-result.js";
13
16
  import { InvalidConfigurationError } from "../core/configuration-error.js";
14
17
  import { parseEvidenceList } from "../core/evidence-provenance.js";
15
18
  import { InvalidScientificInputError } from "../core/validation.js";
19
+ import { requireInputKeys, requireInputObject, rejectUnknownFields, rejectUnknownVariantFields } from "../core/record-validation.js";
16
20
  export const EXPOSURE_METERING_PROFILE_SCHEMA_VERSION = "0.1.0";
17
- function requireRecord(value, path) {
21
+ function requireRecord(value, path, allowedKeys) {
18
22
  if (typeof value !== "object" ||
19
23
  value === null ||
20
24
  Array.isArray(value)) {
21
25
  throw new InvalidConfigurationError(path + " must be an object.");
22
26
  }
27
+ if (allowedKeys !== null)
28
+ rejectUnknownFields(value, allowedKeys, path);
23
29
  return value;
24
30
  }
25
31
  function requireNonEmptyString(value, path) {
@@ -52,7 +58,7 @@ function requireFraction(value, path) {
52
58
  return parsed;
53
59
  }
54
60
  function parseUv(value, path) {
55
- const record = requireRecord(value, path);
61
+ const record = requireRecord(value, path, ["u", "v"]);
56
62
  const u = requireFinite(record.u, path + ".u");
57
63
  const v = requireFinite(record.v, path + ".v");
58
64
  if (u < 0 ||
@@ -76,7 +82,14 @@ function parseLimitations(value, path) {
76
82
  return limitations;
77
83
  }
78
84
  function parsePolicy(value, path) {
79
- const record = requireRecord(value, path);
85
+ const record = requireRecord(value, path, null);
86
+ rejectUnknownVariantFields(record, "kind", {
87
+ "multi-zone-uniform": ["kind"],
88
+ "center-weighted-radial": ["kind", "edgeWeight", "exponent"],
89
+ spot: ["kind", "centerOrientedCaptureUv", "radiusFractionOfCaptureDiagonal"],
90
+ "highlight-weighted": ["kind", "minimumWeightFraction", "exponent"],
91
+ "highlight-priority": ["kind", "highlightPercentile", "saturationRelativeSignal", "headroomStops"]
92
+ }, path);
80
93
  if (record.kind ===
81
94
  "multi-zone-uniform") {
82
95
  return {
@@ -117,17 +130,85 @@ function parsePolicy(value, path) {
117
130
  exponent: requirePositiveFinite(record.exponent, path + ".exponent")
118
131
  };
119
132
  }
133
+ if (record.kind ===
134
+ "highlight-priority") {
135
+ const percentile = requirePositiveFinite(record.highlightPercentile, path + ".highlightPercentile");
136
+ if (percentile > 1) {
137
+ throw new InvalidConfigurationError(path +
138
+ ".highlightPercentile must lie in (0, 1].");
139
+ }
140
+ const headroom = record.headroomStops;
141
+ if (typeof headroom !== "number" ||
142
+ !Number.isFinite(headroom) ||
143
+ headroom < 0) {
144
+ throw new InvalidConfigurationError(path +
145
+ ".headroomStops must be a finite number greater than or equal to zero.");
146
+ }
147
+ return {
148
+ kind: "highlight-priority",
149
+ highlightPercentile: percentile,
150
+ saturationRelativeSignal: requirePositiveFinite(record.saturationRelativeSignal, path +
151
+ ".saturationRelativeSignal"),
152
+ headroomStops: headroom
153
+ };
154
+ }
120
155
  throw new InvalidConfigurationError(path + ".kind is invalid.");
121
156
  }
157
+ /**
158
+ * Relative signal at which a highlight-priority profile places its highlight
159
+ * percentile: `saturationRelativeSignal * 2^-headroomStops`.
160
+ */
161
+ export function calculateHighlightPriorityPlacementSignal(saturationRelativeSignal, headroomStops) {
162
+ if (!Number.isFinite(saturationRelativeSignal) ||
163
+ saturationRelativeSignal <= 0 ||
164
+ !Number.isFinite(headroomStops) ||
165
+ headroomStops < 0) {
166
+ throw new InvalidScientificInputError("Highlight placement requires a positive saturation signal and non-negative headroom.");
167
+ }
168
+ return saturationRelativeSignal *
169
+ Math.pow(2, -headroomStops);
170
+ }
171
+ /**
172
+ * Lower area-weighted quantile (inverse empirical CDF). Sort samples by
173
+ * ascending signal and add up their area weights. The result is the smallest
174
+ * sample signal at which the running weight fraction reaches `percentile`.
175
+ * Ties keep their input order, so the result is deterministic.
176
+ */
177
+ function areaWeightedLowerQuantile(samples, percentile) {
178
+ const ordered = samples
179
+ .map((sample, index) => ({
180
+ signal: sample.relativeLinearSignal,
181
+ weight: sample.areaWeight,
182
+ index
183
+ }))
184
+ .sort((a, b) => a.signal - b.signal ||
185
+ a.index - b.index);
186
+ let total = 0;
187
+ for (const entry of ordered)
188
+ total += entry.weight;
189
+ const threshold = percentile * total;
190
+ let cumulative = 0;
191
+ for (const entry of ordered) {
192
+ cumulative += entry.weight;
193
+ // Relative tolerance absorbs summation rounding at exact quantile boundaries.
194
+ if (cumulative >=
195
+ threshold * (1 - 1e-12)) {
196
+ return entry.signal;
197
+ }
198
+ }
199
+ return ordered[ordered.length - 1]
200
+ .signal;
201
+ }
122
202
  /**
123
203
  * Parses one generic relative exposure-metering profile.
124
204
  *
125
- * Schema 0.1.0 is approximation-only and consumes relative pre-exposure
126
- * linear signal. It deliberately does not claim luminance, spectral radiance,
127
- * sensor-plane irradiance, or a specific manufacturer's meter calibration.
205
+ * Schema 0.1.0 is an approximation only. It works on relative linear signal
206
+ * measured before the exposure. It deliberately does not claim luminance,
207
+ * spectral radiance, sensor-plane irradiance or any manufacturer's meter
208
+ * calibration.
128
209
  */
129
210
  export function parseExposureMeteringProfile(value) {
130
- const record = requireRecord(value, "exposureMeteringProfile");
211
+ const record = requireRecord(value, "exposureMeteringProfile", ["schemaVersion", "scientificStatus", "inputDomain", "captureRegion", "target", "policy", "profileId", "evidence", "limitations"]);
131
212
  if (record.schemaVersion !==
132
213
  EXPOSURE_METERING_PROFILE_SCHEMA_VERSION) {
133
214
  throw new InvalidConfigurationError('exposureMeteringProfile.schemaVersion must be "' +
@@ -146,21 +227,31 @@ export function parseExposureMeteringProfile(value) {
146
227
  "oriented-active-capture") {
147
228
  throw new InvalidConfigurationError('exposureMeteringProfile.captureRegion must be "oriented-active-capture".');
148
229
  }
149
- const target = requireRecord(record.target, "exposureMeteringProfile.target");
230
+ const target = requireRecord(record.target, "exposureMeteringProfile.target", ["kind", "targetRelativeSignal", "evidence"]);
150
231
  if (target.kind !==
151
232
  "relative-signal-reference") {
152
233
  throw new InvalidConfigurationError('exposureMeteringProfile.target.kind must be "relative-signal-reference".');
153
234
  }
235
+ const policy = parsePolicy(record.policy, "exposureMeteringProfile.policy");
236
+ const targetRelativeSignal = requirePositiveFinite(target.targetRelativeSignal, "exposureMeteringProfile.target.targetRelativeSignal");
237
+ if (policy.kind === "highlight-priority") {
238
+ const placement = calculateHighlightPriorityPlacementSignal(policy.saturationRelativeSignal, policy.headroomStops);
239
+ if (Math.abs(targetRelativeSignal -
240
+ placement) >
241
+ 1e-12 * placement) {
242
+ throw new InvalidConfigurationError("exposureMeteringProfile.target.targetRelativeSignal must equal saturationRelativeSignal * 2^-headroomStops for highlight-priority metering.");
243
+ }
244
+ }
154
245
  return {
155
246
  schemaVersion: EXPOSURE_METERING_PROFILE_SCHEMA_VERSION,
156
247
  profileId: requireNonEmptyString(record.profileId, "exposureMeteringProfile.profileId"),
157
248
  scientificStatus: "approximation",
158
249
  inputDomain: "relative-pre-exposure-linear-signal",
159
250
  captureRegion: "oriented-active-capture",
160
- policy: parsePolicy(record.policy, "exposureMeteringProfile.policy"),
251
+ policy,
161
252
  target: {
162
253
  kind: "relative-signal-reference",
163
- targetRelativeSignal: requirePositiveFinite(target.targetRelativeSignal, "exposureMeteringProfile.target.targetRelativeSignal"),
254
+ targetRelativeSignal,
164
255
  evidence: parseEvidenceList(target.evidence, "exposureMeteringProfile.target.evidence")
165
256
  },
166
257
  evidence: parseEvidenceList(record.evidence, "exposureMeteringProfile.evidence"),
@@ -170,7 +261,7 @@ export function parseExposureMeteringProfile(value) {
170
261
  function requireInputString(value, path) {
171
262
  if (typeof value !== "string" ||
172
263
  value.trim().length === 0) {
173
- throw new InvalidScientificInputError(path + " must be a non-empty string.");
264
+ throw new InvalidConfigurationError(path + " must be a non-empty string.");
174
265
  }
175
266
  return value.trim();
176
267
  }
@@ -197,6 +288,7 @@ function requireInputNonNegativeFinite(value, path) {
197
288
  return parsed;
198
289
  }
199
290
  function validateSampleUv(uv, path) {
291
+ requireInputObject(uv, path);
200
292
  const u = requireInputFinite(uv.u, path + ".u");
201
293
  const v = requireInputFinite(uv.v, path + ".v");
202
294
  if (u < 0 ||
@@ -208,6 +300,9 @@ function validateSampleUv(uv, path) {
208
300
  }
209
301
  }
210
302
  function validateCaptureGeometry(geometry) {
303
+ requireInputObject(geometry, "sampleSet.captureGeometry");
304
+ requireInputObject(geometry.orientedCapture, "sampleSet.captureGeometry.orientedCapture");
305
+ requireInputObject(geometry.orientedCapture.imagingArea, "sampleSet.captureGeometry.orientedCapture.imagingArea");
211
306
  const width = requireInputPositiveFinite(geometry.orientedCapture
212
307
  .imagingArea.widthMm, "sampleSet.captureGeometry.orientedCapture.imagingArea.widthMm");
213
308
  const height = requireInputPositiveFinite(geometry.orientedCapture
@@ -219,6 +314,7 @@ function validateCaptureGeometry(geometry) {
219
314
  }
220
315
  function validateProcessingState(sampleSet) {
221
316
  const state = sampleSet.processingState;
317
+ requireInputObject(state, "sampleSet.processingState");
222
318
  if (state.exposureSettingsApplied !==
223
319
  false ||
224
320
  state.whiteBalanceApplied !==
@@ -269,6 +365,10 @@ function policyWeight(policy, sample, widthMm, heightMm, maximumSignal) {
269
365
  ? 1
270
366
  : 0;
271
367
  }
368
+ if (policy.kind === "highlight-priority") {
369
+ // Quantile placement is not a weighted mean; meterRelativeExposure handles it separately.
370
+ return 1;
371
+ }
272
372
  if (maximumSignal <= 0) {
273
373
  return policy
274
374
  .minimumWeightFraction;
@@ -281,16 +381,18 @@ function policyWeight(policy, sample, widthMm, heightMm, maximumSignal) {
281
381
  Math.pow(normalizedHighlight, policy.exponent));
282
382
  }
283
383
  /**
284
- * Meters relative pre-exposure linear signal over the actual oriented active
285
- * capture frame.
384
+ * Meters relative pre-exposure linear signal over the actual active capture
385
+ * frame, in its capture orientation.
286
386
  *
287
- * The first contract is an educational/relative approximation. It is
288
- * intentionally independent of final output crop, display/tone mapping,
289
- * exposure compensation, and automatic exposure setting resolution.
387
+ * This first contract is an educational, relative approximation. It
388
+ * deliberately ignores the final output crop, display and tone mapping,
389
+ * exposure compensation and the choice of automatic exposure settings.
290
390
  */
291
391
  export function meterRelativeExposure(input) {
392
+ requireInputKeys(input, "meterRelativeExposure", ["profile", "sampleSet"]);
292
393
  const profile = parseExposureMeteringProfile(input.profile);
293
394
  const sampleSet = input.sampleSet;
395
+ requireInputObject(sampleSet, "sampleSet");
294
396
  requireInputString(sampleSet.measurementId, "sampleSet.measurementId");
295
397
  requireInputString(sampleSet.sceneStateId, "sampleSet.sceneStateId");
296
398
  if (sampleSet.inputDomain !==
@@ -305,7 +407,7 @@ export function meterRelativeExposure(input) {
305
407
  validateProcessingState(sampleSet);
306
408
  if (!Array.isArray(sampleSet.samples) ||
307
409
  sampleSet.samples.length === 0) {
308
- throw new InvalidScientificInputError("sampleSet.samples must be a non-empty array.");
410
+ throw new InvalidConfigurationError("sampleSet.samples must be a non-empty array.");
309
411
  }
310
412
  const sampleIds = [];
311
413
  let maximumSignal = 0;
@@ -314,6 +416,7 @@ export function meterRelativeExposure(input) {
314
416
  const path = "sampleSet.samples[" +
315
417
  index +
316
418
  "]";
419
+ requireInputObject(sample, path);
317
420
  sampleIds.push(requireInputString(sample.sampleId, path + ".sampleId"));
318
421
  validateSampleUv(sample
319
422
  .positionOrientedCaptureUv, path +
@@ -336,7 +439,11 @@ export function meterRelativeExposure(input) {
336
439
  let weightedSignal = 0;
337
440
  let weightSum = 0;
338
441
  let selectedSampleCount = 0;
339
- for (const sample of sampleSet.samples) {
442
+ const highlightPolicy = profile.policy.kind ===
443
+ "highlight-priority"
444
+ ? profile.policy
445
+ : null;
446
+ for (const sample of highlightPolicy === null ? sampleSet.samples : []) {
340
447
  const policyMultiplier = policyWeight(profile.policy, sample, widthMm, heightMm, maximumSignal);
341
448
  if (policyMultiplier <= 0) {
342
449
  continue;
@@ -353,10 +460,18 @@ export function meterRelativeExposure(input) {
353
460
  !Number.isFinite(weightSum)) {
354
461
  throw new InvalidScientificInputError("Metering weighted sums must remain finite.");
355
462
  }
463
+ if (highlightPolicy !== null) {
464
+ // Every sample participates in the quantile with its area weight.
465
+ weightSum = 1;
466
+ selectedSampleCount =
467
+ sampleSet.samples.length;
468
+ }
356
469
  if (weightSum <= 0) {
357
470
  throw new InvalidScientificInputError("Metering policy selected no samples with positive weight.");
358
471
  }
359
- const meteredRelativeSignal = weightedSignal / weightSum;
472
+ const meteredRelativeSignal = highlightPolicy === null
473
+ ? weightedSignal / weightSum
474
+ : areaWeightedLowerQuantile(sampleSet.samples, highlightPolicy.highlightPercentile);
360
475
  if (!Number.isFinite(meteredRelativeSignal) ||
361
476
  meteredRelativeSignal < 0) {
362
477
  throw new InvalidScientificInputError("Metered relative signal must remain finite and non-negative.");
@@ -388,7 +503,20 @@ export function meterRelativeExposure(input) {
388
503
  calibratedLuminanceClaimAuthorized: false,
389
504
  calibratedSceneRadianceClaimAuthorized: false,
390
505
  automaticExposureResolved: false,
391
- resultReusableForAeLock: true
506
+ resultReusableForAeLock: true,
507
+ ...(highlightPolicy === null
508
+ ? {}
509
+ : {
510
+ highlightPriority: {
511
+ highlightPercentile: highlightPolicy.highlightPercentile,
512
+ percentileRelativeSignal: meteredRelativeSignal,
513
+ saturationRelativeSignal: highlightPolicy.saturationRelativeSignal,
514
+ headroomStops: highlightPolicy.headroomStops,
515
+ placementRelativeSignal: profile.target
516
+ .targetRelativeSignal,
517
+ quantileDefinition: "area-weighted-lower-quantile-inverse-empirical-cdf"
518
+ }
519
+ })
392
520
  };
393
521
  const value = meteredRelativeSignal === 0
394
522
  ? {
@@ -407,11 +535,12 @@ export function meterRelativeExposure(input) {
407
535
  .targetRelativeSignal /
408
536
  meteredRelativeSignal)
409
537
  };
410
- return approximationResult(value, "relative-pre-exposure-metering", "1.0.0", [
538
+ return approximationResult(value, "relative-pre-exposure-metering", "1.1.0", [
411
539
  "Input samples are relative pre-exposure linear signal, not calibrated luminance, scene spectral radiance, sensor-plane irradiance, or final rendered output.",
412
540
  "Sample areaWeight is supplied by the producer and is assumed to represent the active capture frame consistently.",
413
541
  "Metering coordinates are normalized over the physically oriented active capture frame, not the final output crop or CSS/display box.",
414
- "Multi-zone, center-weighted, spot, and highlight-weighted policies are generic explicit approximations and do not claim to reproduce a specific commercial camera.",
542
+ "Multi-zone, center-weighted, spot, highlight-weighted and highlight-priority policies are generic explicit approximations and do not claim to reproduce a specific commercial camera.",
543
+ "highlight-weighted is a highlight-emphasis weighted average placed at the target; it does not place highlights relative to saturation. highlight-priority places an area-weighted signal quantile at a declared headroom below a declared relative saturation signal.",
415
544
  "The declared relative target is profile policy, not a universal 18% gray truth.",
416
545
  "Exposure compensation is not applied by the meter.",
417
546
  "Automatic aperture, shutter, and ISO resolution remains downstream.",
@@ -1 +1 @@
1
- {"version":3,"file":"metering.js","sourceRoot":"","sources":["../../src/exposure/metering.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metering.js","sourceRoot":"","sources":["../../src/exposure/metering.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Generic relative exposure metering.\n *\n * The profile parser reads one metering profile. Schema 0.1.0 is an approximation only. It works on\n * relative linear signal measured before the exposure (pre-exposure). It deliberately does not claim\n * luminance, spectral radiance, sensor-plane irradiance or any manufacturer's meter calibration.\n *\n * The meter works over the actual active capture frame, in its capture orientation. This first\n * contract is an educational, relative approximation. It deliberately ignores the final output crop,\n * display and tone mapping, exposure compensation and the choice of automatic exposure settings.\n * @see docs/USAGE.md for the equations, units, coordinate conventions, known blockers and support\n * limits.\n */\n\nimport {\n approximationResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport {\n parseEvidenceList,\n type EvidenceProvenance\n} from \"../core/evidence-provenance.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport type {\n NormalizedRasterUv,\n ResolvedCaptureGeometry\n} from \"../output/capture-geometry.js\";\nimport { requireInputKeys, requireInputObject, rejectUnknownFields, rejectUnknownVariantFields } from \"../core/record-validation.js\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport const EXPOSURE_METERING_PROFILE_SCHEMA_VERSION =\n \"0.1.0\" as const;\n\nexport type ExposureMeteringPolicy =\n | {\n kind: \"multi-zone-uniform\";\n }\n | {\n kind: \"center-weighted-radial\";\n edgeWeight: number;\n exponent: number;\n }\n | {\n kind: \"spot\";\n centerOrientedCaptureUv:\n NormalizedRasterUv;\n radiusFractionOfCaptureDiagonal:\n number;\n }\n | {\n /**\n * Weighted average that emphasises highlights (unchanged since 1.x).\n * Brighter samples get the weight `minimumWeightFraction + (1 -\n * minimumWeightFraction) * (signal / maximum)^exponent`. The weighted mean\n * is then placed at the profile target.\n *\n * This is NOT highlight protection. No sample is placed relative to\n * saturation. In a mostly mid-grey scene with a small bright area, it\n * underexposes the mid-tones compared with uniform metering, yet does not\n * guarantee headroom. Use `highlight-priority` to keep highlights below\n * saturation.\n */\n kind: \"highlight-weighted\";\n minimumWeightFraction: number;\n exponent: number;\n }\n | {\n /**\n * Highlight-priority placement. The area-weighted `highlightPercentile`\n * quantile of the relative pre-exposure signal is placed `headroomStops`\n * below `saturationRelativeSignal`. The profile target must state that\n * placement exactly: `targetRelativeSignal = saturationRelativeSignal *\n * 2^-headroomStops` (see {@link calculateHighlightPriorityPlacementSignal}).\n */\n kind: \"highlight-priority\";\n /** Area-weighted quantile in (0, 1]; 1 places the brightest sample. */\n highlightPercentile: number;\n /** Relative pre-exposure signal at which the declared output saturates. */\n saturationRelativeSignal: number;\n /** Non-negative headroom in stops between the placed highlight and saturation. */\n headroomStops: number;\n };\n\n/** Diagnostics reported only for the highlight-priority policy. */\nexport interface HighlightPriorityMeteringDiagnostics {\n highlightPercentile: number;\n /** Lower area-weighted quantile (inverse empirical CDF) of the samples. */\n percentileRelativeSignal: number;\n saturationRelativeSignal: number;\n headroomStops: number;\n placementRelativeSignal: number;\n quantileDefinition:\n \"area-weighted-lower-quantile-inverse-empirical-cdf\";\n}\n\nexport interface ExposureMeteringProfile {\n schemaVersion:\n typeof EXPOSURE_METERING_PROFILE_SCHEMA_VERSION;\n profileId: string;\n scientificStatus: \"approximation\";\n inputDomain:\n \"relative-pre-exposure-linear-signal\";\n captureRegion:\n \"oriented-active-capture\";\n policy: ExposureMeteringPolicy;\n target: {\n kind: \"relative-signal-reference\";\n targetRelativeSignal: number;\n evidence: readonly EvidenceProvenance[];\n };\n evidence: readonly EvidenceProvenance[];\n limitations: readonly string[];\n}\n\nexport interface ExposureMeteringZoneSample {\n sampleId: string;\n positionOrientedCaptureUv:\n NormalizedRasterUv;\n relativeLinearSignal: number;\n areaWeight: number;\n}\n\nexport interface ExposureMeteringSampleSet {\n measurementId: string;\n sceneStateId: string;\n inputDomain:\n \"relative-pre-exposure-linear-signal\";\n captureRegion:\n \"oriented-active-capture\";\n captureGeometry:\n ResolvedCaptureGeometry;\n processingState: {\n exposureSettingsApplied: false;\n whiteBalanceApplied: false;\n toneMappingApplied: false;\n displayGammaApplied: false;\n sharpeningApplied: false;\n };\n samples:\n readonly ExposureMeteringZoneSample[];\n}\n\ninterface ExposureMeteringResultBase {\n measurementId: string;\n sceneStateId: string;\n profileId: string;\n scientificStatus: \"approximation\";\n inputDomain:\n \"relative-pre-exposure-linear-signal\";\n captureRegion:\n \"oriented-active-capture\";\n orientation:\n ResolvedCaptureGeometry[\"orientedCapture\"][\"orientation\"];\n activeCaptureImagingAreaMm: {\n width: number;\n height: number;\n };\n policyKind:\n ExposureMeteringPolicy[\"kind\"];\n targetRelativeSignal: number;\n meteredRelativeSignal: number;\n totalSampleCount: number;\n selectedSampleCount: number;\n normalizedWeightSum: number;\n outputCropUsedForMetering: false;\n exposureCompensationApplied: false;\n finalToneMappingUsed: false;\n displayGammaUsed: false;\n calibratedLuminanceClaimAuthorized: false;\n calibratedSceneRadianceClaimAuthorized: false;\n automaticExposureResolved: false;\n resultReusableForAeLock: true;\n /** Present only for the highlight-priority policy. */\n highlightPriority?: HighlightPriorityMeteringDiagnostics;\n}\n\nexport type ExposureMeteringResult =\n | (ExposureMeteringResultBase & {\n status: \"resolved\";\n requiredExposureScaleToTarget:\n number;\n exposureOffsetStopsToTarget:\n number;\n })\n | (ExposureMeteringResultBase & {\n status: \"no-signal\";\n requiredExposureScaleResolved:\n false;\n exposureOffsetStopsResolved:\n false;\n });\n\nexport interface MeterRelativeExposureInput {\n profile: ExposureMeteringProfile;\n sampleSet: ExposureMeteringSampleSet;\n}\n\nfunction requireRecord(\n value: unknown,\n path: string,\n allowedKeys: readonly string[] | null\n): UnknownRecord {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be an object.\"\n );\n }\n if (allowedKeys !== null) rejectUnknownFields(value, allowedKeys, path);\n return value as UnknownRecord;\n}\n\nfunction requireNonEmptyString(\n value: unknown,\n path: string\n): string {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a non-empty string.\"\n );\n }\n return value.trim();\n}\n\nfunction requireFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be finite.\"\n );\n }\n return value;\n}\n\nfunction requirePositiveFinite(\n value: unknown,\n path: string\n): number {\n const parsed = requireFinite(\n value,\n path\n );\n if (parsed <= 0) {\n throw new InvalidConfigurationError(\n path + \" must be greater than zero.\"\n );\n }\n return parsed;\n}\n\nfunction requireFraction(\n value: unknown,\n path: string\n): number {\n const parsed = requireFinite(\n value,\n path\n );\n if (parsed < 0 || parsed > 1) {\n throw new InvalidConfigurationError(\n path +\n \" must be a finite fraction from 0 through 1.\"\n );\n }\n return parsed;\n}\n\nfunction parseUv(\n value: unknown,\n path: string\n): NormalizedRasterUv {\n const record = requireRecord(\n value,\n path, [\"u\", \"v\"]\n );\n const u = requireFinite(\n record.u,\n path + \".u\"\n );\n const v = requireFinite(\n record.v,\n path + \".v\"\n );\n if (\n u < 0 ||\n u > 1 ||\n v < 0 ||\n v > 1\n ) {\n throw new InvalidConfigurationError(\n path +\n \" coordinates must lie within [0, 1].\"\n );\n }\n return { u, v };\n}\n\nfunction parseLimitations(\n value: unknown,\n path: string\n): readonly string[] {\n if (!Array.isArray(value)) {\n throw new InvalidConfigurationError(\n path + \" must be an array.\"\n );\n }\n const limitations = value.map(\n (entry, index) =>\n requireNonEmptyString(\n entry,\n path + \"[\" + index + \"]\"\n )\n );\n if (\n new Set(limitations).size !==\n limitations.length\n ) {\n throw new InvalidConfigurationError(\n path + \" must not contain duplicates.\"\n );\n }\n return limitations;\n}\n\nfunction parsePolicy(\n value: unknown,\n path: string\n): ExposureMeteringPolicy {\n const record = requireRecord(\n value,\n path, null\n );\n rejectUnknownVariantFields(record, \"kind\", {\n \"multi-zone-uniform\": [\"kind\"],\n \"center-weighted-radial\": [\"kind\", \"edgeWeight\", \"exponent\"],\n spot: [\"kind\", \"centerOrientedCaptureUv\", \"radiusFractionOfCaptureDiagonal\"],\n \"highlight-weighted\": [\"kind\", \"minimumWeightFraction\", \"exponent\"],\n \"highlight-priority\": [\"kind\", \"highlightPercentile\", \"saturationRelativeSignal\", \"headroomStops\"]\n }, path);\n\n if (\n record.kind ===\n \"multi-zone-uniform\"\n ) {\n return {\n kind: \"multi-zone-uniform\"\n };\n }\n\n if (\n record.kind ===\n \"center-weighted-radial\"\n ) {\n return {\n kind:\n \"center-weighted-radial\",\n edgeWeight: requireFraction(\n record.edgeWeight,\n path + \".edgeWeight\"\n ),\n exponent:\n requirePositiveFinite(\n record.exponent,\n path + \".exponent\"\n )\n };\n }\n\n if (record.kind === \"spot\") {\n const radius =\n requirePositiveFinite(\n record\n .radiusFractionOfCaptureDiagonal,\n path +\n \".radiusFractionOfCaptureDiagonal\"\n );\n if (radius > 1) {\n throw new InvalidConfigurationError(\n path +\n \".radiusFractionOfCaptureDiagonal must be at most 1.\"\n );\n }\n return {\n kind: \"spot\",\n centerOrientedCaptureUv:\n parseUv(\n record\n .centerOrientedCaptureUv,\n path +\n \".centerOrientedCaptureUv\"\n ),\n radiusFractionOfCaptureDiagonal:\n radius\n };\n }\n\n if (\n record.kind ===\n \"highlight-weighted\"\n ) {\n return {\n kind: \"highlight-weighted\",\n minimumWeightFraction:\n requireFraction(\n record\n .minimumWeightFraction,\n path +\n \".minimumWeightFraction\"\n ),\n exponent:\n requirePositiveFinite(\n record.exponent,\n path + \".exponent\"\n )\n };\n }\n\n if (\n record.kind ===\n \"highlight-priority\"\n ) {\n const percentile =\n requirePositiveFinite(\n record.highlightPercentile,\n path + \".highlightPercentile\"\n );\n if (percentile > 1) {\n throw new InvalidConfigurationError(\n path +\n \".highlightPercentile must lie in (0, 1].\"\n );\n }\n const headroom =\n record.headroomStops;\n if (\n typeof headroom !== \"number\" ||\n !Number.isFinite(headroom) ||\n headroom < 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \".headroomStops must be a finite number greater than or equal to zero.\"\n );\n }\n return {\n kind: \"highlight-priority\",\n highlightPercentile:\n percentile,\n saturationRelativeSignal:\n requirePositiveFinite(\n record.saturationRelativeSignal,\n path +\n \".saturationRelativeSignal\"\n ),\n headroomStops: headroom\n };\n }\n\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\n/**\n * Relative signal at which a highlight-priority profile places its highlight\n * percentile: `saturationRelativeSignal * 2^-headroomStops`.\n */\nexport function calculateHighlightPriorityPlacementSignal(\n saturationRelativeSignal: number,\n headroomStops: number\n): number {\n if (\n !Number.isFinite(saturationRelativeSignal) ||\n saturationRelativeSignal <= 0 ||\n !Number.isFinite(headroomStops) ||\n headroomStops < 0\n ) {\n throw new InvalidScientificInputError(\n \"Highlight placement requires a positive saturation signal and non-negative headroom.\"\n );\n }\n return saturationRelativeSignal *\n Math.pow(2, -headroomStops);\n}\n\n/**\n * Lower area-weighted quantile (inverse empirical CDF). Sort samples by\n * ascending signal and add up their area weights. The result is the smallest\n * sample signal at which the running weight fraction reaches `percentile`.\n * Ties keep their input order, so the result is deterministic.\n */\nfunction areaWeightedLowerQuantile(\n samples:\n readonly ExposureMeteringZoneSample[],\n percentile: number\n): number {\n const ordered = samples\n .map((sample, index) => ({\n signal:\n sample.relativeLinearSignal,\n weight: sample.areaWeight,\n index\n }))\n .sort((a, b) =>\n a.signal - b.signal ||\n a.index - b.index\n );\n let total = 0;\n for (const entry of ordered) total += entry.weight;\n const threshold =\n percentile * total;\n let cumulative = 0;\n for (const entry of ordered) {\n cumulative += entry.weight;\n // Relative tolerance absorbs summation rounding at exact quantile boundaries.\n if (\n cumulative >=\n threshold * (1 - 1e-12)\n ) {\n return entry.signal;\n }\n }\n return ordered[ordered.length - 1]!\n .signal;\n}\n\n/**\n * Parses one generic relative exposure-metering profile.\n *\n * Schema 0.1.0 is an approximation only. It works on relative linear signal\n * measured before the exposure. It deliberately does not claim luminance,\n * spectral radiance, sensor-plane irradiance or any manufacturer's meter\n * calibration.\n */\nexport function parseExposureMeteringProfile(\n value: unknown\n): ExposureMeteringProfile {\n const record = requireRecord(\n value,\n \"exposureMeteringProfile\", [\"schemaVersion\", \"scientificStatus\", \"inputDomain\", \"captureRegion\", \"target\", \"policy\", \"profileId\", \"evidence\", \"limitations\"]\n );\n\n if (\n record.schemaVersion !==\n EXPOSURE_METERING_PROFILE_SCHEMA_VERSION\n ) {\n throw new InvalidConfigurationError(\n 'exposureMeteringProfile.schemaVersion must be \"' +\n EXPOSURE_METERING_PROFILE_SCHEMA_VERSION +\n '\".'\n );\n }\n if (\n record.scientificStatus !==\n \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureMeteringProfile.scientificStatus must be \"approximation\" in schema 0.1.0.'\n );\n }\n if (\n record.inputDomain !==\n \"relative-pre-exposure-linear-signal\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureMeteringProfile.inputDomain must be \"relative-pre-exposure-linear-signal\".'\n );\n }\n if (\n record.captureRegion !==\n \"oriented-active-capture\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureMeteringProfile.captureRegion must be \"oriented-active-capture\".'\n );\n }\n\n const target = requireRecord(\n record.target,\n \"exposureMeteringProfile.target\", [\"kind\", \"targetRelativeSignal\", \"evidence\"]\n );\n if (\n target.kind !==\n \"relative-signal-reference\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureMeteringProfile.target.kind must be \"relative-signal-reference\".'\n );\n }\n\n const policy = parsePolicy(\n record.policy,\n \"exposureMeteringProfile.policy\"\n );\n const targetRelativeSignal =\n requirePositiveFinite(\n target.targetRelativeSignal,\n \"exposureMeteringProfile.target.targetRelativeSignal\"\n );\n if (policy.kind === \"highlight-priority\") {\n const placement =\n calculateHighlightPriorityPlacementSignal(\n policy.saturationRelativeSignal,\n policy.headroomStops\n );\n if (\n Math.abs(\n targetRelativeSignal -\n placement\n ) >\n 1e-12 * placement\n ) {\n throw new InvalidConfigurationError(\n \"exposureMeteringProfile.target.targetRelativeSignal must equal saturationRelativeSignal * 2^-headroomStops for highlight-priority metering.\"\n );\n }\n }\n\n return {\n schemaVersion:\n EXPOSURE_METERING_PROFILE_SCHEMA_VERSION,\n profileId:\n requireNonEmptyString(\n record.profileId,\n \"exposureMeteringProfile.profileId\"\n ),\n scientificStatus: \"approximation\",\n inputDomain:\n \"relative-pre-exposure-linear-signal\",\n captureRegion:\n \"oriented-active-capture\",\n policy,\n target: {\n kind:\n \"relative-signal-reference\",\n targetRelativeSignal,\n evidence: parseEvidenceList(\n target.evidence,\n \"exposureMeteringProfile.target.evidence\"\n )\n },\n evidence: parseEvidenceList(\n record.evidence,\n \"exposureMeteringProfile.evidence\"\n ),\n limitations: parseLimitations(\n record.limitations,\n \"exposureMeteringProfile.limitations\"\n )\n };\n}\n\nfunction requireInputString(\n value: unknown,\n path: string\n): string {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a non-empty string.\"\n );\n }\n return value.trim();\n}\n\nfunction requireInputFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value)\n ) {\n throw new InvalidScientificInputError(\n path + \" must be finite.\"\n );\n }\n return value;\n}\n\nfunction requireInputPositiveFinite(\n value: unknown,\n path: string\n): number {\n const parsed = requireInputFinite(\n value,\n path\n );\n if (parsed <= 0) {\n throw new InvalidScientificInputError(\n path + \" must be greater than zero.\"\n );\n }\n return parsed;\n}\n\nfunction requireInputNonNegativeFinite(\n value: unknown,\n path: string\n): number {\n const parsed = requireInputFinite(\n value,\n path\n );\n if (parsed < 0) {\n throw new InvalidScientificInputError(\n path +\n \" must be greater than or equal to zero.\"\n );\n }\n return parsed;\n}\n\nfunction validateSampleUv(\n uv: NormalizedRasterUv,\n path: string\n): void {\n requireInputObject(uv, path);\n const u = requireInputFinite(\n uv.u,\n path + \".u\"\n );\n const v = requireInputFinite(\n uv.v,\n path + \".v\"\n );\n if (\n u < 0 ||\n u > 1 ||\n v < 0 ||\n v > 1\n ) {\n throw new InvalidScientificInputError(\n path +\n \" coordinates must lie within [0, 1].\"\n );\n }\n}\n\nfunction validateCaptureGeometry(\n geometry:\n ResolvedCaptureGeometry\n): void {\n requireInputObject(geometry, \"sampleSet.captureGeometry\");\n requireInputObject(geometry.orientedCapture, \"sampleSet.captureGeometry.orientedCapture\");\n requireInputObject(geometry.orientedCapture.imagingArea, \"sampleSet.captureGeometry.orientedCapture.imagingArea\");\n const width =\n requireInputPositiveFinite(\n geometry.orientedCapture\n .imagingArea.widthMm,\n \"sampleSet.captureGeometry.orientedCapture.imagingArea.widthMm\"\n );\n const height =\n requireInputPositiveFinite(\n geometry.orientedCapture\n .imagingArea.heightMm,\n \"sampleSet.captureGeometry.orientedCapture.imagingArea.heightMm\"\n );\n const diagonal = Math.hypot(\n width,\n height\n );\n if (!Number.isFinite(diagonal)) {\n throw new InvalidScientificInputError(\n \"sampleSet.captureGeometry oriented capture diagonal must remain finite.\"\n );\n }\n}\n\nfunction validateProcessingState(\n sampleSet:\n ExposureMeteringSampleSet\n): void {\n const state =\n sampleSet.processingState;\n requireInputObject(state, \"sampleSet.processingState\");\n if (\n state.exposureSettingsApplied !==\n false ||\n state.whiteBalanceApplied !==\n false ||\n state.toneMappingApplied !==\n false ||\n state.displayGammaApplied !==\n false ||\n state.sharpeningApplied !==\n false\n ) {\n throw new InvalidScientificInputError(\n \"Relative exposure metering requires pre-exposure linear samples before exposure settings, white balance, tone mapping, display gamma, and sharpening.\"\n );\n }\n}\n\nfunction physicalNormalizedDistanceFromCenter(\n uv: NormalizedRasterUv,\n widthMm: number,\n heightMm: number\n): number {\n const x =\n (uv.u - 0.5) * widthMm;\n const y =\n (uv.v - 0.5) * heightMm;\n const halfDiagonal =\n Math.hypot(\n widthMm,\n heightMm\n ) / 2;\n return Math.hypot(x, y) /\n halfDiagonal;\n}\n\nfunction physicalDistanceFractionOfDiagonal(\n a: NormalizedRasterUv,\n b: NormalizedRasterUv,\n widthMm: number,\n heightMm: number\n): number {\n const dx =\n (a.u - b.u) * widthMm;\n const dy =\n (a.v - b.v) * heightMm;\n const diagonal =\n Math.hypot(\n widthMm,\n heightMm\n );\n return Math.hypot(dx, dy) /\n diagonal;\n}\n\nfunction policyWeight(\n policy: ExposureMeteringPolicy,\n sample:\n ExposureMeteringZoneSample,\n widthMm: number,\n heightMm: number,\n maximumSignal: number\n): number {\n if (\n policy.kind ===\n \"multi-zone-uniform\"\n ) {\n return 1;\n }\n\n if (\n policy.kind ===\n \"center-weighted-radial\"\n ) {\n const radialPhase = Math.min(\n 1,\n physicalNormalizedDistanceFromCenter(\n sample\n .positionOrientedCaptureUv,\n widthMm,\n heightMm\n )\n );\n return (\n policy.edgeWeight +\n (1 - policy.edgeWeight) *\n Math.pow(\n 1 - radialPhase,\n policy.exponent\n )\n );\n }\n\n if (policy.kind === \"spot\") {\n const distance =\n physicalDistanceFractionOfDiagonal(\n sample\n .positionOrientedCaptureUv,\n policy\n .centerOrientedCaptureUv,\n widthMm,\n heightMm\n );\n return distance <=\n policy\n .radiusFractionOfCaptureDiagonal\n ? 1\n : 0;\n }\n\n if (policy.kind === \"highlight-priority\") {\n // Quantile placement is not a weighted mean; meterRelativeExposure handles it separately.\n return 1;\n }\n if (maximumSignal <= 0) {\n return policy\n .minimumWeightFraction;\n }\n const normalizedHighlight =\n sample.relativeLinearSignal /\n maximumSignal;\n return (\n policy.minimumWeightFraction +\n (1 -\n policy.minimumWeightFraction) *\n Math.pow(\n normalizedHighlight,\n policy.exponent\n )\n );\n}\n\n/**\n * Meters relative pre-exposure linear signal over the actual active capture\n * frame, in its capture orientation.\n *\n * This first contract is an educational, relative approximation. It\n * deliberately ignores the final output crop, display and tone mapping,\n * exposure compensation and the choice of automatic exposure settings.\n */\nexport function meterRelativeExposure(\n input:\n MeterRelativeExposureInput\n): CalculationResult<ExposureMeteringResult> {\n requireInputKeys(input, \"meterRelativeExposure\", [\"profile\", \"sampleSet\"]);\n const profile =\n parseExposureMeteringProfile(\n input.profile\n );\n const sampleSet = input.sampleSet;\n requireInputObject(sampleSet, \"sampleSet\");\n\n requireInputString(\n sampleSet.measurementId,\n \"sampleSet.measurementId\"\n );\n requireInputString(\n sampleSet.sceneStateId,\n \"sampleSet.sceneStateId\"\n );\n\n if (\n sampleSet.inputDomain !==\n profile.inputDomain\n ) {\n throw new InvalidScientificInputError(\n \"sampleSet.inputDomain must match the metering profile.\"\n );\n }\n if (\n sampleSet.captureRegion !==\n profile.captureRegion\n ) {\n throw new InvalidScientificInputError(\n \"sampleSet.captureRegion must match the metering profile.\"\n );\n }\n\n validateCaptureGeometry(\n sampleSet.captureGeometry\n );\n validateProcessingState(\n sampleSet\n );\n\n if (\n !Array.isArray(\n sampleSet.samples\n ) ||\n sampleSet.samples.length === 0\n ) {\n throw new InvalidConfigurationError(\n \"sampleSet.samples must be a non-empty array.\"\n );\n }\n\n const sampleIds: string[] = [];\n let maximumSignal = 0;\n for (\n let index = 0;\n index < sampleSet.samples.length;\n index += 1\n ) {\n const sample =\n sampleSet.samples[index]!;\n const path =\n \"sampleSet.samples[\" +\n index +\n \"]\";\n requireInputObject(sample, path);\n sampleIds.push(\n requireInputString(\n sample.sampleId,\n path + \".sampleId\"\n )\n );\n validateSampleUv(\n sample\n .positionOrientedCaptureUv,\n path +\n \".positionOrientedCaptureUv\"\n );\n const signal =\n requireInputNonNegativeFinite(\n sample.relativeLinearSignal,\n path +\n \".relativeLinearSignal\"\n );\n requireInputPositiveFinite(\n sample.areaWeight,\n path + \".areaWeight\"\n );\n maximumSignal = Math.max(\n maximumSignal,\n signal\n );\n }\n\n if (\n new Set(sampleIds).size !==\n sampleIds.length\n ) {\n throw new InvalidScientificInputError(\n \"sampleSet.samples[].sampleId must not contain duplicates.\"\n );\n }\n\n const widthMm =\n sampleSet.captureGeometry\n .orientedCapture.imagingArea\n .widthMm;\n const heightMm =\n sampleSet.captureGeometry\n .orientedCapture.imagingArea\n .heightMm;\n\n let weightedSignal = 0;\n let weightSum = 0;\n let selectedSampleCount = 0;\n const highlightPolicy =\n profile.policy.kind ===\n \"highlight-priority\"\n ? profile.policy\n : null;\n\n for (const sample of highlightPolicy === null ? sampleSet.samples : []) {\n const policyMultiplier =\n policyWeight(\n profile.policy,\n sample,\n widthMm,\n heightMm,\n maximumSignal\n );\n if (policyMultiplier <= 0) {\n continue;\n }\n const weight =\n sample.areaWeight *\n policyMultiplier;\n weightedSignal +=\n sample.relativeLinearSignal *\n weight;\n weightSum += weight;\n selectedSampleCount += 1;\n }\n\n if (\n !Number.isFinite(\n weightedSignal\n ) ||\n !Number.isFinite(weightSum)\n ) {\n throw new InvalidScientificInputError(\n \"Metering weighted sums must remain finite.\"\n );\n }\n if (highlightPolicy !== null) {\n // Every sample participates in the quantile with its area weight.\n weightSum = 1;\n selectedSampleCount =\n sampleSet.samples.length;\n }\n if (weightSum <= 0) {\n throw new InvalidScientificInputError(\n \"Metering policy selected no samples with positive weight.\"\n );\n }\n\n const meteredRelativeSignal =\n highlightPolicy === null\n ? weightedSignal / weightSum\n : areaWeightedLowerQuantile(\n sampleSet.samples,\n highlightPolicy.highlightPercentile\n );\n if (\n !Number.isFinite(\n meteredRelativeSignal\n ) ||\n meteredRelativeSignal < 0\n ) {\n throw new InvalidScientificInputError(\n \"Metered relative signal must remain finite and non-negative.\"\n );\n }\n\n const base = {\n measurementId:\n sampleSet.measurementId,\n sceneStateId:\n sampleSet.sceneStateId,\n profileId: profile.profileId,\n scientificStatus:\n \"approximation\" as const,\n inputDomain:\n \"relative-pre-exposure-linear-signal\" as const,\n captureRegion:\n \"oriented-active-capture\" as const,\n orientation:\n sampleSet.captureGeometry\n .orientedCapture.orientation,\n activeCaptureImagingAreaMm: {\n width: widthMm,\n height: heightMm\n },\n policyKind:\n profile.policy.kind,\n targetRelativeSignal:\n profile.target\n .targetRelativeSignal,\n meteredRelativeSignal,\n totalSampleCount:\n sampleSet.samples.length,\n selectedSampleCount,\n normalizedWeightSum: 1,\n outputCropUsedForMetering:\n false as const,\n exposureCompensationApplied:\n false as const,\n finalToneMappingUsed:\n false as const,\n displayGammaUsed: false as const,\n calibratedLuminanceClaimAuthorized:\n false as const,\n calibratedSceneRadianceClaimAuthorized:\n false as const,\n automaticExposureResolved:\n false as const,\n resultReusableForAeLock:\n true as const,\n ...(highlightPolicy === null\n ? {}\n : {\n highlightPriority: {\n highlightPercentile:\n highlightPolicy.highlightPercentile,\n percentileRelativeSignal:\n meteredRelativeSignal,\n saturationRelativeSignal:\n highlightPolicy.saturationRelativeSignal,\n headroomStops:\n highlightPolicy.headroomStops,\n placementRelativeSignal:\n profile.target\n .targetRelativeSignal,\n quantileDefinition:\n \"area-weighted-lower-quantile-inverse-empirical-cdf\" as const\n }\n })\n };\n\n const value:\n ExposureMeteringResult =\n meteredRelativeSignal === 0\n ? {\n ...base,\n status: \"no-signal\",\n requiredExposureScaleResolved:\n false,\n exposureOffsetStopsResolved:\n false\n }\n : {\n ...base,\n status: \"resolved\",\n requiredExposureScaleToTarget:\n profile.target\n .targetRelativeSignal /\n meteredRelativeSignal,\n exposureOffsetStopsToTarget:\n Math.log2(\n profile.target\n .targetRelativeSignal /\n meteredRelativeSignal\n )\n };\n\n return approximationResult(\n value,\n \"relative-pre-exposure-metering\",\n \"1.1.0\",\n [\n \"Input samples are relative pre-exposure linear signal, not calibrated luminance, scene spectral radiance, sensor-plane irradiance, or final rendered output.\",\n \"Sample areaWeight is supplied by the producer and is assumed to represent the active capture frame consistently.\",\n \"Metering coordinates are normalized over the physically oriented active capture frame, not the final output crop or CSS/display box.\",\n \"Multi-zone, center-weighted, spot, highlight-weighted and highlight-priority policies are generic explicit approximations and do not claim to reproduce a specific commercial camera.\",\n \"highlight-weighted is a highlight-emphasis weighted average placed at the target; it does not place highlights relative to saturation. highlight-priority places an area-weighted signal quantile at a declared headroom below a declared relative saturation signal.\",\n \"The declared relative target is profile policy, not a universal 18% gray truth.\",\n \"Exposure compensation is not applied by the meter.\",\n \"Automatic aperture, shutter, and ISO resolution remains downstream.\",\n \"White balance, tone mapping, display gamma, sharpening, and final output crop do not participate in this metering calculation.\",\n \"A no-signal result does not fabricate an infinite exposure correction.\"\n ]\n );\n}\n"]}
@@ -20,10 +20,10 @@ export interface ExposureProgramLineProfile {
20
20
  /**
21
21
  * Parses a generic educational/product exposure program line.
22
22
  *
23
- * A program line is control policy, not physics. Nodes declare desired
24
- * aperture/shutter pairs at explicit optical-exposure stops relative to the
25
- * resolver's reference exposure. Resolution later verifies that every node is
26
- * physically consistent with that reference and current equipment capability.
23
+ * A program line is control policy, not physics. Each node declares a wanted
24
+ * aperture/shutter pair at an explicit number of stops of optical exposure,
25
+ * relative to the resolver's reference exposure. The resolver later checks
26
+ * that every node is physically consistent with that reference and with what
27
+ * the equipment can do.
27
28
  */
28
29
  export declare function parseExposureProgramLineProfile(value: unknown): ExposureProgramLineProfile;
29
- //# sourceMappingURL=program-line.d.ts.map
@@ -1,21 +1,27 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Parses a generic educational/product exposure program line. A program line is control policy, not
5
- * physics. Nodes declare desired aperture/shutter pairs at explicit optical-exposure stops relative to
6
- * the resolver's reference exposure. Resolution later verifies that every node is physically
7
- * consistent with that reference and current equipment capability.
8
- * @see docs/USAGE.md for equations, coordinate/unit conventions, blockers and support limits.
3
+ * Generic exposure program lines, for teaching and for products. A program line is the curve of
4
+ * aperture/shutter pairs a camera's Program mode follows.
5
+ *
6
+ * A program line is control policy, not physics. Each node declares a wanted aperture/shutter pair at
7
+ * an explicit number of stops of optical exposure, relative to the resolver's reference exposure.
8
+ * The resolver later checks that every node is physically consistent with that reference and with
9
+ * what the equipment can do.
10
+ * @see docs/USAGE.md for the equations, units, coordinate conventions, known blockers and support
11
+ * limits.
9
12
  */
13
+ import { rejectUnknownFields } from "../core/record-validation.js";
10
14
  import { InvalidConfigurationError } from "../core/configuration-error.js";
11
15
  import { parseEvidenceList } from "../core/evidence-provenance.js";
12
16
  export const EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION = "0.1.0";
13
- function requireRecord(value, path) {
17
+ function requireRecord(value, path, allowedKeys) {
14
18
  if (typeof value !== "object" ||
15
19
  value === null ||
16
20
  Array.isArray(value)) {
17
21
  throw new InvalidConfigurationError(path + " must be an object.");
18
22
  }
23
+ if (allowedKeys !== null)
24
+ rejectUnknownFields(value, allowedKeys, path);
19
25
  return value;
20
26
  }
21
27
  function requireNonEmptyString(value, path) {
@@ -55,13 +61,14 @@ function parseLimitations(value, path) {
55
61
  /**
56
62
  * Parses a generic educational/product exposure program line.
57
63
  *
58
- * A program line is control policy, not physics. Nodes declare desired
59
- * aperture/shutter pairs at explicit optical-exposure stops relative to the
60
- * resolver's reference exposure. Resolution later verifies that every node is
61
- * physically consistent with that reference and current equipment capability.
64
+ * A program line is control policy, not physics. Each node declares a wanted
65
+ * aperture/shutter pair at an explicit number of stops of optical exposure,
66
+ * relative to the resolver's reference exposure. The resolver later checks
67
+ * that every node is physically consistent with that reference and with what
68
+ * the equipment can do.
62
69
  */
63
70
  export function parseExposureProgramLineProfile(value) {
64
- const record = requireRecord(value, "exposureProgramLineProfile");
71
+ const record = requireRecord(value, "exposureProgramLineProfile", ["schemaVersion", "scientificStatus", "policyKind", "interpolation", "nodes", "profileId", "profileVersion", "evidence", "limitations"]);
65
72
  if (record.schemaVersion !==
66
73
  EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION) {
67
74
  throw new InvalidConfigurationError('exposureProgramLineProfile.schemaVersion must be "' +
@@ -90,7 +97,7 @@ export function parseExposureProgramLineProfile(value) {
90
97
  const path = "exposureProgramLineProfile.nodes[" +
91
98
  index +
92
99
  "]";
93
- const node = requireRecord(entry, path);
100
+ const node = requireRecord(entry, path, ["nodeId", "opticalExposureStopsFromReference", "aperture", "shutterSeconds"]);
94
101
  const nodeId = requireNonEmptyString(node.nodeId, path + ".nodeId");
95
102
  const stops = requireFinite(node
96
103
  .opticalExposureStopsFromReference, path +
@@ -1 +1 @@
1
- {"version":3,"file":"program-line.js","sourceRoot":"","sources":["../../src/exposure/program-line.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"program-line.js","sourceRoot":"","sources":["../../src/exposure/program-line.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Generic exposure program lines, for teaching and for products. A program line is the curve of\n * aperture/shutter pairs a camera's Program mode follows.\n *\n * A program line is control policy, not physics. Each node declares a wanted aperture/shutter pair at\n * an explicit number of stops of optical exposure, relative to the resolver's reference exposure.\n * The resolver later checks that every node is physically consistent with that reference and with\n * what the equipment can do.\n * @see docs/USAGE.md for the equations, units, coordinate conventions, known blockers and support\n * limits.\n */\n\nimport { rejectUnknownFields } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport {\n parseEvidenceList,\n type EvidenceProvenance\n} from \"../core/evidence-provenance.js\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport const EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION =\n \"0.1.0\" as const;\n\nexport interface ExposureProgramLineNode {\n nodeId: string;\n opticalExposureStopsFromReference: number;\n aperture: number;\n shutterSeconds: number;\n}\n\nexport interface ExposureProgramLineProfile {\n schemaVersion:\n typeof EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION;\n profileId: string;\n profileVersion: string;\n scientificStatus: \"approximation\";\n policyKind:\n \"generic-program-line\";\n interpolation:\n \"log2-aperture-shutter\";\n evidence: readonly EvidenceProvenance[];\n limitations: readonly string[];\n nodes:\n readonly ExposureProgramLineNode[];\n}\n\nfunction requireRecord(\n value: unknown,\n path: string,\n allowedKeys: readonly string[] | null\n): UnknownRecord {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be an object.\"\n );\n }\n if (allowedKeys !== null) rejectUnknownFields(value, allowedKeys, path);\n return value as UnknownRecord;\n}\n\nfunction requireNonEmptyString(\n value: unknown,\n path: string\n): string {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a non-empty string.\"\n );\n }\n return value.trim();\n}\n\nfunction requireFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be finite.\"\n );\n }\n return value;\n}\n\nfunction requirePositiveFinite(\n value: unknown,\n path: string\n): number {\n const parsed =\n requireFinite(value, path);\n if (parsed <= 0) {\n throw new InvalidConfigurationError(\n path +\n \" must be greater than zero.\"\n );\n }\n return parsed;\n}\n\nfunction parseLimitations(\n value: unknown,\n path: string\n): readonly string[] {\n if (!Array.isArray(value)) {\n throw new InvalidConfigurationError(\n path + \" must be an array.\"\n );\n }\n const parsed = value.map(\n (entry, index) =>\n requireNonEmptyString(\n entry,\n path + \"[\" + index + \"]\"\n )\n );\n if (\n new Set(parsed).size !==\n parsed.length\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must not contain duplicates.\"\n );\n }\n return parsed;\n}\n\n/**\n * Parses a generic educational/product exposure program line.\n *\n * A program line is control policy, not physics. Each node declares a wanted\n * aperture/shutter pair at an explicit number of stops of optical exposure,\n * relative to the resolver's reference exposure. The resolver later checks\n * that every node is physically consistent with that reference and with what\n * the equipment can do.\n */\nexport function parseExposureProgramLineProfile(\n value: unknown\n): ExposureProgramLineProfile {\n const record = requireRecord(\n value,\n \"exposureProgramLineProfile\", [\"schemaVersion\", \"scientificStatus\", \"policyKind\", \"interpolation\", \"nodes\", \"profileId\", \"profileVersion\", \"evidence\", \"limitations\"]\n );\n\n if (\n record.schemaVersion !==\n EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION\n ) {\n throw new InvalidConfigurationError(\n 'exposureProgramLineProfile.schemaVersion must be \"' +\n EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION +\n '\".'\n );\n }\n if (\n record.scientificStatus !==\n \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureProgramLineProfile.scientificStatus must be \"approximation\".'\n );\n }\n if (\n record.policyKind !==\n \"generic-program-line\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureProgramLineProfile.policyKind must be \"generic-program-line\".'\n );\n }\n if (\n record.interpolation !==\n \"log2-aperture-shutter\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureProgramLineProfile.interpolation must be \"log2-aperture-shutter\".'\n );\n }\n if (\n !Array.isArray(record.nodes) ||\n record.nodes.length < 2\n ) {\n throw new InvalidConfigurationError(\n \"exposureProgramLineProfile.nodes must contain at least two nodes.\"\n );\n }\n\n let previousStops =\n Number.NEGATIVE_INFINITY;\n const ids: string[] = [];\n\n const nodes = record.nodes.map(\n (entry, index) => {\n const path =\n \"exposureProgramLineProfile.nodes[\" +\n index +\n \"]\";\n const node =\n requireRecord(entry, path, [\"nodeId\", \"opticalExposureStopsFromReference\", \"aperture\", \"shutterSeconds\"]);\n const nodeId =\n requireNonEmptyString(\n node.nodeId,\n path + \".nodeId\"\n );\n const stops =\n requireFinite(\n node\n .opticalExposureStopsFromReference,\n path +\n \".opticalExposureStopsFromReference\"\n );\n if (stops <= previousStops) {\n throw new InvalidConfigurationError(\n \"exposureProgramLineProfile.nodes opticalExposureStopsFromReference must be strictly increasing.\"\n );\n }\n previousStops = stops;\n ids.push(nodeId);\n\n return {\n nodeId,\n opticalExposureStopsFromReference:\n stops,\n aperture:\n requirePositiveFinite(\n node.aperture,\n path + \".aperture\"\n ),\n shutterSeconds:\n requirePositiveFinite(\n node.shutterSeconds,\n path +\n \".shutterSeconds\"\n )\n };\n }\n );\n\n if (\n new Set(ids).size !== ids.length\n ) {\n throw new InvalidConfigurationError(\n \"exposureProgramLineProfile.nodes[].nodeId must not contain duplicates.\"\n );\n }\n\n return {\n schemaVersion:\n EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION,\n profileId:\n requireNonEmptyString(\n record.profileId,\n \"exposureProgramLineProfile.profileId\"\n ),\n profileVersion:\n requireNonEmptyString(\n record.profileVersion,\n \"exposureProgramLineProfile.profileVersion\"\n ),\n scientificStatus:\n \"approximation\",\n policyKind:\n \"generic-program-line\",\n interpolation:\n \"log2-aperture-shutter\",\n evidence: parseEvidenceList(\n record.evidence,\n \"exposureProgramLineProfile.evidence\"\n ),\n limitations:\n parseLimitations(\n record.limitations,\n \"exposureProgramLineProfile.limitations\"\n ),\n nodes\n };\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { GenericEquipmentTierPreset } from "../equipment/generic-tier-assets.js";
2
+ /**
3
+ * Checks a caller-supplied camera preset object and returns it unchanged. Throws InvalidConfigurationError
4
+ * (or the profile parser's domain error) for a missing or malformed part or an unknown field.
5
+ * Readout-timing declarations have no standalone parser; they are checked for shape only and are not
6
+ * read by simulateCapture().
7
+ */
8
+ export declare function parseCallerCameraPreset(value: unknown): GenericEquipmentTierPreset;