@photivra/engine 1.4.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 (1074) hide show
  1. package/CHANGELOG.md +401 -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 +118 -5
  56. package/dist/capture/native-raw-development.js +224 -59
  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 +67 -10
  62. package/dist/capture/native-raw.js +90 -24
  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 -4
  639. package/docs/api/capture-native-raw-dng.md +84 -0
  640. package/docs/api/capture-native-raw.md +23 -8
  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/DEVELOPERS.md +0 -68
  975. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  976. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  977. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  978. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  979. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  980. package/docs/IMAGE_FORMATION.md +0 -247
  981. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  982. package/docs/MOTION_AND_SIGNAL.md +0 -250
  983. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  984. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  985. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  986. package/docs/NATIVE_RAW_AND_PRINT.md +0 -47
  987. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  988. package/docs/PERFORMANCE_BASELINE.md +0 -56
  989. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  990. package/docs/PHYSICS_FOUNDATION.md +0 -426
  991. package/docs/POC_API.md +0 -278
  992. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  993. package/docs/POC_PROJECTION_REUSE.md +0 -124
  994. package/docs/PRINT_195_196_REVIEW.md +0 -93
  995. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  996. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  997. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  998. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  999. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1000. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1001. package/docs/PRINT_PLANNING.md +0 -75
  1002. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1003. package/docs/PROCESSED_OUTPUT.md +0 -157
  1004. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1005. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1006. package/docs/PROVENANCE.md +0 -115
  1007. package/docs/PSF_FOUNDATION.md +0 -165
  1008. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1009. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1010. package/docs/RELEASE_1_0.md +0 -66
  1011. package/docs/RELEASE_1_0_1.md +0 -61
  1012. package/docs/RELEASE_1_1_0.md +0 -25
  1013. package/docs/RELEASE_1_2_0.md +0 -51
  1014. package/docs/RELEASE_1_3_0.md +0 -15
  1015. package/docs/RELEASE_1_4_0.md +0 -23
  1016. package/docs/RELEASE_AUDIT.md +0 -39
  1017. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1018. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1019. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1020. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1021. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1022. package/docs/SDR_RENDERING.md +0 -33
  1023. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1024. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1025. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1026. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1027. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1028. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1029. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1030. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1031. package/docs/SIMULATED_CAPTURE.md +0 -65
  1032. package/docs/STABILIZATION.md +0 -234
  1033. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1034. package/docs/TIER_ACCEPTANCE.md +0 -129
  1035. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1036. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1037. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1038. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1039. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1040. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1041. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1042. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1043. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1044. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1045. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1046. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1047. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1048. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1049. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1050. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1051. package/docs/validation/documentation-fragments.json +0 -212
  1052. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1053. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1054. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1055. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1056. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1057. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1058. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1059. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1060. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1061. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1062. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1063. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1064. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1065. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1066. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1067. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1068. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1069. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1070. package/docs/validation/print-detail-capabilities.json +0 -103
  1071. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1072. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1073. package/docs/validation/release-audit-inventory.json +0 -1306
  1074. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pupil-vignetting.js","sourceRoot":"","sources":["../../src/optics/pupil-vignetting.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Physical vignetting models derived from pupil geometry. They are separate from the\n * calculateIlluminationVignetting() polynomial, whose coefficients the caller supplies.\n *\n * Apply at most one field-throughput model to a signal. Do not stack these results on top of a\n * supplied field-throughput profile.\n *\n * Natural vignetting (relative illumination of an aberration-free system with a uniform Lambertian\n * exit pupil):\n * - cosine-fourth: E(theta) / E(0) = cos^4(theta), theta the image-space chief-ray angle with\n * tan(theta) = h / z for image height h and exit-pupil distance z (Greivenkamp, OPTI-502 course\n * notes, University of Arizona, sec. 11, free. Also see: Slater 1980 Photographic Systems for\n * Engineers; Kingslake, Lens Design Fundamentals, 2nd ed., sec. 6.5; Ray, Applied Photographic\n * Optics, 3rd ed., sec. 12). It is the small-pupil limit of the next model.\n * - finite-lambertian-pupil: exact irradiance from a uniform Lambertian disk of radius a at distance z\n * onto a parallel plane at lateral offset h (Foote 1915, Bull. Bureau of Standards 12:583):\n * E = (pi L / 2) [1 - (z^2 + h^2 - a^2) / sqrt((z^2 + h^2 + a^2)^2 - 4 a^2 h^2)],\n * normalised by its on-axis value pi L a^2 / (z^2 + a^2). For a -> 0 it tends to cos^4(theta).\n * Pupil aberration and pupil distortion are not modeled.\n *\n * Mechanical (optical) vignetting and the cat's-eye pupil:\n * - At field angle theta, each clipping aperture (a lens barrel or element rim, referred to the\n * entrance-pupil plane) appears as a circle of its declared radius. The circle is shifted by\n * shiftPerTanFieldMm * tan(theta) along the field azimuth.\n * - The open pupil is where the entrance-pupil circle overlaps every shifted circle. Off axis, the\n * bundle stays circular and centred on the chief ray, and an aperture passes only the part of it\n * that it covers (Greivenkamp, OPTI-502 course notes, University of Arizona, sec. 10, free. Also\n * see: Kingslake, Lens Design Fundamentals, sec. 6.4; Smith, Modern Optical Engineering, 4th ed.,\n * sec. 6.3).\n * - With one aperture, the area is the exact area of the two-circle overlap.\n * - With any number of apertures, the exact convex boundary is also returned, sampled as a polygon\n * in pupil-plane mm (+X right, +Y up). Use it as a polygon pupil for\n * calculatePolygonPupilFraunhoferPsf() or as a mask for createWavefrontPupilGrid().\n * The combined relative illumination is cos^4(theta) x open-area ratio. This assumes an object at\n * infinity, a stop imaged without pupil aberration, and an object-space field angle equal to the\n * chief-ray angle.\n * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers\n * and support limits.\n */\n\nimport {\n approximationResult,\n calculatedResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveFinite\n} from \"../core/validation.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nexport type NaturalVignettingModel =\n | \"cosine-fourth\"\n | \"finite-lambertian-pupil\";\n\nexport interface CalculateNaturalVignettingInput {\n model: NaturalVignettingModel;\n /** Image-plane point relative to the optical axis, mm. */\n imagePointMm: { x: number; y: number };\n /** Axial distance from the exit pupil to the image plane, mm. */\n exitPupilDistanceMm: number;\n /** Exit-pupil diameter, mm; required for finite-lambertian-pupil. */\n exitPupilDiameterMm?: number;\n}\n\nexport interface NaturalVignetting {\n model: NaturalVignettingModel;\n /** Image-space chief-ray angle, radians. */\n chiefRayAngleRadians: number;\n /** Relative illumination E / E(axis), in (0, 1]. */\n relativeIllumination: number;\n /** Positive exposure loss, stops. */\n attenuationStops: number;\n /** cos^4 of the chief-ray angle, reported for comparison. */\n cosineFourthFactor: number;\n}\n\nexport interface MechanicalVignettingAperture {\n /** Aperture radius referred to the entrance-pupil plane, mm. */\n radiusMm: number;\n /**\n * Signed shift of the aperture's projected centre per unit tan(field angle), in mm, along the\n * field azimuth. Positive means toward the field point.\n */\n shiftPerTanFieldMm: number;\n}\n\nexport interface CalculateMechanicalVignettingInput {\n /** Unclipped entrance-pupil diameter, mm. */\n entrancePupilDiameterMm: number;\n /** Object-space field angle from the optical axis, degrees, in [0, 90). */\n fieldAngleDegrees: number;\n /** Image-plane direction of the field point, degrees counter-clockwise from +X. */\n fieldAzimuthDegrees: number;\n /** One through eight clipping apertures. */\n apertures: readonly MechanicalVignettingAperture[];\n /** Boundary samples per circle for the polygon, from 16 to 4096 (default 256). */\n boundarySamplesPerCircle?: number;\n}\n\nexport interface MechanicalVignetting {\n fieldAngleDegrees: number;\n fieldAzimuthDegrees: number;\n entrancePupilAreaSquareMm: number;\n /** Open area in mm^2. Exact for a single aperture; the polygon area otherwise. */\n openAreaSquareMm: number;\n areaMethod: \"exact-circle-circle-intersection\" | \"boundary-polygon\";\n /** Open area / unclipped pupil area, in [0, 1]. */\n openAreaRatio: number;\n /** cos^4(field angle). */\n cosineFourthFactor: number;\n /** cos^4(theta) x openAreaRatio. */\n combinedRelativeIllumination: number;\n /** Counter-clockwise convex boundary of the open pupil (empty when fully vignetted), mm. */\n openPupilPolygonMm: readonly { x: number; y: number }[];\n /** Area centroid of the boundary polygon, mm (null when fully vignetted). */\n openPupilCentroidMm: { x: number; y: number } | null;\n}\n\nfunction requireFinite(name: string, value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new InvalidScientificInputError(`${name} must be finite.`);\n }\n return value;\n}\n\n/**\n * Natural (cos^4 or finite Lambertian pupil) relative illumination at one image point.\n */\nexport function calculateNaturalVignetting(\n input: CalculateNaturalVignettingInput\n): CalculationResult<NaturalVignetting> {\n requireInputKeys(input, \"calculateNaturalVignetting\", [\"model\", \"imagePointMm\", \"exitPupilDistanceMm\", \"exitPupilDiameterMm\"]);\n if (input.model !== \"cosine-fourth\" && input.model !== \"finite-lambertian-pupil\") {\n throw new InvalidConfigurationError(\n \"model must be cosine-fourth or finite-lambertian-pupil.\"\n );\n }\n if (typeof input.imagePointMm !== \"object\" || input.imagePointMm === null) {\n throw new InvalidConfigurationError(\"imagePointMm must be an object.\");\n }\n const h = Math.hypot(\n requireFinite(\"imagePointMm.x\", input.imagePointMm.x),\n requireFinite(\"imagePointMm.y\", input.imagePointMm.y)\n );\n requirePositiveFinite(\"exitPupilDistanceMm\", input.exitPupilDistanceMm);\n const z = input.exitPupilDistanceMm;\n const theta = Math.atan2(h, z);\n const cos2 = (z * z) / (z * z + h * h);\n const cosineFourthFactor = cos2 * cos2;\n\n let relativeIllumination: number;\n if (input.model === \"cosine-fourth\") {\n if (input.exitPupilDiameterMm !== undefined) {\n throw new InvalidScientificInputError(\n \"exitPupilDiameterMm is not used by the cosine-fourth model; omit it.\"\n );\n }\n relativeIllumination = cosineFourthFactor;\n } else {\n requirePositiveFinite(\"exitPupilDiameterMm\", input.exitPupilDiameterMm as number);\n const a = (input.exitPupilDiameterMm as number) / 2;\n const z2 = z * z;\n const h2 = h * h;\n const a2 = a * a;\n // Bracket term written as 2 a^2 (...) / (sqrt + ...) to avoid cancellation for small pupils:\n // 1 - P / Q = (Q - P) / Q with Q - P = (Q^2 - P^2) / (Q + P) = 4 a^2 z^2 / (Q + P).\n const p = z2 + h2 - a2;\n const q = Math.sqrt((z2 + h2 + a2) ** 2 - 4 * a2 * h2);\n const offAxis = (4 * a2 * z2) / (q * (q + p)) / 2;\n const onAxis = a2 / (z2 + a2);\n relativeIllumination = offAxis / onAxis;\n }\n if (!(relativeIllumination > 0) || !Number.isFinite(relativeIllumination)) {\n throw new InvalidScientificInputError(\n \"Natural vignetting relative illumination must remain finite and positive.\"\n );\n }\n relativeIllumination = Math.min(1, relativeIllumination);\n\n return calculatedResult(\n {\n model: input.model,\n chiefRayAngleRadians: theta,\n relativeIllumination,\n attenuationStops: relativeIllumination === 1 ? 0 : -Math.log2(relativeIllumination),\n cosineFourthFactor\n },\n input.model === \"cosine-fourth\"\n ? \"cosine-fourth-natural-vignetting\"\n : \"finite-lambertian-pupil-natural-vignetting\",\n \"1.0.0\",\n [\n input.model === \"cosine-fourth\"\n ? \"Relative illumination cos^4 of the image-space chief-ray angle from the exit-pupil centre\"\n : \"Exact irradiance from a uniform Lambertian circular exit pupil onto a parallel image plane, normalised on axis\",\n \"Aberration-free pupil: pupil aberration, pupil distortion and mechanical clipping are not modeled\",\n \"Throughput only; apply at most one field-throughput model, in scene-linear signal\"\n ]\n );\n}\n\n/** Exact area of the intersection of two circles. */\nfunction circleIntersectionArea(r1: number, r2: number, d: number): number {\n if (d >= r1 + r2) return 0;\n if (d <= Math.abs(r1 - r2)) return Math.PI * Math.min(r1, r2) ** 2;\n const clamp = (v: number): number => Math.max(-1, Math.min(1, v));\n const a1 = Math.acos(clamp((d * d + r1 * r1 - r2 * r2) / (2 * d * r1)));\n const a2 = Math.acos(clamp((d * d + r2 * r2 - r1 * r1) / (2 * d * r2)));\n const k = Math.sqrt(\n Math.max(0, (-d + r1 + r2) * (d + r1 - r2) * (d - r1 + r2) * (d + r1 + r2))\n );\n return r1 * r1 * a1 + r2 * r2 * a2 - k / 2;\n}\n\ninterface Circle {\n x: number;\n y: number;\n r: number;\n}\n\nfunction insideAll(\n point: { x: number; y: number },\n circles: readonly Circle[],\n skip: number\n): boolean {\n return circles.every(\n (circle, index) =>\n index === skip ||\n Math.hypot(point.x - circle.x, point.y - circle.y) <= circle.r * (1 + 1e-12)\n );\n}\n\n/** Convex boundary of the intersection of circles, sampled with vertices on the true boundary. */\nfunction intersectionPolygon(\n circles: readonly Circle[],\n samples: number\n): { x: number; y: number }[] {\n const points: { x: number; y: number }[] = [];\n circles.forEach((circle, index) => {\n for (let k = 0; k < samples; k += 1) {\n const angle = (2 * Math.PI * k) / samples;\n const point = {\n x: circle.x + circle.r * Math.cos(angle),\n y: circle.y + circle.r * Math.sin(angle)\n };\n if (insideAll(point, circles, index)) points.push(point);\n }\n });\n // Pairwise boundary intersection points (the cusps of the cat's eye).\n for (let i = 0; i < circles.length; i += 1) {\n for (let j = i + 1; j < circles.length; j += 1) {\n const a = circles[i]!;\n const b = circles[j]!;\n const d = Math.hypot(b.x - a.x, b.y - a.y);\n if (d === 0 || d >= a.r + b.r || d <= Math.abs(a.r - b.r)) continue;\n const along = (d * d + a.r * a.r - b.r * b.r) / (2 * d);\n const half = Math.sqrt(Math.max(0, a.r * a.r - along * along));\n const ux = (b.x - a.x) / d;\n const uy = (b.y - a.y) / d;\n for (const sign of [1, -1]) {\n const point = {\n x: a.x + along * ux - sign * half * uy,\n y: a.y + along * uy + sign * half * ux\n };\n if (circles.every((c) => Math.hypot(point.x - c.x, point.y - c.y) <= c.r * (1 + 1e-9))) {\n points.push(point);\n }\n }\n }\n }\n if (points.length < 3) return [];\n const cx = points.reduce((s, p) => s + p.x, 0) / points.length;\n const cy = points.reduce((s, p) => s + p.y, 0) / points.length;\n points.sort((p, q) => Math.atan2(p.y - cy, p.x - cx) - Math.atan2(q.y - cy, q.x - cx));\n // Drop coincident neighbours.\n const unique = points.filter((p, index) => {\n const prev = points[(index + points.length - 1) % points.length]!;\n return index === 0 || Math.hypot(p.x - prev.x, p.y - prev.y) > 1e-12 * (1 + Math.abs(p.x) + Math.abs(p.y));\n });\n return unique.length >= 3 ? unique : [];\n}\n\nfunction polygonAreaAndCentroid(\n polygon: readonly { x: number; y: number }[]\n): { area: number; centroid: { x: number; y: number } } {\n let twiceArea = 0;\n let cx = 0;\n let cy = 0;\n for (let i = 0; i < polygon.length; i += 1) {\n const a = polygon[i]!;\n const b = polygon[(i + 1) % polygon.length]!;\n const cross = a.x * b.y - b.x * a.y;\n twiceArea += cross;\n cx += (a.x + b.x) * cross;\n cy += (a.y + b.y) * cross;\n }\n return {\n area: twiceArea / 2,\n centroid: { x: cx / (3 * twiceArea), y: cy / (3 * twiceArea) }\n };\n}\n\n/**\n * Mechanical vignetting at one field angle: the open (cat's-eye) pupil from intersecting the\n * entrance pupil with displaced clipping apertures, its area ratio, and cos^4 x area ratio.\n */\nexport function calculateMechanicalVignetting(\n input: CalculateMechanicalVignettingInput\n): CalculationResult<MechanicalVignetting> {\n requireInputKeys(input, \"calculateMechanicalVignetting\", [\"entrancePupilDiameterMm\", \"fieldAngleDegrees\", \"fieldAzimuthDegrees\", \"apertures\", \"boundarySamplesPerCircle\"]);\n requirePositiveFinite(\"entrancePupilDiameterMm\", input.entrancePupilDiameterMm);\n const fieldAngleDegrees = requireFinite(\"fieldAngleDegrees\", input.fieldAngleDegrees);\n if (fieldAngleDegrees < 0 || fieldAngleDegrees >= 90) {\n throw new InvalidScientificInputError(\"fieldAngleDegrees must lie in [0, 90).\");\n }\n const fieldAzimuthDegrees = requireFinite(\"fieldAzimuthDegrees\", input.fieldAzimuthDegrees);\n if (!Array.isArray(input.apertures) || input.apertures.length < 1 || input.apertures.length > 8) {\n throw new InvalidScientificInputError(\"apertures must contain 1 through 8 entries.\");\n }\n const samples = input.boundarySamplesPerCircle ?? 256;\n if (!Number.isSafeInteger(samples) || samples < 16 || samples > 4096) {\n throw new InvalidScientificInputError(\n \"boundarySamplesPerCircle must be an integer from 16 through 4096.\"\n );\n }\n const theta = (fieldAngleDegrees * Math.PI) / 180;\n const azimuth = (fieldAzimuthDegrees * Math.PI) / 180;\n const tanTheta = Math.tan(theta);\n const pupilRadius = input.entrancePupilDiameterMm / 2;\n const circles: Circle[] = [{ x: 0, y: 0, r: pupilRadius }];\n input.apertures.forEach((aperture, index) => {\n if (typeof aperture !== \"object\" || aperture === null) {\n throw new InvalidConfigurationError(`apertures[${index}] must be an object.`);\n }\n requirePositiveFinite(`apertures[${index}].radiusMm`, aperture.radiusMm);\n const shift =\n requireFinite(`apertures[${index}].shiftPerTanFieldMm`, aperture.shiftPerTanFieldMm) *\n tanTheta;\n circles.push({\n x: shift * Math.cos(azimuth),\n y: shift * Math.sin(azimuth),\n r: aperture.radiusMm\n });\n });\n\n const pupilArea = Math.PI * pupilRadius * pupilRadius;\n const polygon = intersectionPolygon(circles, samples);\n const geometry = polygon.length >= 3 ? polygonAreaAndCentroid(polygon) : undefined;\n let openArea: number;\n let areaMethod: MechanicalVignetting[\"areaMethod\"];\n if (circles.length === 2) {\n const other = circles[1]!;\n openArea = circleIntersectionArea(pupilRadius, other.r, Math.hypot(other.x, other.y));\n areaMethod = \"exact-circle-circle-intersection\";\n } else {\n openArea = geometry?.area ?? 0;\n areaMethod = \"boundary-polygon\";\n }\n const openAreaRatio = Math.min(1, Math.max(0, openArea / pupilArea));\n const cos2 = Math.cos(theta) ** 2;\n const cosineFourthFactor = cos2 * cos2;\n\n return approximationResult(\n {\n fieldAngleDegrees,\n fieldAzimuthDegrees,\n entrancePupilAreaSquareMm: pupilArea,\n openAreaSquareMm: openArea,\n areaMethod,\n openAreaRatio,\n cosineFourthFactor,\n combinedRelativeIllumination: cosineFourthFactor * openAreaRatio,\n openPupilPolygonMm: polygon,\n openPupilCentroidMm: geometry?.centroid ?? null\n },\n \"cats-eye-mechanical-vignetting\",\n \"1.0.0\",\n [\n \"Clipping apertures are circles referred to the entrance-pupil plane, displaced linearly with tan(field angle) along the field azimuth\",\n \"Open pupil = intersection of the entrance pupil with every displaced aperture; boundary vertices lie exactly on the circles\",\n \"Combined relative illumination cos^4(theta) x open-area ratio assumes an object at infinity and no pupil aberration\",\n \"Pupil coordinates are metric and aligned with the image plane (+X right, +Y up)\",\n \"Geometry is caller-declared; no named-lens barrel data is implied\"\n ]\n );\n}\n"]}
@@ -1,12 +1,14 @@
1
1
  /**
2
- * Module boundary and integration notes.
3
- * Applies a generic radial lens-distortion field mapping to one ideal image-plane point. The mapping
4
- * is rotationally symmetric about the optical axis: p_distorted = p_ideal * (1 + k1 r² + k2 r⁴ + k3
5
- * r⁶) where r is normalized by the caller-declared physical reference radius. The profile is accepted
6
- * only when the radial mapping is strictly monotonic over its declared operating radius, which makes
7
- * inverse destination-to-source sampling well-defined.
8
- * @see docs/PHYSICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and support
9
- * limits.
2
+ * Generic radial lens distortion (barrel and pincushion).
3
+ *
4
+ * The mapping is rotationally symmetric about the optical axis:
5
+ * p_distorted = p_ideal * (1 + k1 r² + k2 r⁴ + k3 r⁶)
6
+ * where r is normalized by the physical reference radius the caller declares.
7
+ *
8
+ * A profile is accepted only if the radial mapping is strictly monotonic over its declared operating
9
+ * radius. That makes the inverse mapping (destination-to-source sampling) well defined.
10
+ * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
11
+ * and support limits.
10
12
  */
11
13
  import { type CalculationResult } from "../core/calculation-result.js";
12
14
  export interface RadialDistortionCoefficients {
@@ -24,8 +26,8 @@ export interface RadialDistortionProfile {
24
26
  */
25
27
  normalizationRadiusMm: number;
26
28
  /**
27
- * Maximum undistorted normalized radius over which this profile is declared
28
- * valid and must remain one-to-one/invertible.
29
+ * Largest undistorted normalized radius for which this profile is declared
30
+ * valid. Within it the mapping must stay one-to-one and invertible.
29
31
  */
30
32
  maximumNormalizedRadius: number;
31
33
  coefficients: RadialDistortionCoefficients;
@@ -85,7 +87,7 @@ export interface InverseRadialDistortionMappings {
85
87
  pointCount: number;
86
88
  profileMinimumRadialDerivative: number;
87
89
  }
88
- /** @internal Shared by composite lens-field batch evaluators; not root-exported. */
90
+ /** @internal Shared by the composite lens-field batch evaluators. Not exported from the package root. */
89
91
  export interface ValidatedRadialProfile {
90
92
  normalizationRadiusMm: number;
91
93
  maximumNormalizedRadius: number;
@@ -93,7 +95,7 @@ export interface ValidatedRadialProfile {
93
95
  minimumRadialDerivative: number;
94
96
  maximumMappedNormalizedRadius: number;
95
97
  }
96
- /** @internal Validates/copies one profile for repeated in-package evaluation. */
98
+ /** @internal Validates and copies one profile for repeated use inside the package. */
97
99
  export declare function validateRadialDistortionProfile(profile: RadialDistortionProfile): ValidatedRadialProfile;
98
100
  /**
99
101
  * Applies a generic radial lens-distortion field mapping to one ideal
@@ -105,20 +107,20 @@ export declare function validateRadialDistortionProfile(profile: RadialDistortio
105
107
  *
106
108
  * where r is normalized by the caller-declared physical reference radius.
107
109
  *
108
- * The profile is accepted only when the radial mapping is strictly monotonic
109
- * over its declared operating radius, which makes inverse destination-to-source
110
- * sampling well-defined.
110
+ * A profile is accepted only if the radial mapping is strictly monotonic over
111
+ * its declared operating radius. That makes the inverse mapping
112
+ * (destination-to-source sampling) well defined.
111
113
  */
112
114
  export declare function calculateRadialDistortionMapping(input: CalculateRadialDistortionMappingInput): CalculationResult<RadialDistortionMapping>;
113
115
  /**
114
- * Inverse-maps one distorted image-plane point to its ideal/undistorted source
115
- * coordinate for destination-to-source renderer sampling.
116
+ * Inverse-maps one distorted image-plane point to its ideal (undistorted)
117
+ * source point, for destination-to-source sampling in a renderer.
116
118
  *
117
- * The same profile monotonicity requirement used by the forward mapping makes
118
- * the inverse unique over the declared operating radius. Exact center,
119
- * identity-profile, and mapped-boundary cases are resolved directly; other
120
- * radii use bounded deterministic bisection that stops once floating-point
121
- * bounds can no longer narrow.
119
+ * The forward mapping must be monotonic, so the inverse is unique over the
120
+ * declared operating radius. The exact centre, an identity profile and the
121
+ * mapped boundary are solved directly. Other radii use a bounded,
122
+ * deterministic bisection that stops when the floating-point bounds can no
123
+ * longer narrow.
122
124
  */
123
125
  export interface InverseRadialSourcePointValue {
124
126
  sourceImagePointMm: LensFieldPointMm;
@@ -127,25 +129,24 @@ export interface InverseRadialSourcePointValue {
127
129
  radialScaleAtSource: number;
128
130
  }
129
131
  /**
130
- * @internal Minimal inverse evaluation used by composite in-package batch
131
- * models that do not need the standalone radial delta/provenance envelope.
132
+ * @internal Minimal inverse evaluation for composite batch models inside the
133
+ * package that do not need the standalone radial delta or provenance wrapper.
132
134
  */
133
135
  export declare function calculateInverseRadialSourcePointValue(distortedImagePointMm: LensFieldPointMm, profile: ValidatedRadialProfile, pointPath: string): InverseRadialSourcePointValue;
134
136
  /**
135
- * Invert the declared monotonic radial field map within its supported envelope using the existing
136
- * bounded root solve and preserve explicit optical coordinates.
137
- * @param input - CalculateInverseRadialDistortionMappingInput. See the linked contract for coordinate, unit and profile binding semantics.
138
- * @returns CalculationResult<InverseRadialDistortionMapping>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
137
+ * Inverts the declared monotonic radial field mapping inside its supported range, using the existing
138
+ * bounded root solver. Optical coordinates are kept explicit.
139
+ * @param input - CalculateInverseRadialDistortionMappingInput. See that type for coordinates, units and profile binding.
140
+ * @returns CalculationResult<InverseRadialDistortionMapping>. The result states its shape and scientific status; a successful call does not imply calibration.
139
141
  *
140
142
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
141
143
  */
142
144
  export declare function calculateInverseRadialDistortionMapping(input: CalculateInverseRadialDistortionMappingInput): CalculationResult<InverseRadialDistortionMapping>;
143
145
  /**
144
- * Inverse-maps multiple distorted image-plane destinations while validating
145
- * and resolving the radial profile only once for the complete batch.
146
+ * Inverse-maps many distorted image-plane points at once. The radial profile
147
+ * is validated and resolved only once for the whole batch.
146
148
  *
147
- * The returned per-point mappings are numerically identical to the scalar API;
148
- * provenance and profile validation are shared once at the batch boundary.
149
+ * Each returned mapping is numerically identical to the single-point API.
150
+ * Provenance and profile validation are reported once for the batch.
149
151
  */
150
152
  export declare function calculateInverseRadialDistortionMappings(input: CalculateInverseRadialDistortionMappingsInput): CalculationResult<InverseRadialDistortionMappings>;
151
- //# sourceMappingURL=radial-distortion.d.ts.map
@@ -1,16 +1,20 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Applies a generic radial lens-distortion field mapping to one ideal image-plane point. The mapping
5
- * is rotationally symmetric about the optical axis: p_distorted = p_ideal * (1 + k1 r² + k2 r⁴ + k3
6
- * r⁶) where r is normalized by the caller-declared physical reference radius. The profile is accepted
7
- * only when the radial mapping is strictly monotonic over its declared operating radius, which makes
8
- * inverse destination-to-source sampling well-defined.
9
- * @see docs/PHYSICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and support
10
- * limits.
3
+ * Generic radial lens distortion (barrel and pincushion).
4
+ *
5
+ * The mapping is rotationally symmetric about the optical axis:
6
+ * p_distorted = p_ideal * (1 + k1 r² + k2 r⁴ + k3 r⁶)
7
+ * where r is normalized by the physical reference radius the caller declares.
8
+ *
9
+ * A profile is accepted only if the radial mapping is strictly monotonic over its declared operating
10
+ * radius. That makes the inverse mapping (destination-to-source sampling) well defined.
11
+ * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
12
+ * and support limits.
11
13
  */
12
14
  import { approximationResult } from "../core/calculation-result.js";
13
15
  import { InvalidScientificInputError, requirePositiveFinite } from "../core/validation.js";
16
+ import { requireInputObject, requireInputKeys } from "../core/record-validation.js";
17
+ import { InvalidConfigurationError } from "../core/configuration-error.js";
14
18
  const INVERSE_BISECTION_ITERATIONS = 80;
15
19
  const INVERSE_MAPPED_RADIUS_FLOATING_TOLERANCE_ULPS = 16;
16
20
  function requireFinite(name, value) {
@@ -49,10 +53,10 @@ function derivativeCriticalSquaredRadii(coefficients) {
49
53
  // d/dr² of the radial derivative:
50
54
  // 3 k1 + 10 k2 s + 21 k3 s² = 0, where s = r².
51
55
  //
52
- // Scale the quadratic before solving so finite caller coefficients cannot
53
- // overflow the discriminant calculation. Use the stable q-form roots so a
56
+ // Scale the quadratic before solving, so finite caller coefficients cannot
57
+ // overflow the discriminant. Use the numerically stable q-form roots. Then a
54
58
  // tiny quadratic term cannot erase the smaller physical root through
55
- // cancellation and accidentally let a non-monotonic profile pass.
59
+ // cancellation and let a non-monotonic profile pass by accident.
56
60
  const a = 21 * coefficients.k3;
57
61
  const b = 10 * coefficients.k2;
58
62
  const c = 3 * coefficients.k1;
@@ -79,15 +83,15 @@ function derivativeCriticalSquaredRadii(coefficients) {
79
83
  if (root === 0) {
80
84
  return [-scaledB / (2 * scaledA)];
81
85
  }
86
+ // root > 0 here, so q is never zero: for scaledB >= 0 the sum scaledB + root is positive and for
87
+ // scaledB < 0 the difference scaledB - root is negative. (A former q === 0 branch was unreachable.)
82
88
  const q = -0.5 *
83
89
  (scaledB + (scaledB >= 0 ? root : -root));
84
- if (q === 0) {
85
- return [-scaledB / (2 * scaledA)];
86
- }
87
90
  return [q / scaledA, scaledC / q];
88
91
  }
89
- /** @internal Validates/copies one profile for repeated in-package evaluation. */
92
+ /** @internal Validates and copies one profile for repeated use inside the package. */
90
93
  export function validateRadialDistortionProfile(profile) {
94
+ requireInputObject(profile, "profile input");
91
95
  requirePositiveFinite("profile.normalizationRadiusMm", profile.normalizationRadiusMm);
92
96
  requirePositiveFinite("profile.maximumNormalizedRadius", profile.maximumNormalizedRadius);
93
97
  requireFinite("profile.coefficients.k1", profile.coefficients.k1);
@@ -121,7 +125,7 @@ export function validateRadialDistortionProfile(profile) {
121
125
  }
122
126
  function requirePoint(name, point) {
123
127
  if (typeof point !== "object" || point === null) {
124
- throw new InvalidScientificInputError(`${name} must be an object with finite numeric x and y coordinates.`);
128
+ throw new InvalidConfigurationError(`${name} must be an object with finite numeric x and y coordinates.`);
125
129
  }
126
130
  if (typeof point.x !== "number" ||
127
131
  typeof point.y !== "number" ||
@@ -150,11 +154,12 @@ function mappingAssumptions() {
150
154
  *
151
155
  * where r is normalized by the caller-declared physical reference radius.
152
156
  *
153
- * The profile is accepted only when the radial mapping is strictly monotonic
154
- * over its declared operating radius, which makes inverse destination-to-source
155
- * sampling well-defined.
157
+ * A profile is accepted only if the radial mapping is strictly monotonic over
158
+ * its declared operating radius. That makes the inverse mapping
159
+ * (destination-to-source sampling) well defined.
156
160
  */
157
161
  export function calculateRadialDistortionMapping(input) {
162
+ requireInputKeys(input, "calculateRadialDistortionMapping", ["imagePointMm", "profile"]);
158
163
  requirePoint("imagePointMm", input.imagePointMm);
159
164
  const profile = validateRadialDistortionProfile(input.profile);
160
165
  const sourceRadiusMm = Math.hypot(input.imagePointMm.x, input.imagePointMm.y);
@@ -187,8 +192,8 @@ export function calculateRadialDistortionMapping(input) {
187
192
  }, "generic-radial-lens-distortion", "1.0.0", mappingAssumptions());
188
193
  }
189
194
  /**
190
- * @internal Minimal inverse evaluation used by composite in-package batch
191
- * models that do not need the standalone radial delta/provenance envelope.
195
+ * @internal Minimal inverse evaluation for composite batch models inside the
196
+ * package that do not need the standalone radial delta or provenance wrapper.
192
197
  */
193
198
  export function calculateInverseRadialSourcePointValue(distortedImagePointMm, profile, pointPath) {
194
199
  requirePoint(pointPath, distortedImagePointMm);
@@ -271,14 +276,15 @@ function calculateInverseRadialDistortionMappingValue(distortedImagePointMm, pro
271
276
  };
272
277
  }
273
278
  /**
274
- * Invert the declared monotonic radial field map within its supported envelope using the existing
275
- * bounded root solve and preserve explicit optical coordinates.
276
- * @param input - CalculateInverseRadialDistortionMappingInput. See the linked contract for coordinate, unit and profile binding semantics.
277
- * @returns CalculationResult<InverseRadialDistortionMapping>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
279
+ * Inverts the declared monotonic radial field mapping inside its supported range, using the existing
280
+ * bounded root solver. Optical coordinates are kept explicit.
281
+ * @param input - CalculateInverseRadialDistortionMappingInput. See that type for coordinates, units and profile binding.
282
+ * @returns CalculationResult<InverseRadialDistortionMapping>. The result states its shape and scientific status; a successful call does not imply calibration.
278
283
  *
279
284
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
280
285
  */
281
286
  export function calculateInverseRadialDistortionMapping(input) {
287
+ requireInputKeys(input, "calculateInverseRadialDistortionMapping", ["distortedImagePointMm", "profile"]);
282
288
  const profile = validateRadialDistortionProfile(input.profile);
283
289
  const mapping = calculateInverseRadialDistortionMappingValue(input.distortedImagePointMm, profile, "distortedImagePointMm");
284
290
  return approximationResult(mapping, "generic-inverse-radial-lens-distortion", "1.0.0", [
@@ -287,16 +293,17 @@ export function calculateInverseRadialDistortionMapping(input) {
287
293
  ]);
288
294
  }
289
295
  /**
290
- * Inverse-maps multiple distorted image-plane destinations while validating
291
- * and resolving the radial profile only once for the complete batch.
296
+ * Inverse-maps many distorted image-plane points at once. The radial profile
297
+ * is validated and resolved only once for the whole batch.
292
298
  *
293
- * The returned per-point mappings are numerically identical to the scalar API;
294
- * provenance and profile validation are shared once at the batch boundary.
299
+ * Each returned mapping is numerically identical to the single-point API.
300
+ * Provenance and profile validation are reported once for the batch.
295
301
  */
296
302
  export function calculateInverseRadialDistortionMappings(input) {
303
+ requireInputKeys(input, "calculateInverseRadialDistortionMappings", ["distortedImagePointsMm", "profile"]);
297
304
  const profile = validateRadialDistortionProfile(input.profile);
298
305
  if (!Array.isArray(input.distortedImagePointsMm)) {
299
- throw new InvalidScientificInputError("distortedImagePointsMm must be an array of image-plane points.");
306
+ throw new InvalidConfigurationError("distortedImagePointsMm must be an array of image-plane points.");
300
307
  }
301
308
  const mappings = [];
302
309
  for (let index = 0; index < input.distortedImagePointsMm.length; index += 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"radial-distortion.js","sourceRoot":"","sources":["../../src/optics/radial-distortion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"radial-distortion.js","sourceRoot":"","sources":["../../src/optics/radial-distortion.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Generic radial lens distortion (barrel and pincushion).\n *\n * The mapping is rotationally symmetric about the optical axis:\n * p_distorted = p_ideal * (1 + k1 r² + k2 r⁴ + k3 r⁶)\n * where r is normalized by the physical reference radius the caller declares.\n *\n * A profile is accepted only if the radial mapping is strictly monotonic over its declared operating\n * radius. That makes the inverse mapping (destination-to-source sampling) well defined.\n * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers\n * and support limits.\n */\n\nimport {\n approximationResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveFinite\n} from \"../core/validation.js\";\nimport { requireInputObject, requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nexport interface RadialDistortionCoefficients {\n /** Dimensionless r² coefficient. */\n k1: number;\n /** Dimensionless r⁴ coefficient. */\n k2: number;\n /** Dimensionless r⁶ coefficient. */\n k3: number;\n}\n\nexport interface RadialDistortionProfile {\n /**\n * Physical image-plane radius used to normalize field position, in mm.\n * Coefficients are meaningful only with this declared normalization.\n */\n normalizationRadiusMm: number;\n /**\n * Largest undistorted normalized radius for which this profile is declared\n * valid. Within it the mapping must stay one-to-one and invertible.\n */\n maximumNormalizedRadius: number;\n coefficients: RadialDistortionCoefficients;\n}\n\nexport interface LensFieldPointMm {\n /** Image-plane X coordinate relative to the optical axis, in mm. */\n x: number;\n /** Image-plane Y coordinate relative to the optical axis, in mm. */\n y: number;\n}\n\nexport interface CalculateRadialDistortionMappingInput {\n /** Ideal/undistorted image-plane point. */\n imagePointMm: LensFieldPointMm;\n profile: RadialDistortionProfile;\n}\n\nexport interface CalculateInverseRadialDistortionMappingInput {\n /** Distorted image-plane point to inverse-map back to ideal coordinates. */\n distortedImagePointMm: LensFieldPointMm;\n profile: RadialDistortionProfile;\n}\n\nexport interface CalculateInverseRadialDistortionMappingsInput {\n /** Distorted image-plane destinations to inverse-map in one validated batch. */\n distortedImagePointsMm: readonly LensFieldPointMm[];\n profile: RadialDistortionProfile;\n}\n\nexport interface RadialDistortionMapping {\n direction: \"undistorted-to-distorted\";\n sourceImagePointMm: LensFieldPointMm;\n mappedImagePointMm: LensFieldPointMm;\n sourceNormalizedRadius: number;\n mappedNormalizedRadius: number;\n radialScale: number;\n deltaMm: {\n x: number;\n y: number;\n distance: number;\n };\n profileMinimumRadialDerivative: number;\n}\n\nexport interface InverseRadialDistortionMapping {\n direction: \"distorted-to-undistorted\";\n distortedImagePointMm: LensFieldPointMm;\n sourceImagePointMm: LensFieldPointMm;\n distortedNormalizedRadius: number;\n sourceNormalizedRadius: number;\n radialScaleAtSource: number;\n deltaMm: {\n x: number;\n y: number;\n distance: number;\n };\n profileMinimumRadialDerivative: number;\n}\n\nexport interface InverseRadialDistortionMappings {\n direction: \"distorted-to-undistorted-batch\";\n mappings: readonly InverseRadialDistortionMapping[];\n pointCount: number;\n profileMinimumRadialDerivative: number;\n}\n\n/** @internal Shared by the composite lens-field batch evaluators. Not exported from the package root. */\nexport interface ValidatedRadialProfile {\n normalizationRadiusMm: number;\n maximumNormalizedRadius: number;\n coefficients: RadialDistortionCoefficients;\n minimumRadialDerivative: number;\n maximumMappedNormalizedRadius: number;\n}\n\nconst INVERSE_BISECTION_ITERATIONS = 80;\nconst INVERSE_MAPPED_RADIUS_FLOATING_TOLERANCE_ULPS = 16;\n\nfunction requireFinite(name: string, value: number): void {\n if (!Number.isFinite(value)) {\n throw new InvalidScientificInputError(`${name} must be finite.`);\n }\n}\n\nfunction inverseMappedRadiusTolerance(\n distortedNormalizedRadius: number,\n maximumMappedNormalizedRadius: number\n): number {\n return (\n Number.EPSILON *\n INVERSE_MAPPED_RADIUS_FLOATING_TOLERANCE_ULPS *\n Math.max(\n 1,\n Math.abs(distortedNormalizedRadius),\n Math.abs(maximumMappedNormalizedRadius)\n )\n );\n}\n\nfunction radialScale(\n normalizedRadius: number,\n coefficients: RadialDistortionCoefficients\n): number {\n const r2 = normalizedRadius * normalizedRadius;\n const r4 = r2 * r2;\n const r6 = r4 * r2;\n return (\n 1 +\n coefficients.k1 * r2 +\n coefficients.k2 * r4 +\n coefficients.k3 * r6\n );\n}\n\nfunction mappedNormalizedRadius(\n normalizedRadius: number,\n coefficients: RadialDistortionCoefficients\n): number {\n return normalizedRadius * radialScale(normalizedRadius, coefficients);\n}\n\nfunction radialDerivativeFromSquaredRadius(\n squaredRadius: number,\n coefficients: RadialDistortionCoefficients\n): number {\n return (\n 1 +\n 3 * coefficients.k1 * squaredRadius +\n 5 * coefficients.k2 * squaredRadius * squaredRadius +\n 7 *\n coefficients.k3 *\n squaredRadius *\n squaredRadius *\n squaredRadius\n );\n}\n\nfunction derivativeCriticalSquaredRadii(\n coefficients: RadialDistortionCoefficients\n): number[] {\n // d/dr² of the radial derivative:\n // 3 k1 + 10 k2 s + 21 k3 s² = 0, where s = r².\n //\n // Scale the quadratic before solving, so finite caller coefficients cannot\n // overflow the discriminant. Use the numerically stable q-form roots. Then a\n // tiny quadratic term cannot erase the smaller physical root through\n // cancellation and let a non-monotonic profile pass by accident.\n const a = 21 * coefficients.k3;\n const b = 10 * coefficients.k2;\n const c = 3 * coefficients.k1;\n const coefficientScale = Math.max(\n Math.abs(a),\n Math.abs(b),\n Math.abs(c)\n );\n\n if (coefficientScale === 0) {\n return [];\n }\n\n const scaledA = a / coefficientScale;\n const scaledB = b / coefficientScale;\n const scaledC = c / coefficientScale;\n\n if (scaledA === 0) {\n return scaledB === 0 ? [] : [-scaledC / scaledB];\n }\n\n const squaredB = scaledB * scaledB;\n const fourAC = 4 * scaledA * scaledC;\n const discriminant = squaredB - fourAC;\n const discriminantTolerance =\n Number.EPSILON *\n 16 *\n Math.max(1, Math.abs(squaredB), Math.abs(fourAC));\n\n if (discriminant < -discriminantTolerance) {\n return [];\n }\n\n const root = Math.sqrt(Math.max(0, discriminant));\n if (root === 0) {\n return [-scaledB / (2 * scaledA)];\n }\n\n // root > 0 here, so q is never zero: for scaledB >= 0 the sum scaledB + root is positive and for\n // scaledB < 0 the difference scaledB - root is negative. (A former q === 0 branch was unreachable.)\n const q =\n -0.5 *\n (scaledB + (scaledB >= 0 ? root : -root));\n\n return [q / scaledA, scaledC / q];\n}\n\n/** @internal Validates and copies one profile for repeated use inside the package. */\nexport function validateRadialDistortionProfile(\n profile: RadialDistortionProfile\n): ValidatedRadialProfile {\n requireInputObject(profile, \"profile input\");\n requirePositiveFinite(\n \"profile.normalizationRadiusMm\",\n profile.normalizationRadiusMm\n );\n requirePositiveFinite(\n \"profile.maximumNormalizedRadius\",\n profile.maximumNormalizedRadius\n );\n requireFinite(\"profile.coefficients.k1\", profile.coefficients.k1);\n requireFinite(\"profile.coefficients.k2\", profile.coefficients.k2);\n requireFinite(\"profile.coefficients.k3\", profile.coefficients.k3);\n\n const maximumSquaredRadius =\n profile.maximumNormalizedRadius * profile.maximumNormalizedRadius;\n if (!Number.isFinite(maximumSquaredRadius)) {\n throw new InvalidScientificInputError(\n \"profile.maximumNormalizedRadius is too large to evaluate safely.\"\n );\n }\n\n const candidates = [\n 0,\n maximumSquaredRadius,\n ...derivativeCriticalSquaredRadii(profile.coefficients).filter(\n (value) => value > 0 && value < maximumSquaredRadius\n )\n ];\n const minimumRadialDerivative = Math.min(\n ...candidates.map((squaredRadius) =>\n radialDerivativeFromSquaredRadius(\n squaredRadius,\n profile.coefficients\n )\n )\n );\n\n if (\n !Number.isFinite(minimumRadialDerivative) ||\n minimumRadialDerivative <= 0\n ) {\n throw new InvalidScientificInputError(\n \"Radial distortion profile must remain strictly monotonic over maximumNormalizedRadius so inverse mapping is single-valued.\"\n );\n }\n\n const maximumMappedRadius = mappedNormalizedRadius(\n profile.maximumNormalizedRadius,\n profile.coefficients\n );\n if (!Number.isFinite(maximumMappedRadius) || maximumMappedRadius <= 0) {\n throw new InvalidScientificInputError(\n \"Radial distortion profile produces an invalid mapped operating radius.\"\n );\n }\n\n return {\n normalizationRadiusMm: profile.normalizationRadiusMm,\n maximumNormalizedRadius: profile.maximumNormalizedRadius,\n coefficients: { ...profile.coefficients },\n minimumRadialDerivative,\n maximumMappedNormalizedRadius: maximumMappedRadius\n };\n}\n\nfunction requirePoint(name: string, point: LensFieldPointMm): void {\n if (typeof point !== \"object\" || point === null) {\n throw new InvalidConfigurationError(\n `${name} must be an object with finite numeric x and y coordinates.`\n );\n }\n if (\n typeof point.x !== \"number\" ||\n typeof point.y !== \"number\" ||\n !Number.isFinite(point.x) ||\n !Number.isFinite(point.y)\n ) {\n throw new InvalidScientificInputError(\n `${name} must contain finite numeric x and y coordinates.`\n );\n }\n}\n\nfunction mappingAssumptions(): readonly string[] {\n return [\n \"Generic rotationally symmetric radial polynomial field mapping\",\n \"Distortion is centered on the optical axis; decentering and tangential distortion are not modeled\",\n \"Normalized radius is image-plane radius divided by the caller-declared normalizationRadiusMm\",\n \"Radial scale is 1 + k1 r^2 + k2 r^4 + k3 r^6\",\n \"The declared operating radius is required to remain strictly monotonic so inverse mapping is single-valued\",\n \"Coefficients are generic caller inputs and do not represent a named lens unless separately calibrated with defensible provenance\"\n ];\n}\n\n/**\n * Applies a generic radial lens-distortion field mapping to one ideal\n * image-plane point.\n *\n * The mapping is rotationally symmetric about the optical axis:\n *\n * p_distorted = p_ideal * (1 + k1 r² + k2 r⁴ + k3 r⁶)\n *\n * where r is normalized by the caller-declared physical reference radius.\n *\n * A profile is accepted only if the radial mapping is strictly monotonic over\n * its declared operating radius. That makes the inverse mapping\n * (destination-to-source sampling) well defined.\n */\nexport function calculateRadialDistortionMapping(\n input: CalculateRadialDistortionMappingInput\n): CalculationResult<RadialDistortionMapping> {\n requireInputKeys(input, \"calculateRadialDistortionMapping\", [\"imagePointMm\", \"profile\"]);\n requirePoint(\"imagePointMm\", input.imagePointMm);\n const profile = validateRadialDistortionProfile(input.profile);\n\n const sourceRadiusMm = Math.hypot(\n input.imagePointMm.x,\n input.imagePointMm.y\n );\n const sourceNormalizedRadius =\n sourceRadiusMm / profile.normalizationRadiusMm;\n requireFinite(\"imagePointMm normalized radius\", sourceNormalizedRadius);\n\n if (sourceNormalizedRadius > profile.maximumNormalizedRadius) {\n throw new InvalidScientificInputError(\n \"imagePointMm lies outside the radial distortion profile maximumNormalizedRadius.\"\n );\n }\n\n const scale = radialScale(\n sourceNormalizedRadius,\n profile.coefficients\n );\n const mappedImagePointMm = {\n x: input.imagePointMm.x * scale,\n y: input.imagePointMm.y * scale\n };\n const mappedRadius = sourceNormalizedRadius * scale;\n const deltaX = mappedImagePointMm.x - input.imagePointMm.x;\n const deltaY = mappedImagePointMm.y - input.imagePointMm.y;\n\n return approximationResult(\n {\n direction: \"undistorted-to-distorted\",\n sourceImagePointMm: { ...input.imagePointMm },\n mappedImagePointMm,\n sourceNormalizedRadius,\n mappedNormalizedRadius: mappedRadius,\n radialScale: scale,\n deltaMm: {\n x: deltaX,\n y: deltaY,\n distance: Math.hypot(deltaX, deltaY)\n },\n profileMinimumRadialDerivative:\n profile.minimumRadialDerivative\n },\n \"generic-radial-lens-distortion\",\n \"1.0.0\",\n mappingAssumptions()\n );\n}\n\n/**\n * Inverse-maps one distorted image-plane point to its ideal (undistorted)\n * source point, for destination-to-source sampling in a renderer.\n *\n * The forward mapping must be monotonic, so the inverse is unique over the\n * declared operating radius. The exact centre, an identity profile and the\n * mapped boundary are solved directly. Other radii use a bounded,\n * deterministic bisection that stops when the floating-point bounds can no\n * longer narrow.\n */\nexport interface InverseRadialSourcePointValue {\n sourceImagePointMm: LensFieldPointMm;\n distortedNormalizedRadius: number;\n sourceNormalizedRadius: number;\n radialScaleAtSource: number;\n}\n\n/**\n * @internal Minimal inverse evaluation for composite batch models inside the\n * package that do not need the standalone radial delta or provenance wrapper.\n */\nexport function calculateInverseRadialSourcePointValue(\n distortedImagePointMm: LensFieldPointMm,\n profile: ValidatedRadialProfile,\n pointPath: string\n): InverseRadialSourcePointValue {\n requirePoint(pointPath, distortedImagePointMm);\n\n const distortedRadiusMm = Math.hypot(\n distortedImagePointMm.x,\n distortedImagePointMm.y\n );\n const distortedNormalizedRadius =\n distortedRadiusMm / profile.normalizationRadiusMm;\n requireFinite(\n `${pointPath} normalized radius`,\n distortedNormalizedRadius\n );\n\n const mappedRadiusTolerance = inverseMappedRadiusTolerance(\n distortedNormalizedRadius,\n profile.maximumMappedNormalizedRadius\n );\n if (\n distortedNormalizedRadius >\n profile.maximumMappedNormalizedRadius + mappedRadiusTolerance\n ) {\n throw new InvalidScientificInputError(\n `${pointPath} lies outside the mapped radial distortion profile operating radius.`\n );\n }\n const solverDistortedNormalizedRadius = Math.min(\n distortedNormalizedRadius,\n profile.maximumMappedNormalizedRadius\n );\n\n let sourceNormalizedRadius = 0;\n if (\n solverDistortedNormalizedRadius ===\n profile.maximumMappedNormalizedRadius\n ) {\n sourceNormalizedRadius = profile.maximumNormalizedRadius;\n } else if (solverDistortedNormalizedRadius > 0) {\n const { k1, k2, k3 } = profile.coefficients;\n if (k1 === 0 && k2 === 0 && k3 === 0) {\n sourceNormalizedRadius = solverDistortedNormalizedRadius;\n } else {\n let lower = 0;\n let upper = profile.maximumNormalizedRadius;\n\n for (\n let iteration = 0;\n iteration < INVERSE_BISECTION_ITERATIONS;\n iteration += 1\n ) {\n const midpoint = (lower + upper) / 2;\n if (midpoint === lower || midpoint === upper) {\n break;\n }\n\n const mapped = mappedNormalizedRadius(\n midpoint,\n profile.coefficients\n );\n if (mapped < solverDistortedNormalizedRadius) {\n lower = midpoint;\n } else {\n upper = midpoint;\n }\n }\n sourceNormalizedRadius = (lower + upper) / 2;\n }\n }\n\n const radialScaleAtSource = radialScale(\n sourceNormalizedRadius,\n profile.coefficients\n );\n const sourceImagePointMm =\n distortedNormalizedRadius === 0\n ? { x: 0, y: 0 }\n : solverDistortedNormalizedRadius === distortedNormalizedRadius\n ? {\n x: distortedImagePointMm.x / radialScaleAtSource,\n y: distortedImagePointMm.y / radialScaleAtSource\n }\n : {\n x:\n distortedImagePointMm.x *\n (sourceNormalizedRadius / distortedNormalizedRadius),\n y:\n distortedImagePointMm.y *\n (sourceNormalizedRadius / distortedNormalizedRadius)\n };\n\n return {\n sourceImagePointMm,\n distortedNormalizedRadius,\n sourceNormalizedRadius,\n radialScaleAtSource\n };\n}\n\nfunction calculateInverseRadialDistortionMappingValue(\n distortedImagePointMm: LensFieldPointMm,\n profile: ValidatedRadialProfile,\n pointPath: string\n): InverseRadialDistortionMapping {\n const source = calculateInverseRadialSourcePointValue(\n distortedImagePointMm,\n profile,\n pointPath\n );\n const deltaX =\n source.sourceImagePointMm.x - distortedImagePointMm.x;\n const deltaY =\n source.sourceImagePointMm.y - distortedImagePointMm.y;\n\n return {\n direction: \"distorted-to-undistorted\",\n distortedImagePointMm: { ...distortedImagePointMm },\n sourceImagePointMm: source.sourceImagePointMm,\n distortedNormalizedRadius: source.distortedNormalizedRadius,\n sourceNormalizedRadius: source.sourceNormalizedRadius,\n radialScaleAtSource: source.radialScaleAtSource,\n deltaMm: {\n x: deltaX,\n y: deltaY,\n distance: Math.hypot(deltaX, deltaY)\n },\n profileMinimumRadialDerivative: profile.minimumRadialDerivative\n };\n}\n\n/**\n * Inverts the declared monotonic radial field mapping inside its supported range, using the existing\n * bounded root solver. Optical coordinates are kept explicit.\n * @param input - CalculateInverseRadialDistortionMappingInput. See that type for coordinates, units and profile binding.\n * @returns CalculationResult<InverseRadialDistortionMapping>. The result states its shape and scientific status; a successful call does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the root export and exact type graph.\n */\nexport function calculateInverseRadialDistortionMapping(\n input: CalculateInverseRadialDistortionMappingInput\n): CalculationResult<InverseRadialDistortionMapping> {\n requireInputKeys(input, \"calculateInverseRadialDistortionMapping\", [\"distortedImagePointMm\", \"profile\"]);\n const profile = validateRadialDistortionProfile(input.profile);\n const mapping = calculateInverseRadialDistortionMappingValue(\n input.distortedImagePointMm,\n profile,\n \"distortedImagePointMm\"\n );\n\n return approximationResult(\n mapping,\n \"generic-inverse-radial-lens-distortion\",\n \"1.0.0\",\n [\n ...mappingAssumptions(),\n `Inverse radius uses exact center/identity/boundary solutions where applicable and otherwise up to ${INVERSE_BISECTION_ITERATIONS} deterministic bisection iterations, stopping when IEEE-754 bounds can no longer narrow`\n ]\n );\n}\n\n/**\n * Inverse-maps many distorted image-plane points at once. The radial profile\n * is validated and resolved only once for the whole batch.\n *\n * Each returned mapping is numerically identical to the single-point API.\n * Provenance and profile validation are reported once for the batch.\n */\nexport function calculateInverseRadialDistortionMappings(\n input: CalculateInverseRadialDistortionMappingsInput\n): CalculationResult<InverseRadialDistortionMappings> {\n requireInputKeys(input, \"calculateInverseRadialDistortionMappings\", [\"distortedImagePointsMm\", \"profile\"]);\n const profile = validateRadialDistortionProfile(input.profile);\n if (!Array.isArray(input.distortedImagePointsMm)) {\n throw new InvalidConfigurationError(\n \"distortedImagePointsMm must be an array of image-plane points.\"\n );\n }\n\n const mappings: InverseRadialDistortionMapping[] = [];\n for (\n let index = 0;\n index < input.distortedImagePointsMm.length;\n index += 1\n ) {\n const point = input.distortedImagePointsMm[index];\n if (point === undefined) {\n throw new InvalidScientificInputError(\n `distortedImagePointsMm[${index}] must be an image-plane point.`\n );\n }\n mappings.push(\n calculateInverseRadialDistortionMappingValue(\n point,\n profile,\n `distortedImagePointsMm[${index}]`\n )\n );\n }\n\n return approximationResult(\n {\n direction: \"distorted-to-undistorted-batch\",\n mappings,\n pointCount: mappings.length,\n profileMinimumRadialDerivative: profile.minimumRadialDerivative\n },\n \"generic-inverse-radial-lens-distortion-batch\",\n \"1.0.0\",\n [\n ...mappingAssumptions(),\n `Inverse radius uses exact center/identity/boundary solutions where applicable and otherwise up to ${INVERSE_BISECTION_ITERATIONS} deterministic bisection iterations per point, stopping when IEEE-754 bounds can no longer narrow`,\n \"The radial profile is validated and its invariant extrema are resolved once for the batch\"\n ]\n );\n}\n"]}
@@ -1,19 +1,23 @@
1
1
  /**
2
- * Module boundary and integration notes.
3
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
4
- * missing required fields and incompatible scientific data fail at this boundary. The optical bridge
5
- * maps outgoing W/m²/sr/nm radiance to pre-sensor-stack W/m²/nm irradiance. Circular paraxial
6
- * acceptance is pi/(4*Nworking²); finite-focus unity-pupil geometry uses N*(1+m). Spectral
7
- * transmission and effective working T-stop are alternative paths, and field throughput is applied
8
- * exactly once. Sensor response and PSF redistribution are downstream.
9
- * Apply declared pupil acceptance and exactly one transmission/field-throughput path to spectral scene
10
- * radiance, returning pre-stack irradiance with conservative evidence. The optical bridge maps
11
- * outgoing W/m²/sr/nm radiance to pre-sensor-stack W/m²/nm irradiance. Circular paraxial acceptance is
12
- * pi/(4*Nworking²); finite-focus unity-pupil geometry uses N*(1+m). Spectral transmission and
13
- * effective working T-stop are alternative paths, and field throughput is applied exactly once. Sensor
14
- * response and PSF redistribution are downstream.
15
- * @see docs/SCENE_SENSOR_QUADRATURE.md for equations, coordinate/unit conventions, blockers and
16
- * support limits.
2
+ * Scene-to-sensor optical bridge: from spectral scene radiance to the irradiance that reaches the
3
+ * sensor.
4
+ *
5
+ * The profile parser validates untrusted input and returns the normalized typed contract. Unknown
6
+ * enum values, missing required fields and incompatible scientific data are rejected here.
7
+ *
8
+ * The calculation applies the declared pupil acceptance and exactly one transmission or
9
+ * field-throughput path. It returns the irradiance before the sensor stack, with conservative
10
+ * evidence.
11
+ *
12
+ * The optical bridge turns outgoing scene radiance (W/m²/sr/nm) into irradiance (W/m²/nm) arriving
13
+ * at the front of the sensor stack.
14
+ * - Circular paraxial acceptance is pi/(4*Nworking²). At finite focus with unit pupil magnification,
15
+ * the working f-number is N*(1+m).
16
+ * - Spectral transmission and an effective working T-stop are alternative paths; use one.
17
+ * - Field throughput is applied exactly once.
18
+ * - Sensor response and PSF (point-spread function) blur happen later in the pipeline.
19
+ * @see docs/SCENE_SENSOR_QUADRATURE.md for the equations, units, coordinate conventions, known
20
+ * blockers and support limits.
17
21
  */
18
22
  import { type CalculationResult } from "../core/calculation-result.js";
19
23
  import { type EvidenceBackedFact, type EvidenceProvenance } from "../core/evidence-provenance.js";
@@ -148,7 +152,11 @@ export interface SceneToSensorIrradianceResult {
148
152
  frontOfLensFilterTransmissionFactor: number;
149
153
  frontOfLensFilterAttenuationStops: number;
150
154
  frontOfLensFilterTransmissionAppliedExactlyOnce: true;
151
- frontOfLensFilterPolarizationModeled: false;
155
+ /**
156
+ * True when a front-of-lens linear polarizer was applied. Scene radiance is unpolarized in this
157
+ * bridge, so a polarizer transmits (k1 + k2) / 2.
158
+ */
159
+ frontOfLensFilterPolarizationModeled: boolean;
152
160
  fieldThroughputFactor: number;
153
161
  effectiveAcceptanceAfterTransmissionAndFieldSteradians: number;
154
162
  sensorPlaneSpectralIrradianceWattsPerSquareMeterNanometer: number;
@@ -181,33 +189,39 @@ export interface SceneToSensorIrradianceResult {
181
189
  limitations: readonly string[];
182
190
  }
183
191
  /**
184
- * Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
185
- * missing required fields and incompatible scientific data fail at this boundary.
192
+ * Validates an untrusted scene-to-sensor profile and returns the normalized typed contract. Unknown
193
+ * enum values, missing required fields and incompatible scientific data are rejected here.
186
194
  *
187
- * The optical bridge maps outgoing W/m²/sr/nm radiance to pre-sensor-stack W/m²/nm irradiance.
188
- * Circular paraxial acceptance is pi/(4*Nworking²); finite-focus unity-pupil geometry uses N*(1+m).
189
- * Spectral transmission and effective working T-stop are alternative paths, and field throughput is
190
- * applied exactly once. Sensor response and PSF redistribution are downstream.
191
- * @param value - unknown. Treated as untrusted data; static typing alone is not validation.
192
- * @returns SceneToSensorIrradianceProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
195
+ * The optical bridge turns outgoing scene radiance (W/m²/sr/nm) into irradiance (W/m²/nm) arriving
196
+ * at the front of the sensor stack.
197
+ * - Circular paraxial acceptance is pi/(4*Nworking²). At finite focus with unit pupil magnification,
198
+ * the working f-number is N*(1+m).
199
+ * - Spectral transmission and an effective working T-stop are alternative paths; use one.
200
+ * - Field throughput is applied exactly once.
201
+ * - Sensor response and PSF (point-spread function) blur happen later in the pipeline.
202
+ * @param value - unknown. Untrusted input; TypeScript types alone are not validation.
203
+ * @returns SceneToSensorIrradianceProfile. The result states its shape and scientific status; a successful call does not imply calibration.
193
204
  *
194
205
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
195
206
  */
196
207
  export declare function parseSceneToSensorIrradianceProfile(value: unknown): SceneToSensorIrradianceProfile;
197
208
  /**
198
- * Apply declared pupil acceptance and exactly one transmission/field-throughput path to spectral scene
199
- * radiance, returning pre-stack irradiance with conservative evidence.
209
+ * Applies the declared pupil acceptance and exactly one transmission or field-throughput path to
210
+ * spectral scene radiance. Returns the irradiance before the sensor stack, with conservative
211
+ * evidence.
200
212
  *
201
- * The optical bridge maps outgoing W/m²/sr/nm radiance to pre-sensor-stack W/m²/nm irradiance.
202
- * Circular paraxial acceptance is pi/(4*Nworking²); finite-focus unity-pupil geometry uses N*(1+m).
203
- * Spectral transmission and effective working T-stop are alternative paths, and field throughput is
204
- * applied exactly once. Sensor response and PSF redistribution are downstream.
205
- * @param input - CalculateSceneRadianceToSensorIrradianceInput. See the linked contract for coordinate, unit and profile binding semantics.
213
+ * The optical bridge turns outgoing scene radiance (W/m²/sr/nm) into irradiance (W/m²/nm) arriving
214
+ * at the front of the sensor stack.
215
+ * - Circular paraxial acceptance is pi/(4*Nworking²). At finite focus with unit pupil magnification,
216
+ * the working f-number is N*(1+m).
217
+ * - Spectral transmission and an effective working T-stop are alternative paths; use one.
218
+ * - Field throughput is applied exactly once.
219
+ * - Sensor response and PSF (point-spread function) blur happen later in the pipeline.
220
+ * @param input - CalculateSceneRadianceToSensorIrradianceInput. See that type for coordinates, units and profile binding.
206
221
  * @returns CalculationResult<
207
222
  SceneToSensorIrradianceResult
208
- >. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
223
+ >. The result states its shape and scientific status; a successful call does not imply calibration.
209
224
  *
210
225
  * @see docs/API_REFERENCE.md for the root export and exact type graph.
211
226
  */
212
227
  export declare function calculateSceneRadianceToSensorIrradiance(input: CalculateSceneRadianceToSensorIrradianceInput): CalculationResult<SceneToSensorIrradianceResult>;
213
- //# sourceMappingURL=scene-to-sensor-irradiance.d.ts.map