@photivra/engine 2.18.0 → 2.20.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 (335) hide show
  1. package/CHANGELOG.md +179 -1
  2. package/CITATION.cff +1 -1
  3. package/NODE_SUPPORT.md +7 -5
  4. package/README.md +6 -6
  5. package/SECURITY.md +1 -1
  6. package/THIRD_PARTY.md +14 -10
  7. package/dist/capture/dng-lens-correction-opcodes.d.ts +32 -0
  8. package/dist/capture/dng-lens-correction-opcodes.js +119 -0
  9. package/dist/capture/dng-lens-correction-opcodes.js.map +1 -0
  10. package/dist/capture/focus-control.js +2 -75
  11. package/dist/capture/focus-control.js.map +1 -1
  12. package/dist/capture/native-environment-lean.d.ts +1 -0
  13. package/dist/capture/native-environment-lean.js +2 -6
  14. package/dist/capture/native-environment-lean.js.map +1 -1
  15. package/dist/capture/native-environment-optical-stage.d.ts +1 -0
  16. package/dist/capture/native-environment-optical-stage.js +2 -5
  17. package/dist/capture/native-environment-optical-stage.js.map +1 -1
  18. package/dist/capture/native-environment-raw.js +1 -5
  19. package/dist/capture/native-environment-raw.js.map +1 -1
  20. package/dist/capture/native-raw-dng.d.ts +6 -0
  21. package/dist/capture/native-raw-dng.js +16 -2
  22. package/dist/capture/native-raw-dng.js.map +1 -1
  23. package/dist/capture/release-sequence.js +2 -47
  24. package/dist/capture/release-sequence.js.map +1 -1
  25. package/dist/capture/sensor-raw-producer.js +3 -5
  26. package/dist/capture/sensor-raw-producer.js.map +1 -1
  27. package/dist/color/white-balance.d.ts +2 -0
  28. package/dist/color/white-balance.js +3 -56
  29. package/dist/color/white-balance.js.map +1 -1
  30. package/dist/composition/image-formation-plan.d.ts +1 -0
  31. package/dist/composition/image-formation-plan.js +3 -49
  32. package/dist/composition/image-formation-plan.js.map +1 -1
  33. package/dist/core/evidence-provenance.js +1 -16
  34. package/dist/core/evidence-provenance.js.map +1 -1
  35. package/dist/core/record-validation.d.ts +54 -0
  36. package/dist/core/record-validation.js +176 -0
  37. package/dist/core/record-validation.js.map +1 -1
  38. package/dist/core/scientific-assurance.js +1 -18
  39. package/dist/core/scientific-assurance.js.map +1 -1
  40. package/dist/core/shared-helpers.d.ts +35 -0
  41. package/dist/core/shared-helpers.js +38 -0
  42. package/dist/core/shared-helpers.js.map +1 -0
  43. package/dist/core/spectral-composition.js +1 -36
  44. package/dist/core/spectral-composition.js.map +1 -1
  45. package/dist/core/spectral.js +1 -19
  46. package/dist/core/spectral.js.map +1 -1
  47. package/dist/core/version.d.ts +1 -1
  48. package/dist/core/version.js +1 -1
  49. package/dist/core/version.js.map +1 -1
  50. package/dist/equipment/exposure-capabilities.d.ts +1 -0
  51. package/dist/equipment/exposure-capabilities.js +2 -36
  52. package/dist/equipment/exposure-capabilities.js.map +1 -1
  53. package/dist/equipment/generic-lens-catalogue.d.ts +8 -2
  54. package/dist/equipment/generic-lens-catalogue.js +31 -2
  55. package/dist/equipment/generic-lens-catalogue.js.map +1 -1
  56. package/dist/equipment/generic-tier-assets.js +2 -3
  57. package/dist/equipment/generic-tier-assets.js.map +1 -1
  58. package/dist/equipment/generic-tier-presets.js +2 -3
  59. package/dist/equipment/generic-tier-presets.js.map +1 -1
  60. package/dist/equipment/iso-capabilities.js +2 -49
  61. package/dist/equipment/iso-capabilities.js.map +1 -1
  62. package/dist/equipment/metering-capabilities.js +1 -26
  63. package/dist/equipment/metering-capabilities.js.map +1 -1
  64. package/dist/equipment/release-capabilities.js +1 -53
  65. package/dist/equipment/release-capabilities.js.map +1 -1
  66. package/dist/exposure/auto-iso-slowest-shutter.js +1 -7
  67. package/dist/exposure/auto-iso-slowest-shutter.js.map +1 -1
  68. package/dist/exposure/exposure-duration-control.js +1 -16
  69. package/dist/exposure/exposure-duration-control.js.map +1 -1
  70. package/dist/exposure/exposure-mode-resolver.js +1 -17
  71. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  72. package/dist/exposure/filtered-exposure-time.d.ts +93 -0
  73. package/dist/exposure/filtered-exposure-time.js +129 -0
  74. package/dist/exposure/filtered-exposure-time.js.map +1 -0
  75. package/dist/exposure/flash-ttl.d.ts +1 -0
  76. package/dist/exposure/flash-ttl.js +1 -1
  77. package/dist/exposure/flash-ttl.js.map +1 -1
  78. package/dist/exposure/flash.js +1 -49
  79. package/dist/exposure/flash.js.map +1 -1
  80. package/dist/exposure/metering-scene-radiance.js +1 -25
  81. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  82. package/dist/exposure/metering-target.js +1 -30
  83. package/dist/exposure/metering-target.js.map +1 -1
  84. package/dist/exposure/metering-temporal.js +1 -8
  85. package/dist/exposure/metering-temporal.js.map +1 -1
  86. package/dist/exposure/metering.js +1 -72
  87. package/dist/exposure/metering.js.map +1 -1
  88. package/dist/exposure/program-line.js +1 -45
  89. package/dist/exposure/program-line.js.map +1 -1
  90. package/dist/facade/develop-joined-parts.d.ts +29 -0
  91. package/dist/facade/develop-joined-parts.js +33 -0
  92. package/dist/facade/develop-joined-parts.js.map +1 -0
  93. package/dist/facade/display-view-gpu.d.ts +7 -4
  94. package/dist/facade/display-view-gpu.js +4 -4
  95. package/dist/facade/display-view-gpu.js.map +1 -1
  96. package/dist/facade/display-view-lens-signal.d.ts +1 -1
  97. package/dist/facade/display-view-lens-signal.js +5 -3
  98. package/dist/facade/display-view-lens-signal.js.map +1 -1
  99. package/dist/facade/display-view.d.ts +3 -1
  100. package/dist/facade/display-view.js +1 -1
  101. package/dist/facade/display-view.js.map +1 -1
  102. package/dist/facade/fast-methods.d.ts +50 -0
  103. package/dist/facade/fast-methods.js +50 -0
  104. package/dist/facade/fast-methods.js.map +1 -0
  105. package/dist/facade/fast-resolution.d.ts +12 -0
  106. package/dist/facade/fast-resolution.js +18 -0
  107. package/dist/facade/fast-resolution.js.map +1 -0
  108. package/dist/facade/generic-lens-capture.d.ts +6 -3
  109. package/dist/facade/generic-lens-capture.js +6 -3
  110. package/dist/facade/generic-lens-capture.js.map +1 -1
  111. package/dist/facade/simulate-capture.d.ts +88 -16
  112. package/dist/facade/simulate-capture.js +279 -153
  113. package/dist/facade/simulate-capture.js.map +1 -1
  114. package/dist/facade/simulate-display-view.d.ts +3 -2
  115. package/dist/facade/simulate-display-view.js +22 -12
  116. package/dist/facade/simulate-display-view.js.map +1 -1
  117. package/dist/gpu/chart-composite-gpu.js +1 -3
  118. package/dist/gpu/chart-composite-gpu.js.map +1 -1
  119. package/dist/gpu/chart-radiance-gpu.js +1 -5
  120. package/dist/gpu/chart-radiance-gpu.js.map +1 -1
  121. package/dist/gpu/display-view-quality-gpu.d.ts +13 -1
  122. package/dist/gpu/display-view-quality-gpu.js +4 -8
  123. package/dist/gpu/display-view-quality-gpu.js.map +1 -1
  124. package/dist/gpu/display-view-speed-gpu.js +3 -25
  125. package/dist/gpu/display-view-speed-gpu.js.map +1 -1
  126. package/dist/gpu/sensor-stage-gpu.js +1 -5
  127. package/dist/gpu/sensor-stage-gpu.js.map +1 -1
  128. package/dist/gpu/webgpu-runtime.d.ts +2 -0
  129. package/dist/gpu/webgpu-runtime.js +3 -0
  130. package/dist/gpu/webgpu-runtime.js.map +1 -1
  131. package/dist/index.d.ts +11 -1
  132. package/dist/index.js +8 -0
  133. package/dist/index.js.map +1 -1
  134. package/dist/motion/camera-rotation.js +1 -6
  135. package/dist/motion/camera-rotation.js.map +1 -1
  136. package/dist/motion/capture-rotation-inverse-mapping.d.ts +12 -0
  137. package/dist/motion/capture-rotation-inverse-mapping.js +2 -2
  138. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  139. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +1 -0
  140. package/dist/motion/capture-rotation-temporal-quadrature.js +1 -1
  141. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  142. package/dist/motion/capture-rotation-trajectory.js +2 -17
  143. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  144. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +1 -0
  145. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +3 -14
  146. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  147. package/dist/motion/extended-object-projection.js +5 -40
  148. package/dist/motion/extended-object-projection.js.map +1 -1
  149. package/dist/optics/aperture-diameter.d.ts +47 -0
  150. package/dist/optics/aperture-diameter.js +50 -0
  151. package/dist/optics/aperture-diameter.js.map +1 -0
  152. package/dist/optics/atmospheric-haze.js +1 -7
  153. package/dist/optics/atmospheric-haze.js.map +1 -1
  154. package/dist/optics/brown-conrady-distortion.js +1 -7
  155. package/dist/optics/brown-conrady-distortion.js.map +1 -1
  156. package/dist/optics/complex-pupil-psf.d.ts +1 -0
  157. package/dist/optics/complex-pupil-psf.js +2 -84
  158. package/dist/optics/complex-pupil-psf.js.map +1 -1
  159. package/dist/optics/detail-limit.d.ts +182 -0
  160. package/dist/optics/detail-limit.js +336 -0
  161. package/dist/optics/detail-limit.js.map +1 -0
  162. package/dist/optics/focus-state.js +1 -11
  163. package/dist/optics/focus-state.js.map +1 -1
  164. package/dist/optics/front-of-lens-filter.d.ts +5 -0
  165. package/dist/optics/front-of-lens-filter.js +3 -65
  166. package/dist/optics/front-of-lens-filter.js.map +1 -1
  167. package/dist/optics/generic-lens-psf.d.ts +18 -2
  168. package/dist/optics/generic-lens-psf.js +25 -2
  169. package/dist/optics/generic-lens-psf.js.map +1 -1
  170. package/dist/optics/generic-nd-filter-presets.d.ts +12 -0
  171. package/dist/optics/generic-nd-filter-presets.js +48 -0
  172. package/dist/optics/generic-nd-filter-presets.js.map +1 -0
  173. package/dist/optics/illumination-vignetting.js +1 -6
  174. package/dist/optics/illumination-vignetting.js.map +1 -1
  175. package/dist/optics/lens-psf-profile.d.ts +4 -1
  176. package/dist/optics/lens-psf-profile.js +12 -111
  177. package/dist/optics/lens-psf-profile.js.map +1 -1
  178. package/dist/optics/longitudinal-chromatic-aberration.js +1 -7
  179. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -1
  180. package/dist/optics/pupil-vignetting.js +1 -7
  181. package/dist/optics/pupil-vignetting.js.map +1 -1
  182. package/dist/optics/radial-distortion.js +1 -6
  183. package/dist/optics/radial-distortion.js.map +1 -1
  184. package/dist/optics/scene-to-sensor-irradiance.d.ts +13 -0
  185. package/dist/optics/scene-to-sensor-irradiance.js +11 -96
  186. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  187. package/dist/optics/stray-light.d.ts +1 -0
  188. package/dist/optics/stray-light.js +1 -1
  189. package/dist/optics/stray-light.js.map +1 -1
  190. package/dist/optics/zernike-wavefront.js +1 -7
  191. package/dist/optics/zernike-wavefront.js.map +1 -1
  192. package/dist/output/capture-geometry.js +1 -8
  193. package/dist/output/capture-geometry.js.map +1 -1
  194. package/dist/output/crop-to-match-focal-length.d.ts +62 -0
  195. package/dist/output/crop-to-match-focal-length.js +63 -0
  196. package/dist/output/crop-to-match-focal-length.js.map +1 -0
  197. package/dist/output/developed-lens-corrections.d.ts +62 -0
  198. package/dist/output/developed-lens-corrections.js +135 -0
  199. package/dist/output/developed-lens-corrections.js.map +1 -0
  200. package/dist/output/generic-lens-corrections.d.ts +5 -7
  201. package/dist/output/generic-lens-corrections.js +11 -10
  202. package/dist/output/generic-lens-corrections.js.map +1 -1
  203. package/dist/output/geometric-transforms.js +1 -4
  204. package/dist/output/geometric-transforms.js.map +1 -1
  205. package/dist/output/lens-corrections.d.ts +12 -2
  206. package/dist/output/lens-corrections.js +22 -7
  207. package/dist/output/lens-corrections.js.map +1 -1
  208. package/dist/output/native-capture-sdr.d.ts +2 -2
  209. package/dist/output/native-capture-sdr.js +3 -2
  210. package/dist/output/native-capture-sdr.js.map +1 -1
  211. package/dist/output/print-contrast-reference.js +1 -1
  212. package/dist/output/print-contrast-reference.js.map +1 -1
  213. package/dist/output/print-size-blur-noise.d.ts +110 -0
  214. package/dist/output/print-size-blur-noise.js +138 -0
  215. package/dist/output/print-size-blur-noise.js.map +1 -0
  216. package/dist/processing/development-detail.d.ts +29 -0
  217. package/dist/processing/development-detail.js +128 -107
  218. package/dist/processing/development-detail.js.map +1 -1
  219. package/dist/schema/illumination-temporal.js +3 -72
  220. package/dist/schema/illumination-temporal.js.map +1 -1
  221. package/dist/schema/illumination.d.ts +1 -0
  222. package/dist/schema/illumination.js +2 -65
  223. package/dist/schema/illumination.js.map +1 -1
  224. package/dist/schema/scene-radiance-temporal.js +2 -14
  225. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  226. package/dist/schema/scene-radiance.js +2 -60
  227. package/dist/schema/scene-radiance.js.map +1 -1
  228. package/dist/schema/validation.d.ts +2 -0
  229. package/dist/schema/validation.js +2 -17
  230. package/dist/schema/validation.js.map +1 -1
  231. package/dist/sensor/accumulated-charge.js +2 -59
  232. package/dist/sensor/accumulated-charge.js.map +1 -1
  233. package/dist/sensor/architecture.js +1 -16
  234. package/dist/sensor/architecture.js.map +1 -1
  235. package/dist/sensor/camera-saturation-capacity.d.ts +1 -0
  236. package/dist/sensor/camera-saturation-capacity.js +3 -55
  237. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  238. package/dist/sensor/capture-color-sampling-binding.js +1 -26
  239. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  240. package/dist/sensor/capture-mode-timing.js +1 -39
  241. package/dist/sensor/capture-mode-timing.js.map +1 -1
  242. package/dist/sensor/capture-mode.js +1 -23
  243. package/dist/sensor/capture-mode.js.map +1 -1
  244. package/dist/sensor/color-sampling.js +1 -26
  245. package/dist/sensor/color-sampling.js.map +1 -1
  246. package/dist/sensor/constant-rate-temporal-integration.js +2 -46
  247. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  248. package/dist/sensor/dark-current.js +2 -45
  249. package/dist/sensor/dark-current.js.map +1 -1
  250. package/dist/sensor/eqe-electron-rate.js +2 -41
  251. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  252. package/dist/sensor/exposure-window.d.ts +7 -0
  253. package/dist/sensor/exposure-window.js +9 -24
  254. package/dist/sensor/exposure-window.js.map +1 -1
  255. package/dist/sensor/iso-gain.js +1 -7
  256. package/dist/sensor/iso-gain.js.map +1 -1
  257. package/dist/sensor/iso-signal-chain.js +1 -43
  258. package/dist/sensor/iso-signal-chain.js.map +1 -1
  259. package/dist/sensor/optical-stack.js +1 -25
  260. package/dist/sensor/optical-stack.js.map +1 -1
  261. package/dist/sensor/photon-energy.js +1 -26
  262. package/dist/sensor/photon-energy.js.map +1 -1
  263. package/dist/sensor/physical-charge-capacity.js +3 -77
  264. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  265. package/dist/sensor/radiometry-readiness.js +2 -23
  266. package/dist/sensor/radiometry-readiness.js.map +1 -1
  267. package/dist/sensor/raw-readout.d.ts +3 -0
  268. package/dist/sensor/raw-readout.js +4 -66
  269. package/dist/sensor/raw-readout.js.map +1 -1
  270. package/dist/sensor/raw-reconstruction.js +2 -64
  271. package/dist/sensor/raw-reconstruction.js.map +1 -1
  272. package/dist/sensor/readout-exposure-linkage.js +1 -9
  273. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  274. package/dist/sensor/readout-timing.js +4 -79
  275. package/dist/sensor/readout-timing.js.map +1 -1
  276. package/dist/sensor/response-application-compatibility.d.ts +2 -0
  277. package/dist/sensor/response-application-compatibility.js +4 -35
  278. package/dist/sensor/response-application-compatibility.js.map +1 -1
  279. package/dist/sensor/response-operating-range.d.ts +1 -0
  280. package/dist/sensor/response-operating-range.js +3 -79
  281. package/dist/sensor/response-operating-range.js.map +1 -1
  282. package/dist/sensor/responsivity-photocurrent.js +4 -114
  283. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  284. package/dist/sensor/sampling-aperture.js +1 -25
  285. package/dist/sensor/sampling-aperture.js.map +1 -1
  286. package/dist/sensor/sensor-characteristics.d.ts +137 -0
  287. package/dist/sensor/sensor-characteristics.js +115 -0
  288. package/dist/sensor/sensor-characteristics.js.map +1 -0
  289. package/dist/sensor/spatial-sample-reduction.js +3 -24
  290. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  291. package/dist/sensor/spatial-sampling-quadrature.js +1 -3
  292. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  293. package/dist/sensor/spatio-spectral-reduction.js +1 -18
  294. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  295. package/dist/sensor/spectral-coverage.d.ts +10 -1
  296. package/dist/sensor/spectral-coverage.js +1 -1
  297. package/dist/sensor/spectral-coverage.js.map +1 -1
  298. package/dist/sensor/spectral-quadrature.js +3 -41
  299. package/dist/sensor/spectral-quadrature.js.map +1 -1
  300. package/dist/sensor/spectral-response.js +1 -47
  301. package/dist/sensor/spectral-response.js.map +1 -1
  302. package/dist/sensor/temporal-photo-signal.d.ts +3 -0
  303. package/dist/sensor/temporal-photo-signal.js +5 -2
  304. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  305. package/dist/stabilization/camera-shake.js +1 -6
  306. package/dist/stabilization/camera-shake.js.map +1 -1
  307. package/dist/stabilization/system.d.ts +9 -0
  308. package/dist/stabilization/system.js +7 -86
  309. package/dist/stabilization/system.js.map +1 -1
  310. package/docs/AGENT_GUIDE.md +5 -0
  311. package/docs/API_REFERENCE.md +116 -3
  312. package/docs/QUICK_START.md +178 -14
  313. package/docs/USAGE.md +111 -3
  314. package/docs/api/capture-native-raw-dng.md +6 -0
  315. package/docs/api/core-version.md +1 -1
  316. package/docs/api/equipment-generic-lens-catalogue.md +7 -2
  317. package/docs/api/exports.json +203 -3
  318. package/docs/api/exposure-filtered-exposure-time.md +105 -0
  319. package/docs/api/facade-develop-joined-parts.md +32 -0
  320. package/docs/api/facade-display-view-gpu.md +5 -2
  321. package/docs/api/facade-fast-methods.md +91 -0
  322. package/docs/api/facade-simulate-capture.md +72 -16
  323. package/docs/api/facade-simulate-display-view.md +3 -2
  324. package/docs/api/optics-aperture-diameter.md +51 -0
  325. package/docs/api/optics-detail-limit.md +203 -0
  326. package/docs/api/optics-generic-nd-filter-presets.md +34 -0
  327. package/docs/api/optics-lens-psf-profile.md +3 -1
  328. package/docs/api/output-crop-to-match-focal-length.md +67 -0
  329. package/docs/api/output-developed-lens-corrections.md +12 -0
  330. package/docs/api/output-generic-lens-corrections.md +3 -10
  331. package/docs/api/output-lens-corrections.md +11 -1
  332. package/docs/api/output-print-size-blur-noise.md +115 -0
  333. package/docs/api/sensor-sensor-characteristics.md +105 -0
  334. package/llms.txt +5 -0
  335. package/package.json +1 -1
package/docs/USAGE.md CHANGED
@@ -374,7 +374,7 @@ The actual focal length stays the physical optical quantity used by projection a
374
374
  - Focus distance is not part of conventional 35 mm-equivalent focal length. A later digital/output crop and the output resolution are also excluded.
375
375
  - If a product wants to describe the final digital framing, it should label it as output framing. It should not silently replace the optical focal length or the capture-equivalent focal length.
376
376
 
377
- To render a lens by its physical focal length on any sensor, give `simulateCapture()` or the display view `lens.ideal: { focalLengthMm }` with any `lens.fNumber` within `IDEAL_LENS_LIMITS` (f/0.5–f/128, 1–4000 mm; optional `widestFNumber` and `narrowestFNumber` narrow the f-number range for the automatic exposure modes): an aberration-free thin lens that is not scaled by the crop factor, unlike `lens.prime` (see docs/QUICK_START.md, "Ideal lens at any focal length and f-number").
377
+ To render a lens by its physical focal length on any sensor, give `simulateCapture()` or the display view `lens.ideal: { focalLengthMm }` with any `lens.fNumber` within `IDEAL_LENS_LIMITS` (f/0.5–f/128, 1–4000 mm; optional `widestFNumber` and `narrowestFNumber` narrow the f-number range for the automatic exposure modes; in program the engine's program line is limited to that range, #583): an aberration-free thin lens that is not scaled by the crop factor, unlike `lens.prime` (see docs/QUICK_START.md, "Ideal lens at any focal length and f-number").
378
378
 
379
379
  `calculateImagingAreaMetrics()` provides the same canonical diagonal crop-factor calculation, independent of raster density, so other engine modules do not need to repeat that formula.
380
380
 
@@ -1058,6 +1058,30 @@ T_stack = T_1 * T_2 * ... * T_n
1058
1058
 
1059
1059
  The stack keeps each filter's identity and evidence. The combined numeric uncertainty is deliberately reported as **not propagated**, unless it is established whether the filters' errors are correlated or independent. Each filter's own uncertainty stays attached to that filter.
1060
1060
 
1061
+ ### Exposure time with an ND filter
1062
+
1063
+ `calculateFilteredExposureTime({ shutterSeconds, filter, shutterDialSeconds? })` (model `filtered-exposure-time` 1.0.0, #578) gives the shutter time that keeps the same exposure at the same f-number and ISO after adding one filter or a stack (`filter` takes one profile or an array in light-path order): `filteredShutterSeconds = shutterSeconds / T`, with `T` the stack's combined transmittance from `composeFrontOfLensFilterTransmission()`. It also returns `attenuationStops`, `exposureFactor` (`1/T`) and the full `filterTransmission`. With a `shutterDialSeconds` list (for example `GENERIC_THIRD_STOP_SHUTTER_SECONDS`) it adds `dial`: the nearest dial value in stops (the shorter on a tie), its exposure error in stops, and `clamped: "maximum"` when the exact time is longer than the longest dial value (use bulb).
1064
+
1065
+ - Exact under the linear sensor model (exposure `H = E·t`); film reciprocity failure is not modelled.
1066
+ - Nominal filters vary: a "10-stop" filter (`T = 2^-10`) gives 1/125 s → 8.19 s, an ND1000 (OD 3.0, 9.97 stops) gives exactly 8 s. The result is only as good as the profile, and is an approximation whenever a profile is.
1067
+ - Generic presets: `GENERIC_ND_FILTER_PROFILES[3]`, `[6]` and `[10]` (keys in `GENERIC_ND_FILTER_STOPS`) are frozen, unbranded, spectrally flat profiles over 380–780 nm with a transmittance of exactly 2^-N (1/8, 1/64, 1/1024). They are idealized (`scientificStatus: "approximation"`, uncertainty not quantified), and any function that takes a front-of-lens filter profile accepts them. For other filters, build a profile with `parseFrontOfLensFilterProfile()`.
1068
+ - Filters are resolved at 550 nm unless `wavelengthNanometers` is given; neutral filters do not depend on it. `incidentPolarization` matters only with a polarizer in the stack.
1069
+
1070
+ ```ts
1071
+ import {
1072
+ GENERIC_ND_FILTER_PROFILES,
1073
+ GENERIC_THIRD_STOP_SHUTTER_SECONDS,
1074
+ calculateFilteredExposureTime
1075
+ } from "@photivra/engine";
1076
+
1077
+ const { value } = calculateFilteredExposureTime({
1078
+ shutterSeconds: 1 / 125,
1079
+ filter: GENERIC_ND_FILTER_PROFILES[10],
1080
+ shutterDialSeconds: GENERIC_THIRD_STOP_SHUTTER_SECONDS
1081
+ });
1082
+ console.log(value.filteredShutterSeconds.toFixed(2), value.dial?.shutterSeconds); // 8.19 8
1083
+ ```
1084
+
1061
1085
  ### Spectral boundary
1062
1086
 
1063
1087
  Spectral filter data stays wavelength-resolved all the way through the [scene-radiance-to-sensor bridge](#scene-radiance-to-sensor-irradiance). Photivra does not turn a spectral filter into an undocumented RGB tint.
@@ -5527,6 +5551,20 @@ All modes:
5527
5551
 
5528
5552
  Flash-aware behaviour, safety shift and the program behaviour of named cameras are separate work.
5529
5553
 
5554
+ ### The capture facade's program line and the lens's f-number range (#583)
5555
+
5556
+ `simulateCapture()` and the display view in `exposure.mode: "program"` use an engine-authored generic line (f/16 1/2000 s … f/8
5557
+ 1/125 s … f/4 1.024 s, assumption `exposure.programLine`). `resolveProgramAutoExposureMode()` refuses a line whose apertures leave
5558
+ the capability range, so with a lens range that does not hold f/4–f/16 (`lens.ideal` `widestFNumber`/`narrowestFNumber`,
5559
+ `lens.prime`, `lens.catalogue`) the facade limits the line to the range first: the line's f/4 and f/16 are clamped to the range, giving the same shape with
5560
+ the aperture held at the range's end and the shutter keeping each point's exposure (t/N², camera equation H = 0.65·L·t/N²),
5561
+ still from 1/2000 s to 1.024 s. Where both lines run, the limited line's aperture is the old one clamped in log2 to the range.
5562
+ Beyond the line's ends the resolver holds them as before. A range that holds f/4–f/16, or no range, keeps the line and its
5563
+ bytes. The limited line is recorded as its profile (id `"facade-generic-program-line-lens-range"`), with node stops measured from the
5564
+ capture's exposure anchor (f/8, 1/125 s; the same N²/t at the range's aperture nearest f/8; or, #585, that aperture at the
5565
+ body's shortest shutter when the same N²/t would need a shorter one). An approximation of a generic
5566
+ program, not a manufacturer's.
5567
+
5530
5568
  ## Program Auto and Full Auto exposure
5531
5569
 
5532
5570
  Program Auto and Full Auto exposure both need a declared, versioned **program line**: a curve that says which aperture and shutter to use at each brightness level. The engine does not invent one "correct" aperture/shutter pair.
@@ -7109,6 +7147,7 @@ See [Print planning](https://github.com/Photivra/photivra/blob/main/docs/PRINT_P
7109
7147
 
7110
7148
  - `calculatePrintPlan()` says whether the native sampling is enough, and gives a compatible minimum file raster.
7111
7149
  - `calculatePrintSizeLimit()` distinguishes finite, unbounded and unavailable sampling limits.
7150
+ - `calculatePrintSizeLimitWithBlurAndNoise()` (2.20.0) gives the largest print at a viewing distance that still looks sharp and clean, counting blur and noise as well as pixels, and names the limiting factor ([Print size limit with blur and noise](https://github.com/Photivra/photivra/blob/main/docs/PRINT_PLANNING.md#print-size-limit-with-blur-and-noise)). An approximation.
7112
7151
  - Print quality and delivery are not assessed.
7113
7152
 
7114
7153
  The [regional Print detail diagnostic](https://github.com/Photivra/photivra/blob/main/docs/PRINT_DETAIL_ASSESSMENT.md) measures one declared, coherent sinusoidal fundamental in a selected linear-luminance ROI, and records the exact pipeline stage it measured. Its [validation protocol](https://github.com/Photivra/photivra/blob/main/docs/PRINT_DETAIL_VALIDATION.md) and [capability ledger](https://github.com/Photivra/photivra/blob/main/docs/validation/print-detail-capabilities.json) separate mathematical conformance from the still-blocked qualification of acquired images, renderers and perceived quality.
@@ -7478,9 +7517,12 @@ console.log(calculateGeometricFocusBreathing({
7478
7517
  `GENERIC_LENS_CATALOGUE` lists the engine's 30 generic primes (17 professional, 13 consumer, "PV 50 1.2 Pro", "PV 50 1.8"; Photivra's
7479
7518
  own designs, not real products). `resolveGenericLens` resolves one for a sensor, an f-number and a focus distance: its focal length
7480
7519
  (scaled by the crop factor), aperture range, close focus, projection and its character, Seidel aberrations, axial and lateral
7481
- colour, distortion and vignetting profiles, flare, breathing and focus scatter, each a labelled approximation.
7520
+ colour, distortion and vignetting profiles, flare, breathing, focus scatter and its bokeh (`character.bokeh`, #567: the options of
7521
+ `lens.defocus` and `calculateDefocusBokehKernel`), each a labelled approximation.
7482
7522
  `simulateGenericLensFocusError` draws a seeded autofocus error; `createGenericLensCorrectionProfile` builds the lens's generic
7483
- correction profile for `resolveLensCorrectionPlan`. `simulateCapture` renders a catalogue lens with `lens.catalogue`
7523
+ correction profile for `resolveLensCorrectionPlan`, which `simulateCapture` applies to its developed image with
7524
+ `output.lensCorrections` (#570; never to the RAW or the DNG), and which a DNG can carry for RAW editors as optional DNG opcodes with
7525
+ `output.dng.lensCorrectionOpcodes` (#587; the RAW codes unchanged). `simulateCapture` renders a catalogue lens with `lens.catalogue`
7484
7526
  ([quick start](QUICK_START.md#generic-lens-catalogue-549)); `fast: true` (or `lens: { catalogue: { kind, fast: true } }`) takes its
7485
7527
  fast method (#568), a labeled approximation that blends the PSF over a field grid, for interactive captures. Equations, tables and the
7486
7528
  chart measurements: [LENS_CATALOGUE.md](https://github.com/Photivra/photivra/blob/main/docs/LENS_CATALOGUE.md).
@@ -7742,6 +7784,12 @@ console.log(star.assumptions.filter((a) => a.kind === "default").map((a) => a.id
7742
7784
  console.log(star.request.siteInput(0).environment.optics.nominalFNumber);
7743
7785
  ```
7744
7786
 
7787
+ A capture can render its RAW in parallel parts (`output.region`, one call per part). `serializeSimulatedCaptureDngFromParts()`
7788
+ writes the whole frame's DNG from the parts, and `simulateCaptureFromParts()` (#571) develops the whole frame from them,
7789
+ including the whole-image stages `output.diffractionCorrection` and `output.sharpening` that a region refuses, with the same
7790
+ bytes as a whole-frame `simulateCapture()` and per-row progress (`diffraction-correction`, `sharpening`). See
7791
+ [Quick start, Developing a capture rendered in parts](QUICK_START.md#developing-a-capture-rendered-in-parts-571).
7792
+
7745
7793
  ### Color charts (2.14)
7746
7794
 
7747
7795
  The engine's own [color patches](https://github.com/Photivra/photivra/blob/main/docs/COLOR_PATCHES.md) are reflectance spectra lit by the capture's illuminant. Draw the
@@ -8040,3 +8088,63 @@ console.log(share.print?.blurOnPrintMm); // 0.25 mm on the print
8040
8088
  - Equal shares of the frame diagonal look the same when images are shown at the same size. `calculateBlurShareOfFrame()` does not judge whether a blur is visible.
8041
8089
 
8042
8090
  See [Physics Foundation](https://github.com/Photivra/photivra/blob/main/docs/PHYSICS_FOUNDATION.md#sensor-equivalence-f-number-area-and-blur-share).
8091
+
8092
+ ## Aperture diameter and cropping to match a longer lens
8093
+
8094
+ `calculateApertureDiameter()` gives the entrance-pupil diameter in millimetres, focal length ÷ f-number (exact by the definition of the f-number, ideal lens focused at infinity). `calculateCropToMatchFocalLength()` gives the centred crop that makes an image from a shorter lens match a longer lens's framing from the same position, and the pixels it leaves:
8095
+
8096
+ ```ts
8097
+ import { calculateApertureDiameter, calculateCropToMatchFocalLength } from "@photivra/engine";
8098
+
8099
+ console.log(calculateApertureDiameter({ focalLengthMm: 50, fNumber: 2 }).value.entrancePupilDiameterMm); // 25
8100
+ console.log(calculateApertureDiameter({ focalLengthMm: 50, fNumber: 4 }).value.entrancePupilDiameterMm); // 12.5
8101
+
8102
+ const crop = calculateCropToMatchFocalLength({
8103
+ focalLengthMm: 50,
8104
+ targetFocalLengthMm: 100,
8105
+ pixelWidth: 6000,
8106
+ pixelHeight: 4000
8107
+ }).value;
8108
+
8109
+ console.log(crop.cropFactor); // 2
8110
+ console.log(crop.pixelWidth, crop.pixelHeight); // 3000 2000
8111
+ console.log(crop.megapixels, crop.sourceMegapixels); // 6 24
8112
+ ```
8113
+
8114
+ - The aperture diameter is the entrance pupil (the aperture stop seen from the front of the lens), not the diaphragm's opening. Close focus (working f-number `N·(1 + m/P)`, pupil magnification `P`) is not modelled.
8115
+ - The crop factor `target ÷ focal length` is exact for ideal rectilinear lenses focused at infinity; at close focus the matching factor is larger, `F·(d − f)/(f·(d − F))` at object distance `d` (thin lens), which is not applied. The crop is `calculateCenteredCrop()`'s (aspect ratio kept to whole pixels), and `targetFocalLengthMm` must be at least `focalLengthMm`.
8116
+
8117
+ See [Physics Foundation](https://github.com/Photivra/photivra/blob/main/docs/PHYSICS_FOUNDATION.md#aperture-entrance-pupil-diameter).
8118
+
8119
+ ## Which limits detail: the lens or the sensor
8120
+
8121
+ `calculateDetailLimit()` (model `detail-limit` 1.0.0, #575) answers "would a sharper lens or a denser sensor help?" for given settings. It returns the optics' resolution (MTF50 in cycles/mm, from diffraction, the lens's aberrations and any defocus), the sampling's (the Nyquist frequency 1/(2p) and, with a Bayer filter, the red and blue sites' 1/(4p)), the system MTF50, and which one limits:
8122
+
8123
+ ```ts
8124
+ import { calculateDetailLimit } from "@photivra/engine";
8125
+
8126
+ const sensor = { widthMm: 36, heightMm: 24, pixelWidth: 6000 }; // 6 µm pixels
8127
+
8128
+ const stoppedDown = calculateDetailLimit({ sensor, lens: { kind: "ideal", focalLengthMm: 50 }, fNumber: 22 }).value;
8129
+ console.log(stoppedDown.limitedBy, stoppedDown.limitingFactor); // "lens" "diffraction"
8130
+ console.log(stoppedDown.optics.mtf50CyclesPerMm); // ≈ 33.4, against a Nyquist frequency of ≈ 83.3
8131
+ console.log(stoppedDown.diffractionLimitedFNumber); // ≈ 8.8: from here on diffraction limits on this sensor
8132
+
8133
+ const wideOpen = calculateDetailLimit({ sensor, lens: { kind: "catalogue", lensId: "pv-50-1.2-pro" }, fNumber: 4 }).value;
8134
+ console.log(wideOpen.limitedBy, wideOpen.limitingFactor); // "sensor" "pixel-pitch"
8135
+
8136
+ const outOfFocus = calculateDetailLimit({
8137
+ sensor,
8138
+ lens: { kind: "ideal", focalLengthMm: 50 },
8139
+ fNumber: 2,
8140
+ focus: { focusDistanceM: 3, subjectDistanceM: 2.5 }
8141
+ }).value;
8142
+ console.log(outOfFocus.limitingFactor); // "defocus"
8143
+ ```
8144
+
8145
+ - The sensor limits when the optics still pass 50 % contrast at the Nyquist frequency (`opticsToNyquistRatio ≥ 1`): a denser sensor would record finer detail. Otherwise the lens limits, through `"diffraction"` when its RMS wavefront error is within λ/14 (the Maréchal criterion), else `"aberrations"` or `"defocus"`, whichever is larger. This rule is an approximation; the MTF values are the exact scalar OTF of the stated wavefront at one wavelength (550 nm unless `wavelengthNm` is given).
8146
+ - `lens.catalogue` lenses use their generic Seidel aberrations at `fieldPosition` (0 the center, 1 the corner), so corners are softer; `lens.ideal` has none.
8147
+ - Tangential and sagittal MTF50 are both reported; the decision uses the lower one.
8148
+ - Demosaicing, sharpening, noise and motion are not included.
8149
+
8150
+ See [Physics Foundation](https://github.com/Photivra/photivra/blob/main/docs/PHYSICS_FOUNDATION.md#which-limits-detail-the-lens-or-the-sensor).
@@ -82,5 +82,11 @@ export interface SerializeNativeRawDngInput {
82
82
  capturedAtUtc?: string;
83
83
  /** Optional (2.4) caller text: description, software, copyright, comment (see the module notes). If omitted, no text is added. */
84
84
  textMetadata?: OutputTextMetadata;
85
+ /**
86
+ * Optional (#587) OpcodeList3 (tag 51022) bytes, for example `createDngLensCorrectionOpcodes(...).opcodeList3`: a big-endian DNG
87
+ * opcode list (DNG 1.3.0.0+, "Opcode List Processing") that readers apply to the demosaiced stage-3 image. Only its framing is
88
+ * checked (count, per-opcode headers and parameter sizes filling the bytes exactly). The RAW codes are unchanged. If omitted, no tag.
89
+ */
90
+ opcodeList3?: Uint8Array;
85
91
  }
86
92
  ```
@@ -11,5 +11,5 @@ version they were made with. Proof-of-concept (POC), schema and model contracts
11
11
  own versions. Release checks confirm it matches package.json and the packed package.
12
12
 
13
13
  ```ts
14
- ENGINE_API_VERSION = "2.18.0" as const
14
+ ENGINE_API_VERSION = "2.20.0" as const
15
15
  ```
@@ -69,7 +69,7 @@ export interface GenericLensCatalogueEntry {
69
69
  note: string;
70
70
  /**
71
71
  * A short plain-English summary of the lens's character (at most 40 characters, US spelling), written from its adjustments and
72
- * `note`, for lists and pickers. It describes only what the catalogue models (bokeh shape is not modeled: the defocus is a disc).
72
+ * `note`, for lists and pickers. It describes the lens's sharpness, color, distortion and falloff, not its bokeh (the same rule for every lens of a set).
73
73
  */
74
74
  summary: string;
75
75
  }
@@ -102,6 +102,11 @@ export interface GenericLensCharacter {
102
102
  breathing: { fieldOfViewChange: number; atMinimumFocus: number };
103
103
  /** Standard deviation of the autofocus error as a fraction of the depth of focus 2·N·c. */
104
104
  focusScatterDepthOfFocusFraction: number;
105
+ /**
106
+ * Bokeh character (#567) at this f-number, focus and sensor, as the options of `lens.defocus` and `calculateDefocusBokehKernel`
107
+ * (#553): blades, the resolved W040 as `sphericalAberration` (µm at this f-number) and, for fast wides and normals, `catsEye`.
108
+ */
109
+ bokeh: DefocusBokehOptions;
105
110
  }
106
111
  ```
107
112
 
@@ -127,7 +132,7 @@ export interface GenericLensCharacterValues {
127
132
  distortionMagnitude: number;
128
133
  /** Corner fall-off in stops that stays when stopped down (natural vignetting). */
129
134
  naturalVignettingStops: number;
130
- /** Extra corner fall-off in stops at the widest aperture (optical vignetting); gone two stops down. */
135
+ /** Extra corner fall-off in stops at the widest aperture (optical vignetting); gone four stops down (N = 4·N0). */
131
136
  opticalVignettingStops: number;
132
137
  /** Veiling glare: the fraction of the image's mean irradiance spread as a uniform veil. */
133
138
  veilingGlareFraction: number;
@@ -1,6 +1,6 @@
1
1
  {
2
- "packageVersion": "2.18.0",
3
- "engineApiVersion": "2.18.0",
2
+ "packageVersion": "2.20.0",
3
+ "engineApiVersion": "2.20.0",
4
4
  "exports": [
5
5
  {
6
6
  "name": "AbsoluteUncertaintyEstimate",
@@ -77,6 +77,11 @@
77
77
  "source": "src/sensor/optical-stack.ts",
78
78
  "kind": "type"
79
79
  },
80
+ {
81
+ "name": "ApertureDiameter",
82
+ "source": "src/optics/aperture-diameter.ts",
83
+ "kind": "type"
84
+ },
80
85
  {
81
86
  "name": "AperturePriorityAutoIsoExposureModeResolution",
82
87
  "source": "src/exposure/exposure-mode-resolver.ts",
@@ -362,6 +367,16 @@
362
367
  "source": "src/optics/diffraction.ts",
363
368
  "kind": "type"
364
369
  },
370
+ {
371
+ "name": "calculateApertureDiameter",
372
+ "source": "src/optics/aperture-diameter.ts",
373
+ "kind": "runtime"
374
+ },
375
+ {
376
+ "name": "CalculateApertureDiameterInput",
377
+ "source": "src/optics/aperture-diameter.ts",
378
+ "kind": "type"
379
+ },
365
380
  {
366
381
  "name": "calculateAtmosphericHaze",
367
382
  "source": "src/optics/atmospheric-haze.ts",
@@ -582,6 +597,16 @@
582
597
  "source": "src/color/illuminants.ts",
583
598
  "kind": "runtime"
584
599
  },
600
+ {
601
+ "name": "calculateCropToMatchFocalLength",
602
+ "source": "src/output/crop-to-match-focal-length.ts",
603
+ "kind": "runtime"
604
+ },
605
+ {
606
+ "name": "CalculateCropToMatchFocalLengthInput",
607
+ "source": "src/output/crop-to-match-focal-length.ts",
608
+ "kind": "type"
609
+ },
585
610
  {
586
611
  "name": "calculateDefocusBokehKernel",
587
612
  "source": "src/optics/defocus-bokeh-kernel.ts",
@@ -632,6 +657,16 @@
632
657
  "source": "src/optics/depth-of-field.ts",
633
658
  "kind": "type"
634
659
  },
660
+ {
661
+ "name": "calculateDetailLimit",
662
+ "source": "src/optics/detail-limit.ts",
663
+ "kind": "runtime"
664
+ },
665
+ {
666
+ "name": "CalculateDetailLimitInput",
667
+ "source": "src/optics/detail-limit.ts",
668
+ "kind": "type"
669
+ },
635
670
  {
636
671
  "name": "calculatedResult",
637
672
  "source": "src/core/calculation-result.ts",
@@ -732,6 +767,16 @@
732
767
  "source": "src/camera/field-of-view.ts",
733
768
  "kind": "type"
734
769
  },
770
+ {
771
+ "name": "calculateFilteredExposureTime",
772
+ "source": "src/exposure/filtered-exposure-time.ts",
773
+ "kind": "runtime"
774
+ },
775
+ {
776
+ "name": "CalculateFilteredExposureTimeInput",
777
+ "source": "src/exposure/filtered-exposure-time.ts",
778
+ "kind": "type"
779
+ },
735
780
  {
736
781
  "name": "calculateFlashGuideNumber",
737
782
  "source": "src/exposure/flash-ttl.ts",
@@ -1142,6 +1187,11 @@
1142
1187
  "source": "src/output/print-plan.ts",
1143
1188
  "kind": "runtime"
1144
1189
  },
1190
+ {
1191
+ "name": "calculatePrintSizeLimitWithBlurAndNoise",
1192
+ "source": "src/output/print-size-blur-noise.ts",
1193
+ "kind": "runtime"
1194
+ },
1145
1195
  {
1146
1196
  "name": "calculateProcessedSensorRaw",
1147
1197
  "source": "src/capture/photographic-export.ts",
@@ -2742,6 +2792,11 @@
2742
2792
  "source": "src/optics/zernike-wavefront.ts",
2743
2793
  "kind": "type"
2744
2794
  },
2795
+ {
2796
+ "name": "CropToMatchFocalLength",
2797
+ "source": "src/output/crop-to-match-focal-length.ts",
2798
+ "kind": "type"
2799
+ },
2745
2800
  {
2746
2801
  "name": "DeadLeavesChartScene",
2747
2802
  "source": "src/facade/chart-scenes.ts",
@@ -2812,6 +2867,56 @@
2812
2867
  "source": "src/optics/depth-of-field.ts",
2813
2868
  "kind": "type"
2814
2869
  },
2870
+ {
2871
+ "name": "DETAIL_LIMIT_LIMITS",
2872
+ "source": "src/optics/detail-limit.ts",
2873
+ "kind": "runtime"
2874
+ },
2875
+ {
2876
+ "name": "DetailLimit",
2877
+ "source": "src/optics/detail-limit.ts",
2878
+ "kind": "type"
2879
+ },
2880
+ {
2881
+ "name": "DetailLimitBasis",
2882
+ "source": "src/optics/detail-limit.ts",
2883
+ "kind": "type"
2884
+ },
2885
+ {
2886
+ "name": "DetailLimitCatalogueLens",
2887
+ "source": "src/optics/detail-limit.ts",
2888
+ "kind": "type"
2889
+ },
2890
+ {
2891
+ "name": "DetailLimitedBy",
2892
+ "source": "src/optics/detail-limit.ts",
2893
+ "kind": "type"
2894
+ },
2895
+ {
2896
+ "name": "DetailLimitIdealLens",
2897
+ "source": "src/optics/detail-limit.ts",
2898
+ "kind": "type"
2899
+ },
2900
+ {
2901
+ "name": "DetailLimitingFactor",
2902
+ "source": "src/optics/detail-limit.ts",
2903
+ "kind": "type"
2904
+ },
2905
+ {
2906
+ "name": "DetailLimitOptics",
2907
+ "source": "src/optics/detail-limit.ts",
2908
+ "kind": "type"
2909
+ },
2910
+ {
2911
+ "name": "DetailLimitSampling",
2912
+ "source": "src/optics/detail-limit.ts",
2913
+ "kind": "type"
2914
+ },
2915
+ {
2916
+ "name": "DetailLimitSystem",
2917
+ "source": "src/optics/detail-limit.ts",
2918
+ "kind": "type"
2919
+ },
2815
2920
  {
2816
2921
  "name": "DIFFRACTION_LIMITED_PSF_PROFILE_LIMITS",
2817
2922
  "source": "src/optics/diffraction-psf-profile.ts",
@@ -3317,6 +3422,21 @@
3317
3422
  "source": "src/camera/field-of-view.ts",
3318
3423
  "kind": "type"
3319
3424
  },
3425
+ {
3426
+ "name": "FILTERED_EXPOSURE_DEFAULT_WAVELENGTH_NANOMETERS",
3427
+ "source": "src/exposure/filtered-exposure-time.ts",
3428
+ "kind": "runtime"
3429
+ },
3430
+ {
3431
+ "name": "FilteredExposureDialSetting",
3432
+ "source": "src/exposure/filtered-exposure-time.ts",
3433
+ "kind": "type"
3434
+ },
3435
+ {
3436
+ "name": "FilteredExposureTime",
3437
+ "source": "src/exposure/filtered-exposure-time.ts",
3438
+ "kind": "type"
3439
+ },
3320
3440
  {
3321
3441
  "name": "FixedMultiFrameCaptureAcquisition",
3322
3442
  "source": "src/sensor/capture-mode.ts",
@@ -3584,7 +3704,7 @@
3584
3704
  },
3585
3705
  {
3586
3706
  "name": "GENERIC_LENS_CORRECTION_CHANNEL_WAVELENGTHS_NM",
3587
- "source": "src/output/generic-lens-corrections.ts",
3707
+ "source": "src/output/developed-lens-corrections.ts",
3588
3708
  "kind": "runtime"
3589
3709
  },
3590
3710
  {
@@ -3597,6 +3717,16 @@
3597
3717
  "source": "src/equipment/generic-lens-catalogue.ts",
3598
3718
  "kind": "runtime"
3599
3719
  },
3720
+ {
3721
+ "name": "GENERIC_ND_FILTER_PROFILES",
3722
+ "source": "src/optics/generic-nd-filter-presets.ts",
3723
+ "kind": "runtime"
3724
+ },
3725
+ {
3726
+ "name": "GENERIC_ND_FILTER_STOPS",
3727
+ "source": "src/optics/generic-nd-filter-presets.ts",
3728
+ "kind": "runtime"
3729
+ },
3600
3730
  {
3601
3731
  "name": "GENERIC_PRIME_EQUIVALENT_FOCAL_LENGTHS_MM",
3602
3732
  "source": "src/equipment/generic-prime-lenses.ts",
@@ -3747,6 +3877,11 @@
3747
3877
  "source": "src/equipment/generic-lens-catalogue.ts",
3748
3878
  "kind": "type"
3749
3879
  },
3880
+ {
3881
+ "name": "GenericNdFilterStops",
3882
+ "source": "src/optics/generic-nd-filter-presets.ts",
3883
+ "kind": "type"
3884
+ },
3750
3885
  {
3751
3886
  "name": "GenericOpticalEvidence",
3752
3887
  "source": "src/optics/profile-contract.ts",
@@ -5927,6 +6062,11 @@
5927
6062
  "source": "src/output/print-region-statistics.ts",
5928
6063
  "kind": "runtime"
5929
6064
  },
6065
+ {
6066
+ "name": "PrintBlurInput",
6067
+ "source": "src/output/print-size-blur-noise.ts",
6068
+ "kind": "type"
6069
+ },
5930
6070
  {
5931
6071
  "name": "PrintContrastReference",
5932
6072
  "source": "src/output/print-contrast-reference.ts",
@@ -5952,6 +6092,11 @@
5952
6092
  "source": "src/output/print-plan.ts",
5953
6093
  "kind": "type"
5954
6094
  },
6095
+ {
6096
+ "name": "PrintImageMm",
6097
+ "source": "src/output/print-size-blur-noise.ts",
6098
+ "kind": "type"
6099
+ },
5955
6100
  {
5956
6101
  "name": "PrintJpegInput",
5957
6102
  "source": "src/output/print-jpeg.ts",
@@ -6007,6 +6152,11 @@
6007
6152
  "source": "src/output/print-plan.ts",
6008
6153
  "kind": "type"
6009
6154
  },
6155
+ {
6156
+ "name": "PrintNoiseInput",
6157
+ "source": "src/output/print-size-blur-noise.ts",
6158
+ "kind": "type"
6159
+ },
6010
6160
  {
6011
6161
  "name": "PrintPlan",
6012
6162
  "source": "src/output/print-plan.ts",
@@ -6072,6 +6222,11 @@
6072
6222
  "source": "src/output/print-plan.ts",
6073
6223
  "kind": "type"
6074
6224
  },
6225
+ {
6226
+ "name": "PrintSharpCleanCriterion",
6227
+ "source": "src/output/print-size-blur-noise.ts",
6228
+ "kind": "type"
6229
+ },
6075
6230
  {
6076
6231
  "name": "PrintSinusoidalMeasurement",
6077
6232
  "source": "src/output/print-detail.ts",
@@ -6092,6 +6247,16 @@
6092
6247
  "source": "src/output/print-plan.ts",
6093
6248
  "kind": "type"
6094
6249
  },
6250
+ {
6251
+ "name": "PrintSizeLimitWithBlurAndNoise",
6252
+ "source": "src/output/print-size-blur-noise.ts",
6253
+ "kind": "type"
6254
+ },
6255
+ {
6256
+ "name": "PrintSizeLimitWithBlurAndNoiseInput",
6257
+ "source": "src/output/print-size-blur-noise.ts",
6258
+ "kind": "type"
6259
+ },
6095
6260
  {
6096
6261
  "name": "PROCESSED_SENSOR_RAW_MODEL_VERSION",
6097
6262
  "source": "src/capture/photographic-export.ts",
@@ -8472,6 +8637,11 @@
8472
8637
  "source": "src/facade/simulate-capture.ts",
8473
8638
  "kind": "runtime"
8474
8639
  },
8640
+ {
8641
+ "name": "SIMULATE_CAPTURE_FAST_METHODS",
8642
+ "source": "src/facade/fast-methods.ts",
8643
+ "kind": "runtime"
8644
+ },
8475
8645
  {
8476
8646
  "name": "SIMULATE_CAPTURE_FAST_OPTIONS",
8477
8647
  "source": "src/facade/simulate-capture.ts",
@@ -8562,6 +8732,11 @@
8562
8732
  "source": "src/facade/simulate-capture.ts",
8563
8733
  "kind": "type"
8564
8734
  },
8735
+ {
8736
+ "name": "SimulateCaptureFastMethod",
8737
+ "source": "src/facade/fast-methods.ts",
8738
+ "kind": "type"
8739
+ },
8565
8740
  {
8566
8741
  "name": "SimulateCaptureFastOption",
8567
8742
  "source": "src/facade/simulate-capture.ts",
@@ -8572,11 +8747,21 @@
8572
8747
  "source": "src/facade/simulate-capture.ts",
8573
8748
  "kind": "type"
8574
8749
  },
8750
+ {
8751
+ "name": "simulateCaptureFromParts",
8752
+ "source": "src/facade/develop-joined-parts.ts",
8753
+ "kind": "runtime"
8754
+ },
8575
8755
  {
8576
8756
  "name": "SimulateCaptureLensCatalogueRecord",
8577
8757
  "source": "src/facade/simulate-capture.ts",
8578
8758
  "kind": "type"
8579
8759
  },
8760
+ {
8761
+ "name": "SimulateCaptureLensCorrections",
8762
+ "source": "src/facade/simulate-capture.ts",
8763
+ "kind": "type"
8764
+ },
8580
8765
  {
8581
8766
  "name": "SimulateCaptureLensDistortion",
8582
8767
  "source": "src/facade/simulate-capture.ts",
@@ -8592,6 +8777,11 @@
8592
8777
  "source": "src/facade/simulate-capture.ts",
8593
8778
  "kind": "type"
8594
8779
  },
8780
+ {
8781
+ "name": "SimulateCaptureNoiseComponents",
8782
+ "source": "src/sensor/sensor-characteristics.ts",
8783
+ "kind": "type"
8784
+ },
8595
8785
  {
8596
8786
  "name": "SimulateCaptureOptions",
8597
8787
  "source": "src/facade/simulate-capture.ts",
@@ -8622,6 +8812,16 @@
8622
8812
  "source": "src/facade/simulate-capture.ts",
8623
8813
  "kind": "type"
8624
8814
  },
8815
+ {
8816
+ "name": "SimulateCaptureSensorCharacteristics",
8817
+ "source": "src/sensor/sensor-characteristics.ts",
8818
+ "kind": "type"
8819
+ },
8820
+ {
8821
+ "name": "SimulateCaptureSensorReport",
8822
+ "source": "src/sensor/sensor-characteristics.ts",
8823
+ "kind": "type"
8824
+ },
8625
8825
  {
8626
8826
  "name": "SimulateCaptureSharpening",
8627
8827
  "source": "src/facade/simulate-capture.ts",