@photivra/engine 0.5.1 → 1.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 (753) hide show
  1. package/AGENTS.md +674 -0
  2. package/CHANGELOG.md +218 -0
  3. package/CITATION.cff +1 -1
  4. package/CONTRIBUTING.md +76 -0
  5. package/DCO +33 -0
  6. package/NODE_SUPPORT.md +37 -0
  7. package/NOTICE +2 -0
  8. package/README.md +157 -56
  9. package/SECURITY.md +55 -0
  10. package/THIRD_PARTY.md +63 -0
  11. package/dist/camera/equivalent-focal-length.d.ts +9 -0
  12. package/dist/camera/equivalent-focal-length.d.ts.map +1 -1
  13. package/dist/camera/equivalent-focal-length.js +9 -0
  14. package/dist/camera/equivalent-focal-length.js.map +1 -1
  15. package/dist/camera/field-of-view.d.ts +13 -0
  16. package/dist/camera/field-of-view.d.ts.map +1 -1
  17. package/dist/camera/field-of-view.js +13 -0
  18. package/dist/camera/field-of-view.js.map +1 -1
  19. package/dist/camera/projected-object-size.d.ts +8 -0
  20. package/dist/camera/projected-object-size.d.ts.map +1 -1
  21. package/dist/camera/projected-object-size.js +8 -0
  22. package/dist/camera/projected-object-size.js.map +1 -1
  23. package/dist/capture/capture-export-metadata.d.ts +60 -0
  24. package/dist/capture/capture-export-metadata.d.ts.map +1 -0
  25. package/dist/capture/capture-export-metadata.js +62 -0
  26. package/dist/capture/capture-export-metadata.js.map +1 -0
  27. package/dist/capture/environment-raw-producer.d.ts +55 -0
  28. package/dist/capture/environment-raw-producer.d.ts.map +1 -0
  29. package/dist/capture/environment-raw-producer.js +88 -0
  30. package/dist/capture/environment-raw-producer.js.map +1 -0
  31. package/dist/capture/export-jpeg.d.ts +12 -0
  32. package/dist/capture/export-jpeg.d.ts.map +1 -0
  33. package/dist/capture/export-jpeg.js +126 -0
  34. package/dist/capture/export-jpeg.js.map +1 -0
  35. package/dist/capture/export-tiff.d.ts +45 -0
  36. package/dist/capture/export-tiff.d.ts.map +1 -0
  37. package/dist/capture/export-tiff.js +129 -0
  38. package/dist/capture/export-tiff.js.map +1 -0
  39. package/dist/capture/focus-control.d.ts +210 -0
  40. package/dist/capture/focus-control.d.ts.map +1 -0
  41. package/dist/capture/focus-control.js +664 -0
  42. package/dist/capture/focus-control.js.map +1 -0
  43. package/dist/capture/linear-encoding.d.ts +59 -0
  44. package/dist/capture/linear-encoding.d.ts.map +1 -0
  45. package/dist/capture/linear-encoding.js +98 -0
  46. package/dist/capture/linear-encoding.js.map +1 -0
  47. package/dist/capture/photographic-export.d.ts +135 -0
  48. package/dist/capture/photographic-export.d.ts.map +1 -0
  49. package/dist/capture/photographic-export.js +273 -0
  50. package/dist/capture/photographic-export.js.map +1 -0
  51. package/dist/capture/raw-frame-limits.d.ts +12 -0
  52. package/dist/capture/raw-frame-limits.d.ts.map +1 -0
  53. package/dist/capture/raw-frame-limits.js +13 -0
  54. package/dist/capture/raw-frame-limits.js.map +1 -0
  55. package/dist/capture/raw-frame-reconstruction.d.ts +48 -0
  56. package/dist/capture/raw-frame-reconstruction.d.ts.map +1 -0
  57. package/dist/capture/raw-frame-reconstruction.js +146 -0
  58. package/dist/capture/raw-frame-reconstruction.js.map +1 -0
  59. package/dist/capture/release-sequence.d.ts +120 -0
  60. package/dist/capture/release-sequence.d.ts.map +1 -0
  61. package/dist/capture/release-sequence.js +446 -0
  62. package/dist/capture/release-sequence.js.map +1 -0
  63. package/dist/capture/sensor-raw-frame.d.ts +34 -0
  64. package/dist/capture/sensor-raw-frame.d.ts.map +1 -0
  65. package/dist/capture/sensor-raw-frame.js +106 -0
  66. package/dist/capture/sensor-raw-frame.js.map +1 -0
  67. package/dist/capture/sensor-raw-producer.d.ts +51 -0
  68. package/dist/capture/sensor-raw-producer.d.ts.map +1 -0
  69. package/dist/capture/sensor-raw-producer.js +235 -0
  70. package/dist/capture/sensor-raw-producer.js.map +1 -0
  71. package/dist/capture/simulated-capture.d.ts +125 -0
  72. package/dist/capture/simulated-capture.d.ts.map +1 -0
  73. package/dist/capture/simulated-capture.js +248 -0
  74. package/dist/capture/simulated-capture.js.map +1 -0
  75. package/dist/color/capture-color.d.ts +73 -0
  76. package/dist/color/capture-color.d.ts.map +1 -0
  77. package/dist/color/capture-color.js +145 -0
  78. package/dist/color/capture-color.js.map +1 -0
  79. package/dist/color/sensor-color-development.d.ts +23 -0
  80. package/dist/color/sensor-color-development.d.ts.map +1 -0
  81. package/dist/color/sensor-color-development.js +56 -0
  82. package/dist/color/sensor-color-development.js.map +1 -0
  83. package/dist/color/white-balance.d.ts +175 -0
  84. package/dist/color/white-balance.d.ts.map +1 -0
  85. package/dist/color/white-balance.js +606 -0
  86. package/dist/color/white-balance.js.map +1 -0
  87. package/dist/composition/image-formation-plan.d.ts +481 -0
  88. package/dist/composition/image-formation-plan.d.ts.map +1 -0
  89. package/dist/composition/image-formation-plan.js +2499 -0
  90. package/dist/composition/image-formation-plan.js.map +1 -0
  91. package/dist/composition/plan-consumer.d.ts +53 -0
  92. package/dist/composition/plan-consumer.d.ts.map +1 -0
  93. package/dist/composition/plan-consumer.js +119 -0
  94. package/dist/composition/plan-consumer.js.map +1 -0
  95. package/dist/core/calculation-result.d.ts.map +1 -1
  96. package/dist/core/calculation-result.js +6 -0
  97. package/dist/core/calculation-result.js.map +1 -1
  98. package/dist/core/canonical-json.d.ts +18 -0
  99. package/dist/core/canonical-json.d.ts.map +1 -0
  100. package/dist/core/canonical-json.js +44 -0
  101. package/dist/core/canonical-json.js.map +1 -0
  102. package/dist/core/configuration-error.d.ts +6 -0
  103. package/dist/core/configuration-error.d.ts.map +1 -1
  104. package/dist/core/configuration-error.js +6 -0
  105. package/dist/core/configuration-error.js.map +1 -1
  106. package/dist/core/evidence-provenance.d.ts +6 -0
  107. package/dist/core/evidence-provenance.d.ts.map +1 -1
  108. package/dist/core/evidence-provenance.js +7 -0
  109. package/dist/core/evidence-provenance.js.map +1 -1
  110. package/dist/core/image-formation.d.ts +9 -3
  111. package/dist/core/image-formation.d.ts.map +1 -1
  112. package/dist/core/image-formation.js +29 -5
  113. package/dist/core/image-formation.js.map +1 -1
  114. package/dist/core/owned-data.d.ts +25 -0
  115. package/dist/core/owned-data.d.ts.map +1 -0
  116. package/dist/core/owned-data.js +34 -0
  117. package/dist/core/owned-data.js.map +1 -0
  118. package/dist/core/record-validation.d.ts +17 -0
  119. package/dist/core/record-validation.d.ts.map +1 -0
  120. package/dist/core/record-validation.js +44 -0
  121. package/dist/core/record-validation.js.map +1 -0
  122. package/dist/core/scientific-assurance.d.ts +101 -0
  123. package/dist/core/scientific-assurance.d.ts.map +1 -0
  124. package/dist/core/scientific-assurance.js +301 -0
  125. package/dist/core/scientific-assurance.js.map +1 -0
  126. package/dist/core/spectral-composition.d.ts +106 -0
  127. package/dist/core/spectral-composition.d.ts.map +1 -0
  128. package/dist/core/spectral-composition.js +334 -0
  129. package/dist/core/spectral-composition.js.map +1 -0
  130. package/dist/core/spectral.d.ts +34 -0
  131. package/dist/core/spectral.d.ts.map +1 -0
  132. package/dist/core/spectral.js +57 -0
  133. package/dist/core/spectral.js.map +1 -0
  134. package/dist/core/validation.d.ts +6 -0
  135. package/dist/core/validation.d.ts.map +1 -1
  136. package/dist/core/validation.js +6 -0
  137. package/dist/core/validation.js.map +1 -1
  138. package/dist/core/version.d.ts +14 -0
  139. package/dist/core/version.d.ts.map +1 -0
  140. package/dist/core/version.js +15 -0
  141. package/dist/core/version.js.map +1 -0
  142. package/dist/equipment/exposure-capabilities.d.ts +125 -0
  143. package/dist/equipment/exposure-capabilities.d.ts.map +1 -0
  144. package/dist/equipment/exposure-capabilities.js +391 -0
  145. package/dist/equipment/exposure-capabilities.js.map +1 -0
  146. package/dist/equipment/generic-tier-assets.d.ts +82 -0
  147. package/dist/equipment/generic-tier-assets.d.ts.map +1 -0
  148. package/dist/equipment/generic-tier-assets.js +119 -0
  149. package/dist/equipment/generic-tier-assets.js.map +1 -0
  150. package/dist/equipment/generic-tier-presets.d.ts +57 -0
  151. package/dist/equipment/generic-tier-presets.d.ts.map +1 -0
  152. package/dist/equipment/generic-tier-presets.js +122 -0
  153. package/dist/equipment/generic-tier-presets.js.map +1 -0
  154. package/dist/equipment/iso-capabilities.d.ts +143 -0
  155. package/dist/equipment/iso-capabilities.d.ts.map +1 -0
  156. package/dist/equipment/iso-capabilities.js +578 -0
  157. package/dist/equipment/iso-capabilities.js.map +1 -0
  158. package/dist/equipment/metering-capabilities.d.ts +58 -0
  159. package/dist/equipment/metering-capabilities.d.ts.map +1 -0
  160. package/dist/equipment/metering-capabilities.js +151 -0
  161. package/dist/equipment/metering-capabilities.js.map +1 -0
  162. package/dist/equipment/release-capabilities.d.ts +33 -0
  163. package/dist/equipment/release-capabilities.d.ts.map +1 -0
  164. package/dist/equipment/release-capabilities.js +176 -0
  165. package/dist/equipment/release-capabilities.js.map +1 -0
  166. package/dist/exposure/exposure-duration-control.d.ts +72 -0
  167. package/dist/exposure/exposure-duration-control.d.ts.map +1 -0
  168. package/dist/exposure/exposure-duration-control.js +161 -0
  169. package/dist/exposure/exposure-duration-control.js.map +1 -0
  170. package/dist/exposure/exposure-mode-resolver.d.ts +637 -0
  171. package/dist/exposure/exposure-mode-resolver.d.ts.map +1 -0
  172. package/dist/exposure/exposure-mode-resolver.js +1905 -0
  173. package/dist/exposure/exposure-mode-resolver.js.map +1 -0
  174. package/dist/exposure/exposure.d.ts +8 -0
  175. package/dist/exposure/exposure.d.ts.map +1 -1
  176. package/dist/exposure/exposure.js +8 -0
  177. package/dist/exposure/exposure.js.map +1 -1
  178. package/dist/exposure/flash.d.ts +179 -0
  179. package/dist/exposure/flash.d.ts.map +1 -0
  180. package/dist/exposure/flash.js +644 -0
  181. package/dist/exposure/flash.js.map +1 -0
  182. package/dist/exposure/metering-scene-radiance.d.ts +72 -0
  183. package/dist/exposure/metering-scene-radiance.d.ts.map +1 -0
  184. package/dist/exposure/metering-scene-radiance.js +222 -0
  185. package/dist/exposure/metering-scene-radiance.js.map +1 -0
  186. package/dist/exposure/metering-target.d.ts +67 -0
  187. package/dist/exposure/metering-target.d.ts.map +1 -0
  188. package/dist/exposure/metering-target.js +265 -0
  189. package/dist/exposure/metering-target.js.map +1 -0
  190. package/dist/exposure/metering-temporal.d.ts +76 -0
  191. package/dist/exposure/metering-temporal.d.ts.map +1 -0
  192. package/dist/exposure/metering-temporal.js +210 -0
  193. package/dist/exposure/metering-temporal.js.map +1 -0
  194. package/dist/exposure/metering.d.ts +124 -0
  195. package/dist/exposure/metering.d.ts.map +1 -0
  196. package/dist/exposure/metering.js +422 -0
  197. package/dist/exposure/metering.js.map +1 -0
  198. package/dist/exposure/program-line.d.ts +29 -0
  199. package/dist/exposure/program-line.d.ts.map +1 -0
  200. package/dist/exposure/program-line.js +126 -0
  201. package/dist/exposure/program-line.js.map +1 -0
  202. package/dist/index.d.ts +101 -7
  203. package/dist/index.d.ts.map +1 -1
  204. package/dist/index.js +99 -7
  205. package/dist/index.js.map +1 -1
  206. package/dist/motion/camera-rotation.d.ts +76 -0
  207. package/dist/motion/camera-rotation.d.ts.map +1 -1
  208. package/dist/motion/camera-rotation.js +111 -0
  209. package/dist/motion/camera-rotation.js.map +1 -1
  210. package/dist/motion/capture-rotation-inverse-mapping.d.ts +113 -0
  211. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -0
  212. package/dist/motion/capture-rotation-inverse-mapping.js +184 -0
  213. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -0
  214. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +104 -0
  215. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -0
  216. package/dist/motion/capture-rotation-temporal-quadrature.js +131 -0
  217. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -0
  218. package/dist/motion/capture-rotation-trajectory.d.ts +113 -0
  219. package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -0
  220. package/dist/motion/capture-rotation-trajectory.js +168 -0
  221. package/dist/motion/capture-rotation-trajectory.js.map +1 -0
  222. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +119 -0
  223. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +1 -0
  224. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +263 -0
  225. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -0
  226. package/dist/motion/extended-object-projection.d.ts +175 -0
  227. package/dist/motion/extended-object-projection.d.ts.map +1 -0
  228. package/dist/motion/extended-object-projection.js +402 -0
  229. package/dist/motion/extended-object-projection.js.map +1 -0
  230. package/dist/motion/projected-motion.d.ts +11 -0
  231. package/dist/motion/projected-motion.d.ts.map +1 -1
  232. package/dist/motion/projected-motion.js +11 -0
  233. package/dist/motion/projected-motion.js.map +1 -1
  234. package/dist/optics/aperture.d.ts +9 -0
  235. package/dist/optics/aperture.d.ts.map +1 -1
  236. package/dist/optics/aperture.js +9 -0
  237. package/dist/optics/aperture.js.map +1 -1
  238. package/dist/optics/circle-of-confusion.d.ts +8 -0
  239. package/dist/optics/circle-of-confusion.d.ts.map +1 -1
  240. package/dist/optics/circle-of-confusion.js +8 -0
  241. package/dist/optics/circle-of-confusion.js.map +1 -1
  242. package/dist/optics/complex-pupil-psf.d.ts +128 -0
  243. package/dist/optics/complex-pupil-psf.d.ts.map +1 -0
  244. package/dist/optics/complex-pupil-psf.js +462 -0
  245. package/dist/optics/complex-pupil-psf.js.map +1 -0
  246. package/dist/optics/depth-of-field.d.ts +18 -0
  247. package/dist/optics/depth-of-field.d.ts.map +1 -1
  248. package/dist/optics/depth-of-field.js +29 -4
  249. package/dist/optics/depth-of-field.js.map +1 -1
  250. package/dist/optics/diffraction.d.ts +8 -0
  251. package/dist/optics/diffraction.d.ts.map +1 -1
  252. package/dist/optics/diffraction.js +8 -0
  253. package/dist/optics/diffraction.js.map +1 -1
  254. package/dist/optics/focus-breathing.d.ts +13 -0
  255. package/dist/optics/focus-breathing.d.ts.map +1 -1
  256. package/dist/optics/focus-breathing.js +13 -0
  257. package/dist/optics/focus-breathing.js.map +1 -1
  258. package/dist/optics/focus-state.d.ts +47 -0
  259. package/dist/optics/focus-state.d.ts.map +1 -0
  260. package/dist/optics/focus-state.js +78 -0
  261. package/dist/optics/focus-state.js.map +1 -0
  262. package/dist/optics/front-of-lens-filter.d.ts +114 -0
  263. package/dist/optics/front-of-lens-filter.d.ts.map +1 -0
  264. package/dist/optics/front-of-lens-filter.js +468 -0
  265. package/dist/optics/front-of-lens-filter.js.map +1 -0
  266. package/dist/optics/illumination-vignetting.d.ts +9 -0
  267. package/dist/optics/illumination-vignetting.d.ts.map +1 -1
  268. package/dist/optics/illumination-vignetting.js +9 -0
  269. package/dist/optics/illumination-vignetting.js.map +1 -1
  270. package/dist/optics/lateral-chromatic-aberration.d.ts +11 -0
  271. package/dist/optics/lateral-chromatic-aberration.d.ts.map +1 -1
  272. package/dist/optics/lateral-chromatic-aberration.js +23 -4
  273. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  274. package/dist/optics/lens-psf-profile.d.ts +217 -0
  275. package/dist/optics/lens-psf-profile.d.ts.map +1 -0
  276. package/dist/optics/lens-psf-profile.js +823 -0
  277. package/dist/optics/lens-psf-profile.js.map +1 -0
  278. package/dist/optics/polygon-diffraction.d.ts +67 -0
  279. package/dist/optics/polygon-diffraction.d.ts.map +1 -0
  280. package/dist/optics/polygon-diffraction.js +145 -0
  281. package/dist/optics/polygon-diffraction.js.map +1 -0
  282. package/dist/optics/profile-contract.d.ts +42 -0
  283. package/dist/optics/profile-contract.d.ts.map +1 -0
  284. package/dist/optics/profile-contract.js +92 -0
  285. package/dist/optics/profile-contract.js.map +1 -0
  286. package/dist/optics/psf-foundation.d.ts +16 -3
  287. package/dist/optics/psf-foundation.d.ts.map +1 -1
  288. package/dist/optics/psf-foundation.js +28 -15
  289. package/dist/optics/psf-foundation.js.map +1 -1
  290. package/dist/optics/radial-distortion.d.ts +22 -2
  291. package/dist/optics/radial-distortion.d.ts.map +1 -1
  292. package/dist/optics/radial-distortion.js +101 -23
  293. package/dist/optics/radial-distortion.js.map +1 -1
  294. package/dist/optics/scene-to-sensor-irradiance.d.ts +213 -0
  295. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +1 -0
  296. package/dist/optics/scene-to-sensor-irradiance.js +662 -0
  297. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -0
  298. package/dist/optics/scene-to-sensor-quadrature.d.ts +63 -0
  299. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +1 -0
  300. package/dist/optics/scene-to-sensor-quadrature.js +82 -0
  301. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -0
  302. package/dist/optics/sensor-environment-query.d.ts +60 -0
  303. package/dist/optics/sensor-environment-query.d.ts.map +1 -0
  304. package/dist/optics/sensor-environment-query.js +50 -0
  305. package/dist/optics/sensor-environment-query.js.map +1 -0
  306. package/dist/optics/sensor-psf-quadrature.d.ts +70 -0
  307. package/dist/optics/sensor-psf-quadrature.d.ts.map +1 -0
  308. package/dist/optics/sensor-psf-quadrature.js +101 -0
  309. package/dist/optics/sensor-psf-quadrature.js.map +1 -0
  310. package/dist/optics/sensor-psf-support.d.ts +20 -0
  311. package/dist/optics/sensor-psf-support.d.ts.map +1 -0
  312. package/dist/optics/sensor-psf-support.js +13 -0
  313. package/dist/optics/sensor-psf-support.js.map +1 -0
  314. package/dist/optics/stray-light.d.ts +91 -0
  315. package/dist/optics/stray-light.d.ts.map +1 -0
  316. package/dist/optics/stray-light.js +110 -0
  317. package/dist/optics/stray-light.js.map +1 -0
  318. package/dist/optics/thin-lens.d.ts +8 -0
  319. package/dist/optics/thin-lens.d.ts.map +1 -1
  320. package/dist/optics/thin-lens.js +8 -0
  321. package/dist/optics/thin-lens.js.map +1 -1
  322. package/dist/output/capture-corrected-sdr.d.ts +49 -0
  323. package/dist/output/capture-corrected-sdr.d.ts.map +1 -0
  324. package/dist/output/capture-corrected-sdr.js +149 -0
  325. package/dist/output/capture-corrected-sdr.js.map +1 -0
  326. package/dist/output/capture-geometry.d.ts.map +1 -1
  327. package/dist/output/capture-geometry.js +32 -11
  328. package/dist/output/capture-geometry.js.map +1 -1
  329. package/dist/output/capture-sdr.d.ts +49 -0
  330. package/dist/output/capture-sdr.d.ts.map +1 -0
  331. package/dist/output/capture-sdr.js +90 -0
  332. package/dist/output/capture-sdr.js.map +1 -0
  333. package/dist/output/crop.d.ts +6 -0
  334. package/dist/output/crop.d.ts.map +1 -1
  335. package/dist/output/crop.js +6 -0
  336. package/dist/output/crop.js.map +1 -1
  337. package/dist/output/geometric-transforms.d.ts +137 -0
  338. package/dist/output/geometric-transforms.d.ts.map +1 -0
  339. package/dist/output/geometric-transforms.js +225 -0
  340. package/dist/output/geometric-transforms.js.map +1 -0
  341. package/dist/output/lens-corrections.d.ts +121 -0
  342. package/dist/output/lens-corrections.d.ts.map +1 -0
  343. package/dist/output/lens-corrections.js +210 -0
  344. package/dist/output/lens-corrections.js.map +1 -0
  345. package/dist/output/sdr-rendering.d.ts +81 -0
  346. package/dist/output/sdr-rendering.d.ts.map +1 -0
  347. package/dist/output/sdr-rendering.js +106 -0
  348. package/dist/output/sdr-rendering.js.map +1 -0
  349. package/dist/output/subject-framing-crop.d.ts +8 -0
  350. package/dist/output/subject-framing-crop.d.ts.map +1 -1
  351. package/dist/output/subject-framing-crop.js +8 -0
  352. package/dist/output/subject-framing-crop.js.map +1 -1
  353. package/dist/schema/camera.d.ts +6 -0
  354. package/dist/schema/camera.d.ts.map +1 -1
  355. package/dist/schema/illumination-spectral.d.ts +51 -0
  356. package/dist/schema/illumination-spectral.d.ts.map +1 -0
  357. package/dist/schema/illumination-spectral.js +132 -0
  358. package/dist/schema/illumination-spectral.js.map +1 -0
  359. package/dist/schema/illumination-temporal.d.ts +156 -0
  360. package/dist/schema/illumination-temporal.d.ts.map +1 -0
  361. package/dist/schema/illumination-temporal.js +554 -0
  362. package/dist/schema/illumination-temporal.js.map +1 -0
  363. package/dist/schema/illumination.d.ts +138 -0
  364. package/dist/schema/illumination.d.ts.map +1 -0
  365. package/dist/schema/illumination.js +483 -0
  366. package/dist/schema/illumination.js.map +1 -0
  367. package/dist/schema/scene-radiance-temporal.d.ts +107 -0
  368. package/dist/schema/scene-radiance-temporal.d.ts.map +1 -0
  369. package/dist/schema/scene-radiance-temporal.js +259 -0
  370. package/dist/schema/scene-radiance-temporal.js.map +1 -0
  371. package/dist/schema/scene-radiance.d.ts +185 -0
  372. package/dist/schema/scene-radiance.d.ts.map +1 -0
  373. package/dist/schema/scene-radiance.js +535 -0
  374. package/dist/schema/scene-radiance.js.map +1 -0
  375. package/dist/schema/scene.d.ts +7 -0
  376. package/dist/schema/scene.d.ts.map +1 -1
  377. package/dist/schema/validation.d.ts.map +1 -1
  378. package/dist/schema/validation.js +7 -0
  379. package/dist/schema/validation.js.map +1 -1
  380. package/dist/sensor/accumulated-charge.d.ts +199 -0
  381. package/dist/sensor/accumulated-charge.d.ts.map +1 -0
  382. package/dist/sensor/accumulated-charge.js +450 -0
  383. package/dist/sensor/accumulated-charge.js.map +1 -0
  384. package/dist/sensor/architecture.d.ts +48 -13
  385. package/dist/sensor/architecture.d.ts.map +1 -1
  386. package/dist/sensor/architecture.js +58 -16
  387. package/dist/sensor/architecture.js.map +1 -1
  388. package/dist/sensor/camera-saturation-capacity.d.ts +138 -0
  389. package/dist/sensor/camera-saturation-capacity.d.ts.map +1 -0
  390. package/dist/sensor/camera-saturation-capacity.js +356 -0
  391. package/dist/sensor/camera-saturation-capacity.js.map +1 -0
  392. package/dist/sensor/capture-color-sampling-binding.d.ts +212 -0
  393. package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -0
  394. package/dist/sensor/capture-color-sampling-binding.js +437 -0
  395. package/dist/sensor/capture-color-sampling-binding.js.map +1 -0
  396. package/dist/sensor/capture-mode-timing.d.ts +63 -0
  397. package/dist/sensor/capture-mode-timing.d.ts.map +1 -0
  398. package/dist/sensor/capture-mode-timing.js +270 -0
  399. package/dist/sensor/capture-mode-timing.js.map +1 -0
  400. package/dist/sensor/capture-mode.d.ts +157 -0
  401. package/dist/sensor/capture-mode.d.ts.map +1 -0
  402. package/dist/sensor/capture-mode.js +447 -0
  403. package/dist/sensor/capture-mode.js.map +1 -0
  404. package/dist/sensor/color-sampling.d.ts +133 -0
  405. package/dist/sensor/color-sampling.d.ts.map +1 -0
  406. package/dist/sensor/color-sampling.js +245 -0
  407. package/dist/sensor/color-sampling.js.map +1 -0
  408. package/dist/sensor/constant-rate-temporal-integration.d.ts +126 -0
  409. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +1 -0
  410. package/dist/sensor/constant-rate-temporal-integration.js +382 -0
  411. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -0
  412. package/dist/sensor/dark-current.d.ts +169 -0
  413. package/dist/sensor/dark-current.d.ts.map +1 -0
  414. package/dist/sensor/dark-current.js +427 -0
  415. package/dist/sensor/dark-current.js.map +1 -0
  416. package/dist/sensor/environment-photo-signal.d.ts +123 -0
  417. package/dist/sensor/environment-photo-signal.d.ts.map +1 -0
  418. package/dist/sensor/environment-photo-signal.js +186 -0
  419. package/dist/sensor/environment-photo-signal.js.map +1 -0
  420. package/dist/sensor/eqe-electron-rate.d.ts +107 -0
  421. package/dist/sensor/eqe-electron-rate.d.ts.map +1 -0
  422. package/dist/sensor/eqe-electron-rate.js +561 -0
  423. package/dist/sensor/eqe-electron-rate.js.map +1 -0
  424. package/dist/sensor/eqe-local-exposure.d.ts +65 -0
  425. package/dist/sensor/eqe-local-exposure.d.ts.map +1 -0
  426. package/dist/sensor/eqe-local-exposure.js +84 -0
  427. package/dist/sensor/eqe-local-exposure.js.map +1 -0
  428. package/dist/sensor/eqe-temporal-exposure.d.ts +55 -0
  429. package/dist/sensor/eqe-temporal-exposure.d.ts.map +1 -0
  430. package/dist/sensor/eqe-temporal-exposure.js +62 -0
  431. package/dist/sensor/eqe-temporal-exposure.js.map +1 -0
  432. package/dist/sensor/exposure-window.d.ts +117 -0
  433. package/dist/sensor/exposure-window.d.ts.map +1 -0
  434. package/dist/sensor/exposure-window.js +305 -0
  435. package/dist/sensor/exposure-window.js.map +1 -0
  436. package/dist/sensor/iso-signal-chain.d.ts +148 -0
  437. package/dist/sensor/iso-signal-chain.d.ts.map +1 -0
  438. package/dist/sensor/iso-signal-chain.js +411 -0
  439. package/dist/sensor/iso-signal-chain.js.map +1 -0
  440. package/dist/sensor/local-exposure-binding.d.ts +87 -0
  441. package/dist/sensor/local-exposure-binding.d.ts.map +1 -0
  442. package/dist/sensor/local-exposure-binding.js +214 -0
  443. package/dist/sensor/local-exposure-binding.js.map +1 -0
  444. package/dist/sensor/optical-stack.d.ts +132 -0
  445. package/dist/sensor/optical-stack.d.ts.map +1 -0
  446. package/dist/sensor/optical-stack.js +303 -0
  447. package/dist/sensor/optical-stack.js.map +1 -0
  448. package/dist/sensor/photon-energy.d.ts +97 -0
  449. package/dist/sensor/photon-energy.d.ts.map +1 -0
  450. package/dist/sensor/photon-energy.js +390 -0
  451. package/dist/sensor/photon-energy.js.map +1 -0
  452. package/dist/sensor/physical-charge-capacity.d.ts +130 -0
  453. package/dist/sensor/physical-charge-capacity.d.ts.map +1 -0
  454. package/dist/sensor/physical-charge-capacity.js +345 -0
  455. package/dist/sensor/physical-charge-capacity.js.map +1 -0
  456. package/dist/sensor/pixel-pitch.d.ts +6 -0
  457. package/dist/sensor/pixel-pitch.d.ts.map +1 -1
  458. package/dist/sensor/pixel-pitch.js +6 -0
  459. package/dist/sensor/pixel-pitch.js.map +1 -1
  460. package/dist/sensor/radiometry-readiness.d.ts +10 -0
  461. package/dist/sensor/radiometry-readiness.d.ts.map +1 -1
  462. package/dist/sensor/radiometry-readiness.js +10 -0
  463. package/dist/sensor/radiometry-readiness.js.map +1 -1
  464. package/dist/sensor/raw-readout.d.ts +314 -0
  465. package/dist/sensor/raw-readout.d.ts.map +1 -0
  466. package/dist/sensor/raw-readout.js +914 -0
  467. package/dist/sensor/raw-readout.js.map +1 -0
  468. package/dist/sensor/raw-reconstruction.d.ts +170 -0
  469. package/dist/sensor/raw-reconstruction.d.ts.map +1 -0
  470. package/dist/sensor/raw-reconstruction.js +424 -0
  471. package/dist/sensor/raw-reconstruction.js.map +1 -0
  472. package/dist/sensor/readout-exposure-linkage.d.ts +123 -0
  473. package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -0
  474. package/dist/sensor/readout-exposure-linkage.js +222 -0
  475. package/dist/sensor/readout-exposure-linkage.js.map +1 -0
  476. package/dist/sensor/readout-timing.d.ts +137 -0
  477. package/dist/sensor/readout-timing.d.ts.map +1 -0
  478. package/dist/sensor/readout-timing.js +243 -0
  479. package/dist/sensor/readout-timing.js.map +1 -0
  480. package/dist/sensor/response-application-compatibility.d.ts +136 -0
  481. package/dist/sensor/response-application-compatibility.d.ts.map +1 -0
  482. package/dist/sensor/response-application-compatibility.js +408 -0
  483. package/dist/sensor/response-application-compatibility.js.map +1 -0
  484. package/dist/sensor/response-operating-range.d.ts +173 -0
  485. package/dist/sensor/response-operating-range.d.ts.map +1 -0
  486. package/dist/sensor/response-operating-range.js +672 -0
  487. package/dist/sensor/response-operating-range.js.map +1 -0
  488. package/dist/sensor/responsivity-photocurrent.d.ts +158 -0
  489. package/dist/sensor/responsivity-photocurrent.d.ts.map +1 -0
  490. package/dist/sensor/responsivity-photocurrent.js +644 -0
  491. package/dist/sensor/responsivity-photocurrent.js.map +1 -0
  492. package/dist/sensor/sampling-aperture.d.ts +154 -0
  493. package/dist/sensor/sampling-aperture.d.ts.map +1 -0
  494. package/dist/sensor/sampling-aperture.js +388 -0
  495. package/dist/sensor/sampling-aperture.js.map +1 -0
  496. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +45 -0
  497. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +1 -0
  498. package/dist/sensor/scene-eqe-temporal-exposure.js +64 -0
  499. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -0
  500. package/dist/sensor/sensor-geometry.d.ts +12 -0
  501. package/dist/sensor/sensor-geometry.d.ts.map +1 -1
  502. package/dist/sensor/sensor-geometry.js +12 -0
  503. package/dist/sensor/sensor-geometry.js.map +1 -1
  504. package/dist/sensor/signal-noise.d.ts +10 -0
  505. package/dist/sensor/signal-noise.d.ts.map +1 -1
  506. package/dist/sensor/signal-noise.js +10 -0
  507. package/dist/sensor/signal-noise.js.map +1 -1
  508. package/dist/sensor/spatial-sample-reduction.d.ts +171 -0
  509. package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -0
  510. package/dist/sensor/spatial-sample-reduction.js +345 -0
  511. package/dist/sensor/spatial-sample-reduction.js.map +1 -0
  512. package/dist/sensor/spatial-sampling-quadrature.d.ts +179 -0
  513. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -0
  514. package/dist/sensor/spatial-sampling-quadrature.js +224 -0
  515. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -0
  516. package/dist/sensor/spatio-spectral-reduction.d.ts +187 -0
  517. package/dist/sensor/spatio-spectral-reduction.d.ts.map +1 -0
  518. package/dist/sensor/spatio-spectral-reduction.js +373 -0
  519. package/dist/sensor/spatio-spectral-reduction.js.map +1 -0
  520. package/dist/sensor/spectral-coverage.d.ts +24 -0
  521. package/dist/sensor/spectral-coverage.d.ts.map +1 -0
  522. package/dist/sensor/spectral-coverage.js +86 -0
  523. package/dist/sensor/spectral-coverage.js.map +1 -0
  524. package/dist/sensor/spectral-quadrature.d.ts +169 -0
  525. package/dist/sensor/spectral-quadrature.d.ts.map +1 -0
  526. package/dist/sensor/spectral-quadrature.js +542 -0
  527. package/dist/sensor/spectral-quadrature.js.map +1 -0
  528. package/dist/sensor/spectral-response.d.ts +192 -0
  529. package/dist/sensor/spectral-response.d.ts.map +1 -0
  530. package/dist/sensor/spectral-response.js +664 -0
  531. package/dist/sensor/spectral-response.js.map +1 -0
  532. package/dist/sensor/temporal-eqe-sum.d.ts +15 -0
  533. package/dist/sensor/temporal-eqe-sum.d.ts.map +1 -0
  534. package/dist/sensor/temporal-eqe-sum.js +30 -0
  535. package/dist/sensor/temporal-eqe-sum.js.map +1 -0
  536. package/dist/sensor/temporal-photo-signal.d.ts +38 -0
  537. package/dist/sensor/temporal-photo-signal.d.ts.map +1 -0
  538. package/dist/sensor/temporal-photo-signal.js +110 -0
  539. package/dist/sensor/temporal-photo-signal.js.map +1 -0
  540. package/dist/sensor/temporal-sample-binding.d.ts +6 -0
  541. package/dist/sensor/temporal-sample-binding.d.ts.map +1 -0
  542. package/dist/sensor/temporal-sample-binding.js +32 -0
  543. package/dist/sensor/temporal-sample-binding.js.map +1 -0
  544. package/dist/simulation/poc-simulation.d.ts.map +1 -1
  545. package/dist/simulation/poc-simulation.js +34 -11
  546. package/dist/simulation/poc-simulation.js.map +1 -1
  547. package/dist/stabilization/camera-shake.d.ts +11 -0
  548. package/dist/stabilization/camera-shake.d.ts.map +1 -1
  549. package/dist/stabilization/camera-shake.js +11 -0
  550. package/dist/stabilization/camera-shake.js.map +1 -1
  551. package/dist/stabilization/system.d.ts +218 -0
  552. package/dist/stabilization/system.d.ts.map +1 -0
  553. package/dist/stabilization/system.js +695 -0
  554. package/dist/stabilization/system.js.map +1 -0
  555. package/docs/API_REFERENCE.md +2017 -0
  556. package/docs/API_STYLE.md +132 -0
  557. package/docs/ARCHITECTURE.md +150 -23
  558. package/docs/AUTOMATION_COORDINATION.md +190 -0
  559. package/docs/CAPTURE_COLOR.md +25 -0
  560. package/docs/CAPTURE_CORRECTED_SDR.md +25 -0
  561. package/docs/CAPTURE_EXPORT_METADATA.md +27 -0
  562. package/docs/CAPTURE_SDR.md +20 -0
  563. package/docs/DEVELOPERS.md +60 -0
  564. package/docs/DIGITAL_OPTICS_FOUNDATION.md +69 -0
  565. package/docs/ENVIRONMENT_RAW_CAPTURE.md +187 -0
  566. package/docs/EXPORT_ACCEPTANCE.md +133 -0
  567. package/docs/GENERIC_TIER_PRESETS.md +269 -0
  568. package/docs/GEOMETRIC_PREPARATION_REUSE.md +141 -0
  569. package/docs/IMAGE_FORMATION.md +105 -9
  570. package/docs/LINEAR_CAPTURE_ENCODING.md +25 -0
  571. package/docs/MOTION_AND_SIGNAL.md +145 -1
  572. package/docs/NUMERICAL_CORRECTNESS.md +191 -0
  573. package/docs/PERFORMANCE_BASELINE.md +56 -0
  574. package/docs/PHOTOGRAPHIC_EXPORT.md +206 -0
  575. package/docs/PHYSICS_FOUNDATION.md +152 -5
  576. package/docs/POC_API.md +2 -0
  577. package/docs/POC_PROJECTION_REUSE.md +124 -0
  578. package/docs/PROCESSED_OUTPUT.md +157 -0
  579. package/docs/PRODUCTION_COMPOSITION.md +373 -0
  580. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +131 -0
  581. package/docs/PROVENANCE.md +4 -0
  582. package/docs/PSF_FOUNDATION.md +110 -88
  583. package/docs/RAW_FRAME_ENVELOPE.md +56 -0
  584. package/docs/RAW_FRAME_RECONSTRUCTION.md +30 -0
  585. package/docs/RELEASE_1_0.md +65 -0
  586. package/docs/RELEASE_AUDIT.md +38 -0
  587. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +298 -0
  588. package/docs/SCENE_SENSOR_QUADRATURE.md +98 -0
  589. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +86 -0
  590. package/docs/SCIENTIFIC_ASSURANCE.md +280 -0
  591. package/docs/SCIENTIFIC_CONFORMANCE.md +83 -0
  592. package/docs/SDR_RENDERING.md +33 -0
  593. package/docs/SENSOR_ENVIRONMENT_QUERY.md +86 -0
  594. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +104 -0
  595. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +74 -0
  596. package/docs/SENSOR_PSF_QUADRATURE.md +90 -0
  597. package/docs/SENSOR_RAW_FRAME.md +20 -0
  598. package/docs/SENSOR_RAW_PRODUCER.md +77 -0
  599. package/docs/SIGNAL_CONFORMANCE.md +23 -0
  600. package/docs/SIMULATED_CAPTURE.md +65 -0
  601. package/docs/STABILIZATION.md +160 -17
  602. package/docs/TEMPORAL_PHOTO_RAW.md +83 -0
  603. package/docs/TIER_ACCEPTANCE.md +129 -0
  604. package/docs/TIER_PRESET_ACCEPTANCE.md +59 -0
  605. package/docs/USAGE.md +5604 -331
  606. package/docs/V1_COMPOSITION_MAP.md +123 -0
  607. package/docs/V1_HELPER_REUSE_REVIEW.md +60 -0
  608. package/docs/V1_PERFORMANCE_DISPOSITION.md +88 -0
  609. package/docs/api/camera-equivalent-focal-length.md +53 -0
  610. package/docs/api/camera-field-of-view.md +119 -0
  611. package/docs/api/camera-projected-object-size.md +54 -0
  612. package/docs/api/capture-capture-export-metadata.md +107 -0
  613. package/docs/api/capture-environment-raw-producer.md +56 -0
  614. package/docs/api/capture-focus-control.md +419 -0
  615. package/docs/api/capture-linear-encoding.md +99 -0
  616. package/docs/api/capture-photographic-export.md +172 -0
  617. package/docs/api/capture-raw-frame-reconstruction.md +87 -0
  618. package/docs/api/capture-release-sequence.md +252 -0
  619. package/docs/api/capture-sensor-raw-frame.md +66 -0
  620. package/docs/api/capture-sensor-raw-producer.md +98 -0
  621. package/docs/api/capture-simulated-capture.md +179 -0
  622. package/docs/api/color-capture-color.md +122 -0
  623. package/docs/api/color-white-balance.md +386 -0
  624. package/docs/api/composition-image-formation-plan.md +825 -0
  625. package/docs/api/composition-plan-consumer.md +98 -0
  626. package/docs/api/core-calculation-result.md +220 -0
  627. package/docs/api/core-configuration-error.md +19 -0
  628. package/docs/api/core-image-formation.md +204 -0
  629. package/docs/api/core-scientific-assurance.md +214 -0
  630. package/docs/api/core-spectral-composition.md +268 -0
  631. package/docs/api/core-spectral.md +78 -0
  632. package/docs/api/core-validation.md +34 -0
  633. package/docs/api/core-version.md +14 -0
  634. package/docs/api/equipment-exposure-capabilities.md +270 -0
  635. package/docs/api/equipment-generic-tier-assets.md +82 -0
  636. package/docs/api/equipment-generic-tier-presets.md +103 -0
  637. package/docs/api/equipment-iso-capabilities.md +295 -0
  638. package/docs/api/equipment-metering-capabilities.md +126 -0
  639. package/docs/api/equipment-release-capabilities.md +91 -0
  640. package/docs/api/exports.json +5656 -0
  641. package/docs/api/exposure-exposure-duration-control.md +115 -0
  642. package/docs/api/exposure-exposure-mode-resolver.md +966 -0
  643. package/docs/api/exposure-exposure.md +150 -0
  644. package/docs/api/exposure-flash.md +327 -0
  645. package/docs/api/exposure-metering-scene-radiance.md +154 -0
  646. package/docs/api/exposure-metering-target.md +134 -0
  647. package/docs/api/exposure-metering-temporal.md +77 -0
  648. package/docs/api/exposure-metering.md +172 -0
  649. package/docs/api/exposure-program-line.md +64 -0
  650. package/docs/api/motion-camera-rotation.md +215 -0
  651. package/docs/api/motion-capture-rotation-inverse-mapping.md +128 -0
  652. package/docs/api/motion-capture-rotation-temporal-quadrature.md +127 -0
  653. package/docs/api/motion-capture-rotation-trajectory.md +132 -0
  654. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +171 -0
  655. package/docs/api/motion-extended-object-projection.md +312 -0
  656. package/docs/api/motion-projected-motion.md +60 -0
  657. package/docs/api/optics-aperture.md +69 -0
  658. package/docs/api/optics-circle-of-confusion.md +46 -0
  659. package/docs/api/optics-complex-pupil-psf.md +193 -0
  660. package/docs/api/optics-depth-of-field.md +92 -0
  661. package/docs/api/optics-diffraction.md +46 -0
  662. package/docs/api/optics-focus-breathing.md +119 -0
  663. package/docs/api/optics-focus-state.md +64 -0
  664. package/docs/api/optics-front-of-lens-filter.md +263 -0
  665. package/docs/api/optics-illumination-vignetting.md +95 -0
  666. package/docs/api/optics-lateral-chromatic-aberration.md +225 -0
  667. package/docs/api/optics-lens-psf-profile.md +380 -0
  668. package/docs/api/optics-polygon-diffraction.md +68 -0
  669. package/docs/api/optics-profile-contract.md +47 -0
  670. package/docs/api/optics-psf-foundation.md +181 -0
  671. package/docs/api/optics-radial-distortion.md +194 -0
  672. package/docs/api/optics-scene-to-sensor-irradiance.md +371 -0
  673. package/docs/api/optics-scene-to-sensor-quadrature.md +78 -0
  674. package/docs/api/optics-sensor-environment-query.md +58 -0
  675. package/docs/api/optics-sensor-psf-quadrature.md +81 -0
  676. package/docs/api/optics-stray-light.md +109 -0
  677. package/docs/api/optics-thin-lens.md +53 -0
  678. package/docs/api/output-capture-corrected-sdr.md +71 -0
  679. package/docs/api/output-capture-geometry.md +500 -0
  680. package/docs/api/output-capture-sdr.md +69 -0
  681. package/docs/api/output-crop.md +47 -0
  682. package/docs/api/output-geometric-transforms.md +199 -0
  683. package/docs/api/output-lens-corrections.md +162 -0
  684. package/docs/api/output-sdr-rendering.md +122 -0
  685. package/docs/api/output-subject-framing-crop.md +59 -0
  686. package/docs/api/schema-camera.md +84 -0
  687. package/docs/api/schema-illumination-spectral.md +77 -0
  688. package/docs/api/schema-illumination-temporal.md +289 -0
  689. package/docs/api/schema-illumination.md +246 -0
  690. package/docs/api/schema-scene-radiance-temporal.md +215 -0
  691. package/docs/api/schema-scene-radiance.md +415 -0
  692. package/docs/api/schema-scene.md +105 -0
  693. package/docs/api/schema-validation.md +25 -0
  694. package/docs/api/sensor-accumulated-charge.md +273 -0
  695. package/docs/api/sensor-architecture.md +155 -0
  696. package/docs/api/sensor-camera-saturation-capacity.md +215 -0
  697. package/docs/api/sensor-capture-color-sampling-binding.md +323 -0
  698. package/docs/api/sensor-capture-mode-timing.md +123 -0
  699. package/docs/api/sensor-capture-mode.md +321 -0
  700. package/docs/api/sensor-color-sampling.md +228 -0
  701. package/docs/api/sensor-constant-rate-temporal-integration.md +152 -0
  702. package/docs/api/sensor-dark-current.md +227 -0
  703. package/docs/api/sensor-environment-photo-signal.md +77 -0
  704. package/docs/api/sensor-eqe-electron-rate.md +166 -0
  705. package/docs/api/sensor-eqe-local-exposure.md +68 -0
  706. package/docs/api/sensor-eqe-temporal-exposure.md +73 -0
  707. package/docs/api/sensor-exposure-window.md +183 -0
  708. package/docs/api/sensor-iso-signal-chain.md +264 -0
  709. package/docs/api/sensor-local-exposure-binding.md +126 -0
  710. package/docs/api/sensor-optical-stack.md +211 -0
  711. package/docs/api/sensor-photon-energy.md +149 -0
  712. package/docs/api/sensor-physical-charge-capacity.md +196 -0
  713. package/docs/api/sensor-pixel-pitch.md +41 -0
  714. package/docs/api/sensor-radiometry-readiness.md +240 -0
  715. package/docs/api/sensor-raw-readout.md +499 -0
  716. package/docs/api/sensor-raw-reconstruction.md +260 -0
  717. package/docs/api/sensor-readout-exposure-linkage.md +172 -0
  718. package/docs/api/sensor-readout-timing.md +209 -0
  719. package/docs/api/sensor-response-application-compatibility.md +256 -0
  720. package/docs/api/sensor-response-operating-range.md +293 -0
  721. package/docs/api/sensor-responsivity-photocurrent.md +245 -0
  722. package/docs/api/sensor-sampling-aperture.md +221 -0
  723. package/docs/api/sensor-scene-eqe-temporal-exposure.md +56 -0
  724. package/docs/api/sensor-sensor-geometry.md +143 -0
  725. package/docs/api/sensor-signal-noise.md +75 -0
  726. package/docs/api/sensor-spatial-sample-reduction.md +186 -0
  727. package/docs/api/sensor-spatial-sampling-quadrature.md +188 -0
  728. package/docs/api/sensor-spatio-spectral-reduction.md +217 -0
  729. package/docs/api/sensor-spectral-coverage.md +33 -0
  730. package/docs/api/sensor-spectral-quadrature.md +183 -0
  731. package/docs/api/sensor-spectral-response.md +291 -0
  732. package/docs/api/sensor-temporal-photo-signal.md +62 -0
  733. package/docs/api/simulation-poc-simulation.md +364 -0
  734. package/docs/api/stabilization-camera-shake.md +71 -0
  735. package/docs/api/stabilization-system.md +442 -0
  736. package/docs/benchmarks/2026-10-01-main-baseline.json +694 -0
  737. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +2190 -0
  738. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +2423 -0
  739. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +210 -0
  740. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +187 -0
  741. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +756 -0
  742. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +711 -0
  743. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +711 -0
  744. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +885 -0
  745. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +868 -0
  746. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +868 -0
  747. package/docs/examples/production-capture.mjs +34 -0
  748. package/docs/examples/production-request.json +4613 -0
  749. package/docs/examples/quick-start.mjs +12 -0
  750. package/docs/validation/documentation-fragments.json +212 -0
  751. package/docs/validation/release-audit-inventory.json +1306 -0
  752. package/docs/validation/tier-acceptance-report-v1.json +2538 -0
  753. package/package.json +18 -4
@@ -0,0 +1,225 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * Module boundary and integration notes.
4
+ * Parses strict transform data, rejecting unknown semantics and noninvertible profiles.
5
+ * Prepares deterministic still/frame geometry; time changes require another preparation.
6
+ * @see docs/DIGITAL_OPTICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and
7
+ * support limits.
8
+ */
9
+ import { approximationResult } from "../core/calculation-result.js";
10
+ import { InvalidScientificInputError } from "../core/validation.js";
11
+ import { calculateRadialDistortionMapping, calculateInverseRadialDistortionMapping, validateRadialDistortionProfile } from "../optics/radial-distortion.js";
12
+ import { choice, finite, list, positive, record, textValue } from "../optics/profile-contract.js";
13
+ function point(value) {
14
+ const p = record(value, ["x", "y"]);
15
+ return { x: finite(p.x, "x"), y: finite(p.y, "y") };
16
+ }
17
+ function multiply(a, b) {
18
+ return [a[0] * b[0] + a[1] * b[2], a[0] * b[1] + a[1] * b[3],
19
+ a[2] * b[0] + a[3] * b[2], a[2] * b[1] + a[3] * b[3]];
20
+ }
21
+ function determinant(m) { return m[0] * m[3] - m[1] * m[2]; }
22
+ function inverse(m) {
23
+ const d = determinant(m);
24
+ if (!Number.isFinite(d) || Math.abs(d) < 1e-12)
25
+ throw new InvalidScientificInputError("Singular or ill-conditioned affine map.");
26
+ return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d];
27
+ }
28
+ function affine(p, m, o) {
29
+ return { x: m[0] * p.x + m[1] * p.y + o.x, y: m[2] * p.x + m[3] * p.y + o.y };
30
+ }
31
+ /** Parses strict transform data, rejecting unknown semantics and noninvertible profiles. */
32
+ export function parseDigitalGeometricTransform(value) {
33
+ const r = record(value, ["id", "version", "domain", "purpose", "kind", "matrix", "offsetMm", "profile"]);
34
+ const identity = {
35
+ id: textValue(r.id), version: textValue(r.version),
36
+ domain: choice(r.domain, ["raw-channel", "reconstructed-linear", "processed-output"]),
37
+ purpose: choice(r.purpose, ["distortion", "breathing", "digital-stabilization", "orientation-crop", "lateral-ca"])
38
+ };
39
+ const kind = choice(r.kind, ["affine", "radial"]);
40
+ if (kind === "affine") {
41
+ if (r.profile !== undefined)
42
+ throw new InvalidScientificInputError("Affine map cannot contain radial profile.");
43
+ const entries = list(r.matrix, 4).map((v) => finite(v, "matrix"));
44
+ if (entries.length !== 4)
45
+ throw new InvalidScientificInputError("Matrix must have four entries.");
46
+ const matrix = entries;
47
+ inverse(matrix);
48
+ return { ...identity, kind, matrix, offsetMm: point(r.offsetMm) };
49
+ }
50
+ if (r.matrix !== undefined || r.offsetMm !== undefined)
51
+ throw new InvalidScientificInputError("Radial map cannot contain affine fields.");
52
+ const p = record(r.profile, ["normalizationRadiusMm", "maximumNormalizedRadius", "coefficients"]);
53
+ const c = record(p.coefficients, ["k1", "k2", "k3"]);
54
+ const profile = { normalizationRadiusMm: positive(p.normalizationRadiusMm, "normalizationRadiusMm"),
55
+ maximumNormalizedRadius: positive(p.maximumNormalizedRadius, "maximumNormalizedRadius"),
56
+ coefficients: { k1: finite(c.k1, "k1"), k2: finite(c.k2, "k2"), k3: finite(c.k3, "k3") } };
57
+ validateRadialDistortionProfile(profile);
58
+ return { ...identity, kind, profile };
59
+ }
60
+ /** Prepares deterministic still/frame geometry; time changes require another preparation. */
61
+ export function prepareGeometricMapping(input) {
62
+ const time = finite(input.frameTimeSeconds, "frameTimeSeconds");
63
+ if (time < 0)
64
+ throw new InvalidScientificInputError("Time is seconds from exposure start.");
65
+ const transforms = list(input.transforms, 32).map(parseDigitalGeometricTransform);
66
+ if (new Set(transforms.map((t) => t.id)).size !== transforms.length)
67
+ throw new InvalidScientificInputError("Duplicate transform IDs.");
68
+ const groups = [];
69
+ for (const t of transforms) {
70
+ const last = groups.at(-1);
71
+ if (last?.domain === t.domain)
72
+ last.componentIds.push(t.id);
73
+ else
74
+ groups.push({ domain: t.domain, componentIds: [t.id] });
75
+ }
76
+ return approximationResult({ schemaVersion: "0.1.0", frameTimeSeconds: time, transforms,
77
+ semanticKey: JSON.stringify({ frameTimeSeconds: time, transforms }), groups }, "composed-digital-geometry", "0.1.0", ["Explicit inverse maps; incompatible domains require separate image stages", "No physical PSF, photon or noise-history recalculation"]);
78
+ }
79
+ /** Authoritative display-to-capture map and full local directional derivatives. */
80
+ export function calculateComposedGeometricMapping(input) {
81
+ const mapping = prepareGeometricMapping(input.mapping).value;
82
+ return calculatePreparedGeometricMappingPoint(mapping, input.destinationPointMm);
83
+ }
84
+ /** Call-local parsed/copy-owned mapping only; never accepts external prepared state. */
85
+ function calculatePreparedGeometricMappingPoint(mapping, destinationPointMm) {
86
+ let p = point(destinationPointMm);
87
+ let j = [1, 0, 0, 1];
88
+ const components = [];
89
+ for (const t of mapping.transforms) {
90
+ let local;
91
+ if (t.kind === "affine") {
92
+ // Preserve independent result arrays when one mapping serves many points.
93
+ local = [...t.matrix];
94
+ p = affine(p, local, t.offsetMm);
95
+ }
96
+ else {
97
+ const { k1, k2, k3 } = t.profile.coefficients;
98
+ const r2 = (p.x * p.x + p.y * p.y) / t.profile.normalizationRadiusMm ** 2;
99
+ const s = 1 + k1 * r2 + k2 * r2 * r2 + k3 * r2 * r2 * r2;
100
+ const d = 2 * (k1 + 2 * k2 * r2 + 3 * k3 * r2 * r2) / t.profile.normalizationRadiusMm ** 2;
101
+ local = [s + d * p.x * p.x, d * p.x * p.y, d * p.x * p.y, s + d * p.y * p.y];
102
+ p = calculateRadialDistortionMapping({ imagePointMm: p, profile: t.profile }).value.mappedImagePointMm;
103
+ }
104
+ j = multiply(local, j);
105
+ components.push({ id: t.id, sourcePointMm: { ...p }, jacobian: local });
106
+ }
107
+ // Singular values via the symmetric J^T J eigenproblem. det/smax avoids cancellation at smin.
108
+ const a = j[0] * j[0] + j[2] * j[2], b = j[0] * j[1] + j[2] * j[3], c = j[1] * j[1] + j[3] * j[3];
109
+ const maximum = Math.sqrt((a + c + Math.hypot(a - c, 2 * b)) / 2);
110
+ const det = determinant(j), minimum = Math.abs(det) / maximum;
111
+ return approximationResult({ sourcePointMm: p, jacobian: j, determinant: det,
112
+ principalStretches: [maximum, minimum], anisotropy: maximum / minimum, components }, "composed-digital-geometry-point", "0.1.0", ["Jacobian warps already-formed blur and noise; it creates no captured detail"]);
113
+ }
114
+ /** Capture-to-display bridge for focus, metering and overlays; reverses the same maps. */
115
+ export function calculateForwardGeometricMapping(input) {
116
+ let p = point(input.sourcePointMm);
117
+ const mapping = prepareGeometricMapping(input.mapping).value;
118
+ for (const t of [...mapping.transforms].reverse()) {
119
+ p = t.kind === "affine"
120
+ ? affine({ x: p.x - t.offsetMm.x, y: p.y - t.offsetMm.y }, inverse(t.matrix), { x: 0, y: 0 })
121
+ : calculateInverseRadialDistortionMapping({ distortedImagePointMm: p, profile: t.profile }).value.sourceImagePointMm;
122
+ }
123
+ return approximationResult(p, "forward-digital-geometry-bridge", "0.1.0", ["Inverse of the authoritative destination-to-source geometry"]);
124
+ }
125
+ /** @internal Shared lattice validation for downstream correction consumers. */
126
+ export function parseGeometricRaster(value) {
127
+ const r = record(value, ["width", "height", "centerMm", "pitchMm"]);
128
+ const width = positive(r.width, "width"), height = positive(r.height, "height");
129
+ if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height) || width * height > 65536) {
130
+ throw new InvalidScientificInputError("Raster must have at most 65536 integral samples.");
131
+ }
132
+ return { width, height, centerMm: point(r.centerMm), pitchMm: positive(r.pitchMm, "pitchMm") };
133
+ }
134
+ function pixelPoint(r, x, y) {
135
+ return { x: r.centerMm.x + (x + .5 - r.width / 2) * r.pitchMm, y: r.centerMm.y - (y + .5 - r.height / 2) * r.pitchMm };
136
+ }
137
+ function pixelCoordinate(r, p) {
138
+ return { x: (p.x - r.centerMm.x) / r.pitchMm + r.width / 2 - .5, y: (r.centerMm.y - p.y) / r.pitchMm + r.height / 2 - .5 };
139
+ }
140
+ function supported(r, p, filter) {
141
+ const q = pixelCoordinate(r, p);
142
+ return filter === "nearest"
143
+ ? Math.round(q.x) >= 0 && Math.round(q.x) < r.width && Math.round(q.y) >= 0 && Math.round(q.y) < r.height
144
+ : q.x >= 0 && q.x <= r.width - 1 && q.y >= 0 && q.y <= r.height - 1;
145
+ }
146
+ /** @internal Shared deterministic crop for a validated pixel mask. */
147
+ export function calculateValidSourceCrop(mask, width, height) {
148
+ const heights = Array(width).fill(0);
149
+ let best = null, area = 0;
150
+ for (let y = 0; y < height; y++) {
151
+ for (let x = 0; x < width; x++)
152
+ heights[x] = mask[y * width + x] ? heights[x] + 1 : 0;
153
+ const stack = [];
154
+ for (let x = 0; x <= width; x++) {
155
+ const h = x === width ? 0 : heights[x];
156
+ while (stack.length && heights[stack.at(-1)] > h) {
157
+ const index = stack.pop(), rectangleHeight = heights[index];
158
+ const left = stack.length ? stack.at(-1) + 1 : 0, rectangleWidth = x - left;
159
+ if (rectangleHeight * rectangleWidth > area) {
160
+ area = rectangleHeight * rectangleWidth;
161
+ best = { x: left, y: y - rectangleHeight + 1, width: rectangleWidth, height: rectangleHeight };
162
+ }
163
+ }
164
+ stack.push(x);
165
+ }
166
+ }
167
+ return best;
168
+ }
169
+ /** Resolves one joint validity/crop/AA plan after composing compatible inverse maps. */
170
+ export function calculateGeometricSamplingPlan(input) {
171
+ const mapping = prepareGeometricMapping(input.mapping).value;
172
+ if (mapping.groups.length > 1)
173
+ throw new InvalidScientificInputError("Separate incompatible-domain groups before resampling.");
174
+ const source = parseGeometricRaster(input.sourceRaster), destination = parseGeometricRaster(input.destinationRaster);
175
+ const r = record(input.resampler, ["id", "version", "filter", "antialias"]);
176
+ const resampler = { id: textValue(r.id), version: textValue(r.version),
177
+ filter: choice(r.filter, ["nearest", "bilinear"]), antialias: choice(r.antialias, ["none", "source-prefiltered"]) };
178
+ const projection = positive(input.physicalProjectionDistanceMm, "physicalProjectionDistanceMm");
179
+ const points = [], mask = [];
180
+ for (let y = 0; y < destination.height; y++)
181
+ for (let x = 0; x < destination.width; x++) {
182
+ const mapped = calculatePreparedGeometricMappingPoint(mapping, pixelPoint(destination, x, y)).value;
183
+ points.push(mapped);
184
+ mask.push(supported(source, mapped.sourcePointMm, resampler.filter));
185
+ }
186
+ const requiresPrefilter = points.some((p) => p.principalStretches[0] * destination.pitchMm / source.pitchMm > 1 + 1e-12);
187
+ const crop = calculateValidSourceCrop(mask, destination.width, destination.height);
188
+ const angle = (mm) => Math.atan(mm / projection) * 180 / Math.PI;
189
+ const retained = points.filter((_, i) => crop !== null && i % destination.width >= crop.x &&
190
+ i % destination.width < crop.x + crop.width && Math.floor(i / destination.width) >= crop.y &&
191
+ Math.floor(i / destination.width) < crop.y + crop.height).map((p) => p.sourcePointMm);
192
+ const envelope = retained.length ? { minX: Math.min(...retained.map((p) => angle(p.x))),
193
+ maxX: Math.max(...retained.map((p) => angle(p.x))), minY: Math.min(...retained.map((p) => angle(p.y))),
194
+ maxY: Math.max(...retained.map((p) => angle(p.y))) } : null;
195
+ return approximationResult({ mapping, sourceRaster: source, destinationRaster: destination, resampler, points,
196
+ validSourceMask: mask, jointCrop: crop, requiresPrefilter,
197
+ canResample: !requiresPrefilter || resampler.antialias === "source-prefiltered",
198
+ physicalCapturedFovDegrees: {
199
+ horizontal: angle(source.centerMm.x + source.width * source.pitchMm / 2) - angle(source.centerMm.x - source.width * source.pitchMm / 2),
200
+ vertical: angle(source.centerMm.y + source.height * source.pitchMm / 2) - angle(source.centerMm.y - source.height * source.pitchMm / 2)
201
+ }, retainedSampleRayEnvelopeDegrees: envelope }, "joint-geometric-sampling-plan", "0.1.0", ["Mask and crop are exact for this pixel-center lattice/filter, not continuous between-pixel support", "Compression requires explicitly source-prefiltered data; this API does not implement that prefilter", "No temporal trajectory crop guarantee"]);
202
+ }
203
+ /** Samples an already-formed scalar image once; null output marks missing source support. */
204
+ export function calculateGeometricResampling(input) {
205
+ const plan = calculateGeometricSamplingPlan({ ...input.plan, physicalProjectionDistanceMm: 1 }).value;
206
+ if (!plan.canResample)
207
+ throw new InvalidScientificInputError("Compression requires source-prefiltered data.");
208
+ const source = list(input.sourceSamples, 65536).map((v) => finite(v, "source sample"));
209
+ if (source.length !== plan.sourceRaster.width * plan.sourceRaster.height)
210
+ throw new InvalidScientificInputError("Source sample count mismatch.");
211
+ const samples = plan.points.map((p, index) => {
212
+ if (!plan.validSourceMask[index])
213
+ return null;
214
+ const q = pixelCoordinate(plan.sourceRaster, p.sourcePointMm), width = plan.sourceRaster.width;
215
+ if (plan.resampler.filter === "nearest")
216
+ return source[Math.round(q.y) * width + Math.round(q.x)];
217
+ const x = Math.floor(q.x), y = Math.floor(q.y), dx = q.x - x, dy = q.y - y;
218
+ // Exact boundary centers need no nonexistent neighbor; no border extension occurs.
219
+ const x1 = dx === 0 ? x : x + 1, y1 = dy === 0 ? y : y + 1;
220
+ return (1 - dy) * ((1 - dx) * source[y * width + x] + dx * source[y * width + x1]) +
221
+ dy * ((1 - dx) * source[y1 * width + x] + dx * source[y1 * width + x1]);
222
+ });
223
+ return approximationResult({ samples, resamplePasses: 1, resampler: plan.resampler }, "single-pass-geometric-resampling", "0.1.0", ["Warps captured blur/noise; does not recalculate the optical PSF"]);
224
+ }
225
+ //# sourceMappingURL=geometric-transforms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometric-transforms.js","sourceRoot":"","sources":["../../src/output/geometric-transforms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Module boundary and integration notes.
3
+ * Strict parser for generic system corrections; no extrapolation or restoration claim.
4
+ * Resolves independent camera states, explicit dependencies, RAW intent and educational bypass.
5
+ * @see docs/DIGITAL_OPTICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and
6
+ * support limits.
7
+ */
8
+ import { type CalculationResult } from "../core/calculation-result.js";
9
+ import { type IlluminationVignettingProfile } from "../optics/illumination-vignetting.js";
10
+ import { type GenericOpticalEvidence, type OpticalProfileState } from "../optics/profile-contract.js";
11
+ import type { LensFieldPointMm } from "../optics/radial-distortion.js";
12
+ import { type DigitalGeometricTransform, type GeometricImageDomain, type GeometricRaster, type GeometricResampler, type GeometricSamplingPlan } from "./geometric-transforms.js";
13
+ export type LensCorrectionChannel = "red" | "green" | "blue";
14
+ interface CorrectionComponentIdentity {
15
+ id: string;
16
+ version: string;
17
+ domain: GeometricImageDomain;
18
+ availability: "toggle" | "automatic" | "mandatory";
19
+ defaultEnabled: boolean;
20
+ dependencies: readonly string[];
21
+ requiredByStabilizationModes: readonly string[];
22
+ /** Declared residual/calibration limitations; not inferred from optical tier. */
23
+ residualNote: string;
24
+ }
25
+ /** A separately declared correction map may deliberately retain physical distortion. */
26
+ export interface GeometricLensCorrection extends CorrectionComponentIdentity {
27
+ kind: "geometry";
28
+ transform: DigitalGeometricTransform;
29
+ }
30
+ /** Channel registration only, not longitudinal CA or color shading. */
31
+ export interface LateralCaLensCorrection extends CorrectionComponentIdentity {
32
+ kind: "lateral-ca";
33
+ transforms: Readonly<Record<LensCorrectionChannel, DigitalGeometricTransform>>;
34
+ }
35
+ /** Post-capture scalar gain; strength 0..1 leaves explicit residual falloff. */
36
+ export interface IlluminationLensCorrection extends CorrectionComponentIdentity {
37
+ kind: "peripheral-illumination";
38
+ profile: IlluminationVignettingProfile;
39
+ strength: number;
40
+ }
41
+ export type LensCorrectionComponent = GeometricLensCorrection | LateralCaLensCorrection | IlluminationLensCorrection;
42
+ /** Exact generic system binding, with components in authoritative application order. */
43
+ export interface GenericLensCorrectionProfile {
44
+ schemaVersion: "0.1.0";
45
+ id: string;
46
+ version: string;
47
+ state: OpticalProfileState;
48
+ evidence: GenericOpticalEvidence;
49
+ components: readonly LensCorrectionComponent[];
50
+ }
51
+ export interface ResolvedLensCorrectionPlan {
52
+ profile: GenericLensCorrectionProfile;
53
+ outputKind: "raw-like" | "processed";
54
+ selectionKind: "camera-selectable" | "reference-bypass";
55
+ components: readonly {
56
+ component: LensCorrectionComponent;
57
+ enabled: boolean;
58
+ reason: "selected" | "default" | "mandatory" | "stabilization-dependency" | "component-dependency" | "reference-bypass";
59
+ }[];
60
+ /** RAW-like intent remains metadata only in this first foundation. */
61
+ application: "metadata-only" | "bake-downstream";
62
+ }
63
+ /** Strict parser for generic system corrections; no extrapolation or restoration claim. */
64
+ export declare function parseGenericLensCorrectionProfile(value: unknown): GenericLensCorrectionProfile;
65
+ /** Resolves independent camera states, explicit dependencies, RAW intent and educational bypass. */
66
+ export declare function resolveLensCorrectionPlan(input: {
67
+ profile: GenericLensCorrectionProfile;
68
+ state: OpticalProfileState;
69
+ selections: Readonly<Record<string, "on" | "off" | "auto">>;
70
+ outputKind: "raw-like" | "processed";
71
+ selectionKind: "camera-selectable" | "reference-bypass";
72
+ }): CalculationResult<ResolvedLensCorrectionPlan>;
73
+ /** Applies scalar post-capture gain and reports pre-clip variance; no photon/SNR history rewrite. */
74
+ export declare function calculatePeripheralIlluminationCorrection(input: {
75
+ component: IlluminationLensCorrection;
76
+ imagePointMm: LensFieldPointMm;
77
+ signal: number;
78
+ noiseVariance: number;
79
+ clippingLevel: number;
80
+ }): CalculationResult<{
81
+ gain: number;
82
+ signalBeforeClipping: number;
83
+ signal: number;
84
+ noiseVarianceBeforeClipping: number;
85
+ clipped: boolean;
86
+ }>;
87
+ /** Immutable capture identity accompanies downstream channels for meaningful On/Off comparisons. */
88
+ export interface LensCorrectionCapture {
89
+ state: OpticalProfileState;
90
+ captureId: string;
91
+ noiseRealizationId: string;
92
+ timeSeconds: number;
93
+ raster: GeometricRaster;
94
+ channels: Readonly<Record<LensCorrectionChannel, readonly number[]>>;
95
+ }
96
+ /** Executes bounded reconstructed-linear corrections on already sampled RGB channels.
97
+ * Compatible common geometry plus channel CA is sampled once per channel.
98
+ * A gain between geometry components or incompatible domains requires an external staged consumer.
99
+ */
100
+ export declare function calculateLensCorrectedCapture(input: {
101
+ plan: ResolvedLensCorrectionPlan;
102
+ capture: LensCorrectionCapture;
103
+ destinationRaster: GeometricRaster;
104
+ resampler: GeometricResampler;
105
+ physicalProjectionDistanceMm: number;
106
+ clippingLevel: number;
107
+ }): CalculationResult<{
108
+ captureId: string;
109
+ noiseRealizationId: string;
110
+ timeSeconds: number;
111
+ application: ResolvedLensCorrectionPlan["application"];
112
+ channels: Readonly<Record<LensCorrectionChannel, readonly (number | null)[]>>;
113
+ samplingPlans: Partial<Record<LensCorrectionChannel, GeometricSamplingPlan>>;
114
+ /** Intersection across all channel footprints, before crop; no missing colors fabricated. */
115
+ validSourceMask: readonly boolean[];
116
+ jointCrop: GeometricSamplingPlan["jointCrop"];
117
+ /** Gain-stage clipping events before joint support/crop; repeated stages count separately. */
118
+ illuminationClippingEventCount: number;
119
+ }>;
120
+ export {};
121
+ //# sourceMappingURL=lens-corrections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lens-corrections.d.ts","sourceRoot":"","sources":["../../src/output/lens-corrections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,210 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * Module boundary and integration notes.
4
+ * Strict parser for generic system corrections; no extrapolation or restoration claim.
5
+ * Resolves independent camera states, explicit dependencies, RAW intent and educational bypass.
6
+ * @see docs/DIGITAL_OPTICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and
7
+ * support limits.
8
+ */
9
+ import { approximationResult } from "../core/calculation-result.js";
10
+ import { InvalidScientificInputError } from "../core/validation.js";
11
+ import { calculateIlluminationVignetting } from "../optics/illumination-vignetting.js";
12
+ import { choice, finite, list, parseEvidence, parseOpticalProfileState, positive, record, requireSameState, textValue } from "../optics/profile-contract.js";
13
+ import { calculateGeometricResampling, calculateGeometricSamplingPlan, parseDigitalGeometricTransform, prepareGeometricMapping, parseGeometricRaster, calculateValidSourceCrop } from "./geometric-transforms.js";
14
+ function illumination(value) {
15
+ const r = record(value, ["normalizationRadiusMm", "maximumNormalizedRadius", "coefficients"]);
16
+ const c = record(r.coefficients, ["r2", "r4", "r6"]);
17
+ const profile = { normalizationRadiusMm: positive(r.normalizationRadiusMm, "normalizationRadiusMm"),
18
+ maximumNormalizedRadius: positive(r.maximumNormalizedRadius, "maximumNormalizedRadius"),
19
+ coefficients: { r2: finite(c.r2, "r2"), r4: finite(c.r4, "r4"), r6: finite(c.r6, "r6") } };
20
+ calculateIlluminationVignetting({ imagePointMm: { x: 0, y: 0 }, profile });
21
+ return profile;
22
+ }
23
+ /** Strict parser for generic system corrections; no extrapolation or restoration claim. */
24
+ export function parseGenericLensCorrectionProfile(value) {
25
+ const r = record(value, ["schemaVersion", "id", "version", "state", "evidence", "components"]);
26
+ const components = list(r.components, 16).map((value) => {
27
+ const c = record(value, ["id", "version", "domain", "availability", "defaultEnabled", "dependencies",
28
+ "requiredByStabilizationModes", "residualNote", "kind", "transform", "transforms", "profile", "strength"]);
29
+ if (typeof c.defaultEnabled !== "boolean")
30
+ throw new InvalidScientificInputError("defaultEnabled must be boolean.");
31
+ const identity = { id: textValue(c.id), version: textValue(c.version),
32
+ domain: choice(c.domain, ["raw-channel", "reconstructed-linear", "processed-output"]),
33
+ availability: choice(c.availability, ["toggle", "automatic", "mandatory"]), defaultEnabled: c.defaultEnabled,
34
+ dependencies: list(c.dependencies, 16).map(textValue),
35
+ requiredByStabilizationModes: list(c.requiredByStabilizationModes, 16).map(textValue), residualNote: textValue(c.residualNote) };
36
+ const kind = choice(c.kind, ["geometry", "lateral-ca", "peripheral-illumination"]);
37
+ if (kind === "geometry") {
38
+ if (c.transforms !== undefined || c.profile !== undefined || c.strength !== undefined)
39
+ throw new InvalidScientificInputError("Extraneous geometry parameters.");
40
+ const transform = parseDigitalGeometricTransform(c.transform);
41
+ if (transform.domain !== identity.domain || !["distortion", "breathing"].includes(transform.purpose))
42
+ throw new InvalidScientificInputError("Geometry domain/purpose mismatch.");
43
+ return { ...identity, kind, transform };
44
+ }
45
+ if (kind === "lateral-ca") {
46
+ if (c.transform !== undefined || c.profile !== undefined || c.strength !== undefined)
47
+ throw new InvalidScientificInputError("Extraneous CA parameters.");
48
+ const t = record(c.transforms, ["red", "green", "blue"]);
49
+ const transforms = { red: parseDigitalGeometricTransform(t.red), green: parseDigitalGeometricTransform(t.green), blue: parseDigitalGeometricTransform(t.blue) };
50
+ for (const transform of Object.values(transforms)) {
51
+ if (transform.domain !== identity.domain || transform.purpose !== "lateral-ca")
52
+ throw new InvalidScientificInputError("CA domain/purpose mismatch.");
53
+ }
54
+ return { ...identity, kind, transforms };
55
+ }
56
+ if (c.transform !== undefined || c.transforms !== undefined)
57
+ throw new InvalidScientificInputError("Extraneous illumination geometry.");
58
+ const strength = finite(c.strength, "strength");
59
+ if (strength < 0 || strength > 1)
60
+ throw new InvalidScientificInputError("Strength must lie in [0,1].");
61
+ return { ...identity, kind, profile: illumination(c.profile), strength };
62
+ });
63
+ const preceding = new Set(), mappingIds = new Set();
64
+ for (const c of components) {
65
+ if (preceding.has(c.id) || c.dependencies.some((id) => !preceding.has(id)) ||
66
+ new Set(c.dependencies).size !== c.dependencies.length)
67
+ throw new InvalidScientificInputError("Component IDs/dependency order must be unique and acyclic.");
68
+ preceding.add(c.id);
69
+ // Common and per-channel transforms need stable distinct IDs when fused.
70
+ const maps = c.kind === "geometry" ? [c.transform] : c.kind === "lateral-ca" ? Object.values(c.transforms) : [];
71
+ for (const t of maps) {
72
+ if (mappingIds.has(t.id))
73
+ throw new InvalidScientificInputError("Duplicate correction transform ID.");
74
+ mappingIds.add(t.id);
75
+ }
76
+ }
77
+ return { schemaVersion: choice(r.schemaVersion, ["0.1.0"]), id: textValue(r.id), version: textValue(r.version),
78
+ state: parseOpticalProfileState(r.state), evidence: parseEvidence(r.evidence), components };
79
+ }
80
+ /** Resolves independent camera states, explicit dependencies, RAW intent and educational bypass. */
81
+ export function resolveLensCorrectionPlan(input) {
82
+ const profile = parseGenericLensCorrectionProfile(input.profile);
83
+ requireSameState(profile.state, input.state);
84
+ const outputKind = choice(input.outputKind, ["raw-like", "processed"]);
85
+ const selectionKind = choice(input.selectionKind, ["camera-selectable", "reference-bypass"]);
86
+ const selections = record(input.selections, profile.components.map((c) => c.id));
87
+ const components = profile.components.map((c) => {
88
+ const selection = choice(selections[c.id] ?? "auto", ["on", "off", "auto"]);
89
+ if (selectionKind === "reference-bypass")
90
+ return { component: c, enabled: false, reason: "reference-bypass" };
91
+ const stabilization = c.requiredByStabilizationModes.includes(profile.state.stabilizationMode);
92
+ if (c.availability === "mandatory" && selection === "off")
93
+ throw new InvalidScientificInputError("Mandatory correction cannot be disabled as a camera setting; use reference-bypass.");
94
+ if (c.availability === "automatic" && selection !== "auto")
95
+ throw new InvalidScientificInputError("Automatic correction has no camera toggle.");
96
+ return { component: c, enabled: c.availability === "mandatory" || stabilization || (selection === "auto" ? c.defaultEnabled : selection === "on"),
97
+ reason: c.availability === "mandatory" ? "mandatory" : stabilization ? "stabilization-dependency" : selection === "auto" ? "default" : "selected" };
98
+ });
99
+ for (const entry of [...components].reverse())
100
+ if (entry.enabled)
101
+ for (const id of entry.component.dependencies) {
102
+ const dependency = components.find((c) => c.component.id === id);
103
+ dependency.enabled = true;
104
+ dependency.reason = "component-dependency";
105
+ }
106
+ return approximationResult({ profile, outputKind, selectionKind, components,
107
+ application: outputKind === "raw-like" ? "metadata-only" : "bake-downstream" }, "generic-camera-lens-correction-plan", "0.1.0", [profile.evidence.basis, profile.evidence.residualNote,
108
+ "Corrections occur after the same physical capture; tier is not a correction-strength input",
109
+ "Raw-like output preserves intent without baking corrections; color shading, axial CA and restoration remain unsupported"]);
110
+ }
111
+ /** Applies scalar post-capture gain and reports pre-clip variance; no photon/SNR history rewrite. */
112
+ export function calculatePeripheralIlluminationCorrection(input) {
113
+ const component = input.component;
114
+ if (component.kind !== "peripheral-illumination" || component.strength < 0 || component.strength > 1 || !Number.isFinite(component.strength))
115
+ throw new InvalidScientificInputError("Invalid illumination component.");
116
+ const signal = finite(input.signal, "signal"), variance = finite(input.noiseVariance, "noiseVariance");
117
+ const level = positive(input.clippingLevel, "clippingLevel");
118
+ if (variance < 0)
119
+ throw new InvalidScientificInputError("Variance must be nonnegative.");
120
+ const throughput = calculateIlluminationVignetting({ imagePointMm: input.imagePointMm, profile: component.profile }).value.linearThroughputFactor;
121
+ const gain = throughput ** (-component.strength), before = signal * gain;
122
+ return approximationResult({ gain, signalBeforeClipping: before, signal: Math.min(level, before),
123
+ noiseVarianceBeforeClipping: variance * gain * gain, clipped: before > level }, "post-capture-peripheral-illumination-gain", "0.1.0", ["Variance describes pre-clip samples only", "Gain does not increase captured photons or restore sensor SNR"]);
124
+ }
125
+ /** Executes bounded reconstructed-linear corrections on already sampled RGB channels.
126
+ * Compatible common geometry plus channel CA is sampled once per channel.
127
+ * A gain between geometry components or incompatible domains requires an external staged consumer.
128
+ */
129
+ export function calculateLensCorrectedCapture(input) {
130
+ // Re-resolve untrusted/mutated plans; callers cannot forge enabled/mandatory state.
131
+ const plan = resolveLensCorrectionPlan({ profile: input.plan.profile, state: input.plan.profile.state,
132
+ selections: Object.fromEntries(input.plan.components.filter((e) => e.component.availability === "toggle").map((e) => [e.component.id, e.enabled ? "on" : "off"])),
133
+ outputKind: input.plan.outputKind, selectionKind: input.plan.selectionKind }).value;
134
+ const capture = input.capture;
135
+ requireSameState(plan.profile.state, capture.state);
136
+ const sourceRaster = parseGeometricRaster(capture.raster);
137
+ const destination = parseGeometricRaster(input.destinationRaster);
138
+ if (destination.width !== plan.profile.state.outputWidth || destination.height !== plan.profile.state.outputHeight) {
139
+ throw new InvalidScientificInputError("Destination raster differs from correction output binding.");
140
+ }
141
+ textValue(capture.captureId);
142
+ textValue(capture.noiseRealizationId);
143
+ if (finite(capture.timeSeconds, "timeSeconds") < 0)
144
+ throw new InvalidScientificInputError("Invalid capture time.");
145
+ const count = capture.raster.width * capture.raster.height;
146
+ for (const channel of ["red", "green", "blue"]) {
147
+ const data = list(capture.channels[channel], 65536);
148
+ if (data.length !== count)
149
+ throw new InvalidScientificInputError("Capture channel sample count mismatch.");
150
+ data.forEach((s) => finite(s, "channel sample"));
151
+ }
152
+ const active = plan.components.filter((e) => e.enabled).map((e) => e.component);
153
+ const sameLattice = sourceRaster.width === destination.width && sourceRaster.height === destination.height &&
154
+ sourceRaster.pitchMm === destination.pitchMm && sourceRaster.centerMm.x === destination.centerMm.x &&
155
+ sourceRaster.centerMm.y === destination.centerMm.y;
156
+ // Disabling corrections does not disable an explicit output crop/resampling request.
157
+ if (plan.application === "metadata-only" || (!active.length && sameLattice)) {
158
+ return approximationResult({ captureId: capture.captureId, noiseRealizationId: capture.noiseRealizationId,
159
+ timeSeconds: capture.timeSeconds, application: plan.application, channels: capture.channels,
160
+ samplingPlans: {}, validSourceMask: Array(count).fill(true), illuminationClippingEventCount: 0,
161
+ jointCrop: { x: 0, y: 0, width: capture.raster.width, height: capture.raster.height } }, "generic-lens-correction-capture", "0.1.0", ["Original physical capture preserved"]);
162
+ }
163
+ if (active.some((c) => c.domain !== "reconstructed-linear"))
164
+ throw new InvalidScientificInputError("This executor requires reconstructed-linear components; other domains need separate consumers.");
165
+ let seenGain = false;
166
+ for (const c of active) {
167
+ if (c.kind === "peripheral-illumination")
168
+ seenGain = true;
169
+ else if (seenGain)
170
+ throw new InvalidScientificInputError("Cannot reorder geometry across a gain stage.");
171
+ }
172
+ const channels = {};
173
+ const samplingPlans = {};
174
+ let illuminationClippingEventCount = 0;
175
+ for (const channel of ["red", "green", "blue"]) {
176
+ // Application order source->destination reverses for inverse sampling.
177
+ const transforms = active.filter((c) => c.kind !== "peripheral-illumination").reverse().map((c) => c.kind === "geometry" ? c.transform : c.transforms[channel]);
178
+ const mapping = prepareGeometricMapping({ transforms, frameTimeSeconds: capture.timeSeconds }).value;
179
+ const sampling = calculateGeometricSamplingPlan({ mapping, sourceRaster: capture.raster,
180
+ destinationRaster: input.destinationRaster, resampler: input.resampler,
181
+ physicalProjectionDistanceMm: input.physicalProjectionDistanceMm }).value;
182
+ samplingPlans[channel] = sampling;
183
+ let data = calculateGeometricResampling({ plan: sampling, sourceSamples: capture.channels[channel] }).value.samples;
184
+ for (const c of active)
185
+ if (c.kind === "peripheral-illumination") {
186
+ data = data.map((signal, index) => {
187
+ if (signal === null)
188
+ return null;
189
+ const raster = input.destinationRaster, x = index % raster.width, y = Math.floor(index / raster.width);
190
+ const corrected = calculatePeripheralIlluminationCorrection({ component: c,
191
+ imagePointMm: { x: raster.centerMm.x + (x + .5 - raster.width / 2) * raster.pitchMm,
192
+ y: raster.centerMm.y - (y + .5 - raster.height / 2) * raster.pitchMm },
193
+ signal, noiseVariance: 0, clippingLevel: input.clippingLevel }).value;
194
+ if (corrected.clipped)
195
+ illuminationClippingEventCount++;
196
+ return corrected.signal;
197
+ });
198
+ }
199
+ channels[channel] = data;
200
+ }
201
+ const mask = channels.red.map((_, i) => channels.red[i] !== null && channels.green[i] !== null && channels.blue[i] !== null);
202
+ for (const channel of ["red", "green", "blue"])
203
+ channels[channel] = channels[channel].map((s, i) => mask[i] ? s : null);
204
+ return approximationResult({ captureId: capture.captureId, noiseRealizationId: capture.noiseRealizationId,
205
+ timeSeconds: capture.timeSeconds, application: plan.application, channels, samplingPlans, validSourceMask: mask,
206
+ illuminationClippingEventCount,
207
+ jointCrop: calculateValidSourceCrop(mask, destination.width, destination.height) }, "generic-lens-correction-capture", "0.1.0", ["Input capture/noise realization remains unchanged", "Channel support intersects before output; optical blur/noise is warped, not physically repaired",
208
+ "No production-plan composition is enabled by this standalone executor"]);
209
+ }
210
+ //# sourceMappingURL=lens-corrections.js.map