@photivra/engine 2.17.0 → 2.19.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 (288) hide show
  1. package/CHANGELOG.md +116 -1
  2. package/CITATION.cff +1 -1
  3. package/README.md +6 -6
  4. package/SECURITY.md +1 -1
  5. package/dist/camera/sensor-equivalence.d.ts +156 -0
  6. package/dist/camera/sensor-equivalence.js +208 -0
  7. package/dist/camera/sensor-equivalence.js.map +1 -0
  8. package/dist/capture/focus-control.js +2 -75
  9. package/dist/capture/focus-control.js.map +1 -1
  10. package/dist/capture/native-environment-lean.d.ts +1 -0
  11. package/dist/capture/native-environment-lean.js +1 -1
  12. package/dist/capture/native-environment-lean.js.map +1 -1
  13. package/dist/capture/native-environment-optical-stage.d.ts +1 -0
  14. package/dist/capture/native-environment-optical-stage.js +2 -5
  15. package/dist/capture/native-environment-optical-stage.js.map +1 -1
  16. package/dist/capture/native-environment-raw.js +1 -5
  17. package/dist/capture/native-environment-raw.js.map +1 -1
  18. package/dist/capture/native-environment-tabulated.d.ts +5 -0
  19. package/dist/capture/native-environment-tabulated.js +1 -1
  20. package/dist/capture/native-environment-tabulated.js.map +1 -1
  21. package/dist/capture/release-sequence.js +2 -47
  22. package/dist/capture/release-sequence.js.map +1 -1
  23. package/dist/color/white-balance.d.ts +2 -0
  24. package/dist/color/white-balance.js +3 -56
  25. package/dist/color/white-balance.js.map +1 -1
  26. package/dist/composition/image-formation-plan.d.ts +1 -0
  27. package/dist/composition/image-formation-plan.js +3 -49
  28. package/dist/composition/image-formation-plan.js.map +1 -1
  29. package/dist/core/evidence-provenance.js +1 -16
  30. package/dist/core/evidence-provenance.js.map +1 -1
  31. package/dist/core/record-validation.d.ts +54 -0
  32. package/dist/core/record-validation.js +176 -0
  33. package/dist/core/record-validation.js.map +1 -1
  34. package/dist/core/scientific-assurance.js +1 -18
  35. package/dist/core/scientific-assurance.js.map +1 -1
  36. package/dist/core/shared-helpers.d.ts +33 -0
  37. package/dist/core/shared-helpers.js +34 -0
  38. package/dist/core/shared-helpers.js.map +1 -0
  39. package/dist/core/spectral-composition.js +1 -36
  40. package/dist/core/spectral-composition.js.map +1 -1
  41. package/dist/core/spectral.js +1 -19
  42. package/dist/core/spectral.js.map +1 -1
  43. package/dist/core/version.d.ts +1 -1
  44. package/dist/core/version.js +1 -1
  45. package/dist/core/version.js.map +1 -1
  46. package/dist/equipment/exposure-capabilities.d.ts +1 -0
  47. package/dist/equipment/exposure-capabilities.js +2 -36
  48. package/dist/equipment/exposure-capabilities.js.map +1 -1
  49. package/dist/equipment/ideal-lens.d.ts +25 -0
  50. package/dist/equipment/ideal-lens.js +21 -0
  51. package/dist/equipment/ideal-lens.js.map +1 -0
  52. package/dist/equipment/iso-capabilities.js +2 -49
  53. package/dist/equipment/iso-capabilities.js.map +1 -1
  54. package/dist/equipment/metering-capabilities.js +1 -26
  55. package/dist/equipment/metering-capabilities.js.map +1 -1
  56. package/dist/equipment/release-capabilities.js +1 -53
  57. package/dist/equipment/release-capabilities.js.map +1 -1
  58. package/dist/exposure/auto-iso-slowest-shutter.js +1 -7
  59. package/dist/exposure/auto-iso-slowest-shutter.js.map +1 -1
  60. package/dist/exposure/exposure-duration-control.js +1 -16
  61. package/dist/exposure/exposure-duration-control.js.map +1 -1
  62. package/dist/exposure/exposure-mode-resolver.js +1 -17
  63. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  64. package/dist/exposure/filtered-exposure-time.d.ts +93 -0
  65. package/dist/exposure/filtered-exposure-time.js +129 -0
  66. package/dist/exposure/filtered-exposure-time.js.map +1 -0
  67. package/dist/exposure/flash-ttl.d.ts +1 -0
  68. package/dist/exposure/flash-ttl.js +1 -1
  69. package/dist/exposure/flash-ttl.js.map +1 -1
  70. package/dist/exposure/flash.js +1 -49
  71. package/dist/exposure/flash.js.map +1 -1
  72. package/dist/exposure/metering-scene-radiance.js +1 -25
  73. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  74. package/dist/exposure/metering-target.js +1 -30
  75. package/dist/exposure/metering-target.js.map +1 -1
  76. package/dist/exposure/metering-temporal.js +1 -8
  77. package/dist/exposure/metering-temporal.js.map +1 -1
  78. package/dist/exposure/metering.js +1 -72
  79. package/dist/exposure/metering.js.map +1 -1
  80. package/dist/exposure/program-line.js +1 -45
  81. package/dist/exposure/program-line.js.map +1 -1
  82. package/dist/facade/catalogue-lens-signal.d.ts +94 -0
  83. package/dist/facade/catalogue-lens-signal.js +362 -0
  84. package/dist/facade/catalogue-lens-signal.js.map +1 -0
  85. package/dist/facade/defocus-image-space-provider.js +5 -2
  86. package/dist/facade/defocus-image-space-provider.js.map +1 -1
  87. package/dist/facade/develop-joined-parts.d.ts +29 -0
  88. package/dist/facade/develop-joined-parts.js +33 -0
  89. package/dist/facade/develop-joined-parts.js.map +1 -0
  90. package/dist/facade/display-view-lens-signal.d.ts +32 -1
  91. package/dist/facade/display-view-lens-signal.js +85 -10
  92. package/dist/facade/display-view-lens-signal.js.map +1 -1
  93. package/dist/facade/expected-signal-setup.d.ts +8 -0
  94. package/dist/facade/expected-signal-setup.js +7 -0
  95. package/dist/facade/expected-signal-setup.js.map +1 -1
  96. package/dist/facade/expected-signal.d.ts +5 -0
  97. package/dist/facade/expected-signal.js +5 -1
  98. package/dist/facade/expected-signal.js.map +1 -1
  99. package/dist/facade/generic-lens-capture.d.ts +5 -2
  100. package/dist/facade/generic-lens-capture.js +5 -2
  101. package/dist/facade/generic-lens-capture.js.map +1 -1
  102. package/dist/facade/simulate-capture.d.ts +67 -8
  103. package/dist/facade/simulate-capture.js +262 -126
  104. package/dist/facade/simulate-capture.js.map +1 -1
  105. package/dist/facade/simulate-display-view.js +1 -1
  106. package/dist/facade/simulate-display-view.js.map +1 -1
  107. package/dist/gpu/chart-composite-gpu.js +1 -3
  108. package/dist/gpu/chart-composite-gpu.js.map +1 -1
  109. package/dist/gpu/chart-radiance-gpu.js +1 -5
  110. package/dist/gpu/chart-radiance-gpu.js.map +1 -1
  111. package/dist/gpu/display-view-quality-gpu.d.ts +13 -1
  112. package/dist/gpu/display-view-quality-gpu.js +4 -8
  113. package/dist/gpu/display-view-quality-gpu.js.map +1 -1
  114. package/dist/gpu/display-view-speed-gpu.js +3 -25
  115. package/dist/gpu/display-view-speed-gpu.js.map +1 -1
  116. package/dist/gpu/sensor-stage-gpu.js +1 -5
  117. package/dist/gpu/sensor-stage-gpu.js.map +1 -1
  118. package/dist/gpu/webgpu-runtime.d.ts +2 -0
  119. package/dist/gpu/webgpu-runtime.js +3 -0
  120. package/dist/gpu/webgpu-runtime.js.map +1 -1
  121. package/dist/index.d.ts +6 -1
  122. package/dist/index.js +5 -0
  123. package/dist/index.js.map +1 -1
  124. package/dist/motion/camera-rotation.js +1 -6
  125. package/dist/motion/camera-rotation.js.map +1 -1
  126. package/dist/motion/capture-rotation-inverse-mapping.d.ts +12 -0
  127. package/dist/motion/capture-rotation-inverse-mapping.js +2 -2
  128. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  129. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +1 -0
  130. package/dist/motion/capture-rotation-temporal-quadrature.js +1 -1
  131. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  132. package/dist/motion/capture-rotation-trajectory.js +2 -17
  133. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  134. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +1 -0
  135. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +3 -14
  136. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  137. package/dist/motion/extended-object-projection.js +5 -40
  138. package/dist/motion/extended-object-projection.js.map +1 -1
  139. package/dist/optics/atmospheric-haze.js +1 -7
  140. package/dist/optics/atmospheric-haze.js.map +1 -1
  141. package/dist/optics/brown-conrady-distortion.js +1 -7
  142. package/dist/optics/brown-conrady-distortion.js.map +1 -1
  143. package/dist/optics/complex-pupil-psf.d.ts +1 -0
  144. package/dist/optics/complex-pupil-psf.js +2 -84
  145. package/dist/optics/complex-pupil-psf.js.map +1 -1
  146. package/dist/optics/focus-state.js +1 -11
  147. package/dist/optics/focus-state.js.map +1 -1
  148. package/dist/optics/front-of-lens-filter.d.ts +5 -0
  149. package/dist/optics/front-of-lens-filter.js +3 -65
  150. package/dist/optics/front-of-lens-filter.js.map +1 -1
  151. package/dist/optics/generic-nd-filter-presets.d.ts +12 -0
  152. package/dist/optics/generic-nd-filter-presets.js +48 -0
  153. package/dist/optics/generic-nd-filter-presets.js.map +1 -0
  154. package/dist/optics/illumination-vignetting.js +1 -6
  155. package/dist/optics/illumination-vignetting.js.map +1 -1
  156. package/dist/optics/lens-psf-profile.d.ts +4 -1
  157. package/dist/optics/lens-psf-profile.js +12 -111
  158. package/dist/optics/lens-psf-profile.js.map +1 -1
  159. package/dist/optics/longitudinal-chromatic-aberration.js +1 -7
  160. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -1
  161. package/dist/optics/pupil-vignetting.js +1 -7
  162. package/dist/optics/pupil-vignetting.js.map +1 -1
  163. package/dist/optics/radial-distortion.js +1 -6
  164. package/dist/optics/radial-distortion.js.map +1 -1
  165. package/dist/optics/scene-to-sensor-irradiance.js +4 -96
  166. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  167. package/dist/optics/stray-light.d.ts +1 -0
  168. package/dist/optics/stray-light.js +1 -1
  169. package/dist/optics/stray-light.js.map +1 -1
  170. package/dist/optics/zernike-wavefront.js +1 -7
  171. package/dist/optics/zernike-wavefront.js.map +1 -1
  172. package/dist/output/capture-geometry.js +1 -8
  173. package/dist/output/capture-geometry.js.map +1 -1
  174. package/dist/output/developed-lens-corrections.d.ts +62 -0
  175. package/dist/output/developed-lens-corrections.js +135 -0
  176. package/dist/output/developed-lens-corrections.js.map +1 -0
  177. package/dist/output/generic-lens-corrections.d.ts +2 -6
  178. package/dist/output/generic-lens-corrections.js +3 -6
  179. package/dist/output/generic-lens-corrections.js.map +1 -1
  180. package/dist/output/geometric-transforms.js +1 -4
  181. package/dist/output/geometric-transforms.js.map +1 -1
  182. package/dist/output/native-capture-sdr.d.ts +2 -2
  183. package/dist/output/native-capture-sdr.js +3 -2
  184. package/dist/output/native-capture-sdr.js.map +1 -1
  185. package/dist/processing/development-detail.d.ts +29 -0
  186. package/dist/processing/development-detail.js +128 -107
  187. package/dist/processing/development-detail.js.map +1 -1
  188. package/dist/schema/illumination-temporal.js +3 -72
  189. package/dist/schema/illumination-temporal.js.map +1 -1
  190. package/dist/schema/illumination.d.ts +1 -0
  191. package/dist/schema/illumination.js +2 -65
  192. package/dist/schema/illumination.js.map +1 -1
  193. package/dist/schema/scene-radiance-temporal.js +2 -14
  194. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  195. package/dist/schema/scene-radiance.js +2 -60
  196. package/dist/schema/scene-radiance.js.map +1 -1
  197. package/dist/schema/validation.d.ts +2 -0
  198. package/dist/schema/validation.js +2 -17
  199. package/dist/schema/validation.js.map +1 -1
  200. package/dist/sensor/accumulated-charge.js +2 -59
  201. package/dist/sensor/accumulated-charge.js.map +1 -1
  202. package/dist/sensor/architecture.js +1 -16
  203. package/dist/sensor/architecture.js.map +1 -1
  204. package/dist/sensor/camera-saturation-capacity.d.ts +1 -0
  205. package/dist/sensor/camera-saturation-capacity.js +3 -55
  206. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  207. package/dist/sensor/capture-color-sampling-binding.js +1 -26
  208. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  209. package/dist/sensor/capture-mode-timing.js +1 -39
  210. package/dist/sensor/capture-mode-timing.js.map +1 -1
  211. package/dist/sensor/capture-mode.js +1 -23
  212. package/dist/sensor/capture-mode.js.map +1 -1
  213. package/dist/sensor/color-sampling.js +1 -26
  214. package/dist/sensor/color-sampling.js.map +1 -1
  215. package/dist/sensor/constant-rate-temporal-integration.js +2 -46
  216. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  217. package/dist/sensor/dark-current.js +2 -45
  218. package/dist/sensor/dark-current.js.map +1 -1
  219. package/dist/sensor/eqe-electron-rate.js +2 -35
  220. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  221. package/dist/sensor/exposure-window.d.ts +5 -0
  222. package/dist/sensor/exposure-window.js +7 -22
  223. package/dist/sensor/exposure-window.js.map +1 -1
  224. package/dist/sensor/iso-gain.js +1 -7
  225. package/dist/sensor/iso-gain.js.map +1 -1
  226. package/dist/sensor/iso-signal-chain.js +1 -43
  227. package/dist/sensor/iso-signal-chain.js.map +1 -1
  228. package/dist/sensor/optical-stack.js +1 -25
  229. package/dist/sensor/optical-stack.js.map +1 -1
  230. package/dist/sensor/photon-energy.js +1 -26
  231. package/dist/sensor/photon-energy.js.map +1 -1
  232. package/dist/sensor/physical-charge-capacity.js +3 -77
  233. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  234. package/dist/sensor/radiometry-readiness.js +2 -23
  235. package/dist/sensor/radiometry-readiness.js.map +1 -1
  236. package/dist/sensor/raw-readout.d.ts +3 -0
  237. package/dist/sensor/raw-readout.js +4 -66
  238. package/dist/sensor/raw-readout.js.map +1 -1
  239. package/dist/sensor/raw-reconstruction.js +2 -64
  240. package/dist/sensor/raw-reconstruction.js.map +1 -1
  241. package/dist/sensor/readout-exposure-linkage.js +1 -9
  242. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  243. package/dist/sensor/readout-timing.js +3 -57
  244. package/dist/sensor/readout-timing.js.map +1 -1
  245. package/dist/sensor/response-application-compatibility.d.ts +2 -0
  246. package/dist/sensor/response-application-compatibility.js +3 -29
  247. package/dist/sensor/response-application-compatibility.js.map +1 -1
  248. package/dist/sensor/response-operating-range.d.ts +1 -0
  249. package/dist/sensor/response-operating-range.js +3 -79
  250. package/dist/sensor/response-operating-range.js.map +1 -1
  251. package/dist/sensor/responsivity-photocurrent.js +4 -108
  252. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  253. package/dist/sensor/sampling-aperture.js +1 -25
  254. package/dist/sensor/sampling-aperture.js.map +1 -1
  255. package/dist/sensor/spatial-sample-reduction.js +2 -19
  256. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  257. package/dist/sensor/spatial-sampling-quadrature.js +1 -3
  258. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  259. package/dist/sensor/spatio-spectral-reduction.js +1 -18
  260. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  261. package/dist/sensor/spectral-coverage.d.ts +10 -1
  262. package/dist/sensor/spectral-coverage.js +1 -1
  263. package/dist/sensor/spectral-coverage.js.map +1 -1
  264. package/dist/sensor/spectral-quadrature.js +2 -35
  265. package/dist/sensor/spectral-quadrature.js.map +1 -1
  266. package/dist/sensor/spectral-response.js +1 -47
  267. package/dist/sensor/spectral-response.js.map +1 -1
  268. package/dist/stabilization/camera-shake.js +1 -6
  269. package/dist/stabilization/camera-shake.js.map +1 -1
  270. package/dist/stabilization/system.js +2 -80
  271. package/dist/stabilization/system.js.map +1 -1
  272. package/docs/AGENT_GUIDE.md +4 -0
  273. package/docs/API_REFERENCE.md +69 -2
  274. package/docs/QUICK_START.md +136 -6
  275. package/docs/USAGE.md +89 -3
  276. package/docs/api/camera-sensor-equivalence.md +209 -0
  277. package/docs/api/core-version.md +1 -1
  278. package/docs/api/equipment-ideal-lens.md +26 -0
  279. package/docs/api/exports.json +118 -3
  280. package/docs/api/exposure-filtered-exposure-time.md +105 -0
  281. package/docs/api/facade-develop-joined-parts.md +32 -0
  282. package/docs/api/facade-simulate-capture.md +62 -8
  283. package/docs/api/optics-generic-nd-filter-presets.md +34 -0
  284. package/docs/api/optics-lens-psf-profile.md +3 -1
  285. package/docs/api/output-developed-lens-corrections.md +12 -0
  286. package/docs/api/output-generic-lens-corrections.md +0 -9
  287. package/llms.txt +3 -0
  288. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
- "packageVersion": "2.17.0",
3
- "engineApiVersion": "2.17.0",
2
+ "packageVersion": "2.19.0",
3
+ "engineApiVersion": "2.19.0",
4
4
  "exports": [
5
5
  {
6
6
  "name": "AbsoluteUncertaintyEstimate",
@@ -282,6 +282,16 @@
282
282
  "source": "src/sensor/local-exposure-binding.ts",
283
283
  "kind": "type"
284
284
  },
285
+ {
286
+ "name": "BlurShareOfFrame",
287
+ "source": "src/camera/sensor-equivalence.ts",
288
+ "kind": "type"
289
+ },
290
+ {
291
+ "name": "BlurShareOfPrint",
292
+ "source": "src/camera/sensor-equivalence.ts",
293
+ "kind": "type"
294
+ },
285
295
  {
286
296
  "name": "BOLTZMANN_CONSTANT_JOULES_PER_KELVIN",
287
297
  "source": "src/color/illuminants.ts",
@@ -367,6 +377,16 @@
367
377
  "source": "src/facade/chart-scenes.ts",
368
378
  "kind": "runtime"
369
379
  },
380
+ {
381
+ "name": "calculateBlurShareOfFrame",
382
+ "source": "src/camera/sensor-equivalence.ts",
383
+ "kind": "runtime"
384
+ },
385
+ {
386
+ "name": "CalculateBlurShareOfFrameInput",
387
+ "source": "src/camera/sensor-equivalence.ts",
388
+ "kind": "type"
389
+ },
370
390
  {
371
391
  "name": "calculateBrownConradyDistortionMapping",
372
392
  "source": "src/optics/brown-conrady-distortion.ts",
@@ -712,6 +732,16 @@
712
732
  "source": "src/camera/field-of-view.ts",
713
733
  "kind": "type"
714
734
  },
735
+ {
736
+ "name": "calculateFilteredExposureTime",
737
+ "source": "src/exposure/filtered-exposure-time.ts",
738
+ "kind": "runtime"
739
+ },
740
+ {
741
+ "name": "CalculateFilteredExposureTimeInput",
742
+ "source": "src/exposure/filtered-exposure-time.ts",
743
+ "kind": "type"
744
+ },
715
745
  {
716
746
  "name": "calculateFlashGuideNumber",
717
747
  "source": "src/exposure/flash-ttl.ts",
@@ -1287,6 +1317,16 @@
1287
1317
  "source": "src/sensor/eqe-temporal-exposure.ts",
1288
1318
  "kind": "type"
1289
1319
  },
1320
+ {
1321
+ "name": "calculateSensorEquivalence",
1322
+ "source": "src/camera/sensor-equivalence.ts",
1323
+ "kind": "runtime"
1324
+ },
1325
+ {
1326
+ "name": "CalculateSensorEquivalenceInput",
1327
+ "source": "src/camera/sensor-equivalence.ts",
1328
+ "kind": "type"
1329
+ },
1290
1330
  {
1291
1331
  "name": "calculateSensorFixedPatternSite",
1292
1332
  "source": "src/sensor/fixed-pattern-noise.ts",
@@ -2957,6 +2997,16 @@
2957
2997
  "source": "src/capture/environment-raw-producer.ts",
2958
2998
  "kind": "type"
2959
2999
  },
3000
+ {
3001
+ "name": "EquivalenceExactness",
3002
+ "source": "src/camera/sensor-equivalence.ts",
3003
+ "kind": "type"
3004
+ },
3005
+ {
3006
+ "name": "EquivalenceValueBasis",
3007
+ "source": "src/camera/sensor-equivalence.ts",
3008
+ "kind": "type"
3009
+ },
2960
3010
  {
2961
3011
  "name": "EquivalentFocalLength35Mm",
2962
3012
  "source": "src/camera/equivalent-focal-length.ts",
@@ -3277,6 +3327,21 @@
3277
3327
  "source": "src/camera/field-of-view.ts",
3278
3328
  "kind": "type"
3279
3329
  },
3330
+ {
3331
+ "name": "FILTERED_EXPOSURE_DEFAULT_WAVELENGTH_NANOMETERS",
3332
+ "source": "src/exposure/filtered-exposure-time.ts",
3333
+ "kind": "runtime"
3334
+ },
3335
+ {
3336
+ "name": "FilteredExposureDialSetting",
3337
+ "source": "src/exposure/filtered-exposure-time.ts",
3338
+ "kind": "type"
3339
+ },
3340
+ {
3341
+ "name": "FilteredExposureTime",
3342
+ "source": "src/exposure/filtered-exposure-time.ts",
3343
+ "kind": "type"
3344
+ },
3280
3345
  {
3281
3346
  "name": "FixedMultiFrameCaptureAcquisition",
3282
3347
  "source": "src/sensor/capture-mode.ts",
@@ -3544,7 +3609,7 @@
3544
3609
  },
3545
3610
  {
3546
3611
  "name": "GENERIC_LENS_CORRECTION_CHANNEL_WAVELENGTHS_NM",
3547
- "source": "src/output/generic-lens-corrections.ts",
3612
+ "source": "src/output/developed-lens-corrections.ts",
3548
3613
  "kind": "runtime"
3549
3614
  },
3550
3615
  {
@@ -3557,6 +3622,16 @@
3557
3622
  "source": "src/equipment/generic-lens-catalogue.ts",
3558
3623
  "kind": "runtime"
3559
3624
  },
3625
+ {
3626
+ "name": "GENERIC_ND_FILTER_PROFILES",
3627
+ "source": "src/optics/generic-nd-filter-presets.ts",
3628
+ "kind": "runtime"
3629
+ },
3630
+ {
3631
+ "name": "GENERIC_ND_FILTER_STOPS",
3632
+ "source": "src/optics/generic-nd-filter-presets.ts",
3633
+ "kind": "runtime"
3634
+ },
3560
3635
  {
3561
3636
  "name": "GENERIC_PRIME_EQUIVALENT_FOCAL_LENGTHS_MM",
3562
3637
  "source": "src/equipment/generic-prime-lenses.ts",
@@ -3707,6 +3782,11 @@
3707
3782
  "source": "src/equipment/generic-lens-catalogue.ts",
3708
3783
  "kind": "type"
3709
3784
  },
3785
+ {
3786
+ "name": "GenericNdFilterStops",
3787
+ "source": "src/optics/generic-nd-filter-presets.ts",
3788
+ "kind": "type"
3789
+ },
3710
3790
  {
3711
3791
  "name": "GenericOpticalEvidence",
3712
3792
  "source": "src/optics/profile-contract.ts",
@@ -3892,6 +3972,11 @@
3892
3972
  "source": "src/facade/chart-scenes.ts",
3893
3973
  "kind": "type"
3894
3974
  },
3975
+ {
3976
+ "name": "IDEAL_LENS_LIMITS",
3977
+ "source": "src/equipment/ideal-lens.ts",
3978
+ "kind": "runtime"
3979
+ },
3895
3980
  {
3896
3981
  "name": "IdealApertureGeometry",
3897
3982
  "source": "src/optics/aperture.ts",
@@ -7827,6 +7912,21 @@
7827
7912
  "source": "src/sensor/eqe-electron-rate.ts",
7828
7913
  "kind": "type"
7829
7914
  },
7915
+ {
7916
+ "name": "SensorEquivalence",
7917
+ "source": "src/camera/sensor-equivalence.ts",
7918
+ "kind": "type"
7919
+ },
7920
+ {
7921
+ "name": "SensorEquivalenceFieldOfView",
7922
+ "source": "src/camera/sensor-equivalence.ts",
7923
+ "kind": "type"
7924
+ },
7925
+ {
7926
+ "name": "SensorEquivalenceQuantity",
7927
+ "source": "src/camera/sensor-equivalence.ts",
7928
+ "kind": "type"
7929
+ },
7830
7930
  {
7831
7931
  "name": "SensorExpectedReadoutSignal",
7832
7932
  "source": "src/sensor/raw-readout.ts",
@@ -8512,6 +8612,21 @@
8512
8612
  "source": "src/facade/simulate-capture.ts",
8513
8613
  "kind": "type"
8514
8614
  },
8615
+ {
8616
+ "name": "simulateCaptureFromParts",
8617
+ "source": "src/facade/develop-joined-parts.ts",
8618
+ "kind": "runtime"
8619
+ },
8620
+ {
8621
+ "name": "SimulateCaptureLensCatalogueRecord",
8622
+ "source": "src/facade/simulate-capture.ts",
8623
+ "kind": "type"
8624
+ },
8625
+ {
8626
+ "name": "SimulateCaptureLensCorrections",
8627
+ "source": "src/facade/simulate-capture.ts",
8628
+ "kind": "type"
8629
+ },
8515
8630
  {
8516
8631
  "name": "SimulateCaptureLensDistortion",
8517
8632
  "source": "src/facade/simulate-capture.ts",
@@ -0,0 +1,105 @@
1
+ # exposure/filtered-exposure-time.ts public contracts
2
+
3
+ The package and root API versions are recorded once in [Navigation](../API_REFERENCE.md) · [Developer guide](https://github.com/Photivra/photivra/blob/main/docs/DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
4
+
5
+ ## calculateFilteredExposureTime
6
+
7
+ Shutter time that keeps the same exposure after adding front-of-lens filters, such as a
8
+ neutral-density (ND) filter: t / T, with T the combined transmittance of the filter profiles.
9
+ Aperture and ISO are unchanged.
10
+
11
+ Exact under the linear sensor model (exposure H = E·t); film reciprocity failure is not modelled.
12
+ Nominal filters vary: a "10-stop" or ND1000 (OD 3.0, 9.97 stops) filter transmits roughly, not
13
+ exactly, its rating, so the result is only as good as the profile. The envelope is an
14
+ approximation whenever any profile's `scientificStatus` is `"approximation"`.
15
+
16
+ Example: 1/125 s with `GENERIC_ND_FILTER_PROFILES[10]` (exactly 2^-10) gives 1024/125 = 8.192 s;
17
+ on a third-stop dial, 8 s.
18
+
19
+ ```ts
20
+ export function calculateFilteredExposureTime(
21
+ input: CalculateFilteredExposureTimeInput
22
+ ): CalculationResult<FilteredExposureTime>;
23
+ ```
24
+
25
+ This call is synchronous; any supplied provider must follow its explicit synchronous contract.
26
+
27
+ ## CalculateFilteredExposureTimeInput
28
+
29
+ The exact contract is declared below; use the domain guide for assumptions and staged integration.
30
+
31
+ ```ts
32
+ export interface CalculateFilteredExposureTimeInput {
33
+ /** Shutter time without the filter, in seconds. */
34
+ shutterSeconds: number;
35
+ /**
36
+ * One front-of-lens filter profile, or several in light-path order (scene side first), as
37
+ * accepted by `composeFrontOfLensFilterTransmission`.
38
+ */
39
+ filter: FrontOfLensFilterProfile | readonly FrontOfLensFilterProfile[];
40
+ /**
41
+ * Optional shutter dial, in seconds (for example `GENERIC_THIRD_STOP_SHUTTER_SECONDS`). When
42
+ * given, the result also reports the nearest dial value (nearest in stops, the shorter on a tie).
43
+ */
44
+ shutterDialSeconds?: readonly number[];
45
+ /** Wavelength at which the filters are resolved. Defaults to 550 nm. Neutral filters do not depend on it. */
46
+ wavelengthNanometers?: number;
47
+ /** Wavelength basis; defaults to the first filter profile's basis and must match every profile. */
48
+ wavelengthBasis?: Exclude<SpectralWavelengthBasis, "unspecified">;
49
+ /** Incident polarization, which matters only when a polarizer is in the stack. Omitted means unpolarized. */
50
+ incidentPolarization?: LinearPolarizationState;
51
+ }
52
+ ```
53
+
54
+ ## FILTERED_EXPOSURE_DEFAULT_WAVELENGTH_NANOMETERS
55
+
56
+ Wavelength used when the caller gives none: 550 nm, near the photopic peak. Neutral filters do not depend on it.
57
+
58
+ ```ts
59
+ FILTERED_EXPOSURE_DEFAULT_WAVELENGTH_NANOMETERS = 550 as const
60
+ ```
61
+
62
+ ## FilteredExposureDialSetting
63
+
64
+ The dial value nearest the exact filtered shutter time.
65
+
66
+ ```ts
67
+ export interface FilteredExposureDialSetting {
68
+ /** Nearest dial value in seconds. */
69
+ shutterSeconds: number;
70
+ /**
71
+ * log2(dial / exact filtered time): exposure of the dial setting relative to the unfiltered
72
+ * exposure, in stops. Positive is brighter (longer), negative darker.
73
+ */
74
+ exposureErrorStops: number;
75
+ /** `"maximum"` when the exact time is longer than every dial value (use bulb for the exact time), `"minimum"` when shorter than every one. */
76
+ clamped: false | "minimum" | "maximum";
77
+ /** How the dial value was chosen. */
78
+ quantizationPolicy: "nearest-log2-shorter-on-tie";
79
+ }
80
+ ```
81
+
82
+ ## FilteredExposureTime
83
+
84
+ The exact contract is declared below; use the domain guide for assumptions and staged integration.
85
+
86
+ ```ts
87
+ export interface FilteredExposureTime {
88
+ /** Shutter time without the filter, in seconds. */
89
+ shutterSeconds: number;
90
+ /** Shutter time that gives the same exposure with the filter: shutterSeconds / linearTransmissionFactor. */
91
+ filteredShutterSeconds: number;
92
+ /** Combined intensity transmittance T of the filter stack, in (0, 1]. */
93
+ linearTransmissionFactor: number;
94
+ /** Combined attenuation −log2 T, in stops. */
95
+ attenuationStops: number;
96
+ /** Shutter multiplier 1/T = 2^attenuationStops. */
97
+ exposureFactor: number;
98
+ /** Wavelength at which the filters were resolved, in nanometres. */
99
+ wavelengthNanometers: number;
100
+ /** The filter-stack transmission this result is based on, with each filter's identity and evidence. */
101
+ filterTransmission: ComposedFrontOfLensFilterTransmission;
102
+ /** Nearest shutter-dial value; present only when `shutterDialSeconds` was given. */
103
+ dial?: FilteredExposureDialSetting;
104
+ }
105
+ ```
@@ -0,0 +1,32 @@
1
+ # facade/develop-joined-parts.ts public contracts
2
+
3
+ The package and root API versions are recorded once in [Navigation](../API_REFERENCE.md) · [Developer guide](https://github.com/Photivra/photivra/blob/main/docs/DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
4
+
5
+ ## simulateCaptureFromParts
6
+
7
+ Develops the whole frame of `options` from the packed RAW of region renders of the same request (#571), so a capture can
8
+ render its RAW in parallel parts and still take the development steps that filter across the whole image:
9
+ `output.diffractionCorrection` and `output.sharpening`, which a region render refuses, and `output.lensCorrections` (#570), which
10
+ runs on the whole developed frame here exactly as in `simulateCapture(options)`. The parts are joined exactly as
11
+ {@link serializeSimulatedCaptureDngFromParts } joins them (they must cover every native site and agree where they overlap),
12
+ and the joined RAW is the whole render's RAW, so the result's `image` (samples and JPEG or PNG bytes), `raw` codes and
13
+ `plan` are those of `simulateCapture(options)`, bit for bit.
14
+
15
+ `options` is the whole request (no `output.region`), with the development options it should have; render the parts with
16
+ the same request plus `output.region`, without `output.diffractionCorrection`, `output.sharpening` and `output.dng`, and with a
17
+ fixed white balance in place of `"auto"` (none of these change the RAW codes; auto white balance is measured here over the
18
+ joined frame). A part may keep or drop `output.lensCorrections` (a corrected region only widens its `region.nativeRect`).
19
+ Any `output.format` serves for a part.
20
+
21
+ `onProgress` reports the `white-balance` (with auto white balance), `development`, `diffraction-correction`, `sharpening` and
22
+ `jpeg` stages, the detail stages once per output row, so a host can show "Applying sharpening to the whole image". The lens
23
+ corrections report no stage of their own: they run between `diffraction-correction` and `sharpening`.
24
+ No `raw` stage is reported: no RAW is rendered. What differs from the whole render's result: `diagnostics.providerEvaluationCount`
25
+ is 0, `diagnostics.timingsMs` are this call's, `diagnostics.fast` and the `raw.*` assumptions of how the RAW was rendered are
26
+ not repeated (they are in the parts' results), and a `parts` assumption records the join.
27
+
28
+ ```ts
29
+ export async function simulateCaptureFromParts(options: SimulateCaptureOptions, parts: readonly SimulateCaptureDngPart[]): Promise<SimulateCaptureResult>;
30
+ ```
31
+
32
+ This call is asynchronous; byte hashing uses the caller runtime's Web Crypto.
@@ -144,7 +144,7 @@ a capture does. `motion.rotation` is a non-zero angular velocity; `sensor.tempor
144
144
  SIMULATE_CAPTURE_COST_OPTIONS = Object.freeze(["lens.pupilSampling", "lens.projection", "lens.distortion", "lens.vignetting", "lens.psf",
145
145
  "lens.diffraction", "lens.defocus", "lens.catalogue", "sensor.antiAliasing", "sensor.pixelAperture.box", "sensor.temporalSampleCount", "motion.rotation", "motion.shutter.rolling", "output.borderHandling.mirror", "output.region",
146
146
  "output.whiteBalance.auto", "output.demosaic.ahd", "output.highlightMode.reconstruct", "output.colorEncoding.wide-gamut", "output.gamutMapping.perceptual",
147
- "output.diffractionCorrection", "output.sharpening", "output.format.jpeg", "output.format.png", "output.format.dng"] as const)
147
+ "output.diffractionCorrection", "output.sharpening", "output.lensCorrections", "output.format.jpeg", "output.format.png", "output.format.dng"] as const)
148
148
  ```
149
149
 
150
150
  ## SIMULATE_CAPTURE_DEFAULT_ILLUMINANCE_LUX
@@ -173,7 +173,7 @@ the record form with `fast` and is reported in `diagnostics.fast.applied` when i
173
173
  whether or not it has a fast method yet; one without runs exact and reports `false`.
174
174
 
175
175
  ```ts
176
- SIMULATE_CAPTURE_FAST_OPTIONS = Object.freeze(["lens.diffraction", "sensor.antiAliasing", "sensor.pixelAperture.box", "output.demosaic.ahd"] as const)
176
+ SIMULATE_CAPTURE_FAST_OPTIONS = Object.freeze(["lens.diffraction", "lens.catalogue", "sensor.antiAliasing", "sensor.pixelAperture.box", "output.demosaic.ahd"] as const)
177
177
  ```
178
178
 
179
179
  ## SIMULATE_CAPTURE_METERING_MODES
@@ -459,6 +459,30 @@ export interface SimulateCaptureFastReport {
459
459
  }
460
460
  ```
461
461
 
462
+ ## SimulateCaptureLensCatalogueRecord
463
+
464
+ `lens.catalogue` as a record (#568): the lens id as `kind` and the `fast` override (see {@link SimulateCaptureOptions.fast}).
465
+
466
+ ```ts
467
+ export interface SimulateCaptureLensCatalogueRecord { kind: string; fast?: boolean }
468
+ ```
469
+
470
+ ## SimulateCaptureLensCorrections
471
+
472
+ `output.lensCorrections` (#570): which of the catalogue lens's generic corrections (`createGenericLensCorrectionProfile`) the
473
+ development applies. Each is off unless set to true.
474
+
475
+ ```ts
476
+ export interface SimulateCaptureLensCorrections {
477
+ /** Radial distortion r_d = r(1 + k1ρ²), inverted by resampling: it stretches the corners and lowers their resolution. */
478
+ distortion?: boolean;
479
+ /** Lateral colour: each channel rescaled by 1/(1 + L·D(λ_c)) into register; axial (longitudinal) colour stays. */
480
+ lateralColor?: boolean;
481
+ /** Vignetting: a gain 1/E(ρ) at each pixel's source point; corner noise rises with the signal, the SNR does not. */
482
+ vignetting?: boolean;
483
+ }
484
+ ```
485
+
462
486
  ## SimulateCaptureLensDistortion
463
487
 
464
488
  The exact contract is declared below; use the domain guide for assumptions and staged integration.
@@ -514,6 +538,19 @@ export interface SimulateCaptureOptions {
514
538
  * focus distance below its minimum focus distance, is rejected. Not combinable with `focalLengthMm`.
515
539
  */
516
540
  prime?: number;
541
+ /**
542
+ * Opt-in (#576): an ideal lens, an aberration-free thin lens of this physical focal length (1–4000 mm) on whatever sensor the
543
+ * frame is (output width × height × pixel pitch; no crop-factor scaling), at any `fNumber` from f/0.5 to f/128
544
+ * (`IDEAL_LENS_LIMITS`; beyond them the request is refused). It replaces the tier lens's focal length and f-number range (the
545
+ * transmission is kept); shutter priority and program may choose any aperture in that range. Recorded in the `lens.ideal`
546
+ * assumption. Its blur is that of `defocus`, `diffraction` and `vignetting`, the same models as with `prime`. It focuses at any
547
+ * distance beyond the focal length (no minimum focus distance; `subjectDistanceM` must be at least twice the focal length, as for
548
+ * every lens). Works in `simulateCapture` and the display view. Not combinable with `prime`, `catalogue` or `focalLengthMm`.
549
+ * Optional `widestFNumber` and `narrowestFNumber` (within `IDEAL_LENS_LIMITS`, widest ≤ narrowest; each defaults to its bound)
550
+ * narrow the range: `fNumber` must lie in it, and shutter priority and program choose apertures only in it (program limits its
551
+ * line to a range that does not hold f/4–f/16, #583). Default off.
552
+ */
553
+ ideal?: { focalLengthMm: number; widestFNumber?: number; narrowestFNumber?: number };
517
554
  /**
518
555
  * Opt-in (#549): a lens of the generic lens catalogue by id (`GENERIC_LENS_IDS`, for example "pv-50-1.2-pro" or "pv-50-1.8";
519
556
  * docs/LENS_CATALOGUE.md). Like `prime`, its focal length is the full-frame equivalent ÷ the simulated frame's diagonal crop
@@ -522,9 +559,12 @@ export interface SimulateCaptureOptions {
522
559
  * colour, at the resolved f-number and focus) through the environment PSF quadrature, its radial distortion, its vignetting
523
560
  * and, for the fisheyes, the equisolid projection. Flare, focus breathing and bokeh shape are not rendered. Not combinable
524
561
  * with `prime`, `focalLengthMm`, `projection`, `distortion`, `vignetting`, `psf`, `diffraction` or `pupilSampling` (the
525
- * lens sets them); `defocus` convolves the disc into the lens's PSF. Not offered by the display view. Default off.
562
+ * lens sets them); `defocus` convolves the disc into the lens's PSF. The display view renders it with the PSF taken per field zone (#569; docs/DISPLAY_VIEW.md). Default off.
563
+ * #568: the record form `{ kind: <lens id>, fast }` overrides the top-level `fast` flag for this option; the fast method
564
+ * blends the PSF between exactly resolved kernels on a field grid and tabulates each site's expected signal
565
+ * (docs/LENS_CATALOGUE.md, "Fast method").
526
566
  */
527
- catalogue?: string;
567
+ catalogue?: string | SimulateCaptureLensCatalogueRecord;
528
568
  /**
529
569
  * Opt-in (#549), with `catalogue` only: a seeded autofocus error (`simulateGenericLensFocusError`). The focus distance becomes
530
570
  * the sampled one for (seed, shotIndex), reported in the `lens.focusScatter` assumption; it is visible with `defocus`. Default off.
@@ -715,6 +755,16 @@ export interface SimulateCaptureOptions {
715
755
  * (not the wide-gamut or perceptual PNG paths); not combinable with `region`. The DNG's RAW codes are not changed. Default off.
716
756
  */
717
757
  sharpening?: SimulateCaptureSharpening;
758
+ /**
759
+ * Opt-in (#570), with `lens.catalogue`: the lens's generic corrections (see {@link SimulateCaptureLensCorrections}) on the
760
+ * developed linear colour, after demosaic, colour, white balance and `diffractionCorrection`, before the tone curve; for the JPEG,
761
+ * PNG and samples. The RAW and the DNG are never corrected. To keep the output size with no missing pixels, the corrected image is
762
+ * magnified by the smallest factor 1/m ≥ 1 that keeps every pixel's source inside the frame (recorded in the
763
+ * `output.lensCorrections` assumption). Works with `region`: a region develops the frame pixels its corrected pixels read
764
+ * (`region.nativeRect`, `raw` and `plan` describe that rectangle) and its pixels are the whole render's. All off (or omitted):
765
+ * the development is unchanged.
766
+ */
767
+ lensCorrections?: SimulateCaptureLensCorrections;
718
768
  };
719
769
  /** Camera motion and shutter type. Default: still camera, global electronic shutter. */
720
770
  motion?: SimulateCaptureMotion;
@@ -748,12 +798,12 @@ export interface SimulateCaptureOptions {
748
798
  * Exact or fast (#395). `false` or omitted: every option runs its exact method, the engine reference. `true`: each option
749
799
  * listed in {@link SIMULATE_CAPTURE_FAST_OPTIONS} runs its fast method where it has one, a measured, bounded approximation of
750
800
  * the exact one; an option without a fast method runs exact. An option's own record `fast` overrides this for that option
751
- * only. `diagnostics.fast` reports what was requested and what ran. No option has a fast method yet, so every result is exact.
801
+ * only. `diagnostics.fast` reports what was requested and what ran. `lens.catalogue` has a fast method (#568); the other options run exact.
752
802
  */
753
803
  fast?: boolean;
754
804
  /** Aborting cancels the running task; the promise rejects with a domain error and returns no partial image. */
755
805
  signal?: AbortSignal;
756
- /** Called after each committed RAW, development or JPEG tile. Cannot change output. */
806
+ /** Called after each committed RAW, development, detail or JPEG tile (see {@link SimulateCaptureProgress}). Cannot change output. */
757
807
  onProgress?: (progress: SimulateCaptureProgress) => void;
758
808
  }
759
809
  ```
@@ -776,11 +826,15 @@ export type SimulateCapturePixelAperture = "point" | "box" | { kind: "box"; samp
776
826
 
777
827
  ## SimulateCaptureProgress
778
828
 
779
- The exact contract is declared below; use the domain guide for assumptions and staged integration.
829
+ One progress event of `onProgress`. Stages run in this order: `raw`, `white-balance` (with auto white balance), `development`
830
+ (rows), then, when requested, `diffraction-correction` and `sharpening` (#571: one event per output row of the whole image;
831
+ each stage's last event has `completedTileCount === totalTileCount`), then `jpeg`. `output.lensCorrections` (#570) runs between
832
+ `diffraction-correction` and `sharpening` and reports no stage of its own. {@link simulateCaptureFromParts }
833
+ reports no `raw` stage: its RAW comes from the parts.
780
834
 
781
835
  ```ts
782
836
  export interface SimulateCaptureProgress {
783
- stage: "raw" | "white-balance" | "development" | "jpeg";
837
+ stage: "raw" | "white-balance" | "development" | "diffraction-correction" | "sharpening" | "jpeg";
784
838
  completedTileCount: number;
785
839
  totalTileCount: number;
786
840
  }
@@ -0,0 +1,34 @@
1
+ # optics/generic-nd-filter-presets.ts public contracts
2
+
3
+ The package and root API versions are recorded once in [Navigation](../API_REFERENCE.md) · [Developer guide](https://github.com/Photivra/photivra/blob/main/docs/DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
4
+
5
+ ## GENERIC_ND_FILTER_PROFILES
6
+
7
+ Frozen generic ND filter profiles keyed by stops: `GENERIC_ND_FILTER_PROFILES[10]` transmits
8
+ exactly 1/1024. Spectrally flat over 380–780 nm (air), idealized (`scientificStatus:
9
+ "approximation"`), unbranded. 1/125 s with the 10-stop preset gives 1024/125 ≈ 8.19 s in
10
+ `calculateFilteredExposureTime`.
11
+
12
+ ```ts
13
+ GENERIC_ND_FILTER_PROFILES: Readonly<Record<GenericNdFilterStops, FrontOfLensFilterProfile>> = freezeOwnedData({
14
+ 3: idealNdProfile(3),
15
+ 6: idealNdProfile(6),
16
+ 10: idealNdProfile(10)
17
+ })
18
+ ```
19
+
20
+ ## GENERIC_ND_FILTER_STOPS
21
+
22
+ Attenuations, in stops, of the generic ND presets.
23
+
24
+ ```ts
25
+ GENERIC_ND_FILTER_STOPS = Object.freeze([3, 6, 10] as const)
26
+ ```
27
+
28
+ ## GenericNdFilterStops
29
+
30
+ One of the generic ND preset attenuations: 3, 6 or 10 stops.
31
+
32
+ ```ts
33
+ export type GenericNdFilterStops = (typeof GENERIC_ND_FILTER_STOPS)[number];
34
+ ```
@@ -200,7 +200,9 @@ Kernel interpolation between regular-grid nodes.
200
200
  - `rotationally-symmetric-radial-field-centroid-aligned`: for a rotationally symmetric lens. Nodes
201
201
  are declared only along the +X field axis (fieldYmm = [0], fieldXmm >= 0). A query at field
202
202
  (x, y) is interpolated, with centroid alignment, at radius hypot(x, y). The kernel is then
203
- rotated by atan2(y, x) about its centre. The sample pitch must be square.
203
+ rotated by atan2(y, x) about its centre, with the kernel row index increasing with image +Y (the
204
+ convention the environment PSF quadrature applies), so an asymmetric kernel points the same way
205
+ as in the 2-D grid modes. The sample pitch must be square.
204
206
  Shifts and rotations use bilinear resampling. This smooths the kernel slightly (by at most about
205
207
  one sample). Samples outside the kernel are zero, and the result is renormalised to unit energy.
206
208
 
@@ -0,0 +1,12 @@
1
+ # output/developed-lens-corrections.ts public contracts
2
+
3
+ The package and root API versions are recorded once in [Navigation](../API_REFERENCE.md) · [Developer guide](https://github.com/Photivra/photivra/blob/main/docs/DEVELOPERS.md). Generated signatures retain independent schema/model versions. Only the exports listed here are root-package contracts; module-local helpers are not supported deep imports.
4
+
5
+ ## GENERIC_LENS_CORRECTION_CHANNEL_WAVELENGTHS_NM
6
+
7
+ Effective wavelengths of the red, green and blue channels for the lateral-colour map, nm: a generic approximation of where
8
+ a camera's channel responses peak, not a measured camera.
9
+
10
+ ```ts
11
+ GENERIC_LENS_CORRECTION_CHANNEL_WAVELENGTHS_NM: Readonly<Record<LensCorrectionChannel, number>> = Object.freeze({ red: 610, green: 540, blue: 465 })
12
+ ```
@@ -28,12 +28,3 @@ export interface CreateGenericLensCorrectionProfileInput {
28
28
  state: OpticalProfileState;
29
29
  }
30
30
  ```
31
-
32
- ## GENERIC_LENS_CORRECTION_CHANNEL_WAVELENGTHS_NM
33
-
34
- Effective wavelengths of the red, green and blue channels for the lateral-colour map, nm: a generic approximation of where
35
- a camera's channel responses peak, not a measured camera.
36
-
37
- ```ts
38
- GENERIC_LENS_CORRECTION_CHANNEL_WAVELENGTHS_NM: Readonly<Record<LensCorrectionChannel, number>> = Object.freeze({ red: 610, green: 540, blue: 465 })
39
- ```
package/llms.txt CHANGED
@@ -24,8 +24,11 @@
24
24
  - [resolveGenericLens()](https://github.com/Photivra/photivra/blob/main/docs/api/equipment-generic-lens-catalogue.md#resolvegenericlens): one of the 30 generic catalogue lenses ("PV 50 1.2 Pro") on a sensor, with its approximated optical character; `simulateCapture` renders it with `lens.catalogue`
25
25
  - [calculateFieldOfView()](https://github.com/Photivra/photivra/blob/main/docs/api/camera-field-of-view.md#calculatefieldofview): angle of view from focal length and sensor size
26
26
  - [calculateEquivalentFocalLength35Mm()](https://github.com/Photivra/photivra/blob/main/docs/api/camera-equivalent-focal-length.md#calculateequivalentfocallength35mm): crop factor and 35 mm-equivalent focal length
27
+ - [calculateSensorEquivalence()](https://github.com/Photivra/photivra/blob/main/docs/api/camera-sensor-equivalence.md#calculatesensorequivalence): equivalent focal length and f-number, sensor area ratio and angles of view of a lens on one sensor, each marked exact or approximated
28
+ - [calculateBlurShareOfFrame()](https://github.com/Photivra/photivra/blob/main/docs/api/camera-sensor-equivalence.md#calculateblurshareofframe): a blur circle as a share of the frame diagonal, or its size on a print
27
29
  - [calculateCenteredCrop()](https://github.com/Photivra/photivra/blob/main/docs/api/output-crop.md#calculatecenteredcrop): pixels left after a centred crop
28
30
  - [calculateProjectedMotionBlur()](https://github.com/Photivra/photivra/blob/main/docs/api/motion-projected-motion.md#calculateprojectedmotionblur): how far a moving subject smears on the sensor during the shutter time
31
+ - [calculateFilteredExposureTime()](https://github.com/Photivra/photivra/blob/main/docs/api/exposure-filtered-exposure-time.md#calculatefilteredexposuretime): shutter time that keeps the same exposure with an ND (or any front-of-lens) filter, and the nearest shutter-dial value; `GENERIC_ND_FILTER_PROFILES` gives idealized 3-, 6- and 10-stop filters (exactly 2^-N)
29
32
  - [calculateAiryDisk()](https://github.com/Photivra/photivra/blob/main/docs/api/optics-diffraction.md#calculateairydisk): diffraction spot size from f-number and wavelength
30
33
  - [calculateSignalToNoise()](https://github.com/Photivra/photivra/blob/main/docs/api/sensor-signal-noise.md#calculatesignaltonoise): expected SNR from signal and read noise in electrons
31
34
  - [calculateChromaticityFromCorrelatedColorTemperature()](https://github.com/Photivra/photivra/blob/main/docs/api/color-illuminants.md#calculatechromaticityfromcorrelatedcolortemperature): white point for a colour temperature in kelvin
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@photivra/engine",
3
- "version": "2.17.0",
3
+ "version": "2.19.0",
4
4
  "private": false,
5
5
  "description": "Scientific TypeScript engine for camera optics, exposure, focus, motion, sensor sampling, diffraction, and digital imaging calculations.",
6
6
  "type": "module",