@photivra/engine 1.5.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1078) hide show
  1. package/CHANGELOG.md +393 -6
  2. package/CITATION.cff +1 -1
  3. package/NODE_SUPPORT.md +64 -12
  4. package/README.md +301 -182
  5. package/SECURITY.md +37 -28
  6. package/THIRD_PARTY.md +148 -4
  7. package/dist/camera/equivalent-focal-length.d.ts +13 -14
  8. package/dist/camera/equivalent-focal-length.js +15 -13
  9. package/dist/camera/equivalent-focal-length.js.map +1 -1
  10. package/dist/camera/field-of-view.d.ts +30 -19
  11. package/dist/camera/field-of-view.js +67 -18
  12. package/dist/camera/field-of-view.js.map +1 -1
  13. package/dist/camera/lens-projection.d.ts +170 -0
  14. package/dist/camera/lens-projection.js +444 -0
  15. package/dist/camera/lens-projection.js.map +1 -0
  16. package/dist/camera/projected-object-size.d.ts +10 -11
  17. package/dist/camera/projected-object-size.js +12 -10
  18. package/dist/camera/projected-object-size.js.map +1 -1
  19. package/dist/capture/capture-export-metadata.d.ts +9 -10
  20. package/dist/capture/capture-export-metadata.js +8 -5
  21. package/dist/capture/capture-export-metadata.js.map +1 -1
  22. package/dist/capture/dng-import.d.ts +91 -0
  23. package/dist/capture/dng-import.js +343 -0
  24. package/dist/capture/dng-import.js.map +1 -0
  25. package/dist/capture/environment-raw-producer.d.ts +37 -17
  26. package/dist/capture/environment-raw-producer.js +43 -19
  27. package/dist/capture/environment-raw-producer.js.map +1 -1
  28. package/dist/capture/export-jpeg.d.ts +35 -4
  29. package/dist/capture/export-jpeg.js +133 -47
  30. package/dist/capture/export-jpeg.js.map +1 -1
  31. package/dist/capture/export-tiff.d.ts +48 -24
  32. package/dist/capture/export-tiff.js +91 -31
  33. package/dist/capture/export-tiff.js.map +1 -1
  34. package/dist/capture/focus-control.d.ts +42 -65
  35. package/dist/capture/focus-control.js +56 -75
  36. package/dist/capture/focus-control.js.map +1 -1
  37. package/dist/capture/host-yield-cadence.d.ts +25 -0
  38. package/dist/capture/host-yield-cadence.js +25 -0
  39. package/dist/capture/host-yield-cadence.js.map +1 -0
  40. package/dist/capture/linear-encoding.d.ts +14 -12
  41. package/dist/capture/linear-encoding.js +14 -13
  42. package/dist/capture/linear-encoding.js.map +1 -1
  43. package/dist/capture/lossless-jpeg.d.ts +27 -0
  44. package/dist/capture/lossless-jpeg.js +237 -0
  45. package/dist/capture/lossless-jpeg.js.map +1 -0
  46. package/dist/capture/native-environment-lean.d.ts +227 -0
  47. package/dist/capture/native-environment-lean.js +974 -0
  48. package/dist/capture/native-environment-lean.js.map +1 -0
  49. package/dist/capture/native-environment-optical-stage.d.ts +97 -0
  50. package/dist/capture/native-environment-optical-stage.js +340 -0
  51. package/dist/capture/native-environment-optical-stage.js.map +1 -0
  52. package/dist/capture/native-environment-raw.d.ts +140 -6
  53. package/dist/capture/native-environment-raw.js +435 -34
  54. package/dist/capture/native-environment-raw.js.map +1 -1
  55. package/dist/capture/native-raw-development.d.ts +116 -9
  56. package/dist/capture/native-raw-development.js +221 -62
  57. package/dist/capture/native-raw-development.js.map +1 -1
  58. package/dist/capture/native-raw-dng.d.ts +60 -0
  59. package/dist/capture/native-raw-dng.js +167 -0
  60. package/dist/capture/native-raw-dng.js.map +1 -0
  61. package/dist/capture/native-raw.d.ts +65 -12
  62. package/dist/capture/native-raw.js +81 -19
  63. package/dist/capture/native-raw.js.map +1 -1
  64. package/dist/capture/packed-sensor-raw.d.ts +160 -0
  65. package/dist/capture/packed-sensor-raw.js +221 -0
  66. package/dist/capture/packed-sensor-raw.js.map +1 -0
  67. package/dist/capture/photographic-export.d.ts +58 -35
  68. package/dist/capture/photographic-export.js +177 -70
  69. package/dist/capture/photographic-export.js.map +1 -1
  70. package/dist/capture/raw-development-kernel.d.ts +52 -0
  71. package/dist/capture/raw-development-kernel.js +88 -0
  72. package/dist/capture/raw-development-kernel.js.map +1 -0
  73. package/dist/capture/raw-frame-limits.d.ts +7 -7
  74. package/dist/capture/raw-frame-limits.js +7 -6
  75. package/dist/capture/raw-frame-limits.js.map +1 -1
  76. package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
  77. package/dist/capture/raw-frame-reconstruction.js +9 -8
  78. package/dist/capture/raw-frame-reconstruction.js.map +1 -1
  79. package/dist/capture/raw-white-level.d.ts +55 -0
  80. package/dist/capture/raw-white-level.js +165 -0
  81. package/dist/capture/raw-white-level.js.map +1 -0
  82. package/dist/capture/release-sequence.d.ts +5 -7
  83. package/dist/capture/release-sequence.js +15 -13
  84. package/dist/capture/release-sequence.js.map +1 -1
  85. package/dist/capture/sensor-raw-frame.d.ts +5 -6
  86. package/dist/capture/sensor-raw-frame.js +26 -9
  87. package/dist/capture/sensor-raw-frame.js.map +1 -1
  88. package/dist/capture/sensor-raw-producer.d.ts +21 -13
  89. package/dist/capture/sensor-raw-producer.js +86 -25
  90. package/dist/capture/sensor-raw-producer.js.map +1 -1
  91. package/dist/capture/simulated-capture.d.ts +15 -16
  92. package/dist/capture/simulated-capture.js +22 -12
  93. package/dist/capture/simulated-capture.js.map +1 -1
  94. package/dist/color/camera-color-matrix.d.ts +69 -0
  95. package/dist/color/camera-color-matrix.js +132 -0
  96. package/dist/color/camera-color-matrix.js.map +1 -0
  97. package/dist/color/capture-color.d.ts +17 -10
  98. package/dist/color/capture-color.js +50 -17
  99. package/dist/color/capture-color.js.map +1 -1
  100. package/dist/color/chromatic-adaptation.d.ts +63 -0
  101. package/dist/color/chromatic-adaptation.js +91 -0
  102. package/dist/color/chromatic-adaptation.js.map +1 -0
  103. package/dist/color/color-difference.d.ts +104 -0
  104. package/dist/color/color-difference.js +205 -0
  105. package/dist/color/color-difference.js.map +1 -0
  106. package/dist/color/color-matching-functions.d.ts +168 -0
  107. package/dist/color/color-matching-functions.js +309 -0
  108. package/dist/color/color-matching-functions.js.map +1 -0
  109. package/dist/color/colorimetry-math.d.ts +52 -0
  110. package/dist/color/colorimetry-math.js +144 -0
  111. package/dist/color/colorimetry-math.js.map +1 -0
  112. package/dist/color/gamut-mapping.d.ts +54 -0
  113. package/dist/color/gamut-mapping.js +107 -0
  114. package/dist/color/gamut-mapping.js.map +1 -0
  115. package/dist/color/illuminants.d.ts +182 -0
  116. package/dist/color/illuminants.js +434 -0
  117. package/dist/color/illuminants.js.map +1 -0
  118. package/dist/color/rgb-color-spaces.d.ts +79 -0
  119. package/dist/color/rgb-color-spaces.js +115 -0
  120. package/dist/color/rgb-color-spaces.js.map +1 -0
  121. package/dist/color/sensor-color-development.d.ts +33 -11
  122. package/dist/color/sensor-color-development.js +104 -30
  123. package/dist/color/sensor-color-development.js.map +1 -1
  124. package/dist/color/srgb-icc.d.ts +9 -2
  125. package/dist/color/srgb-icc.js +16 -5
  126. package/dist/color/srgb-icc.js.map +1 -1
  127. package/dist/color/srgb-transfer.d.ts +1 -2
  128. package/dist/color/srgb-transfer.js +1 -1
  129. package/dist/color/srgb-transfer.js.map +1 -1
  130. package/dist/color/white-balance.d.ts +68 -19
  131. package/dist/color/white-balance.js +168 -35
  132. package/dist/color/white-balance.js.map +1 -1
  133. package/dist/composition/image-formation-plan.d.ts +152 -128
  134. package/dist/composition/image-formation-plan.js +292 -138
  135. package/dist/composition/image-formation-plan.js.map +1 -1
  136. package/dist/composition/plan-consumer.d.ts +6 -7
  137. package/dist/composition/plan-consumer.js +14 -11
  138. package/dist/composition/plan-consumer.js.map +1 -1
  139. package/dist/core/calculation-result.d.ts +21 -14
  140. package/dist/core/calculation-result.js +209 -11
  141. package/dist/core/calculation-result.js.map +1 -1
  142. package/dist/core/canonical-json.d.ts +13 -8
  143. package/dist/core/canonical-json.js +34 -15
  144. package/dist/core/canonical-json.js.map +1 -1
  145. package/dist/core/configuration-error.d.ts +5 -4
  146. package/dist/core/configuration-error.js +5 -3
  147. package/dist/core/configuration-error.js.map +1 -1
  148. package/dist/core/evidence-provenance.d.ts +12 -12
  149. package/dist/core/evidence-provenance.js +10 -9
  150. package/dist/core/evidence-provenance.js.map +1 -1
  151. package/dist/core/image-formation.d.ts +11 -10
  152. package/dist/core/image-formation.js +11 -9
  153. package/dist/core/image-formation.js.map +1 -1
  154. package/dist/core/owned-data.d.ts +9 -17
  155. package/dist/core/owned-data.js +9 -16
  156. package/dist/core/owned-data.js.map +1 -1
  157. package/dist/core/portable-math.d.ts +15 -0
  158. package/dist/core/portable-math.js +56 -0
  159. package/dist/core/portable-math.js.map +1 -0
  160. package/dist/core/record-validation.d.ts +48 -9
  161. package/dist/core/record-validation.js +93 -19
  162. package/dist/core/record-validation.js.map +1 -1
  163. package/dist/core/scientific-assurance.d.ts +16 -14
  164. package/dist/core/scientific-assurance.js +22 -18
  165. package/dist/core/scientific-assurance.js.map +1 -1
  166. package/dist/core/spectral-composition.d.ts +13 -14
  167. package/dist/core/spectral-composition.js +30 -27
  168. package/dist/core/spectral-composition.js.map +1 -1
  169. package/dist/core/spectral.d.ts +5 -6
  170. package/dist/core/spectral.js +9 -7
  171. package/dist/core/spectral.js.map +1 -1
  172. package/dist/core/validation.d.ts +3 -6
  173. package/dist/core/validation.js +3 -5
  174. package/dist/core/validation.js.map +1 -1
  175. package/dist/core/version.d.ts +6 -6
  176. package/dist/core/version.js +6 -5
  177. package/dist/core/version.js.map +1 -1
  178. package/dist/equipment/exposure-capabilities.d.ts +10 -10
  179. package/dist/equipment/exposure-capabilities.js +40 -30
  180. package/dist/equipment/exposure-capabilities.js.map +1 -1
  181. package/dist/equipment/generic-tier-assets.d.ts +13 -6
  182. package/dist/equipment/generic-tier-assets.js +34 -15
  183. package/dist/equipment/generic-tier-assets.js.map +1 -1
  184. package/dist/equipment/generic-tier-presets.d.ts +5 -6
  185. package/dist/equipment/generic-tier-presets.js +15 -13
  186. package/dist/equipment/generic-tier-presets.js.map +1 -1
  187. package/dist/equipment/iso-capabilities.d.ts +21 -22
  188. package/dist/equipment/iso-capabilities.js +49 -44
  189. package/dist/equipment/iso-capabilities.js.map +1 -1
  190. package/dist/equipment/metering-capabilities.d.ts +5 -6
  191. package/dist/equipment/metering-capabilities.js +22 -19
  192. package/dist/equipment/metering-capabilities.js.map +1 -1
  193. package/dist/equipment/release-capabilities.d.ts +3 -4
  194. package/dist/equipment/release-capabilities.js +18 -14
  195. package/dist/equipment/release-capabilities.js.map +1 -1
  196. package/dist/exposure/exposure-duration-control.d.ts +19 -17
  197. package/dist/exposure/exposure-duration-control.js +27 -23
  198. package/dist/exposure/exposure-duration-control.js.map +1 -1
  199. package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
  200. package/dist/exposure/exposure-mode-resolver.js +127 -82
  201. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  202. package/dist/exposure/exposure.d.ts +17 -16
  203. package/dist/exposure/exposure.js +22 -15
  204. package/dist/exposure/exposure.js.map +1 -1
  205. package/dist/exposure/flash-ttl.d.ts +135 -0
  206. package/dist/exposure/flash-ttl.js +193 -0
  207. package/dist/exposure/flash-ttl.js.map +1 -0
  208. package/dist/exposure/flash.d.ts +144 -36
  209. package/dist/exposure/flash.js +259 -59
  210. package/dist/exposure/flash.js.map +1 -1
  211. package/dist/exposure/metering-scene-radiance.d.ts +10 -10
  212. package/dist/exposure/metering-scene-radiance.js +42 -23
  213. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  214. package/dist/exposure/metering-target.d.ts +8 -8
  215. package/dist/exposure/metering-target.js +30 -20
  216. package/dist/exposure/metering-target.js.map +1 -1
  217. package/dist/exposure/metering-temporal.d.ts +16 -15
  218. package/dist/exposure/metering-temporal.js +41 -19
  219. package/dist/exposure/metering-temporal.js.map +1 -1
  220. package/dist/exposure/metering.d.ts +64 -17
  221. package/dist/exposure/metering.js +159 -30
  222. package/dist/exposure/metering.js.map +1 -1
  223. package/dist/exposure/program-line.d.ts +5 -5
  224. package/dist/exposure/program-line.js +20 -13
  225. package/dist/exposure/program-line.js.map +1 -1
  226. package/dist/facade/camera-preset.d.ts +8 -0
  227. package/dist/facade/camera-preset.js +102 -0
  228. package/dist/facade/camera-preset.js.map +1 -0
  229. package/dist/facade/chart-radiance-batch.d.ts +57 -0
  230. package/dist/facade/chart-radiance-batch.js +121 -0
  231. package/dist/facade/chart-radiance-batch.js.map +1 -0
  232. package/dist/facade/chart-scenes.d.ts +177 -0
  233. package/dist/facade/chart-scenes.js +232 -0
  234. package/dist/facade/chart-scenes.js.map +1 -0
  235. package/dist/facade/host-yield.d.ts +7 -0
  236. package/dist/facade/host-yield.js +23 -0
  237. package/dist/facade/host-yield.js.map +1 -0
  238. package/dist/facade/scene-radiance.d.ts +117 -0
  239. package/dist/facade/scene-radiance.js +205 -0
  240. package/dist/facade/scene-radiance.js.map +1 -0
  241. package/dist/facade/simulate-capture.d.ts +284 -0
  242. package/dist/facade/simulate-capture.js +1026 -0
  243. package/dist/facade/simulate-capture.js.map +1 -0
  244. package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
  245. package/dist/gpu/chart-radiance-gpu.js +176 -0
  246. package/dist/gpu/chart-radiance-gpu.js.map +1 -0
  247. package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
  248. package/dist/gpu/image-kernel-accelerator.js +720 -0
  249. package/dist/gpu/image-kernel-accelerator.js.map +1 -0
  250. package/dist/gpu/image-kernel-execution.d.ts +92 -0
  251. package/dist/gpu/image-kernel-execution.js +84 -0
  252. package/dist/gpu/image-kernel-execution.js.map +1 -0
  253. package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
  254. package/dist/gpu/sensor-stage-gpu.js +317 -0
  255. package/dist/gpu/sensor-stage-gpu.js.map +1 -0
  256. package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
  257. package/dist/gpu/temporal-sum-gpu.js +150 -0
  258. package/dist/gpu/temporal-sum-gpu.js.map +1 -0
  259. package/dist/gpu/webgpu-runtime.d.ts +63 -0
  260. package/dist/gpu/webgpu-runtime.js +215 -0
  261. package/dist/gpu/webgpu-runtime.js.map +1 -0
  262. package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
  263. package/dist/gpu/wgsl-chart-kernel.js +165 -0
  264. package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
  265. package/dist/gpu/wgsl-kernels.d.ts +53 -0
  266. package/dist/gpu/wgsl-kernels.js +365 -0
  267. package/dist/gpu/wgsl-kernels.js.map +1 -0
  268. package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
  269. package/dist/gpu/wgsl-sensor-kernel.js +409 -0
  270. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
  271. package/dist/index.d.ts +89 -25
  272. package/dist/index.js +59 -15
  273. package/dist/index.js.map +1 -1
  274. package/dist/motion/camera-rotation.d.ts +92 -40
  275. package/dist/motion/camera-rotation.js +84 -47
  276. package/dist/motion/camera-rotation.js.map +1 -1
  277. package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
  278. package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
  279. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  280. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
  281. package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
  282. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  283. package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
  284. package/dist/motion/capture-rotation-trajectory.js +36 -26
  285. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  286. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
  287. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
  288. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  289. package/dist/motion/extended-object-projection.d.ts +19 -16
  290. package/dist/motion/extended-object-projection.js +38 -18
  291. package/dist/motion/extended-object-projection.js.map +1 -1
  292. package/dist/motion/projected-motion.d.ts +18 -17
  293. package/dist/motion/projected-motion.js +25 -17
  294. package/dist/motion/projected-motion.js.map +1 -1
  295. package/dist/motion/temporal-exposure-sum.d.ts +55 -0
  296. package/dist/motion/temporal-exposure-sum.js +141 -0
  297. package/dist/motion/temporal-exposure-sum.js.map +1 -0
  298. package/dist/motion/video-sequence.d.ts +111 -0
  299. package/dist/motion/video-sequence.js +179 -0
  300. package/dist/motion/video-sequence.js.map +1 -0
  301. package/dist/optics/aperture.d.ts +14 -15
  302. package/dist/optics/aperture.js +13 -11
  303. package/dist/optics/aperture.js.map +1 -1
  304. package/dist/optics/atmospheric-haze.d.ts +83 -0
  305. package/dist/optics/atmospheric-haze.js +113 -0
  306. package/dist/optics/atmospheric-haze.js.map +1 -0
  307. package/dist/optics/brown-conrady-distortion.d.ts +116 -0
  308. package/dist/optics/brown-conrady-distortion.js +291 -0
  309. package/dist/optics/brown-conrady-distortion.js.map +1 -0
  310. package/dist/optics/circle-of-confusion.d.ts +10 -10
  311. package/dist/optics/circle-of-confusion.js +15 -11
  312. package/dist/optics/circle-of-confusion.js.map +1 -1
  313. package/dist/optics/complex-pupil-psf.d.ts +64 -33
  314. package/dist/optics/complex-pupil-psf.js +190 -98
  315. package/dist/optics/complex-pupil-psf.js.map +1 -1
  316. package/dist/optics/depth-of-field.d.ts +25 -15
  317. package/dist/optics/depth-of-field.js +67 -27
  318. package/dist/optics/depth-of-field.js.map +1 -1
  319. package/dist/optics/diffraction.d.ts +14 -13
  320. package/dist/optics/diffraction.js +14 -10
  321. package/dist/optics/diffraction.js.map +1 -1
  322. package/dist/optics/focus-breathing.d.ts +88 -27
  323. package/dist/optics/focus-breathing.js +114 -23
  324. package/dist/optics/focus-breathing.js.map +1 -1
  325. package/dist/optics/focus-state.d.ts +18 -18
  326. package/dist/optics/focus-state.js +21 -15
  327. package/dist/optics/focus-state.js.map +1 -1
  328. package/dist/optics/front-of-lens-filter.d.ts +45 -14
  329. package/dist/optics/front-of-lens-filter.js +259 -88
  330. package/dist/optics/front-of-lens-filter.js.map +1 -1
  331. package/dist/optics/illumination-vignetting.d.ts +16 -17
  332. package/dist/optics/illumination-vignetting.js +40 -17
  333. package/dist/optics/illumination-vignetting.js.map +1 -1
  334. package/dist/optics/irradiance-convolution.d.ts +59 -0
  335. package/dist/optics/irradiance-convolution.js +138 -0
  336. package/dist/optics/irradiance-convolution.js.map +1 -0
  337. package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
  338. package/dist/optics/lateral-chromatic-aberration.js +33 -23
  339. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  340. package/dist/optics/lens-psf-kernels.d.ts +89 -0
  341. package/dist/optics/lens-psf-kernels.js +175 -0
  342. package/dist/optics/lens-psf-kernels.js.map +1 -0
  343. package/dist/optics/lens-psf-profile.d.ts +78 -46
  344. package/dist/optics/lens-psf-profile.js +335 -124
  345. package/dist/optics/lens-psf-profile.js.map +1 -1
  346. package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
  347. package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
  348. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
  349. package/dist/optics/polygon-diffraction.d.ts +80 -23
  350. package/dist/optics/polygon-diffraction.js +130 -25
  351. package/dist/optics/polygon-diffraction.js.map +1 -1
  352. package/dist/optics/profile-contract.d.ts +5 -6
  353. package/dist/optics/profile-contract.js +14 -11
  354. package/dist/optics/profile-contract.js.map +1 -1
  355. package/dist/optics/psf-foundation.d.ts +23 -23
  356. package/dist/optics/psf-foundation.js +24 -21
  357. package/dist/optics/psf-foundation.js.map +1 -1
  358. package/dist/optics/pupil-vignetting.d.ts +118 -0
  359. package/dist/optics/pupil-vignetting.js +264 -0
  360. package/dist/optics/pupil-vignetting.js.map +1 -0
  361. package/dist/optics/radial-distortion.d.ts +34 -33
  362. package/dist/optics/radial-distortion.js +37 -30
  363. package/dist/optics/radial-distortion.js.map +1 -1
  364. package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
  365. package/dist/optics/scene-to-sensor-irradiance.js +73 -45
  366. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  367. package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
  368. package/dist/optics/scene-to-sensor-quadrature.js +16 -11
  369. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
  370. package/dist/optics/sensor-aperture-rays.d.ts +20 -4
  371. package/dist/optics/sensor-aperture-rays.js +32 -14
  372. package/dist/optics/sensor-aperture-rays.js.map +1 -1
  373. package/dist/optics/sensor-environment-query.d.ts +81 -16
  374. package/dist/optics/sensor-environment-query.js +145 -12
  375. package/dist/optics/sensor-environment-query.js.map +1 -1
  376. package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
  377. package/dist/optics/sensor-psf-quadrature.js +18 -11
  378. package/dist/optics/sensor-psf-quadrature.js.map +1 -1
  379. package/dist/optics/sensor-psf-support.d.ts +8 -6
  380. package/dist/optics/sensor-psf-support.js +8 -5
  381. package/dist/optics/sensor-psf-support.js.map +1 -1
  382. package/dist/optics/stray-light.d.ts +22 -19
  383. package/dist/optics/stray-light.js +18 -12
  384. package/dist/optics/stray-light.js.map +1 -1
  385. package/dist/optics/thin-lens.d.ts +10 -9
  386. package/dist/optics/thin-lens.js +12 -8
  387. package/dist/optics/thin-lens.js.map +1 -1
  388. package/dist/optics/zernike-wavefront.d.ts +154 -0
  389. package/dist/optics/zernike-wavefront.js +352 -0
  390. package/dist/optics/zernike-wavefront.js.map +1 -0
  391. package/dist/output/capture-corrected-sdr.d.ts +16 -8
  392. package/dist/output/capture-corrected-sdr.js +16 -8
  393. package/dist/output/capture-corrected-sdr.js.map +1 -1
  394. package/dist/output/capture-geometry.d.ts +34 -36
  395. package/dist/output/capture-geometry.js +52 -32
  396. package/dist/output/capture-geometry.js.map +1 -1
  397. package/dist/output/capture-sdr.d.ts +7 -6
  398. package/dist/output/capture-sdr.js +11 -8
  399. package/dist/output/capture-sdr.js.map +1 -1
  400. package/dist/output/crop.d.ts +22 -6
  401. package/dist/output/crop.js +40 -6
  402. package/dist/output/crop.js.map +1 -1
  403. package/dist/output/geometric-transforms.d.ts +60 -23
  404. package/dist/output/geometric-transforms.js +111 -24
  405. package/dist/output/geometric-transforms.js.map +1 -1
  406. package/dist/output/lens-corrections.d.ts +27 -19
  407. package/dist/output/lens-corrections.js +29 -13
  408. package/dist/output/lens-corrections.js.map +1 -1
  409. package/dist/output/native-capture-sdr.d.ts +71 -16
  410. package/dist/output/native-capture-sdr.js +190 -33
  411. package/dist/output/native-capture-sdr.js.map +1 -1
  412. package/dist/output/png-encoder.d.ts +65 -0
  413. package/dist/output/png-encoder.js +461 -0
  414. package/dist/output/png-encoder.js.map +1 -0
  415. package/dist/output/print-contrast-reference.d.ts +10 -9
  416. package/dist/output/print-contrast-reference.js +10 -8
  417. package/dist/output/print-contrast-reference.js.map +1 -1
  418. package/dist/output/print-detail.d.ts +18 -17
  419. package/dist/output/print-detail.js +12 -10
  420. package/dist/output/print-detail.js.map +1 -1
  421. package/dist/output/print-jpeg.d.ts +26 -5
  422. package/dist/output/print-jpeg.js +117 -50
  423. package/dist/output/print-jpeg.js.map +1 -1
  424. package/dist/output/print-plan.d.ts +19 -19
  425. package/dist/output/print-plan.js +11 -10
  426. package/dist/output/print-plan.js.map +1 -1
  427. package/dist/output/print-region-statistics.d.ts +14 -15
  428. package/dist/output/print-region-statistics.js +11 -11
  429. package/dist/output/print-region-statistics.js.map +1 -1
  430. package/dist/output/sdr-rendering.d.ts +48 -10
  431. package/dist/output/sdr-rendering.js +114 -25
  432. package/dist/output/sdr-rendering.js.map +1 -1
  433. package/dist/output/subject-framing-crop.d.ts +6 -10
  434. package/dist/output/subject-framing-crop.js +23 -13
  435. package/dist/output/subject-framing-crop.js.map +1 -1
  436. package/dist/processing/demosaic.d.ts +90 -0
  437. package/dist/processing/demosaic.js +275 -0
  438. package/dist/processing/demosaic.js.map +1 -0
  439. package/dist/processing/denoise.d.ts +68 -0
  440. package/dist/processing/denoise.js +214 -0
  441. package/dist/processing/denoise.js.map +1 -0
  442. package/dist/processing/focus-stacking.d.ts +17 -0
  443. package/dist/processing/focus-stacking.js +80 -0
  444. package/dist/processing/focus-stacking.js.map +1 -0
  445. package/dist/processing/hdr.d.ts +54 -0
  446. package/dist/processing/hdr.js +172 -0
  447. package/dist/processing/hdr.js.map +1 -0
  448. package/dist/processing/image-ops.d.ts +66 -0
  449. package/dist/processing/image-ops.js +192 -0
  450. package/dist/processing/image-ops.js.map +1 -0
  451. package/dist/processing/panorama.d.ts +51 -0
  452. package/dist/processing/panorama.js +305 -0
  453. package/dist/processing/panorama.js.map +1 -0
  454. package/dist/processing/processing-task.d.ts +85 -0
  455. package/dist/processing/processing-task.js +164 -0
  456. package/dist/processing/processing-task.js.map +1 -0
  457. package/dist/processing/tone-mapping.d.ts +69 -0
  458. package/dist/processing/tone-mapping.js +310 -0
  459. package/dist/processing/tone-mapping.js.map +1 -0
  460. package/dist/schema/camera.d.ts +5 -4
  461. package/dist/schema/illumination-spectral.d.ts +13 -19
  462. package/dist/schema/illumination-spectral.js +23 -19
  463. package/dist/schema/illumination-spectral.js.map +1 -1
  464. package/dist/schema/illumination-temporal.d.ts +12 -15
  465. package/dist/schema/illumination-temporal.js +43 -28
  466. package/dist/schema/illumination-temporal.js.map +1 -1
  467. package/dist/schema/illumination.d.ts +5 -4
  468. package/dist/schema/illumination.js +55 -20
  469. package/dist/schema/illumination.js.map +1 -1
  470. package/dist/schema/scene-radiance-temporal.d.ts +9 -11
  471. package/dist/schema/scene-radiance-temporal.js +26 -23
  472. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  473. package/dist/schema/scene-radiance.d.ts +17 -17
  474. package/dist/schema/scene-radiance.js +56 -34
  475. package/dist/schema/scene-radiance.js.map +1 -1
  476. package/dist/schema/scene.d.ts +14 -13
  477. package/dist/schema/validation.d.ts +0 -1
  478. package/dist/schema/validation.js +17 -15
  479. package/dist/schema/validation.js.map +1 -1
  480. package/dist/sensor/accumulated-charge.d.ts +45 -64
  481. package/dist/sensor/accumulated-charge.js +41 -47
  482. package/dist/sensor/accumulated-charge.js.map +1 -1
  483. package/dist/sensor/architecture.d.ts +22 -25
  484. package/dist/sensor/architecture.js +17 -16
  485. package/dist/sensor/architecture.js.map +1 -1
  486. package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
  487. package/dist/sensor/camera-saturation-capacity.js +36 -34
  488. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  489. package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
  490. package/dist/sensor/capture-color-sampling-binding.js +39 -41
  491. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  492. package/dist/sensor/capture-mode-timing.d.ts +8 -9
  493. package/dist/sensor/capture-mode-timing.js +24 -21
  494. package/dist/sensor/capture-mode-timing.js.map +1 -1
  495. package/dist/sensor/capture-mode.d.ts +28 -30
  496. package/dist/sensor/capture-mode.js +33 -31
  497. package/dist/sensor/capture-mode.js.map +1 -1
  498. package/dist/sensor/color-sampling.d.ts +30 -33
  499. package/dist/sensor/color-sampling.js +32 -37
  500. package/dist/sensor/color-sampling.js.map +1 -1
  501. package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
  502. package/dist/sensor/constant-rate-temporal-integration.js +28 -26
  503. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  504. package/dist/sensor/dark-current.d.ts +53 -49
  505. package/dist/sensor/dark-current.js +87 -46
  506. package/dist/sensor/dark-current.js.map +1 -1
  507. package/dist/sensor/environment-photo-signal.d.ts +71 -30
  508. package/dist/sensor/environment-photo-signal.js +127 -46
  509. package/dist/sensor/environment-photo-signal.js.map +1 -1
  510. package/dist/sensor/eqe-electron-rate.d.ts +14 -13
  511. package/dist/sensor/eqe-electron-rate.js +34 -14
  512. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  513. package/dist/sensor/eqe-local-exposure.d.ts +24 -24
  514. package/dist/sensor/eqe-local-exposure.js +15 -11
  515. package/dist/sensor/eqe-local-exposure.js.map +1 -1
  516. package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
  517. package/dist/sensor/eqe-temporal-exposure.js +15 -10
  518. package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
  519. package/dist/sensor/exposure-window.d.ts +48 -34
  520. package/dist/sensor/exposure-window.js +77 -36
  521. package/dist/sensor/exposure-window.js.map +1 -1
  522. package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
  523. package/dist/sensor/fixed-pattern-noise.js +166 -0
  524. package/dist/sensor/fixed-pattern-noise.js.map +1 -0
  525. package/dist/sensor/iso-gain.d.ts +44 -0
  526. package/dist/sensor/iso-gain.js +119 -0
  527. package/dist/sensor/iso-gain.js.map +1 -0
  528. package/dist/sensor/iso-signal-chain.d.ts +25 -48
  529. package/dist/sensor/iso-signal-chain.js +52 -66
  530. package/dist/sensor/iso-signal-chain.js.map +1 -1
  531. package/dist/sensor/local-exposure-binding.d.ts +21 -21
  532. package/dist/sensor/local-exposure-binding.js +22 -18
  533. package/dist/sensor/local-exposure-binding.js.map +1 -1
  534. package/dist/sensor/optical-stack.d.ts +36 -40
  535. package/dist/sensor/optical-stack.js +34 -37
  536. package/dist/sensor/optical-stack.js.map +1 -1
  537. package/dist/sensor/photon-energy.d.ts +22 -28
  538. package/dist/sensor/photon-energy.js +42 -34
  539. package/dist/sensor/photon-energy.js.map +1 -1
  540. package/dist/sensor/physical-charge-capacity.d.ts +20 -30
  541. package/dist/sensor/physical-charge-capacity.js +35 -36
  542. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  543. package/dist/sensor/pixel-pitch.d.ts +2 -3
  544. package/dist/sensor/pixel-pitch.js +4 -2
  545. package/dist/sensor/pixel-pitch.js.map +1 -1
  546. package/dist/sensor/radiometry-readiness.d.ts +13 -15
  547. package/dist/sensor/radiometry-readiness.js +20 -17
  548. package/dist/sensor/radiometry-readiness.js.map +1 -1
  549. package/dist/sensor/raw-readout.d.ts +173 -83
  550. package/dist/sensor/raw-readout.js +425 -160
  551. package/dist/sensor/raw-readout.js.map +1 -1
  552. package/dist/sensor/raw-reconstruction.d.ts +112 -44
  553. package/dist/sensor/raw-reconstruction.js +200 -47
  554. package/dist/sensor/raw-reconstruction.js.map +1 -1
  555. package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
  556. package/dist/sensor/readout-exposure-linkage.js +125 -27
  557. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  558. package/dist/sensor/readout-timing.d.ts +43 -44
  559. package/dist/sensor/readout-timing.js +38 -30
  560. package/dist/sensor/readout-timing.js.map +1 -1
  561. package/dist/sensor/response-application-compatibility.d.ts +21 -28
  562. package/dist/sensor/response-application-compatibility.js +35 -34
  563. package/dist/sensor/response-application-compatibility.js.map +1 -1
  564. package/dist/sensor/response-operating-range.d.ts +26 -35
  565. package/dist/sensor/response-operating-range.js +40 -39
  566. package/dist/sensor/response-operating-range.js.map +1 -1
  567. package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
  568. package/dist/sensor/responsivity-photocurrent.js +57 -40
  569. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  570. package/dist/sensor/sampling-aperture.d.ts +21 -25
  571. package/dist/sensor/sampling-aperture.js +29 -28
  572. package/dist/sensor/sampling-aperture.js.map +1 -1
  573. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
  574. package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
  575. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
  576. package/dist/sensor/sensor-geometry.d.ts +28 -32
  577. package/dist/sensor/sensor-geometry.js +35 -20
  578. package/dist/sensor/sensor-geometry.js.map +1 -1
  579. package/dist/sensor/signal-noise.d.ts +14 -16
  580. package/dist/sensor/signal-noise.js +15 -13
  581. package/dist/sensor/signal-noise.js.map +1 -1
  582. package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
  583. package/dist/sensor/spatial-sample-reduction.js +39 -48
  584. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  585. package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
  586. package/dist/sensor/spatial-sampling-quadrature.js +31 -36
  587. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  588. package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
  589. package/dist/sensor/spatio-spectral-reduction.js +24 -29
  590. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  591. package/dist/sensor/spectral-coverage.d.ts +6 -9
  592. package/dist/sensor/spectral-coverage.js +9 -6
  593. package/dist/sensor/spectral-coverage.js.map +1 -1
  594. package/dist/sensor/spectral-quadrature.d.ts +46 -60
  595. package/dist/sensor/spectral-quadrature.js +38 -48
  596. package/dist/sensor/spectral-quadrature.js.map +1 -1
  597. package/dist/sensor/spectral-response.d.ts +53 -41
  598. package/dist/sensor/spectral-response.js +80 -47
  599. package/dist/sensor/spectral-response.js.map +1 -1
  600. package/dist/sensor/stochastic-seed.d.ts +50 -0
  601. package/dist/sensor/stochastic-seed.js +123 -0
  602. package/dist/sensor/stochastic-seed.js.map +1 -0
  603. package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
  604. package/dist/sensor/temporal-eqe-sum.js +5 -6
  605. package/dist/sensor/temporal-eqe-sum.js.map +1 -1
  606. package/dist/sensor/temporal-photo-signal.d.ts +5 -6
  607. package/dist/sensor/temporal-photo-signal.js +11 -10
  608. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  609. package/dist/sensor/temporal-sample-binding.d.ts +1 -2
  610. package/dist/sensor/temporal-sample-binding.js +3 -3
  611. package/dist/sensor/temporal-sample-binding.js.map +1 -1
  612. package/dist/simulation/poc-simulation.d.ts +16 -16
  613. package/dist/simulation/poc-simulation.js +20 -15
  614. package/dist/simulation/poc-simulation.js.map +1 -1
  615. package/dist/stabilization/camera-shake.d.ts +42 -18
  616. package/dist/stabilization/camera-shake.js +43 -20
  617. package/dist/stabilization/camera-shake.js.map +1 -1
  618. package/dist/stabilization/system.d.ts +44 -41
  619. package/dist/stabilization/system.js +196 -108
  620. package/dist/stabilization/system.js.map +1 -1
  621. package/docs/AGENT_GUIDE.md +183 -0
  622. package/docs/API_REFERENCE.md +761 -2
  623. package/docs/QUICK_START.md +495 -0
  624. package/docs/USAGE.md +1719 -714
  625. package/docs/api/camera-equivalent-focal-length.md +6 -7
  626. package/docs/api/camera-field-of-view.md +16 -8
  627. package/docs/api/camera-lens-projection.md +246 -0
  628. package/docs/api/camera-projected-object-size.md +6 -5
  629. package/docs/api/capture-capture-export-metadata.md +10 -10
  630. package/docs/api/capture-dng-import.md +134 -0
  631. package/docs/api/capture-environment-raw-producer.md +17 -11
  632. package/docs/api/capture-export-jpeg.md +16 -0
  633. package/docs/api/capture-focus-control.md +25 -47
  634. package/docs/api/capture-linear-encoding.md +21 -12
  635. package/docs/api/capture-lossless-jpeg.md +49 -0
  636. package/docs/api/capture-native-environment-optical-stage.md +75 -0
  637. package/docs/api/capture-native-environment-raw.md +161 -4
  638. package/docs/api/capture-native-raw-development.md +69 -8
  639. package/docs/api/capture-native-raw-dng.md +84 -0
  640. package/docs/api/capture-native-raw.md +21 -10
  641. package/docs/api/capture-packed-sensor-raw.md +156 -0
  642. package/docs/api/capture-photographic-export.md +69 -31
  643. package/docs/api/capture-raw-frame-reconstruction.md +8 -8
  644. package/docs/api/capture-raw-white-level.md +37 -0
  645. package/docs/api/capture-release-sequence.md +6 -7
  646. package/docs/api/capture-sensor-raw-frame.md +6 -6
  647. package/docs/api/capture-sensor-raw-producer.md +17 -11
  648. package/docs/api/capture-simulated-capture.md +15 -15
  649. package/docs/api/color-camera-color-matrix.md +103 -0
  650. package/docs/api/color-capture-color.md +22 -11
  651. package/docs/api/color-chromatic-adaptation.md +82 -0
  652. package/docs/api/color-color-difference.md +134 -0
  653. package/docs/api/color-color-matching-functions.md +259 -0
  654. package/docs/api/color-colorimetry-math.md +54 -0
  655. package/docs/api/color-gamut-mapping.md +72 -0
  656. package/docs/api/color-illuminants.md +280 -0
  657. package/docs/api/color-rgb-color-spaces.md +151 -0
  658. package/docs/api/color-sensor-color-development.md +27 -0
  659. package/docs/api/color-srgb-icc.md +2 -4
  660. package/docs/api/color-white-balance.md +95 -19
  661. package/docs/api/composition-image-formation-plan.md +124 -95
  662. package/docs/api/composition-plan-consumer.md +7 -7
  663. package/docs/api/core-calculation-result.md +18 -14
  664. package/docs/api/core-configuration-error.md +1 -1
  665. package/docs/api/core-image-formation.md +7 -7
  666. package/docs/api/core-scientific-assurance.md +12 -10
  667. package/docs/api/core-spectral-composition.md +14 -14
  668. package/docs/api/core-spectral.md +6 -6
  669. package/docs/api/core-validation.md +3 -3
  670. package/docs/api/core-version.md +7 -6
  671. package/docs/api/equipment-exposure-capabilities.md +11 -10
  672. package/docs/api/equipment-generic-tier-assets.md +7 -2
  673. package/docs/api/equipment-generic-tier-presets.md +6 -6
  674. package/docs/api/equipment-iso-capabilities.md +18 -18
  675. package/docs/api/equipment-metering-capabilities.md +6 -6
  676. package/docs/api/equipment-release-capabilities.md +4 -4
  677. package/docs/api/exports.json +2213 -8
  678. package/docs/api/exposure-exposure-duration-control.md +9 -9
  679. package/docs/api/exposure-exposure-mode-resolver.md +35 -31
  680. package/docs/api/exposure-exposure.md +10 -10
  681. package/docs/api/exposure-flash-ttl.md +182 -0
  682. package/docs/api/exposure-flash.md +183 -28
  683. package/docs/api/exposure-metering-scene-radiance.md +11 -10
  684. package/docs/api/exposure-metering-target.md +9 -8
  685. package/docs/api/exposure-metering-temporal.md +8 -8
  686. package/docs/api/exposure-metering.md +69 -9
  687. package/docs/api/exposure-program-line.md +6 -5
  688. package/docs/api/facade-chart-radiance-batch.md +96 -0
  689. package/docs/api/facade-chart-scenes.md +240 -0
  690. package/docs/api/facade-scene-radiance.md +122 -0
  691. package/docs/api/facade-simulate-capture.md +324 -0
  692. package/docs/api/gpu-image-kernel-accelerator.md +157 -0
  693. package/docs/api/gpu-image-kernel-execution.md +152 -0
  694. package/docs/api/motion-camera-rotation.md +43 -26
  695. package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
  696. package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
  697. package/docs/api/motion-capture-rotation-trajectory.md +15 -15
  698. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
  699. package/docs/api/motion-extended-object-projection.md +10 -8
  700. package/docs/api/motion-projected-motion.md +8 -8
  701. package/docs/api/motion-temporal-exposure-sum.md +98 -0
  702. package/docs/api/motion-video-sequence.md +159 -0
  703. package/docs/api/optics-aperture.md +8 -8
  704. package/docs/api/optics-atmospheric-haze.md +104 -0
  705. package/docs/api/optics-brown-conrady-distortion.md +123 -0
  706. package/docs/api/optics-circle-of-confusion.md +5 -4
  707. package/docs/api/optics-complex-pupil-psf.md +57 -16
  708. package/docs/api/optics-depth-of-field.md +12 -6
  709. package/docs/api/optics-diffraction.md +8 -7
  710. package/docs/api/optics-focus-breathing.md +104 -16
  711. package/docs/api/optics-focus-state.md +9 -10
  712. package/docs/api/optics-front-of-lens-filter.md +72 -14
  713. package/docs/api/optics-illumination-vignetting.md +10 -10
  714. package/docs/api/optics-irradiance-convolution.md +95 -0
  715. package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
  716. package/docs/api/optics-lens-psf-kernels.md +72 -0
  717. package/docs/api/optics-lens-psf-profile.md +48 -26
  718. package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
  719. package/docs/api/optics-polygon-diffraction.md +78 -13
  720. package/docs/api/optics-profile-contract.md +4 -4
  721. package/docs/api/optics-psf-foundation.md +12 -12
  722. package/docs/api/optics-pupil-vignetting.md +132 -0
  723. package/docs/api/optics-radial-distortion.md +12 -12
  724. package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
  725. package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
  726. package/docs/api/optics-sensor-aperture-rays.md +3 -2
  727. package/docs/api/optics-sensor-environment-query.md +52 -9
  728. package/docs/api/optics-sensor-psf-quadrature.md +13 -10
  729. package/docs/api/optics-stray-light.md +12 -11
  730. package/docs/api/optics-thin-lens.md +4 -3
  731. package/docs/api/optics-zernike-wavefront.md +229 -0
  732. package/docs/api/output-capture-corrected-sdr.md +10 -7
  733. package/docs/api/output-capture-geometry.md +35 -36
  734. package/docs/api/output-capture-sdr.md +4 -4
  735. package/docs/api/output-crop.md +7 -4
  736. package/docs/api/output-geometric-transforms.md +65 -19
  737. package/docs/api/output-lens-corrections.md +17 -15
  738. package/docs/api/output-native-capture-sdr.md +26 -13
  739. package/docs/api/output-png-encoder.md +105 -0
  740. package/docs/api/output-print-contrast-reference.md +8 -8
  741. package/docs/api/output-print-detail.md +14 -14
  742. package/docs/api/output-print-jpeg.md +22 -5
  743. package/docs/api/output-print-plan.md +18 -18
  744. package/docs/api/output-print-region-statistics.md +14 -14
  745. package/docs/api/output-sdr-rendering.md +52 -10
  746. package/docs/api/output-subject-framing-crop.md +5 -6
  747. package/docs/api/processing-demosaic.md +120 -0
  748. package/docs/api/processing-denoise.md +148 -0
  749. package/docs/api/processing-focus-stacking.md +41 -0
  750. package/docs/api/processing-hdr.md +113 -0
  751. package/docs/api/processing-panorama.md +82 -0
  752. package/docs/api/processing-processing-task.md +107 -0
  753. package/docs/api/processing-tone-mapping.md +142 -0
  754. package/docs/api/schema-camera.md +6 -4
  755. package/docs/api/schema-illumination-spectral.md +10 -11
  756. package/docs/api/schema-illumination-temporal.md +13 -15
  757. package/docs/api/schema-illumination.md +4 -4
  758. package/docs/api/schema-scene-radiance-temporal.md +10 -11
  759. package/docs/api/schema-scene-radiance.md +18 -17
  760. package/docs/api/schema-scene.md +9 -9
  761. package/docs/api/schema-validation.md +1 -1
  762. package/docs/api/sensor-accumulated-charge.md +12 -20
  763. package/docs/api/sensor-architecture.md +15 -16
  764. package/docs/api/sensor-camera-saturation-capacity.md +9 -11
  765. package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
  766. package/docs/api/sensor-capture-mode-timing.md +9 -9
  767. package/docs/api/sensor-capture-mode.md +29 -30
  768. package/docs/api/sensor-color-sampling.md +31 -33
  769. package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
  770. package/docs/api/sensor-dark-current.md +30 -14
  771. package/docs/api/sensor-environment-photo-signal.md +13 -6
  772. package/docs/api/sensor-eqe-electron-rate.md +9 -8
  773. package/docs/api/sensor-eqe-local-exposure.md +18 -17
  774. package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
  775. package/docs/api/sensor-exposure-window.md +24 -24
  776. package/docs/api/sensor-fixed-pattern-noise.md +104 -0
  777. package/docs/api/sensor-iso-gain.md +63 -0
  778. package/docs/api/sensor-iso-signal-chain.md +13 -22
  779. package/docs/api/sensor-local-exposure-binding.md +12 -13
  780. package/docs/api/sensor-optical-stack.md +37 -40
  781. package/docs/api/sensor-photon-energy.md +10 -11
  782. package/docs/api/sensor-physical-charge-capacity.md +8 -13
  783. package/docs/api/sensor-pixel-pitch.md +1 -1
  784. package/docs/api/sensor-radiometry-readiness.md +9 -9
  785. package/docs/api/sensor-raw-readout.md +118 -52
  786. package/docs/api/sensor-raw-reconstruction.md +97 -20
  787. package/docs/api/sensor-readout-exposure-linkage.md +120 -24
  788. package/docs/api/sensor-readout-timing.md +33 -35
  789. package/docs/api/sensor-response-application-compatibility.md +9 -11
  790. package/docs/api/sensor-response-operating-range.md +14 -18
  791. package/docs/api/sensor-responsivity-photocurrent.md +9 -12
  792. package/docs/api/sensor-sampling-aperture.md +22 -25
  793. package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
  794. package/docs/api/sensor-sensor-geometry.md +23 -24
  795. package/docs/api/sensor-signal-noise.md +10 -10
  796. package/docs/api/sensor-spatial-sample-reduction.md +27 -30
  797. package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
  798. package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
  799. package/docs/api/sensor-spectral-coverage.md +5 -5
  800. package/docs/api/sensor-spectral-quadrature.md +33 -35
  801. package/docs/api/sensor-spectral-response.md +28 -16
  802. package/docs/api/sensor-temporal-photo-signal.md +6 -6
  803. package/docs/api/simulation-poc-simulation.md +17 -16
  804. package/docs/api/stabilization-camera-shake.md +29 -10
  805. package/docs/api/stabilization-system.md +25 -21
  806. package/docs/examples/production-request.json +3821 -2157
  807. package/docs/examples/simulate-capture.mjs +14 -0
  808. package/llms.txt +35 -0
  809. package/package.json +32 -12
  810. package/AGENTS.md +0 -674
  811. package/CONTRIBUTING.md +0 -76
  812. package/DCO +0 -33
  813. package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
  814. package/dist/camera/field-of-view.d.ts.map +0 -1
  815. package/dist/camera/projected-object-size.d.ts.map +0 -1
  816. package/dist/capture/capture-export-metadata.d.ts.map +0 -1
  817. package/dist/capture/environment-raw-producer.d.ts.map +0 -1
  818. package/dist/capture/export-jpeg.d.ts.map +0 -1
  819. package/dist/capture/export-tiff.d.ts.map +0 -1
  820. package/dist/capture/focus-control.d.ts.map +0 -1
  821. package/dist/capture/linear-encoding.d.ts.map +0 -1
  822. package/dist/capture/native-environment-raw.d.ts.map +0 -1
  823. package/dist/capture/native-raw-development.d.ts.map +0 -1
  824. package/dist/capture/native-raw.d.ts.map +0 -1
  825. package/dist/capture/photographic-export.d.ts.map +0 -1
  826. package/dist/capture/raw-frame-limits.d.ts.map +0 -1
  827. package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
  828. package/dist/capture/release-sequence.d.ts.map +0 -1
  829. package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
  830. package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
  831. package/dist/capture/simulated-capture.d.ts.map +0 -1
  832. package/dist/color/capture-color.d.ts.map +0 -1
  833. package/dist/color/sensor-color-development.d.ts.map +0 -1
  834. package/dist/color/srgb-icc.d.ts.map +0 -1
  835. package/dist/color/srgb-transfer.d.ts.map +0 -1
  836. package/dist/color/white-balance.d.ts.map +0 -1
  837. package/dist/composition/image-formation-plan.d.ts.map +0 -1
  838. package/dist/composition/plan-consumer.d.ts.map +0 -1
  839. package/dist/core/calculation-result.d.ts.map +0 -1
  840. package/dist/core/canonical-json.d.ts.map +0 -1
  841. package/dist/core/configuration-error.d.ts.map +0 -1
  842. package/dist/core/evidence-provenance.d.ts.map +0 -1
  843. package/dist/core/image-formation.d.ts.map +0 -1
  844. package/dist/core/owned-data.d.ts.map +0 -1
  845. package/dist/core/record-validation.d.ts.map +0 -1
  846. package/dist/core/scientific-assurance.d.ts.map +0 -1
  847. package/dist/core/spectral-composition.d.ts.map +0 -1
  848. package/dist/core/spectral.d.ts.map +0 -1
  849. package/dist/core/validation.d.ts.map +0 -1
  850. package/dist/core/version.d.ts.map +0 -1
  851. package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
  852. package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
  853. package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
  854. package/dist/equipment/iso-capabilities.d.ts.map +0 -1
  855. package/dist/equipment/metering-capabilities.d.ts.map +0 -1
  856. package/dist/equipment/release-capabilities.d.ts.map +0 -1
  857. package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
  858. package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
  859. package/dist/exposure/exposure.d.ts.map +0 -1
  860. package/dist/exposure/flash.d.ts.map +0 -1
  861. package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
  862. package/dist/exposure/metering-target.d.ts.map +0 -1
  863. package/dist/exposure/metering-temporal.d.ts.map +0 -1
  864. package/dist/exposure/metering.d.ts.map +0 -1
  865. package/dist/exposure/program-line.d.ts.map +0 -1
  866. package/dist/index.d.ts.map +0 -1
  867. package/dist/motion/camera-rotation.d.ts.map +0 -1
  868. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
  869. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
  870. package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
  871. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
  872. package/dist/motion/extended-object-projection.d.ts.map +0 -1
  873. package/dist/motion/projected-motion.d.ts.map +0 -1
  874. package/dist/optics/aperture.d.ts.map +0 -1
  875. package/dist/optics/circle-of-confusion.d.ts.map +0 -1
  876. package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
  877. package/dist/optics/depth-of-field.d.ts.map +0 -1
  878. package/dist/optics/diffraction.d.ts.map +0 -1
  879. package/dist/optics/focus-breathing.d.ts.map +0 -1
  880. package/dist/optics/focus-state.d.ts.map +0 -1
  881. package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
  882. package/dist/optics/illumination-vignetting.d.ts.map +0 -1
  883. package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
  884. package/dist/optics/lens-psf-profile.d.ts.map +0 -1
  885. package/dist/optics/polygon-diffraction.d.ts.map +0 -1
  886. package/dist/optics/profile-contract.d.ts.map +0 -1
  887. package/dist/optics/psf-foundation.d.ts.map +0 -1
  888. package/dist/optics/radial-distortion.d.ts.map +0 -1
  889. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
  890. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
  891. package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
  892. package/dist/optics/sensor-environment-query.d.ts.map +0 -1
  893. package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
  894. package/dist/optics/sensor-psf-support.d.ts.map +0 -1
  895. package/dist/optics/stray-light.d.ts.map +0 -1
  896. package/dist/optics/thin-lens.d.ts.map +0 -1
  897. package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
  898. package/dist/output/capture-geometry.d.ts.map +0 -1
  899. package/dist/output/capture-sdr.d.ts.map +0 -1
  900. package/dist/output/crop.d.ts.map +0 -1
  901. package/dist/output/geometric-transforms.d.ts.map +0 -1
  902. package/dist/output/lens-corrections.d.ts.map +0 -1
  903. package/dist/output/native-capture-sdr.d.ts.map +0 -1
  904. package/dist/output/print-contrast-reference.d.ts.map +0 -1
  905. package/dist/output/print-detail.d.ts.map +0 -1
  906. package/dist/output/print-jpeg.d.ts.map +0 -1
  907. package/dist/output/print-plan.d.ts.map +0 -1
  908. package/dist/output/print-region-statistics.d.ts.map +0 -1
  909. package/dist/output/sdr-rendering.d.ts.map +0 -1
  910. package/dist/output/subject-framing-crop.d.ts.map +0 -1
  911. package/dist/schema/camera.d.ts.map +0 -1
  912. package/dist/schema/camera.js +0 -3
  913. package/dist/schema/camera.js.map +0 -1
  914. package/dist/schema/illumination-spectral.d.ts.map +0 -1
  915. package/dist/schema/illumination-temporal.d.ts.map +0 -1
  916. package/dist/schema/illumination.d.ts.map +0 -1
  917. package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
  918. package/dist/schema/scene-radiance.d.ts.map +0 -1
  919. package/dist/schema/scene.d.ts.map +0 -1
  920. package/dist/schema/scene.js +0 -3
  921. package/dist/schema/scene.js.map +0 -1
  922. package/dist/schema/validation.d.ts.map +0 -1
  923. package/dist/sensor/accumulated-charge.d.ts.map +0 -1
  924. package/dist/sensor/architecture.d.ts.map +0 -1
  925. package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
  926. package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
  927. package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
  928. package/dist/sensor/capture-mode.d.ts.map +0 -1
  929. package/dist/sensor/color-sampling.d.ts.map +0 -1
  930. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
  931. package/dist/sensor/dark-current.d.ts.map +0 -1
  932. package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
  933. package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
  934. package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
  935. package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
  936. package/dist/sensor/exposure-window.d.ts.map +0 -1
  937. package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
  938. package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
  939. package/dist/sensor/optical-stack.d.ts.map +0 -1
  940. package/dist/sensor/photon-energy.d.ts.map +0 -1
  941. package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
  942. package/dist/sensor/pixel-pitch.d.ts.map +0 -1
  943. package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
  944. package/dist/sensor/raw-readout.d.ts.map +0 -1
  945. package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
  946. package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
  947. package/dist/sensor/readout-timing.d.ts.map +0 -1
  948. package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
  949. package/dist/sensor/response-operating-range.d.ts.map +0 -1
  950. package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
  951. package/dist/sensor/sampling-aperture.d.ts.map +0 -1
  952. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
  953. package/dist/sensor/sensor-geometry.d.ts.map +0 -1
  954. package/dist/sensor/signal-noise.d.ts.map +0 -1
  955. package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
  956. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
  957. package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
  958. package/dist/sensor/spectral-coverage.d.ts.map +0 -1
  959. package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
  960. package/dist/sensor/spectral-response.d.ts.map +0 -1
  961. package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
  962. package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
  963. package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
  964. package/dist/simulation/poc-simulation.d.ts.map +0 -1
  965. package/dist/stabilization/camera-shake.d.ts.map +0 -1
  966. package/dist/stabilization/system.d.ts.map +0 -1
  967. package/docs/API_STYLE.md +0 -235
  968. package/docs/ARCHITECTURE.md +0 -356
  969. package/docs/AUTOMATION_COORDINATION.md +0 -190
  970. package/docs/CAPTURE_COLOR.md +0 -25
  971. package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
  972. package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
  973. package/docs/CAPTURE_SDR.md +0 -22
  974. package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
  975. package/docs/DEVELOPERS.md +0 -68
  976. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  977. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  978. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  979. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  980. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  981. package/docs/IMAGE_FORMATION.md +0 -247
  982. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  983. package/docs/MOTION_AND_SIGNAL.md +0 -250
  984. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  985. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  986. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  987. package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
  988. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  989. package/docs/PERFORMANCE_BASELINE.md +0 -56
  990. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  991. package/docs/PHYSICS_FOUNDATION.md +0 -426
  992. package/docs/POC_API.md +0 -278
  993. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  994. package/docs/POC_PROJECTION_REUSE.md +0 -124
  995. package/docs/PRINT_195_196_REVIEW.md +0 -93
  996. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  997. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  998. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  999. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  1000. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1001. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1002. package/docs/PRINT_PLANNING.md +0 -75
  1003. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1004. package/docs/PROCESSED_OUTPUT.md +0 -157
  1005. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1006. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1007. package/docs/PROVENANCE.md +0 -115
  1008. package/docs/PSF_FOUNDATION.md +0 -165
  1009. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1010. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1011. package/docs/RELEASE_1_0.md +0 -66
  1012. package/docs/RELEASE_1_0_1.md +0 -61
  1013. package/docs/RELEASE_1_1_0.md +0 -25
  1014. package/docs/RELEASE_1_2_0.md +0 -51
  1015. package/docs/RELEASE_1_3_0.md +0 -15
  1016. package/docs/RELEASE_1_4_0.md +0 -23
  1017. package/docs/RELEASE_1_5_0.md +0 -105
  1018. package/docs/RELEASE_AUDIT.md +0 -39
  1019. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1020. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1021. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1022. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1023. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1024. package/docs/SDR_RENDERING.md +0 -33
  1025. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1026. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1027. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1028. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1029. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1030. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1031. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1032. package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
  1033. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1034. package/docs/SIMULATED_CAPTURE.md +0 -65
  1035. package/docs/STABILIZATION.md +0 -234
  1036. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1037. package/docs/TIER_ACCEPTANCE.md +0 -129
  1038. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1039. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1040. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1041. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1042. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1043. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1044. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1045. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1046. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1047. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1048. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1049. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1050. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1051. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1052. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1053. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1054. package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
  1055. package/docs/validation/documentation-fragments.json +0 -212
  1056. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1057. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1058. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1059. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1060. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1061. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1062. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1063. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1064. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1065. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1066. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1067. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1068. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1069. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1070. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1071. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1072. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1073. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1074. package/docs/validation/print-detail-capabilities.json +0 -103
  1075. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1076. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1077. package/docs/validation/release-audit-inventory.json +0 -1306
  1078. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -1,25 +1,34 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
5
- * missing required fields and incompatible scientific data fail at this boundary. Sampled lens PSF
6
- * shapes bind exact generic optical state, field, wavelength and signed defocus support. Interpolation
7
- * stays within declared applicability and preserves normalized shape separately from throughput.
8
- * MTF-only data lacks phase/spatial information and does not authorize rendering a unique PSF.
9
- * Resolve the bounded sampled PSF for a declared optical state and support point without extrapolation
10
- * or silently inventing missing dimensions. Sampled lens PSF shapes bind exact generic optical state,
11
- * field, wavelength and signed defocus support. Interpolation stays within declared applicability and
12
- * preserves normalized shape separately from throughput. MTF-only data lacks phase/spatial information
13
- * and does not authorize rendering a unique PSF.
14
- * @see docs/PSF_FOUNDATION.md for equations, coordinate/unit conventions, blockers and support limits.
3
+ * Sampled lens PSF (point-spread function) profiles, and MTF-only diagnostic profiles.
4
+ *
5
+ * The parsers validate untrusted input and return the normalized typed contract. Unknown enum
6
+ * values, missing required fields and incompatible scientific data are rejected.
7
+ *
8
+ * The resolver finds the sampled PSF for a declared optical state and query point. It never
9
+ * extrapolates and never invents missing dimensions.
10
+ *
11
+ * A sampled lens PSF is tied to an exact generic optical state and to declared ranges of field
12
+ * position, wavelength and signed defocus. Interpolation stays inside those declared ranges. It keeps
13
+ * the normalized shape separate from the throughput. MTF (modulation transfer function) data alone
14
+ * has no phase or spatial information, so it cannot justify rendering one unique PSF.
15
+ * @see docs/PSF_FOUNDATION.md for the equations, units, coordinate conventions, known blockers and
16
+ * support limits.
15
17
  */
16
18
  import { approximationResult } from "../core/calculation-result.js";
17
19
  import { InvalidConfigurationError } from "../core/configuration-error.js";
20
+ import { freezeOwnedData } from "../core/owned-data.js";
18
21
  import { parseEvidenceList } from "../core/evidence-provenance.js";
19
22
  import { InvalidScientificInputError } from "../core/validation.js";
20
23
  import { parseFocusPlane } from "./focus-state.js";
24
+ import { requireInputKeys, rejectUnknownFields, rejectUnknownVariantFields, UNCERTAINTY_VARIANT_FIELDS } from "../core/record-validation.js";
21
25
  export const LENS_SAMPLED_PSF_PROFILE_SCHEMA_VERSION = "0.1.0";
22
26
  export const LENS_MTF_DIAGNOSTIC_PROFILE_SCHEMA_VERSION = "0.1.0";
27
+ const LENS_SAMPLED_PSF_INTERPOLATIONS = [
28
+ "bounded-regular-grid-multilinear",
29
+ "bounded-regular-grid-centroid-aligned",
30
+ "rotationally-symmetric-radial-field-centroid-aligned"
31
+ ];
23
32
  const AXIS_KEYS = [
24
33
  "focalLengthMm",
25
34
  "focusDiopters",
@@ -29,12 +38,14 @@ const AXIS_KEYS = [
29
38
  "wavelengthNm",
30
39
  "signedDefocusImagePlaneMicrometers"
31
40
  ];
32
- function requireRecord(value, path) {
41
+ function requireRecord(value, path, allowedKeys) {
33
42
  if (typeof value !== "object" ||
34
43
  value === null ||
35
44
  Array.isArray(value)) {
36
45
  throw new InvalidConfigurationError(path + " must be an object.");
37
46
  }
47
+ if (allowedKeys !== null)
48
+ rejectUnknownFields(value, allowedKeys, path);
38
49
  return value;
39
50
  }
40
51
  function requireNonEmptyString(value, path) {
@@ -103,7 +114,8 @@ function parseStatus(value, path) {
103
114
  return value;
104
115
  }
105
116
  function parseUncertainty(value, path) {
106
- const record = requireRecord(value, path);
117
+ const record = requireRecord(value, path, null);
118
+ rejectUnknownVariantFields(record, "kind", UNCERTAINTY_VARIANT_FIELDS, path);
107
119
  if (record.kind === "relative") {
108
120
  return {
109
121
  kind: "relative",
@@ -165,7 +177,7 @@ function parseAxis(value, path, options = {}) {
165
177
  return parsed;
166
178
  }
167
179
  function parseKernel(value, path) {
168
- const record = requireRecord(value, path);
180
+ const record = requireRecord(value, path, ["widthSamples", "heightSamples", "centerSampleX", "centerSampleY", "normalizedIntensity", "samplePitchMicrometersX", "samplePitchMicrometersY"]);
169
181
  const widthSamples = requirePositiveSafeInteger(record.widthSamples, path + ".widthSamples");
170
182
  const heightSamples = requirePositiveSafeInteger(record.heightSamples, path + ".heightSamples");
171
183
  const total = widthSamples *
@@ -218,7 +230,7 @@ function parseKernel(value, path) {
218
230
  };
219
231
  }
220
232
  function parseAxes(value) {
221
- const record = requireRecord(value, "lensPsfProfile.axes");
233
+ const record = requireRecord(value, "lensPsfProfile.axes", ["focalLengthMm", "focusDiopters", "apertureFNumber", "fieldXmm", "fieldYmm", "wavelengthNm", "signedDefocusImagePlaneMicrometers"]);
222
234
  return {
223
235
  focalLengthMm: parseAxis(record.focalLengthMm, "lensPsfProfile.axes.focalLengthMm", {
224
236
  positive: true
@@ -239,7 +251,7 @@ function parseAxes(value) {
239
251
  };
240
252
  }
241
253
  function parseCoordinate(value, path) {
242
- const record = requireRecord(value, path);
254
+ const record = requireRecord(value, path, ["focalLengthMm", "focusDiopters", "apertureFNumber", "fieldXmm", "fieldYmm", "wavelengthNm", "signedDefocusImagePlaneMicrometers"]);
243
255
  return {
244
256
  focalLengthMm: requirePositiveFinite(record.focalLengthMm, path + ".focalLengthMm"),
245
257
  focusDiopters: requireNonNegativeFinite(record.focusDiopters, path + ".focusDiopters"),
@@ -274,7 +286,7 @@ function parseNode(value, index, axes, status) {
274
286
  const path = "lensPsfProfile.nodes[" +
275
287
  index +
276
288
  "]";
277
- const record = requireRecord(value, path);
289
+ const record = requireRecord(value, path, ["coordinate", "uncertainty", "nodeId", "kernel", "bestFocusImagePlaneOffsetMicrometers", "relativePupilThroughputFactor", "evidence"]);
278
290
  const coordinate = parseCoordinate(record.coordinate, path + ".coordinate");
279
291
  validateNodeCoordinate(axes, coordinate, path + ".coordinate");
280
292
  const uncertainty = parseUncertainty(record.uncertainty, path + ".uncertainty");
@@ -327,21 +339,61 @@ function sameKernelGeometry(first, second) {
327
339
  first.centerSampleY ===
328
340
  second.centerSampleY);
329
341
  }
342
+ /** Private profile declarations owned by the engine, registered by markEngineOwnedLensSampledPsfProfile. */
343
+ const ENGINE_OWNED_PROFILES = new WeakSet();
344
+ /** Deep-frozen parse of a deep-frozen engine-owned declaration. */
345
+ const PARSED_OWNED_PROFILES = new WeakMap();
346
+ /** Grid node index of a cached, deep-frozen parse. */
347
+ const TRUSTED_NODE_INDEX = new WeakMap();
330
348
  /**
331
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
332
- * missing required fields and incompatible scientific data fail at this boundary.
349
+ * Internal: registers a private profile declaration owned by the engine, so that repeated
350
+ * resolveLensSampledPsf calls reuse one parse. The declaration is a structured clone that caller code
351
+ * never sees.
333
352
  *
334
- * Sampled lens PSF shapes bind exact generic optical state, field, wavelength and signed defocus
335
- * support. Interpolation stays within declared applicability and preserves normalized shape separately
336
- * from throughput. MTF-only data lacks phase/spatial information and does not authorize rendering a
337
- * unique PSF.
338
- * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
339
- * @returns LensSampledPsfProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
353
+ * The first resolve parses it exactly like untrusted input. It then deep-freezes the declaration and
354
+ * caches the frozen parse with its node index. A frozen declaration cannot change, so the cached
355
+ * parse stays exact. Caller objects that were never registered are always parsed again.
356
+ */
357
+ export function markEngineOwnedLensSampledPsfProfile(value) {
358
+ if (typeof value === "object" && value !== null)
359
+ ENGINE_OWNED_PROFILES.add(value);
360
+ }
361
+ function parseOwnedOrUntrustedProfile(value) {
362
+ if (typeof value !== "object" || value === null || !ENGINE_OWNED_PROFILES.has(value)) {
363
+ return parseLensSampledPsfProfile(value);
364
+ }
365
+ const cached = PARSED_OWNED_PROFILES.get(value);
366
+ if (cached !== undefined)
367
+ return cached;
368
+ const parsed = parseLensSampledPsfProfile(value);
369
+ try {
370
+ freezeOwnedData(value);
371
+ }
372
+ catch {
373
+ // Not plain data that freezeOwnedData accepts (for example typed-array storage), so do not cache.
374
+ ENGINE_OWNED_PROFILES.delete(value);
375
+ return parsed;
376
+ }
377
+ freezeOwnedData(parsed);
378
+ TRUSTED_NODE_INDEX.set(parsed, buildGridNodeIndex(parsed));
379
+ PARSED_OWNED_PROFILES.set(value, parsed);
380
+ return parsed;
381
+ }
382
+ /**
383
+ * Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,
384
+ * missing required fields and incompatible scientific data are rejected here.
385
+ *
386
+ * A sampled lens PSF is tied to an exact generic optical state and to declared ranges of field
387
+ * position, wavelength and signed defocus. Interpolation stays inside those declared ranges. It keeps
388
+ * the normalized shape separate from the throughput. MTF (modulation transfer function) data alone
389
+ * has no phase or spatial information, so it cannot justify rendering one unique PSF.
390
+ * @param value - unknown. Untrusted input; TypeScript types alone are not validation.
391
+ * @returns LensSampledPsfProfile. The result states its shape and scientific status; a successful call does not imply calibration.
340
392
  *
341
393
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
342
394
  */
343
395
  export function parseLensSampledPsfProfile(value) {
344
- const record = requireRecord(value, "lensPsfProfile");
396
+ const record = requireRecord(value, "lensPsfProfile", ["schemaVersion", "opticalDomain", "coordinateSystem", "fieldAxes", "kernelEnergyNormalization", "interpolation", "throughputOwnership", "sensorOpticalStackIncluded", "sensorSamplingIncluded", "reconstructionIncluded", "strayLightIncluded", "scientificStatus", "responseIncludes", "axes", "nodes", "profileId", "profileVersion", "evidence", "limitations"]);
345
397
  if (record.schemaVersion !==
346
398
  LENS_SAMPLED_PSF_PROFILE_SCHEMA_VERSION) {
347
399
  throw new InvalidConfigurationError('lensPsfProfile.schemaVersion must be "' +
@@ -360,8 +412,7 @@ export function parseLensSampledPsfProfile(value) {
360
412
  }
361
413
  if (record.kernelEnergyNormalization !==
362
414
  "unit-energy-shape" ||
363
- record.interpolation !==
364
- "bounded-regular-grid-multilinear" ||
415
+ !LENS_SAMPLED_PSF_INTERPOLATIONS.includes(record.interpolation) ||
365
416
  record.throughputOwnership !==
366
417
  "separate-relative-pupil-throughput-factor") {
367
418
  throw new InvalidConfigurationError("lensPsfProfile normalization/interpolation/throughput ownership is invalid.");
@@ -377,7 +428,7 @@ export function parseLensSampledPsfProfile(value) {
377
428
  throw new InvalidConfigurationError("V1 lens PSF profiles must remain lens-primary-optical-path-only and exclude sensor/reconstruction/stray-light effects.");
378
429
  }
379
430
  const status = parseStatus(record.scientificStatus, "lensPsfProfile.scientificStatus");
380
- const response = requireRecord(record.responseIncludes, "lensPsfProfile.responseIncludes");
431
+ const response = requireRecord(record.responseIncludes, "lensPsfProfile.responseIncludes", ["diffraction", "aberration", "defocus", "pupilClippingShape"]);
381
432
  for (const key of [
382
433
  "diffraction",
383
434
  "aberration",
@@ -419,6 +470,18 @@ export function parseLensSampledPsfProfile(value) {
419
470
  throw new InvalidConfigurationError("Every lensPsfProfile node must use identical PSF kernel grid geometry for multilinear interpolation.");
420
471
  }
421
472
  }
473
+ if (record.interpolation ===
474
+ "rotationally-symmetric-radial-field-centroid-aligned") {
475
+ if (axes.fieldYmm.length !== 1 ||
476
+ axes.fieldYmm[0] !== 0 ||
477
+ axes.fieldXmm.some((value) => value < 0)) {
478
+ throw new InvalidConfigurationError("Rotationally symmetric PSF profiles must declare fieldYmm = [0] and non-negative fieldXmm radii.");
479
+ }
480
+ if (firstKernel.samplePitchMicrometersX !==
481
+ firstKernel.samplePitchMicrometersY) {
482
+ throw new InvalidConfigurationError("Rotationally symmetric PSF profiles require square kernel sample pitch for rotation.");
483
+ }
484
+ }
422
485
  return {
423
486
  schemaVersion: LENS_SAMPLED_PSF_PROFILE_SCHEMA_VERSION,
424
487
  profileId: requireNonEmptyString(record.profileId, "lensPsfProfile.profileId"),
@@ -428,7 +491,7 @@ export function parseLensSampledPsfProfile(value) {
428
491
  coordinateSystem: "image-plane-metric",
429
492
  fieldAxes: "+X right, +Y up",
430
493
  kernelEnergyNormalization: "unit-energy-shape",
431
- interpolation: "bounded-regular-grid-multilinear",
494
+ interpolation: record.interpolation,
432
495
  throughputOwnership: "separate-relative-pupil-throughput-factor",
433
496
  responseIncludes: {
434
497
  diffraction: response.diffraction,
@@ -484,11 +547,14 @@ function bracketAxis(values, target, path) {
484
547
  throw new InvalidScientificInputError(path +
485
548
  " lies outside the declared PSF profile grid; extrapolation is not permitted.");
486
549
  }
487
- for (const value of values) {
550
+ for (let index = 0; index < values.length; index += 1) {
551
+ const value = values[index];
488
552
  if (Math.abs(target - value) <= tolerance) {
489
553
  return {
490
554
  lower: value,
491
555
  upper: value,
556
+ lowerIndex: index,
557
+ upperIndex: index,
492
558
  fraction: 0,
493
559
  exact: true
494
560
  };
@@ -503,6 +569,8 @@ function bracketAxis(values, target, path) {
503
569
  return {
504
570
  lower,
505
571
  upper,
572
+ lowerIndex: index,
573
+ upperIndex: index + 1,
506
574
  fraction: (target - lower) /
507
575
  (upper - lower),
508
576
  exact: false
@@ -541,66 +609,68 @@ function bracketCoordinate(axes, coordinate) {
541
609
  .signedDefocusImagePlaneMicrometers, "signedDefocusImagePlaneMicrometers")
542
610
  };
543
611
  }
544
- function cornerCoordinates(brackets) {
545
- let corners = [{
546
- partial: {},
547
- weight: 1
548
- }];
549
- for (const key of AXIS_KEYS) {
550
- const bracket = brackets[key];
551
- const values = bracket.exact
552
- ? [{
553
- value: bracket.lower,
554
- weight: 1
555
- }]
556
- : [
557
- {
558
- value: bracket.lower,
559
- weight: 1 -
560
- bracket.fraction
561
- },
562
- {
563
- value: bracket.upper,
564
- weight: bracket.fraction
565
- }
566
- ];
567
- const next = [];
568
- for (const corner of corners) {
569
- for (const option of values) {
570
- if (option.weight === 0) {
571
- continue;
572
- }
573
- next.push({
574
- partial: {
575
- ...corner.partial,
576
- [key]: option.value
577
- },
578
- weight: corner.weight *
579
- option.weight
580
- });
581
- }
612
+ /** Flat-index strides of the regular grid over AXIS_KEYS (the last axis varies fastest). */
613
+ function gridStrides(axes) {
614
+ const strides = new Array(AXIS_KEYS.length);
615
+ let stride = 1;
616
+ for (let a = AXIS_KEYS.length - 1; a >= 0; a -= 1) {
617
+ strides[a] = stride;
618
+ stride *= axes[AXIS_KEYS[a]].length;
619
+ }
620
+ return strides;
621
+ }
622
+ /**
623
+ * Nodes indexed by grid position. Node coordinates match declared axis values exactly (checked by the
624
+ * parser, with `===`, so −0 and 0 are one position) and are unique, so each position holds at most one node.
625
+ */
626
+ function buildGridNodeIndex(profile) {
627
+ const strides = gridStrides(profile.axes);
628
+ const nodes = new Array(AXIS_KEYS.reduce((n, key) => n * profile.axes[key].length, 1));
629
+ for (const node of profile.nodes) {
630
+ let flat = 0;
631
+ for (let a = 0; a < AXIS_KEYS.length; a += 1) {
632
+ const key = AXIS_KEYS[a];
633
+ flat += profile.axes[key].indexOf(node.coordinate[key]) * strides[a];
582
634
  }
583
- corners = next;
635
+ nodes[flat] = node;
584
636
  }
585
- return corners.map((corner) => ({
586
- coordinate: corner.partial,
587
- weight: corner.weight
588
- }));
637
+ return { strides, nodes };
589
638
  }
639
+ /**
640
+ * The multilinear corners of a bracketed query and their weights, in a fixed order: axes in AXIS_KEYS order,
641
+ * lower before upper, zero-weight options skipped. Each weight is the product of its per-axis weights in that order.
642
+ */
590
643
  function resolveWeightedNodes(profile, brackets) {
591
- const byKey = new Map(profile.nodes.map((node) => [
592
- coordinateKey(node.coordinate),
593
- node
594
- ]));
595
- return cornerCoordinates(brackets).map((corner) => {
596
- const node = byKey.get(coordinateKey(corner.coordinate));
644
+ const index = TRUSTED_NODE_INDEX.get(profile) ?? buildGridNodeIndex(profile);
645
+ let flats = [0], weights = [1];
646
+ for (let a = 0; a < AXIS_KEYS.length; a += 1) {
647
+ const bracket = brackets[AXIS_KEYS[a]], stride = index.strides[a];
648
+ const nextFlats = [], nextWeights = [];
649
+ for (let c = 0; c < flats.length; c += 1) {
650
+ if (bracket.exact) {
651
+ nextFlats.push(flats[c] + bracket.lowerIndex * stride);
652
+ nextWeights.push(weights[c] * 1);
653
+ continue;
654
+ }
655
+ const lowerWeight = 1 - bracket.fraction, upperWeight = bracket.fraction;
656
+ if (lowerWeight !== 0) {
657
+ nextFlats.push(flats[c] + bracket.lowerIndex * stride);
658
+ nextWeights.push(weights[c] * lowerWeight);
659
+ }
660
+ if (upperWeight !== 0) {
661
+ nextFlats.push(flats[c] + bracket.upperIndex * stride);
662
+ nextWeights.push(weights[c] * upperWeight);
663
+ }
664
+ }
665
+ flats = nextFlats;
666
+ weights = nextWeights;
667
+ }
668
+ return flats.map((flat, c) => {
669
+ const node = index.nodes[flat];
597
670
  if (node === undefined) {
598
671
  throw new InvalidScientificInputError("PSF profile grid is missing a required interpolation corner.");
599
672
  }
600
- return {
601
- node,
602
- weight: corner.weight
603
- };
673
+ return { node, weight: weights[c] };
604
674
  });
605
675
  }
606
676
  function interpolateKernel(weighted) {
@@ -637,41 +707,170 @@ function interpolateKernel(weighted) {
637
707
  normalizedIntensity: normalized
638
708
  };
639
709
  }
710
+ function kernelCentroid(kernel) {
711
+ let sum = 0;
712
+ let x = 0;
713
+ let y = 0;
714
+ for (let row = 0; row < kernel.heightSamples; row += 1) {
715
+ for (let column = 0; column < kernel.widthSamples; column += 1) {
716
+ const value = kernel.normalizedIntensity[row * kernel.widthSamples + column];
717
+ sum += value;
718
+ x += value * (column - kernel.centerSampleX);
719
+ y += value * (row - kernel.centerSampleY);
720
+ }
721
+ }
722
+ return { x: x / sum, y: y / sum };
723
+ }
724
+ /** Bilinear sample at fractional array coordinates; zero outside the kernel. */
725
+ function bilinearSample(kernel, column, row) {
726
+ const x0 = Math.floor(column);
727
+ const y0 = Math.floor(row);
728
+ const fx = column - x0;
729
+ const fy = row - y0;
730
+ const at = (x, y) => x < 0 || y < 0 || x >= kernel.widthSamples || y >= kernel.heightSamples
731
+ ? 0
732
+ : kernel.normalizedIntensity[y * kernel.widthSamples + x];
733
+ const top = fx === 0 ? at(x0, y0) : (1 - fx) * at(x0, y0) + fx * at(x0 + 1, y0);
734
+ if (fy === 0) {
735
+ return top;
736
+ }
737
+ const bottom = fx === 0 ? at(x0, y0 + 1) : (1 - fx) * at(x0, y0 + 1) + fx * at(x0 + 1, y0 + 1);
738
+ return (1 - fy) * top + fy * bottom;
739
+ }
740
+ function normalizedKernel(template, values) {
741
+ const sum = values.reduce((acc, value) => acc + value, 0);
742
+ if (!Number.isFinite(sum) || sum <= 0) {
743
+ throw new InvalidScientificInputError("Interpolated PSF energy must remain finite and positive.");
744
+ }
745
+ return {
746
+ widthSamples: template.widthSamples,
747
+ heightSamples: template.heightSamples,
748
+ samplePitchMicrometersX: template.samplePitchMicrometersX,
749
+ samplePitchMicrometersY: template.samplePitchMicrometersY,
750
+ centerSampleX: template.centerSampleX,
751
+ centerSampleY: template.centerSampleY,
752
+ normalizedIntensity: values.map((value) => value / sum)
753
+ };
754
+ }
755
+ /**
756
+ * Centroid-aligned interpolation. Each node kernel is shifted so its intensity centroid lands on the
757
+ * weighted centroid. Then the multilinear weights are applied. A single exact node is returned
758
+ * unchanged.
759
+ */
760
+ function interpolateKernelCentroidAligned(weighted) {
761
+ const first = weighted[0]?.node.kernel;
762
+ if (first === undefined) {
763
+ throw new InvalidScientificInputError("PSF interpolation requires at least one source node.");
764
+ }
765
+ if (weighted.length === 1) {
766
+ // An exact grid node is already a validated unit-energy kernel; return it bit-for-bit.
767
+ return { ...first, normalizedIntensity: [...first.normalizedIntensity] };
768
+ }
769
+ const centroids = weighted.map((entry) => kernelCentroid(entry.node.kernel));
770
+ const target = centroids.reduce((acc, centroid, index) => ({
771
+ x: acc.x + weighted[index].weight * centroid.x,
772
+ y: acc.y + weighted[index].weight * centroid.y
773
+ }), { x: 0, y: 0 });
774
+ const values = new Array(first.normalizedIntensity.length).fill(0);
775
+ weighted.forEach((entry, index) => {
776
+ const dx = centroids[index].x - target.x;
777
+ const dy = centroids[index].y - target.y;
778
+ for (let row = 0; row < first.heightSamples; row += 1) {
779
+ for (let column = 0; column < first.widthSamples; column += 1) {
780
+ values[row * first.widthSamples + column] +=
781
+ entry.weight * bilinearSample(entry.node.kernel, column + dx, row + dy);
782
+ }
783
+ }
784
+ });
785
+ return normalizedKernel(first, values);
786
+ }
787
+ /** Rotates a kernel by angleRadians (counter-clockwise, +Y up) about its centre sample. */
788
+ function rotateKernel(kernel, angleRadians) {
789
+ const cos = Math.cos(angleRadians);
790
+ const sin = Math.sin(angleRadians);
791
+ const values = [];
792
+ for (let row = 0; row < kernel.heightSamples; row += 1) {
793
+ // Array rows increase downward; image +Y is up.
794
+ const y = kernel.centerSampleY - row;
795
+ for (let column = 0; column < kernel.widthSamples; column += 1) {
796
+ const x = column - kernel.centerSampleX;
797
+ // Inverse rotation: destination (x, y) samples source R(-angle) (x, y).
798
+ const sourceX = cos * x + sin * y;
799
+ const sourceY = -sin * x + cos * y;
800
+ values.push(bilinearSample(kernel, kernel.centerSampleX + sourceX, kernel.centerSampleY - sourceY));
801
+ }
802
+ }
803
+ return normalizedKernel(kernel, values);
804
+ }
640
805
  function weightedScalar(weighted, select) {
641
806
  return weighted.reduce((sum, entry) => sum +
642
807
  entry.weight *
643
808
  select(entry.node), 0);
644
809
  }
645
- /**
646
- * Resolve the bounded sampled PSF for a declared optical state and support point without extrapolation
647
- * or silently inventing missing dimensions.
648
- *
649
- * Sampled lens PSF shapes bind exact generic optical state, field, wavelength and signed defocus
650
- * support. Interpolation stays within declared applicability and preserves normalized shape separately
651
- * from throughput. MTF-only data lacks phase/spatial information and does not authorize rendering a
652
- * unique PSF.
653
- * @param input - ResolveLensSampledPsfInput. See the linked contract for coordinate, unit and profile binding semantics.
654
- * @returns CalculationResult<ResolvedLensSampledPsf>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
655
- *
656
- * @see docs/API_REFERENCE.md for the root export and exact type graph.
657
- */
658
- export function resolveLensSampledPsf(input) {
659
- const profile = parseLensSampledPsfProfile(input.profile);
810
+ function resolveLensSampledPsfCore(input) {
811
+ requireInputKeys(input, "resolveLensSampledPsf", ["profile", "focalLengthMm", "focus", "apertureFNumber", "fieldPointMm", "wavelengthNm", "signedDefocusImagePlaneMicrometers"]);
812
+ const profile = parseOwnedOrUntrustedProfile(input.profile);
660
813
  const query = queryCoordinate(input);
661
- const brackets = bracketCoordinate(profile.axes, query.coordinate);
814
+ const rotational = profile.interpolation ===
815
+ "rotationally-symmetric-radial-field-centroid-aligned";
816
+ const fieldRadiusMm = Math.hypot(query.coordinate.fieldXmm, query.coordinate.fieldYmm);
817
+ const fieldAngleRadians = rotational
818
+ ? Math.atan2(query.coordinate.fieldYmm, query.coordinate.fieldXmm)
819
+ : 0;
820
+ const brackets = bracketCoordinate(profile.axes, rotational
821
+ ? { ...query.coordinate, fieldXmm: fieldRadiusMm, fieldYmm: 0 }
822
+ : query.coordinate);
662
823
  const weighted = resolveWeightedNodes(profile, brackets);
663
- const exact = AXIS_KEYS.every((key) => brackets[key].exact);
664
- const kernel = interpolateKernel(weighted);
824
+ const exact = AXIS_KEYS.every((key) => brackets[key].exact) && fieldAngleRadians === 0;
825
+ const kernel = profile.interpolation === "bounded-regular-grid-multilinear"
826
+ ? interpolateKernel(weighted)
827
+ : fieldAngleRadians === 0
828
+ ? interpolateKernelCentroidAligned(weighted)
829
+ : rotateKernel(interpolateKernelCentroidAligned(weighted), fieldAngleRadians);
665
830
  const bestFocus = weightedScalar(weighted, (node) => node
666
831
  .bestFocusImagePlaneOffsetMicrometers);
667
- const throughput = weightedScalar(weighted, (node) => node
832
+ // A multilinear blend is a convex combination, so it cannot exceed its largest node value. But its
833
+ // floating-point weights can sum to a few ulps above 1. A result above 1 that lies within
834
+ // 8·ε·(node count)·max of the largest node is that rounding error. It is clamped to the largest node
835
+ // value (≤ 1, so the result is again a declared value). Results already within [0, 1] are unchanged.
836
+ const blended = weightedScalar(weighted, (node) => node
668
837
  .relativePupilThroughputFactor);
838
+ const largestThroughput = Math.max(...weighted.map((entry) => entry.node.relativePupilThroughputFactor));
839
+ const throughput = blended > 1 && largestThroughput <= 1 &&
840
+ blended - largestThroughput <= 8 * Number.EPSILON * weighted.length * Math.max(1, largestThroughput)
841
+ ? largestThroughput
842
+ : blended;
669
843
  if (!Number.isFinite(bestFocus) ||
670
844
  !Number.isFinite(throughput) ||
671
845
  throughput < 0 ||
672
846
  throughput > 1) {
673
847
  throw new InvalidScientificInputError("Interpolated PSF metadata must remain finite and physically bounded.");
674
848
  }
849
+ return { profile, query, rotational, exact, weighted, kernel, bestFocus, throughput };
850
+ }
851
+ /**
852
+ * Internal (2.0 performance): the kernel resolveLensSampledPsf returns for the same input, computed by
853
+ * the same code without building the result envelope. Throws whenever resolveLensSampledPsf would throw
854
+ * before its envelope. Not exported from the package.
855
+ */
856
+ export function resolveLensSampledPsfKernel(input) {
857
+ return resolveLensSampledPsfCore(input).kernel;
858
+ }
859
+ /**
860
+ * Resolves the sampled PSF for a declared optical state and query point. It never extrapolates and
861
+ * never invents missing dimensions.
862
+ *
863
+ * A sampled lens PSF is tied to an exact generic optical state and to declared ranges of field
864
+ * position, wavelength and signed defocus. Interpolation stays inside those declared ranges. It keeps
865
+ * the normalized shape separate from the throughput. MTF (modulation transfer function) data alone
866
+ * has no phase or spatial information, so it cannot justify rendering one unique PSF.
867
+ * @param input - ResolveLensSampledPsfInput. See that type for coordinates, units and profile binding.
868
+ * @returns CalculationResult<ResolvedLensSampledPsf>. The result states its shape and scientific status; a successful call does not imply calibration.
869
+ *
870
+ * @see docs/API_REFERENCE.md for the root export and exact type graph.
871
+ */
872
+ export function resolveLensSampledPsf(input) {
873
+ const { profile, query, rotational, exact, weighted, kernel, bestFocus, throughput } = resolveLensSampledPsfCore(input);
675
874
  return approximationResult({
676
875
  profileId: profile.profileId,
677
876
  profileVersion: profile.profileVersion,
@@ -705,7 +904,19 @@ export function resolveLensSampledPsf(input) {
705
904
  reconstructionIncluded: false,
706
905
  strayLightIncluded: false,
707
906
  scalarSharpnessScoreProduced: false
708
- }, "lens-sampled-psf-bounded-interpolation", "1.0.0", [
907
+ }, profile.interpolation === "bounded-regular-grid-multilinear"
908
+ ? "lens-sampled-psf-bounded-interpolation"
909
+ : rotational
910
+ ? "lens-sampled-psf-rotational-centroid-aligned-interpolation"
911
+ : "lens-sampled-psf-centroid-aligned-interpolation", "1.0.0", [
912
+ ...(profile.interpolation === "bounded-regular-grid-multilinear"
913
+ ? []
914
+ : [
915
+ "Node kernels are translated to the weighted intensity centroid before blending (bilinear resampling, outside samples zero, renormalised), so shifted PSFs blend into one peak.",
916
+ ...(rotational
917
+ ? ["Rotationally symmetric lens: nodes along +X are interpolated at the field radius and the kernel is rotated by the field azimuth."]
918
+ : [])
919
+ ]),
709
920
  "PSF intensity is a unit-energy shape; relative pupil throughput remains a separate factor for the optical-throughput path.",
710
921
  "Regular-grid interpolation is bounded and never extrapolates beyond declared focal-length, focus, aperture, field, wavelength or signed-defocus axes.",
711
922
  "Full 2D image-plane kernel orientation is preserved in +X right, +Y up coordinates; no radial or sagittal/tangential averaging is forced.",
@@ -715,20 +926,20 @@ export function resolveLensSampledPsf(input) {
715
926
  ]);
716
927
  }
717
928
  /**
718
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
719
- * missing required fields and incompatible scientific data fail at this boundary.
929
+ * Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,
930
+ * missing required fields and incompatible scientific data are rejected here.
720
931
  *
721
- * Sampled lens PSF shapes bind exact generic optical state, field, wavelength and signed defocus
722
- * support. Interpolation stays within declared applicability and preserves normalized shape separately
723
- * from throughput. MTF-only data lacks phase/spatial information and does not authorize rendering a
724
- * unique PSF.
725
- * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
726
- * @returns LensMtfDiagnosticProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
932
+ * A sampled lens PSF is tied to an exact generic optical state and to declared ranges of field
933
+ * position, wavelength and signed defocus. Interpolation stays inside those declared ranges. It keeps
934
+ * the normalized shape separate from the throughput. MTF (modulation transfer function) data alone
935
+ * has no phase or spatial information, so it cannot justify rendering one unique PSF.
936
+ * @param value - unknown. Untrusted input; TypeScript types alone are not validation.
937
+ * @returns LensMtfDiagnosticProfile. The result states its shape and scientific status; a successful call does not imply calibration.
727
938
  *
728
939
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
729
940
  */
730
941
  export function parseLensMtfDiagnosticProfile(value) {
731
- const record = requireRecord(value, "lensMtfProfile");
942
+ const record = requireRecord(value, "lensMtfProfile", ["schemaVersion", "opticalDomain", "phaseInformationAvailable", "magnitudeMeaning", "samples", "fieldPointMm", "wavelengthNm", "profileId", "profileVersion", "focalLengthMm", "focus", "apertureFNumber", "evidence", "limitations"]);
732
943
  if (record.schemaVersion !==
733
944
  LENS_MTF_DIAGNOSTIC_PROFILE_SCHEMA_VERSION) {
734
945
  throw new InvalidConfigurationError('lensMtfProfile.schemaVersion must be "' +
@@ -753,7 +964,7 @@ export function parseLensMtfDiagnosticProfile(value) {
753
964
  const path = "lensMtfProfile.samples[" +
754
965
  index +
755
966
  "]";
756
- const sample = requireRecord(entry, path);
967
+ const sample = requireRecord(entry, path, ["spatialFrequencyCyclesPerMm", "sagittalMagnitude", "tangentialMagnitude"]);
757
968
  const frequency = requireNonNegativeFinite(sample
758
969
  .spatialFrequencyCyclesPerMm, path +
759
970
  ".spatialFrequencyCyclesPerMm");
@@ -773,7 +984,7 @@ export function parseLensMtfDiagnosticProfile(value) {
773
984
  ".tangentialMagnitude")
774
985
  };
775
986
  });
776
- const field = requireRecord(record.fieldPointMm, "lensMtfProfile.fieldPointMm");
987
+ const field = requireRecord(record.fieldPointMm, "lensMtfProfile.fieldPointMm", ["x", "y"]);
777
988
  const wavelength = record.wavelengthNm ===
778
989
  null
779
990
  ? null
@@ -799,15 +1010,15 @@ export function parseLensMtfDiagnosticProfile(value) {
799
1010
  };
800
1011
  }
801
1012
  /**
802
- * Explain why MTF-only evidence cannot determine a unique renderable PSF; return blockers instead of
803
- * fabricating phase information.
1013
+ * Explains why MTF-only evidence cannot determine one unique renderable PSF. Returns blockers instead
1014
+ * of making up phase information.
804
1015
  *
805
- * Sampled lens PSF shapes bind exact generic optical state, field, wavelength and signed defocus
806
- * support. Interpolation stays within declared applicability and preserves normalized shape separately
807
- * from throughput. MTF-only data lacks phase/spatial information and does not authorize rendering a
808
- * unique PSF.
809
- * @param profile - LensMtfDiagnosticProfile. See the linked contract for coordinate, unit and profile binding semantics.
810
- * @returns MtfOnlyPsfRenderabilityAssessment. Read structured blockers before consuming an authorization.
1016
+ * A sampled lens PSF is tied to an exact generic optical state and to declared ranges of field
1017
+ * position, wavelength and signed defocus. Interpolation stays inside those declared ranges. It keeps
1018
+ * the normalized shape separate from the throughput. MTF (modulation transfer function) data alone
1019
+ * has no phase or spatial information, so it cannot justify rendering one unique PSF.
1020
+ * @param profile - LensMtfDiagnosticProfile. See that type for coordinates, units and profile binding.
1021
+ * @returns MtfOnlyPsfRenderabilityAssessment. Read the structured blockers before relying on any authorization.
811
1022
  *
812
1023
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
813
1024
  */