@photivra/engine 1.5.0 → 2.1.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.
- package/CHANGELOG.md +414 -6
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +64 -12
- package/README.md +301 -182
- package/SECURITY.md +37 -28
- package/THIRD_PARTY.md +148 -4
- package/dist/camera/equivalent-focal-length.d.ts +13 -14
- package/dist/camera/equivalent-focal-length.js +15 -13
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +30 -19
- package/dist/camera/field-of-view.js +67 -18
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/lens-projection.d.ts +170 -0
- package/dist/camera/lens-projection.js +444 -0
- package/dist/camera/lens-projection.js.map +1 -0
- package/dist/camera/projected-object-size.d.ts +10 -11
- package/dist/camera/projected-object-size.js +12 -10
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +9 -10
- package/dist/capture/capture-export-metadata.js +8 -5
- package/dist/capture/capture-export-metadata.js.map +1 -1
- package/dist/capture/dng-import.d.ts +91 -0
- package/dist/capture/dng-import.js +343 -0
- package/dist/capture/dng-import.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +37 -17
- package/dist/capture/environment-raw-producer.js +43 -19
- package/dist/capture/environment-raw-producer.js.map +1 -1
- package/dist/capture/export-jpeg.d.ts +35 -4
- package/dist/capture/export-jpeg.js +133 -47
- package/dist/capture/export-jpeg.js.map +1 -1
- package/dist/capture/export-tiff.d.ts +48 -24
- package/dist/capture/export-tiff.js +91 -31
- package/dist/capture/export-tiff.js.map +1 -1
- package/dist/capture/focus-control.d.ts +42 -65
- package/dist/capture/focus-control.js +56 -75
- package/dist/capture/focus-control.js.map +1 -1
- package/dist/capture/host-yield-cadence.d.ts +25 -0
- package/dist/capture/host-yield-cadence.js +25 -0
- package/dist/capture/host-yield-cadence.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +14 -12
- package/dist/capture/linear-encoding.js +14 -13
- package/dist/capture/linear-encoding.js.map +1 -1
- package/dist/capture/lossless-jpeg.d.ts +27 -0
- package/dist/capture/lossless-jpeg.js +237 -0
- package/dist/capture/lossless-jpeg.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +227 -0
- package/dist/capture/native-environment-lean.js +974 -0
- package/dist/capture/native-environment-lean.js.map +1 -0
- package/dist/capture/native-environment-optical-stage.d.ts +97 -0
- package/dist/capture/native-environment-optical-stage.js +340 -0
- package/dist/capture/native-environment-optical-stage.js.map +1 -0
- package/dist/capture/native-environment-raw.d.ts +140 -6
- package/dist/capture/native-environment-raw.js +435 -34
- package/dist/capture/native-environment-raw.js.map +1 -1
- package/dist/capture/native-raw-development.d.ts +116 -9
- package/dist/capture/native-raw-development.js +221 -62
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/capture/native-raw-dng.d.ts +60 -0
- package/dist/capture/native-raw-dng.js +167 -0
- package/dist/capture/native-raw-dng.js.map +1 -0
- package/dist/capture/native-raw.d.ts +65 -12
- package/dist/capture/native-raw.js +81 -19
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/packed-sensor-raw.d.ts +160 -0
- package/dist/capture/packed-sensor-raw.js +221 -0
- package/dist/capture/packed-sensor-raw.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +58 -35
- package/dist/capture/photographic-export.js +177 -70
- package/dist/capture/photographic-export.js.map +1 -1
- package/dist/capture/raw-development-kernel.d.ts +52 -0
- package/dist/capture/raw-development-kernel.js +88 -0
- package/dist/capture/raw-development-kernel.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +7 -7
- package/dist/capture/raw-frame-limits.js +7 -6
- package/dist/capture/raw-frame-limits.js.map +1 -1
- package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
- package/dist/capture/raw-frame-reconstruction.js +9 -8
- package/dist/capture/raw-frame-reconstruction.js.map +1 -1
- package/dist/capture/raw-white-level.d.ts +55 -0
- package/dist/capture/raw-white-level.js +165 -0
- package/dist/capture/raw-white-level.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +5 -7
- package/dist/capture/release-sequence.js +15 -13
- package/dist/capture/release-sequence.js.map +1 -1
- package/dist/capture/sensor-raw-frame.d.ts +5 -6
- package/dist/capture/sensor-raw-frame.js +26 -9
- package/dist/capture/sensor-raw-frame.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +21 -13
- package/dist/capture/sensor-raw-producer.js +86 -25
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/capture/simulated-capture.d.ts +15 -16
- package/dist/capture/simulated-capture.js +22 -12
- package/dist/capture/simulated-capture.js.map +1 -1
- package/dist/color/camera-color-matrix.d.ts +69 -0
- package/dist/color/camera-color-matrix.js +132 -0
- package/dist/color/camera-color-matrix.js.map +1 -0
- package/dist/color/capture-color.d.ts +17 -10
- package/dist/color/capture-color.js +50 -17
- package/dist/color/capture-color.js.map +1 -1
- package/dist/color/chromatic-adaptation.d.ts +63 -0
- package/dist/color/chromatic-adaptation.js +91 -0
- package/dist/color/chromatic-adaptation.js.map +1 -0
- package/dist/color/color-difference.d.ts +104 -0
- package/dist/color/color-difference.js +205 -0
- package/dist/color/color-difference.js.map +1 -0
- package/dist/color/color-matching-functions.d.ts +168 -0
- package/dist/color/color-matching-functions.js +309 -0
- package/dist/color/color-matching-functions.js.map +1 -0
- package/dist/color/colorimetry-math.d.ts +52 -0
- package/dist/color/colorimetry-math.js +144 -0
- package/dist/color/colorimetry-math.js.map +1 -0
- package/dist/color/gamut-mapping.d.ts +54 -0
- package/dist/color/gamut-mapping.js +107 -0
- package/dist/color/gamut-mapping.js.map +1 -0
- package/dist/color/illuminants.d.ts +182 -0
- package/dist/color/illuminants.js +434 -0
- package/dist/color/illuminants.js.map +1 -0
- package/dist/color/rgb-color-spaces.d.ts +79 -0
- package/dist/color/rgb-color-spaces.js +115 -0
- package/dist/color/rgb-color-spaces.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +33 -11
- package/dist/color/sensor-color-development.js +104 -30
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/srgb-icc.d.ts +9 -2
- package/dist/color/srgb-icc.js +16 -5
- package/dist/color/srgb-icc.js.map +1 -1
- package/dist/color/srgb-transfer.d.ts +1 -2
- package/dist/color/srgb-transfer.js +1 -1
- package/dist/color/srgb-transfer.js.map +1 -1
- package/dist/color/white-balance.d.ts +68 -19
- package/dist/color/white-balance.js +168 -35
- package/dist/color/white-balance.js.map +1 -1
- package/dist/composition/image-formation-plan.d.ts +152 -128
- package/dist/composition/image-formation-plan.js +292 -138
- package/dist/composition/image-formation-plan.js.map +1 -1
- package/dist/composition/plan-consumer.d.ts +6 -7
- package/dist/composition/plan-consumer.js +14 -11
- package/dist/composition/plan-consumer.js.map +1 -1
- package/dist/core/calculation-result.d.ts +21 -14
- package/dist/core/calculation-result.js +209 -11
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +13 -8
- package/dist/core/canonical-json.js +34 -15
- package/dist/core/canonical-json.js.map +1 -1
- package/dist/core/configuration-error.d.ts +5 -4
- package/dist/core/configuration-error.js +5 -3
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +12 -12
- package/dist/core/evidence-provenance.js +10 -9
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +11 -10
- package/dist/core/image-formation.js +11 -9
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +9 -17
- package/dist/core/owned-data.js +9 -16
- package/dist/core/owned-data.js.map +1 -1
- package/dist/core/portable-math.d.ts +15 -0
- package/dist/core/portable-math.js +56 -0
- package/dist/core/portable-math.js.map +1 -0
- package/dist/core/record-validation.d.ts +48 -9
- package/dist/core/record-validation.js +93 -19
- package/dist/core/record-validation.js.map +1 -1
- package/dist/core/scientific-assurance.d.ts +16 -14
- package/dist/core/scientific-assurance.js +22 -18
- package/dist/core/scientific-assurance.js.map +1 -1
- package/dist/core/spectral-composition.d.ts +13 -14
- package/dist/core/spectral-composition.js +30 -27
- package/dist/core/spectral-composition.js.map +1 -1
- package/dist/core/spectral.d.ts +5 -6
- package/dist/core/spectral.js +9 -7
- package/dist/core/spectral.js.map +1 -1
- package/dist/core/validation.d.ts +3 -6
- package/dist/core/validation.js +3 -5
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +6 -6
- package/dist/core/version.js +6 -5
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/exposure-capabilities.d.ts +10 -10
- package/dist/equipment/exposure-capabilities.js +40 -30
- package/dist/equipment/exposure-capabilities.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +13 -6
- package/dist/equipment/generic-tier-assets.js +34 -15
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/generic-tier-presets.d.ts +5 -6
- package/dist/equipment/generic-tier-presets.js +15 -13
- package/dist/equipment/generic-tier-presets.js.map +1 -1
- package/dist/equipment/iso-capabilities.d.ts +21 -22
- package/dist/equipment/iso-capabilities.js +49 -44
- package/dist/equipment/iso-capabilities.js.map +1 -1
- package/dist/equipment/metering-capabilities.d.ts +5 -6
- package/dist/equipment/metering-capabilities.js +22 -19
- package/dist/equipment/metering-capabilities.js.map +1 -1
- package/dist/equipment/release-capabilities.d.ts +3 -4
- package/dist/equipment/release-capabilities.js +18 -14
- package/dist/equipment/release-capabilities.js.map +1 -1
- package/dist/exposure/exposure-duration-control.d.ts +19 -17
- package/dist/exposure/exposure-duration-control.js +27 -23
- package/dist/exposure/exposure-duration-control.js.map +1 -1
- package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
- package/dist/exposure/exposure-mode-resolver.js +127 -82
- package/dist/exposure/exposure-mode-resolver.js.map +1 -1
- package/dist/exposure/exposure.d.ts +17 -16
- package/dist/exposure/exposure.js +22 -15
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash-ttl.d.ts +135 -0
- package/dist/exposure/flash-ttl.js +193 -0
- package/dist/exposure/flash-ttl.js.map +1 -0
- package/dist/exposure/flash.d.ts +144 -36
- package/dist/exposure/flash.js +259 -59
- package/dist/exposure/flash.js.map +1 -1
- package/dist/exposure/metering-scene-radiance.d.ts +10 -10
- package/dist/exposure/metering-scene-radiance.js +42 -23
- package/dist/exposure/metering-scene-radiance.js.map +1 -1
- package/dist/exposure/metering-target.d.ts +8 -8
- package/dist/exposure/metering-target.js +30 -20
- package/dist/exposure/metering-target.js.map +1 -1
- package/dist/exposure/metering-temporal.d.ts +16 -15
- package/dist/exposure/metering-temporal.js +41 -19
- package/dist/exposure/metering-temporal.js.map +1 -1
- package/dist/exposure/metering.d.ts +64 -17
- package/dist/exposure/metering.js +159 -30
- package/dist/exposure/metering.js.map +1 -1
- package/dist/exposure/program-line.d.ts +5 -5
- package/dist/exposure/program-line.js +20 -13
- package/dist/exposure/program-line.js.map +1 -1
- package/dist/facade/camera-preset.d.ts +8 -0
- package/dist/facade/camera-preset.js +102 -0
- package/dist/facade/camera-preset.js.map +1 -0
- package/dist/facade/chart-radiance-batch.d.ts +57 -0
- package/dist/facade/chart-radiance-batch.js +121 -0
- package/dist/facade/chart-radiance-batch.js.map +1 -0
- package/dist/facade/chart-scenes.d.ts +177 -0
- package/dist/facade/chart-scenes.js +232 -0
- package/dist/facade/chart-scenes.js.map +1 -0
- package/dist/facade/diffraction-provider.d.ts +30 -0
- package/dist/facade/diffraction-provider.js +127 -0
- package/dist/facade/diffraction-provider.js.map +1 -0
- package/dist/facade/host-yield.d.ts +7 -0
- package/dist/facade/host-yield.js +19 -0
- package/dist/facade/host-yield.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +117 -0
- package/dist/facade/scene-radiance.js +205 -0
- package/dist/facade/scene-radiance.js.map +1 -0
- package/dist/facade/simulate-capture.d.ts +363 -0
- package/dist/facade/simulate-capture.js +1281 -0
- package/dist/facade/simulate-capture.js.map +1 -0
- package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
- package/dist/gpu/chart-radiance-gpu.js +176 -0
- package/dist/gpu/chart-radiance-gpu.js.map +1 -0
- package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
- package/dist/gpu/image-kernel-accelerator.js +720 -0
- package/dist/gpu/image-kernel-accelerator.js.map +1 -0
- package/dist/gpu/image-kernel-execution.d.ts +92 -0
- package/dist/gpu/image-kernel-execution.js +84 -0
- package/dist/gpu/image-kernel-execution.js.map +1 -0
- package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
- package/dist/gpu/sensor-stage-gpu.js +317 -0
- package/dist/gpu/sensor-stage-gpu.js.map +1 -0
- package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
- package/dist/gpu/temporal-sum-gpu.js +150 -0
- package/dist/gpu/temporal-sum-gpu.js.map +1 -0
- package/dist/gpu/webgpu-runtime.d.ts +63 -0
- package/dist/gpu/webgpu-runtime.js +215 -0
- package/dist/gpu/webgpu-runtime.js.map +1 -0
- package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
- package/dist/gpu/wgsl-chart-kernel.js +165 -0
- package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
- package/dist/gpu/wgsl-kernels.d.ts +53 -0
- package/dist/gpu/wgsl-kernels.js +365 -0
- package/dist/gpu/wgsl-kernels.js.map +1 -0
- package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
- package/dist/gpu/wgsl-sensor-kernel.js +409 -0
- package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
- package/dist/index.d.ts +91 -25
- package/dist/index.js +60 -15
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +92 -40
- package/dist/motion/camera-rotation.js +84 -47
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
- package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
- package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
- package/dist/motion/capture-rotation-trajectory.js +36 -26
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
- package/dist/motion/extended-object-projection.d.ts +19 -16
- package/dist/motion/extended-object-projection.js +38 -18
- package/dist/motion/extended-object-projection.js.map +1 -1
- package/dist/motion/projected-motion.d.ts +18 -17
- package/dist/motion/projected-motion.js +25 -17
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/motion/temporal-exposure-sum.d.ts +55 -0
- package/dist/motion/temporal-exposure-sum.js +141 -0
- package/dist/motion/temporal-exposure-sum.js.map +1 -0
- package/dist/motion/video-sequence.d.ts +111 -0
- package/dist/motion/video-sequence.js +179 -0
- package/dist/motion/video-sequence.js.map +1 -0
- package/dist/optics/aperture.d.ts +14 -15
- package/dist/optics/aperture.js +13 -11
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/atmospheric-haze.d.ts +83 -0
- package/dist/optics/atmospheric-haze.js +113 -0
- package/dist/optics/atmospheric-haze.js.map +1 -0
- package/dist/optics/brown-conrady-distortion.d.ts +116 -0
- package/dist/optics/brown-conrady-distortion.js +291 -0
- package/dist/optics/brown-conrady-distortion.js.map +1 -0
- package/dist/optics/circle-of-confusion.d.ts +10 -10
- package/dist/optics/circle-of-confusion.js +15 -11
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +64 -33
- package/dist/optics/complex-pupil-psf.js +190 -98
- package/dist/optics/complex-pupil-psf.js.map +1 -1
- package/dist/optics/depth-of-field.d.ts +25 -15
- package/dist/optics/depth-of-field.js +67 -27
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction-psf-profile.d.ts +118 -0
- package/dist/optics/diffraction-psf-profile.js +252 -0
- package/dist/optics/diffraction-psf-profile.js.map +1 -0
- package/dist/optics/diffraction.d.ts +14 -13
- package/dist/optics/diffraction.js +14 -10
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +88 -27
- package/dist/optics/focus-breathing.js +114 -23
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +18 -18
- package/dist/optics/focus-state.js +21 -15
- package/dist/optics/focus-state.js.map +1 -1
- package/dist/optics/front-of-lens-filter.d.ts +45 -14
- package/dist/optics/front-of-lens-filter.js +259 -88
- package/dist/optics/front-of-lens-filter.js.map +1 -1
- package/dist/optics/illumination-vignetting.d.ts +16 -17
- package/dist/optics/illumination-vignetting.js +40 -17
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/irradiance-convolution.d.ts +59 -0
- package/dist/optics/irradiance-convolution.js +138 -0
- package/dist/optics/irradiance-convolution.js.map +1 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
- package/dist/optics/lateral-chromatic-aberration.js +33 -23
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-kernels.d.ts +89 -0
- package/dist/optics/lens-psf-kernels.js +175 -0
- package/dist/optics/lens-psf-kernels.js.map +1 -0
- package/dist/optics/lens-psf-profile.d.ts +78 -46
- package/dist/optics/lens-psf-profile.js +335 -124
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
- package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
- package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +80 -23
- package/dist/optics/polygon-diffraction.js +130 -25
- package/dist/optics/polygon-diffraction.js.map +1 -1
- package/dist/optics/profile-contract.d.ts +5 -6
- package/dist/optics/profile-contract.js +14 -11
- package/dist/optics/profile-contract.js.map +1 -1
- package/dist/optics/psf-foundation.d.ts +23 -23
- package/dist/optics/psf-foundation.js +24 -21
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/pupil-vignetting.d.ts +118 -0
- package/dist/optics/pupil-vignetting.js +264 -0
- package/dist/optics/pupil-vignetting.js.map +1 -0
- package/dist/optics/radial-distortion.d.ts +34 -33
- package/dist/optics/radial-distortion.js +37 -30
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
- package/dist/optics/scene-to-sensor-irradiance.js +73 -45
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
- package/dist/optics/scene-to-sensor-quadrature.js +16 -11
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
- package/dist/optics/sensor-aperture-rays.d.ts +20 -4
- package/dist/optics/sensor-aperture-rays.js +32 -14
- package/dist/optics/sensor-aperture-rays.js.map +1 -1
- package/dist/optics/sensor-environment-query.d.ts +81 -16
- package/dist/optics/sensor-environment-query.js +145 -12
- package/dist/optics/sensor-environment-query.js.map +1 -1
- package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
- package/dist/optics/sensor-psf-quadrature.js +18 -11
- package/dist/optics/sensor-psf-quadrature.js.map +1 -1
- package/dist/optics/sensor-psf-support.d.ts +8 -6
- package/dist/optics/sensor-psf-support.js +8 -5
- package/dist/optics/sensor-psf-support.js.map +1 -1
- package/dist/optics/stray-light.d.ts +22 -19
- package/dist/optics/stray-light.js +18 -12
- package/dist/optics/stray-light.js.map +1 -1
- package/dist/optics/thin-lens.d.ts +10 -9
- package/dist/optics/thin-lens.js +12 -8
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/optics/zernike-wavefront.d.ts +154 -0
- package/dist/optics/zernike-wavefront.js +352 -0
- package/dist/optics/zernike-wavefront.js.map +1 -0
- package/dist/output/capture-corrected-sdr.d.ts +16 -8
- package/dist/output/capture-corrected-sdr.js +16 -8
- package/dist/output/capture-corrected-sdr.js.map +1 -1
- package/dist/output/capture-geometry.d.ts +34 -36
- package/dist/output/capture-geometry.js +52 -32
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +7 -6
- package/dist/output/capture-sdr.js +11 -8
- package/dist/output/capture-sdr.js.map +1 -1
- package/dist/output/crop.d.ts +22 -6
- package/dist/output/crop.js +40 -6
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +60 -23
- package/dist/output/geometric-transforms.js +111 -24
- package/dist/output/geometric-transforms.js.map +1 -1
- package/dist/output/lens-corrections.d.ts +27 -19
- package/dist/output/lens-corrections.js +29 -13
- package/dist/output/lens-corrections.js.map +1 -1
- package/dist/output/native-capture-sdr.d.ts +71 -16
- package/dist/output/native-capture-sdr.js +190 -33
- package/dist/output/native-capture-sdr.js.map +1 -1
- package/dist/output/png-encoder.d.ts +65 -0
- package/dist/output/png-encoder.js +461 -0
- package/dist/output/png-encoder.js.map +1 -0
- package/dist/output/print-contrast-reference.d.ts +10 -9
- package/dist/output/print-contrast-reference.js +10 -8
- package/dist/output/print-contrast-reference.js.map +1 -1
- package/dist/output/print-detail.d.ts +18 -17
- package/dist/output/print-detail.js +12 -10
- package/dist/output/print-detail.js.map +1 -1
- package/dist/output/print-jpeg.d.ts +26 -5
- package/dist/output/print-jpeg.js +117 -50
- package/dist/output/print-jpeg.js.map +1 -1
- package/dist/output/print-plan.d.ts +19 -19
- package/dist/output/print-plan.js +11 -10
- package/dist/output/print-plan.js.map +1 -1
- package/dist/output/print-region-statistics.d.ts +14 -15
- package/dist/output/print-region-statistics.js +11 -11
- package/dist/output/print-region-statistics.js.map +1 -1
- package/dist/output/sdr-rendering.d.ts +48 -10
- package/dist/output/sdr-rendering.js +114 -25
- package/dist/output/sdr-rendering.js.map +1 -1
- package/dist/output/subject-framing-crop.d.ts +6 -10
- package/dist/output/subject-framing-crop.js +23 -13
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/processing/demosaic.d.ts +90 -0
- package/dist/processing/demosaic.js +275 -0
- package/dist/processing/demosaic.js.map +1 -0
- package/dist/processing/denoise.d.ts +68 -0
- package/dist/processing/denoise.js +214 -0
- package/dist/processing/denoise.js.map +1 -0
- package/dist/processing/focus-stacking.d.ts +17 -0
- package/dist/processing/focus-stacking.js +80 -0
- package/dist/processing/focus-stacking.js.map +1 -0
- package/dist/processing/hdr.d.ts +54 -0
- package/dist/processing/hdr.js +172 -0
- package/dist/processing/hdr.js.map +1 -0
- package/dist/processing/image-ops.d.ts +66 -0
- package/dist/processing/image-ops.js +192 -0
- package/dist/processing/image-ops.js.map +1 -0
- package/dist/processing/panorama.d.ts +51 -0
- package/dist/processing/panorama.js +305 -0
- package/dist/processing/panorama.js.map +1 -0
- package/dist/processing/processing-task.d.ts +85 -0
- package/dist/processing/processing-task.js +164 -0
- package/dist/processing/processing-task.js.map +1 -0
- package/dist/processing/tone-mapping.d.ts +69 -0
- package/dist/processing/tone-mapping.js +310 -0
- package/dist/processing/tone-mapping.js.map +1 -0
- package/dist/schema/camera.d.ts +5 -4
- package/dist/schema/illumination-spectral.d.ts +13 -19
- package/dist/schema/illumination-spectral.js +23 -19
- package/dist/schema/illumination-spectral.js.map +1 -1
- package/dist/schema/illumination-temporal.d.ts +12 -15
- package/dist/schema/illumination-temporal.js +43 -28
- package/dist/schema/illumination-temporal.js.map +1 -1
- package/dist/schema/illumination.d.ts +5 -4
- package/dist/schema/illumination.js +55 -20
- package/dist/schema/illumination.js.map +1 -1
- package/dist/schema/scene-radiance-temporal.d.ts +9 -11
- package/dist/schema/scene-radiance-temporal.js +26 -23
- package/dist/schema/scene-radiance-temporal.js.map +1 -1
- package/dist/schema/scene-radiance.d.ts +17 -17
- package/dist/schema/scene-radiance.js +56 -34
- package/dist/schema/scene-radiance.js.map +1 -1
- package/dist/schema/scene.d.ts +14 -13
- package/dist/schema/validation.d.ts +0 -1
- package/dist/schema/validation.js +17 -15
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +45 -64
- package/dist/sensor/accumulated-charge.js +41 -47
- package/dist/sensor/accumulated-charge.js.map +1 -1
- package/dist/sensor/architecture.d.ts +22 -25
- package/dist/sensor/architecture.js +17 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
- package/dist/sensor/camera-saturation-capacity.js +36 -34
- package/dist/sensor/camera-saturation-capacity.js.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
- package/dist/sensor/capture-color-sampling-binding.js +39 -41
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- package/dist/sensor/capture-mode-timing.d.ts +8 -9
- package/dist/sensor/capture-mode-timing.js +24 -21
- package/dist/sensor/capture-mode-timing.js.map +1 -1
- package/dist/sensor/capture-mode.d.ts +28 -30
- package/dist/sensor/capture-mode.js +33 -31
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts +30 -33
- package/dist/sensor/color-sampling.js +32 -37
- package/dist/sensor/color-sampling.js.map +1 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
- package/dist/sensor/constant-rate-temporal-integration.js +28 -26
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
- package/dist/sensor/dark-current.d.ts +53 -49
- package/dist/sensor/dark-current.js +87 -46
- package/dist/sensor/dark-current.js.map +1 -1
- package/dist/sensor/environment-photo-signal.d.ts +71 -30
- package/dist/sensor/environment-photo-signal.js +127 -46
- package/dist/sensor/environment-photo-signal.js.map +1 -1
- package/dist/sensor/eqe-electron-rate.d.ts +14 -13
- package/dist/sensor/eqe-electron-rate.js +34 -14
- package/dist/sensor/eqe-electron-rate.js.map +1 -1
- package/dist/sensor/eqe-local-exposure.d.ts +24 -24
- package/dist/sensor/eqe-local-exposure.js +15 -11
- package/dist/sensor/eqe-local-exposure.js.map +1 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
- package/dist/sensor/eqe-temporal-exposure.js +15 -10
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/exposure-window.d.ts +48 -34
- package/dist/sensor/exposure-window.js +77 -36
- package/dist/sensor/exposure-window.js.map +1 -1
- package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
- package/dist/sensor/fixed-pattern-noise.js +166 -0
- package/dist/sensor/fixed-pattern-noise.js.map +1 -0
- package/dist/sensor/iso-gain.d.ts +44 -0
- package/dist/sensor/iso-gain.js +119 -0
- package/dist/sensor/iso-gain.js.map +1 -0
- package/dist/sensor/iso-signal-chain.d.ts +25 -48
- package/dist/sensor/iso-signal-chain.js +52 -66
- package/dist/sensor/iso-signal-chain.js.map +1 -1
- package/dist/sensor/local-exposure-binding.d.ts +21 -21
- package/dist/sensor/local-exposure-binding.js +22 -18
- package/dist/sensor/local-exposure-binding.js.map +1 -1
- package/dist/sensor/optical-stack.d.ts +36 -40
- package/dist/sensor/optical-stack.js +34 -37
- package/dist/sensor/optical-stack.js.map +1 -1
- package/dist/sensor/photon-energy.d.ts +22 -28
- package/dist/sensor/photon-energy.js +42 -34
- package/dist/sensor/photon-energy.js.map +1 -1
- package/dist/sensor/physical-charge-capacity.d.ts +20 -30
- package/dist/sensor/physical-charge-capacity.js +35 -36
- package/dist/sensor/physical-charge-capacity.js.map +1 -1
- package/dist/sensor/pixel-pitch.d.ts +2 -3
- package/dist/sensor/pixel-pitch.js +4 -2
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +13 -15
- package/dist/sensor/radiometry-readiness.js +20 -17
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +173 -83
- package/dist/sensor/raw-readout.js +425 -160
- package/dist/sensor/raw-readout.js.map +1 -1
- package/dist/sensor/raw-reconstruction.d.ts +112 -44
- package/dist/sensor/raw-reconstruction.js +200 -47
- package/dist/sensor/raw-reconstruction.js.map +1 -1
- package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
- package/dist/sensor/readout-exposure-linkage.js +125 -27
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +43 -44
- package/dist/sensor/readout-timing.js +38 -30
- package/dist/sensor/readout-timing.js.map +1 -1
- package/dist/sensor/response-application-compatibility.d.ts +21 -28
- package/dist/sensor/response-application-compatibility.js +35 -34
- package/dist/sensor/response-application-compatibility.js.map +1 -1
- package/dist/sensor/response-operating-range.d.ts +26 -35
- package/dist/sensor/response-operating-range.js +40 -39
- package/dist/sensor/response-operating-range.js.map +1 -1
- package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
- package/dist/sensor/responsivity-photocurrent.js +57 -40
- package/dist/sensor/responsivity-photocurrent.js.map +1 -1
- package/dist/sensor/sampling-aperture.d.ts +21 -25
- package/dist/sensor/sampling-aperture.js +29 -28
- package/dist/sensor/sampling-aperture.js.map +1 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
- package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/sensor-geometry.d.ts +28 -32
- package/dist/sensor/sensor-geometry.js +35 -20
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +14 -16
- package/dist/sensor/signal-noise.js +15 -13
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
- package/dist/sensor/spatial-sample-reduction.js +39 -48
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
- package/dist/sensor/spatial-sampling-quadrature.js +31 -36
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
- package/dist/sensor/spatio-spectral-reduction.js +24 -29
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
- package/dist/sensor/spectral-coverage.d.ts +6 -9
- package/dist/sensor/spectral-coverage.js +9 -6
- package/dist/sensor/spectral-coverage.js.map +1 -1
- package/dist/sensor/spectral-quadrature.d.ts +46 -60
- package/dist/sensor/spectral-quadrature.js +38 -48
- package/dist/sensor/spectral-quadrature.js.map +1 -1
- package/dist/sensor/spectral-response.d.ts +53 -41
- package/dist/sensor/spectral-response.js +80 -47
- package/dist/sensor/spectral-response.js.map +1 -1
- package/dist/sensor/stochastic-seed.d.ts +50 -0
- package/dist/sensor/stochastic-seed.js +123 -0
- package/dist/sensor/stochastic-seed.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
- package/dist/sensor/temporal-eqe-sum.js +5 -6
- package/dist/sensor/temporal-eqe-sum.js.map +1 -1
- package/dist/sensor/temporal-photo-signal.d.ts +5 -6
- package/dist/sensor/temporal-photo-signal.js +11 -10
- package/dist/sensor/temporal-photo-signal.js.map +1 -1
- package/dist/sensor/temporal-sample-binding.d.ts +1 -2
- package/dist/sensor/temporal-sample-binding.js +3 -3
- package/dist/sensor/temporal-sample-binding.js.map +1 -1
- package/dist/simulation/poc-simulation.d.ts +16 -16
- package/dist/simulation/poc-simulation.js +20 -15
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +42 -18
- package/dist/stabilization/camera-shake.js +43 -20
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +44 -41
- package/dist/stabilization/system.js +196 -108
- package/dist/stabilization/system.js.map +1 -1
- package/docs/AGENT_GUIDE.md +183 -0
- package/docs/API_REFERENCE.md +777 -2
- package/docs/QUICK_START.md +663 -0
- package/docs/USAGE.md +1719 -714
- package/docs/api/camera-equivalent-focal-length.md +6 -7
- package/docs/api/camera-field-of-view.md +16 -8
- package/docs/api/camera-lens-projection.md +246 -0
- package/docs/api/camera-projected-object-size.md +6 -5
- package/docs/api/capture-capture-export-metadata.md +10 -10
- package/docs/api/capture-dng-import.md +134 -0
- package/docs/api/capture-environment-raw-producer.md +17 -11
- package/docs/api/capture-export-jpeg.md +16 -0
- package/docs/api/capture-focus-control.md +25 -47
- package/docs/api/capture-linear-encoding.md +21 -12
- package/docs/api/capture-lossless-jpeg.md +49 -0
- package/docs/api/capture-native-environment-optical-stage.md +75 -0
- package/docs/api/capture-native-environment-raw.md +161 -4
- package/docs/api/capture-native-raw-development.md +69 -8
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +21 -10
- package/docs/api/capture-packed-sensor-raw.md +156 -0
- package/docs/api/capture-photographic-export.md +69 -31
- package/docs/api/capture-raw-frame-reconstruction.md +8 -8
- package/docs/api/capture-raw-white-level.md +37 -0
- package/docs/api/capture-release-sequence.md +6 -7
- package/docs/api/capture-sensor-raw-frame.md +6 -6
- package/docs/api/capture-sensor-raw-producer.md +17 -11
- package/docs/api/capture-simulated-capture.md +15 -15
- package/docs/api/color-camera-color-matrix.md +103 -0
- package/docs/api/color-capture-color.md +22 -11
- package/docs/api/color-chromatic-adaptation.md +82 -0
- package/docs/api/color-color-difference.md +134 -0
- package/docs/api/color-color-matching-functions.md +259 -0
- package/docs/api/color-colorimetry-math.md +54 -0
- package/docs/api/color-gamut-mapping.md +72 -0
- package/docs/api/color-illuminants.md +280 -0
- package/docs/api/color-rgb-color-spaces.md +151 -0
- package/docs/api/color-sensor-color-development.md +27 -0
- package/docs/api/color-srgb-icc.md +2 -4
- package/docs/api/color-white-balance.md +95 -19
- package/docs/api/composition-image-formation-plan.md +124 -95
- package/docs/api/composition-plan-consumer.md +7 -7
- package/docs/api/core-calculation-result.md +18 -14
- package/docs/api/core-configuration-error.md +1 -1
- package/docs/api/core-image-formation.md +7 -7
- package/docs/api/core-scientific-assurance.md +12 -10
- package/docs/api/core-spectral-composition.md +14 -14
- package/docs/api/core-spectral.md +6 -6
- package/docs/api/core-validation.md +3 -3
- package/docs/api/core-version.md +7 -6
- package/docs/api/equipment-exposure-capabilities.md +11 -10
- package/docs/api/equipment-generic-tier-assets.md +7 -2
- package/docs/api/equipment-generic-tier-presets.md +6 -6
- package/docs/api/equipment-iso-capabilities.md +18 -18
- package/docs/api/equipment-metering-capabilities.md +6 -6
- package/docs/api/equipment-release-capabilities.md +4 -4
- package/docs/api/exports.json +2253 -3
- package/docs/api/exposure-exposure-duration-control.md +9 -9
- package/docs/api/exposure-exposure-mode-resolver.md +35 -31
- package/docs/api/exposure-exposure.md +10 -10
- package/docs/api/exposure-flash-ttl.md +182 -0
- package/docs/api/exposure-flash.md +183 -28
- package/docs/api/exposure-metering-scene-radiance.md +11 -10
- package/docs/api/exposure-metering-target.md +9 -8
- package/docs/api/exposure-metering-temporal.md +8 -8
- package/docs/api/exposure-metering.md +69 -9
- package/docs/api/exposure-program-line.md +6 -5
- package/docs/api/facade-chart-radiance-batch.md +96 -0
- package/docs/api/facade-chart-scenes.md +240 -0
- package/docs/api/facade-scene-radiance.md +122 -0
- package/docs/api/facade-simulate-capture.md +397 -0
- package/docs/api/gpu-image-kernel-accelerator.md +157 -0
- package/docs/api/gpu-image-kernel-execution.md +152 -0
- package/docs/api/motion-camera-rotation.md +43 -26
- package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
- package/docs/api/motion-capture-rotation-trajectory.md +15 -15
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
- package/docs/api/motion-extended-object-projection.md +10 -8
- package/docs/api/motion-projected-motion.md +8 -8
- package/docs/api/motion-temporal-exposure-sum.md +98 -0
- package/docs/api/motion-video-sequence.md +159 -0
- package/docs/api/optics-aperture.md +8 -8
- package/docs/api/optics-atmospheric-haze.md +104 -0
- package/docs/api/optics-brown-conrady-distortion.md +123 -0
- package/docs/api/optics-circle-of-confusion.md +5 -4
- package/docs/api/optics-complex-pupil-psf.md +57 -16
- package/docs/api/optics-depth-of-field.md +12 -6
- package/docs/api/optics-diffraction-psf-profile.md +96 -0
- package/docs/api/optics-diffraction.md +8 -7
- package/docs/api/optics-focus-breathing.md +104 -16
- package/docs/api/optics-focus-state.md +9 -10
- package/docs/api/optics-front-of-lens-filter.md +72 -14
- package/docs/api/optics-illumination-vignetting.md +10 -10
- package/docs/api/optics-irradiance-convolution.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
- package/docs/api/optics-lens-psf-kernels.md +72 -0
- package/docs/api/optics-lens-psf-profile.md +48 -26
- package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
- package/docs/api/optics-polygon-diffraction.md +78 -13
- package/docs/api/optics-profile-contract.md +4 -4
- package/docs/api/optics-psf-foundation.md +12 -12
- package/docs/api/optics-pupil-vignetting.md +132 -0
- package/docs/api/optics-radial-distortion.md +12 -12
- package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
- package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
- package/docs/api/optics-sensor-aperture-rays.md +3 -2
- package/docs/api/optics-sensor-environment-query.md +52 -9
- package/docs/api/optics-sensor-psf-quadrature.md +13 -10
- package/docs/api/optics-stray-light.md +12 -11
- package/docs/api/optics-thin-lens.md +4 -3
- package/docs/api/optics-zernike-wavefront.md +229 -0
- package/docs/api/output-capture-corrected-sdr.md +10 -7
- package/docs/api/output-capture-geometry.md +35 -36
- package/docs/api/output-capture-sdr.md +4 -4
- package/docs/api/output-crop.md +7 -4
- package/docs/api/output-geometric-transforms.md +65 -19
- package/docs/api/output-lens-corrections.md +17 -15
- package/docs/api/output-native-capture-sdr.md +26 -13
- package/docs/api/output-png-encoder.md +105 -0
- package/docs/api/output-print-contrast-reference.md +8 -8
- package/docs/api/output-print-detail.md +14 -14
- package/docs/api/output-print-jpeg.md +22 -5
- package/docs/api/output-print-plan.md +18 -18
- package/docs/api/output-print-region-statistics.md +14 -14
- package/docs/api/output-sdr-rendering.md +52 -10
- package/docs/api/output-subject-framing-crop.md +5 -6
- package/docs/api/processing-demosaic.md +120 -0
- package/docs/api/processing-denoise.md +148 -0
- package/docs/api/processing-focus-stacking.md +41 -0
- package/docs/api/processing-hdr.md +113 -0
- package/docs/api/processing-panorama.md +82 -0
- package/docs/api/processing-processing-task.md +107 -0
- package/docs/api/processing-tone-mapping.md +142 -0
- package/docs/api/schema-camera.md +6 -4
- package/docs/api/schema-illumination-spectral.md +10 -11
- package/docs/api/schema-illumination-temporal.md +13 -15
- package/docs/api/schema-illumination.md +4 -4
- package/docs/api/schema-scene-radiance-temporal.md +10 -11
- package/docs/api/schema-scene-radiance.md +18 -17
- package/docs/api/schema-scene.md +9 -9
- package/docs/api/schema-validation.md +1 -1
- package/docs/api/sensor-accumulated-charge.md +12 -20
- package/docs/api/sensor-architecture.md +15 -16
- package/docs/api/sensor-camera-saturation-capacity.md +9 -11
- package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
- package/docs/api/sensor-capture-mode-timing.md +9 -9
- package/docs/api/sensor-capture-mode.md +29 -30
- package/docs/api/sensor-color-sampling.md +31 -33
- package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
- package/docs/api/sensor-dark-current.md +30 -14
- package/docs/api/sensor-environment-photo-signal.md +13 -6
- package/docs/api/sensor-eqe-electron-rate.md +9 -8
- package/docs/api/sensor-eqe-local-exposure.md +18 -17
- package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
- package/docs/api/sensor-exposure-window.md +24 -24
- package/docs/api/sensor-fixed-pattern-noise.md +104 -0
- package/docs/api/sensor-iso-gain.md +63 -0
- package/docs/api/sensor-iso-signal-chain.md +13 -22
- package/docs/api/sensor-local-exposure-binding.md +12 -13
- package/docs/api/sensor-optical-stack.md +37 -40
- package/docs/api/sensor-photon-energy.md +10 -11
- package/docs/api/sensor-physical-charge-capacity.md +8 -13
- package/docs/api/sensor-pixel-pitch.md +1 -1
- package/docs/api/sensor-radiometry-readiness.md +9 -9
- package/docs/api/sensor-raw-readout.md +118 -52
- package/docs/api/sensor-raw-reconstruction.md +97 -20
- package/docs/api/sensor-readout-exposure-linkage.md +120 -24
- package/docs/api/sensor-readout-timing.md +33 -35
- package/docs/api/sensor-response-application-compatibility.md +9 -11
- package/docs/api/sensor-response-operating-range.md +14 -18
- package/docs/api/sensor-responsivity-photocurrent.md +9 -12
- package/docs/api/sensor-sampling-aperture.md +22 -25
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
- package/docs/api/sensor-sensor-geometry.md +23 -24
- package/docs/api/sensor-signal-noise.md +10 -10
- package/docs/api/sensor-spatial-sample-reduction.md +27 -30
- package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
- package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
- package/docs/api/sensor-spectral-coverage.md +5 -5
- package/docs/api/sensor-spectral-quadrature.md +33 -35
- package/docs/api/sensor-spectral-response.md +28 -16
- package/docs/api/sensor-temporal-photo-signal.md +6 -6
- package/docs/api/simulation-poc-simulation.md +17 -16
- package/docs/api/stabilization-camera-shake.md +29 -10
- package/docs/api/stabilization-system.md +25 -21
- package/docs/examples/production-request.json +3821 -2157
- package/docs/examples/simulate-capture.mjs +14 -0
- package/llms.txt +35 -0
- package/package.json +32 -11
- package/AGENTS.md +0 -674
- package/CONTRIBUTING.md +0 -76
- package/DCO +0 -33
- package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
- package/dist/camera/field-of-view.d.ts.map +0 -1
- package/dist/camera/projected-object-size.d.ts.map +0 -1
- package/dist/capture/capture-export-metadata.d.ts.map +0 -1
- package/dist/capture/environment-raw-producer.d.ts.map +0 -1
- package/dist/capture/export-jpeg.d.ts.map +0 -1
- package/dist/capture/export-tiff.d.ts.map +0 -1
- package/dist/capture/focus-control.d.ts.map +0 -1
- package/dist/capture/linear-encoding.d.ts.map +0 -1
- package/dist/capture/native-environment-raw.d.ts.map +0 -1
- package/dist/capture/native-raw-development.d.ts.map +0 -1
- package/dist/capture/native-raw.d.ts.map +0 -1
- package/dist/capture/photographic-export.d.ts.map +0 -1
- package/dist/capture/raw-frame-limits.d.ts.map +0 -1
- package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
- package/dist/capture/release-sequence.d.ts.map +0 -1
- package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
- package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
- package/dist/capture/simulated-capture.d.ts.map +0 -1
- package/dist/color/capture-color.d.ts.map +0 -1
- package/dist/color/sensor-color-development.d.ts.map +0 -1
- package/dist/color/srgb-icc.d.ts.map +0 -1
- package/dist/color/srgb-transfer.d.ts.map +0 -1
- package/dist/color/white-balance.d.ts.map +0 -1
- package/dist/composition/image-formation-plan.d.ts.map +0 -1
- package/dist/composition/plan-consumer.d.ts.map +0 -1
- package/dist/core/calculation-result.d.ts.map +0 -1
- package/dist/core/canonical-json.d.ts.map +0 -1
- package/dist/core/configuration-error.d.ts.map +0 -1
- package/dist/core/evidence-provenance.d.ts.map +0 -1
- package/dist/core/image-formation.d.ts.map +0 -1
- package/dist/core/owned-data.d.ts.map +0 -1
- package/dist/core/record-validation.d.ts.map +0 -1
- package/dist/core/scientific-assurance.d.ts.map +0 -1
- package/dist/core/spectral-composition.d.ts.map +0 -1
- package/dist/core/spectral.d.ts.map +0 -1
- package/dist/core/validation.d.ts.map +0 -1
- package/dist/core/version.d.ts.map +0 -1
- package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
- package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
- package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
- package/dist/equipment/iso-capabilities.d.ts.map +0 -1
- package/dist/equipment/metering-capabilities.d.ts.map +0 -1
- package/dist/equipment/release-capabilities.d.ts.map +0 -1
- package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
- package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
- package/dist/exposure/exposure.d.ts.map +0 -1
- package/dist/exposure/flash.d.ts.map +0 -1
- package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
- package/dist/exposure/metering-target.d.ts.map +0 -1
- package/dist/exposure/metering-temporal.d.ts.map +0 -1
- package/dist/exposure/metering.d.ts.map +0 -1
- package/dist/exposure/program-line.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/motion/camera-rotation.d.ts.map +0 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/extended-object-projection.d.ts.map +0 -1
- package/dist/motion/projected-motion.d.ts.map +0 -1
- package/dist/optics/aperture.d.ts.map +0 -1
- package/dist/optics/circle-of-confusion.d.ts.map +0 -1
- package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
- package/dist/optics/depth-of-field.d.ts.map +0 -1
- package/dist/optics/diffraction.d.ts.map +0 -1
- package/dist/optics/focus-breathing.d.ts.map +0 -1
- package/dist/optics/focus-state.d.ts.map +0 -1
- package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
- package/dist/optics/illumination-vignetting.d.ts.map +0 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
- package/dist/optics/lens-psf-profile.d.ts.map +0 -1
- package/dist/optics/polygon-diffraction.d.ts.map +0 -1
- package/dist/optics/profile-contract.d.ts.map +0 -1
- package/dist/optics/psf-foundation.d.ts.map +0 -1
- package/dist/optics/radial-distortion.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
- package/dist/optics/sensor-environment-query.d.ts.map +0 -1
- package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-psf-support.d.ts.map +0 -1
- package/dist/optics/stray-light.d.ts.map +0 -1
- package/dist/optics/thin-lens.d.ts.map +0 -1
- package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
- package/dist/output/capture-geometry.d.ts.map +0 -1
- package/dist/output/capture-sdr.d.ts.map +0 -1
- package/dist/output/crop.d.ts.map +0 -1
- package/dist/output/geometric-transforms.d.ts.map +0 -1
- package/dist/output/lens-corrections.d.ts.map +0 -1
- package/dist/output/native-capture-sdr.d.ts.map +0 -1
- package/dist/output/print-contrast-reference.d.ts.map +0 -1
- package/dist/output/print-detail.d.ts.map +0 -1
- package/dist/output/print-jpeg.d.ts.map +0 -1
- package/dist/output/print-plan.d.ts.map +0 -1
- package/dist/output/print-region-statistics.d.ts.map +0 -1
- package/dist/output/sdr-rendering.d.ts.map +0 -1
- package/dist/output/subject-framing-crop.d.ts.map +0 -1
- package/dist/schema/camera.d.ts.map +0 -1
- package/dist/schema/camera.js +0 -3
- package/dist/schema/camera.js.map +0 -1
- package/dist/schema/illumination-spectral.d.ts.map +0 -1
- package/dist/schema/illumination-temporal.d.ts.map +0 -1
- package/dist/schema/illumination.d.ts.map +0 -1
- package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
- package/dist/schema/scene-radiance.d.ts.map +0 -1
- package/dist/schema/scene.d.ts.map +0 -1
- package/dist/schema/scene.js +0 -3
- package/dist/schema/scene.js.map +0 -1
- package/dist/schema/validation.d.ts.map +0 -1
- package/dist/sensor/accumulated-charge.d.ts.map +0 -1
- package/dist/sensor/architecture.d.ts.map +0 -1
- package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
- package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
- package/dist/sensor/capture-mode.d.ts.map +0 -1
- package/dist/sensor/color-sampling.d.ts.map +0 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
- package/dist/sensor/dark-current.d.ts.map +0 -1
- package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
- package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
- package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/exposure-window.d.ts.map +0 -1
- package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
- package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
- package/dist/sensor/optical-stack.d.ts.map +0 -1
- package/dist/sensor/photon-energy.d.ts.map +0 -1
- package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
- package/dist/sensor/pixel-pitch.d.ts.map +0 -1
- package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
- package/dist/sensor/raw-readout.d.ts.map +0 -1
- package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
- package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
- package/dist/sensor/readout-timing.d.ts.map +0 -1
- package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
- package/dist/sensor/response-operating-range.d.ts.map +0 -1
- package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
- package/dist/sensor/sampling-aperture.d.ts.map +0 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/sensor-geometry.d.ts.map +0 -1
- package/dist/sensor/signal-noise.d.ts.map +0 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
- package/dist/sensor/spectral-coverage.d.ts.map +0 -1
- package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
- package/dist/sensor/spectral-response.d.ts.map +0 -1
- package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
- package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
- package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
- package/dist/simulation/poc-simulation.d.ts.map +0 -1
- package/dist/stabilization/camera-shake.d.ts.map +0 -1
- package/dist/stabilization/system.d.ts.map +0 -1
- package/docs/API_STYLE.md +0 -235
- package/docs/ARCHITECTURE.md +0 -356
- package/docs/AUTOMATION_COORDINATION.md +0 -190
- package/docs/CAPTURE_COLOR.md +0 -25
- package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
- package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
- package/docs/CAPTURE_SDR.md +0 -22
- package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
- package/docs/DEVELOPERS.md +0 -68
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
- package/docs/EXPORT_ACCEPTANCE.md +0 -133
- package/docs/GENERIC_TIER_PRESETS.md +0 -269
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
- package/docs/IMAGE_FORMATION.md +0 -247
- package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
- package/docs/MOTION_AND_SIGNAL.md +0 -250
- package/docs/NATIVE_CAPTURE_SDR.md +0 -70
- package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
- package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
- package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
- package/docs/NUMERICAL_CORRECTNESS.md +0 -191
- package/docs/PERFORMANCE_BASELINE.md +0 -56
- package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
- package/docs/PHYSICS_FOUNDATION.md +0 -426
- package/docs/POC_API.md +0 -278
- package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
- package/docs/POC_PROJECTION_REUSE.md +0 -124
- package/docs/PRINT_195_196_REVIEW.md +0 -93
- package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
- package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
- package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
- package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
- package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
- package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
- package/docs/PRINT_PLANNING.md +0 -75
- package/docs/PRINT_REGION_STATISTICS.md +0 -38
- package/docs/PROCESSED_OUTPUT.md +0 -157
- package/docs/PRODUCTION_COMPOSITION.md +0 -373
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
- package/docs/PROVENANCE.md +0 -115
- package/docs/PSF_FOUNDATION.md +0 -165
- package/docs/RAW_FRAME_ENVELOPE.md +0 -56
- package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
- package/docs/RELEASE_1_0.md +0 -66
- package/docs/RELEASE_1_0_1.md +0 -61
- package/docs/RELEASE_1_1_0.md +0 -25
- package/docs/RELEASE_1_2_0.md +0 -51
- package/docs/RELEASE_1_3_0.md +0 -15
- package/docs/RELEASE_1_4_0.md +0 -23
- package/docs/RELEASE_1_5_0.md +0 -105
- package/docs/RELEASE_AUDIT.md +0 -39
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
- package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
- package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
- package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
- package/docs/SDR_RENDERING.md +0 -33
- package/docs/SENSOR_APERTURE_RAYS.md +0 -23
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
- package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
- package/docs/SENSOR_RAW_FRAME.md +0 -20
- package/docs/SENSOR_RAW_PRODUCER.md +0 -77
- package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
- package/docs/SIGNAL_CONFORMANCE.md +0 -23
- package/docs/SIMULATED_CAPTURE.md +0 -65
- package/docs/STABILIZATION.md +0 -234
- package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
- package/docs/TIER_ACCEPTANCE.md +0 -129
- package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
- package/docs/V1_COMPOSITION_MAP.md +0 -123
- package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
- package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
- package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
- package/docs/licenses/castleCSF-MIT.txt +0 -21
- package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
- package/docs/validation/documentation-fragments.json +0 -212
- package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
- package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
- package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
- package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
- package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
- package/docs/validation/print-196-candidate-capabilities.json +0 -28
- package/docs/validation/print-196-candidate-evidence.json +0 -356
- package/docs/validation/print-196-engine-acceptance.json +0 -81
- package/docs/validation/print-detail-capabilities.json +0 -103
- package/docs/validation/print-detail-jpeg-evidence.json +0 -116
- package/docs/validation/print-detail-sdr-evidence.json +0 -81
- package/docs/validation/release-audit-inventory.json +0 -1306
- package/docs/validation/tier-acceptance-report-v1.json +0 -2538
|
@@ -7,7 +7,7 @@ export interface SensorPsfSourceSample {
|
|
|
7
7
|
timeSecondsFromOpeningReference: number;
|
|
8
8
|
kernelSampleX: number;
|
|
9
9
|
kernelSampleY: number;
|
|
10
|
-
/**
|
|
10
|
+
/** Origin on the optical axis, +X right, +Y down, in millimetres. Not clipped to the native crop. */
|
|
11
11
|
sourcePointNativeSensorMm: {
|
|
12
12
|
x: number;
|
|
13
13
|
y: number;
|
|
@@ -15,18 +15,18 @@ export interface SensorPsfSourceSample {
|
|
|
15
15
|
spectralIrradianceWattsPerSquareMeterPerNanometer: number;
|
|
16
16
|
}
|
|
17
17
|
export interface CalculateSensorPsfIrradianceQuadratureInput {
|
|
18
|
-
/** One instant on the
|
|
18
|
+
/** One instant, measured on the declared shutter-opening time reference. */
|
|
19
19
|
timeSecondsFromOpeningReference: number;
|
|
20
20
|
spatialQuadrature: ReduceSensorSpatioSpectralIrradianceInput["spatialQuadrature"];
|
|
21
21
|
spectralQuadrature: ReduceSensorSpatioSpectralIrradianceInput["spectralQuadrature"];
|
|
22
|
-
/** The adapter
|
|
22
|
+
/** The adapter supplies the wavelength and image-plane field position for each node. */
|
|
23
23
|
psf: Omit<ResolveLensSampledPsfInput, "fieldPointMm" | "wavelengthNm">;
|
|
24
|
-
/** Schema 0.1.0 PSF profiles
|
|
24
|
+
/** Schema 0.1.0 PSF profiles have no basis field, so the caller states what the source means. */
|
|
25
25
|
psfWavelengthBasis: {
|
|
26
26
|
value: "air" | "vacuum";
|
|
27
27
|
evidence: readonly EvidenceProvenance[];
|
|
28
28
|
};
|
|
29
|
-
/** Explicit local approximation
|
|
29
|
+
/** Explicit local approximation. A PSF that varies across a grid is not a global convolution. */
|
|
30
30
|
spatialModel: {
|
|
31
31
|
kind: "destination-local-shift-invariant-approximation";
|
|
32
32
|
evidence: readonly EvidenceProvenance[];
|
|
@@ -61,10 +61,12 @@ export interface SensorPsfIrradianceQuadrature {
|
|
|
61
61
|
}[];
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
64
|
+
* Applies each resolved unit-energy PSF as an inverse sum of samples around
|
|
65
|
+
* each destination pixel.
|
|
66
|
+
*
|
|
67
|
+
* Support in native coordinates (+Y down) is converted explicitly to the
|
|
68
|
+
* optical kernel orientation (+Y up). The edges are not extended, missing
|
|
69
|
+
* support is not renormalized and no extra throughput is applied. This
|
|
70
|
+
* approximation is not a field-dependent forward transport of energy.
|
|
68
71
|
*/
|
|
69
72
|
export declare function calculateSensorPsfIrradianceQuadrature(input: CalculateSensorPsfIrradianceQuadratureInput): CalculationResult<SensorPsfIrradianceQuadrature>;
|
|
70
|
-
//# sourceMappingURL=sensor-psf-quadrature.d.ts.map
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
3
|
+
* Applies each resolved PSF (point-spread function, normalized to unit energy) as an inverse sum of
|
|
4
|
+
* samples around each destination pixel.
|
|
5
|
+
*
|
|
6
|
+
* Support offsets in native sensor coordinates (+Y down) are converted explicitly to the optical
|
|
7
|
+
* kernel orientation (+Y up). The edges are not extended. Missing support is not renormalized. No
|
|
8
|
+
* extra throughput is applied. This approximation is not a field-dependent forward transport of
|
|
9
|
+
* energy.
|
|
10
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
11
|
+
* and support limits.
|
|
10
12
|
*/
|
|
11
13
|
import { sensorPsfSourcePoint } from "./sensor-psf-support.js";
|
|
12
14
|
import { approximationResult } from "../core/calculation-result.js";
|
|
@@ -15,13 +17,18 @@ import { InvalidScientificInputError, InvalidScientificResultError } from "../co
|
|
|
15
17
|
import { bindSensorSpatioSpectralSamples, reduceSensorSpatioSpectralIrradiance } from "../sensor/spatio-spectral-reduction.js";
|
|
16
18
|
import { sensorSpatialQuadratureNodeIdentityKey } from "../sensor/spatial-sample-reduction.js";
|
|
17
19
|
import { resolveLensSampledPsf } from "./lens-psf-profile.js";
|
|
20
|
+
import { requireInputKeys } from "../core/record-validation.js";
|
|
18
21
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
22
|
+
* Applies each resolved unit-energy PSF as an inverse sum of samples around
|
|
23
|
+
* each destination pixel.
|
|
24
|
+
*
|
|
25
|
+
* Support in native coordinates (+Y down) is converted explicitly to the
|
|
26
|
+
* optical kernel orientation (+Y up). The edges are not extended, missing
|
|
27
|
+
* support is not renormalized and no extra throughput is applied. This
|
|
28
|
+
* approximation is not a field-dependent forward transport of energy.
|
|
23
29
|
*/
|
|
24
30
|
export function calculateSensorPsfIrradianceQuadrature(input) {
|
|
31
|
+
requireInputKeys(input, "calculateSensorPsfIrradianceQuadrature", ["timeSecondsFromOpeningReference", "spatialQuadrature", "spectralQuadrature", "psf", "psfWavelengthBasis", "spatialModel", "inputMeaning", "samples"]);
|
|
25
32
|
if (!Number.isFinite(input.timeSecondsFromOpeningReference) || input.timeSecondsFromOpeningReference < 0) {
|
|
26
33
|
throw new InvalidScientificInputError("PSF source time must be finite and nonnegative.");
|
|
27
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sensor-psf-quadrature.js","sourceRoot":"","sources":["../../src/optics/sensor-psf-quadrature.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sensor-psf-quadrature.js","sourceRoot":"","sources":["../../src/optics/sensor-psf-quadrature.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Applies each resolved PSF (point-spread function, normalized to unit energy) as an inverse sum of\n * samples around each destination pixel.\n *\n * Support offsets in native sensor coordinates (+Y down) are converted explicitly to the optical\n * kernel orientation (+Y up). The edges are not extended. Missing support is not renormalized. No\n * extra throughput is applied. This approximation is not a field-dependent forward transport of\n * energy.\n * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers\n * and support limits.\n */\n\nimport { sensorPsfSourcePoint } from \"./sensor-psf-support.js\";\nimport { approximationResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { parseEvidenceList, type EvidenceProvenance } from \"../core/evidence-provenance.js\";\nimport { InvalidScientificInputError, InvalidScientificResultError } from \"../core/validation.js\";\nimport { bindSensorSpatioSpectralSamples, reduceSensorSpatioSpectralIrradiance,\n type ReduceSensorSpatioSpectralIrradianceInput, type SensorSpatioSpectralNodeIdentity } from \"../sensor/spatio-spectral-reduction.js\";\nimport { sensorSpatialQuadratureNodeIdentityKey } from \"../sensor/spatial-sample-reduction.js\";\nimport { resolveLensSampledPsf, type ResolveLensSampledPsfInput } from \"./lens-psf-profile.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\n\n/** One pre-PSF incident irradiance value per explicitly identified kernel tap. */\nexport interface SensorPsfSourceSample {\n timeSecondsFromOpeningReference: number;\n kernelSampleX: number;\n kernelSampleY: number;\n /** Origin on the optical axis, +X right, +Y down, in millimetres. Not clipped to the native crop. */\n sourcePointNativeSensorMm: { x: number; y: number };\n spectralIrradianceWattsPerSquareMeterPerNanometer: number;\n}\n\nexport interface CalculateSensorPsfIrradianceQuadratureInput {\n /** One instant, measured on the declared shutter-opening time reference. */\n timeSecondsFromOpeningReference: number;\n spatialQuadrature: ReduceSensorSpatioSpectralIrradianceInput[\"spatialQuadrature\"];\n spectralQuadrature: ReduceSensorSpatioSpectralIrradianceInput[\"spectralQuadrature\"];\n /** The adapter supplies the wavelength and image-plane field position for each node. */\n psf: Omit<ResolveLensSampledPsfInput, \"fieldPointMm\" | \"wavelengthNm\">;\n /** Schema 0.1.0 PSF profiles have no basis field, so the caller states what the source means. */\n psfWavelengthBasis: { value: \"air\" | \"vacuum\"; evidence: readonly EvidenceProvenance[] };\n /** Explicit local approximation. A PSF that varies across a grid is not a global convolution. */\n spatialModel: { kind: \"destination-local-shift-invariant-approximation\";\n evidence: readonly EvidenceProvenance[]; limitation: string };\n inputMeaning: \"pre-psf-pre-sensor-stack-pre-aa-spectral-irradiance\";\n /** All nodes and all kernel taps, including zero weights, must be supplied. */\n samples: readonly { node: SensorSpatioSpectralNodeIdentity; sourceSamples: readonly SensorPsfSourceSample[] }[];\n}\n\nexport interface SensorPsfIrradianceQuadrature {\n timeSecondsFromOpeningReference: number;\n wavelengthBasis: \"air\" | \"vacuum\";\n sourcePlane: \"sensor-package-incident\";\n outputMeaning: \"post-psf-pre-sensor-stack-pre-aa-irradiance-quadrature\";\n psfRedistributionApplied: true;\n localShiftInvarianceEstablished: false;\n globalFieldEnergyConservationEstablished: false;\n pupilThroughputApplied: false;\n sceneProviderExecutionVerified: false;\n spatialModelEvidence: readonly EvidenceProvenance[];\n wavelengthBasisEvidence: readonly EvidenceProvenance[];\n spatialModelLimitation: string;\n irradianceSamples: ReduceSensorSpatioSpectralIrradianceInput[\"sampleValues\"];\n reduction: ReturnType<typeof reduceSensorSpatioSpectralIrradiance>;\n samples: readonly { node: SensorSpatioSpectralNodeIdentity;\n psf: ReturnType<typeof resolveLensSampledPsf>; sourceSamples: readonly SensorPsfSourceSample[] }[];\n}\n\n/**\n * Applies each resolved unit-energy PSF as an inverse sum of samples around\n * each destination pixel.\n *\n * Support in native coordinates (+Y down) is converted explicitly to the\n * optical kernel orientation (+Y up). The edges are not extended, missing\n * support is not renormalized and no extra throughput is applied. This\n * approximation is not a field-dependent forward transport of energy.\n */\nexport function calculateSensorPsfIrradianceQuadrature(\n input: CalculateSensorPsfIrradianceQuadratureInput\n): CalculationResult<SensorPsfIrradianceQuadrature> {\n requireInputKeys(input, \"calculateSensorPsfIrradianceQuadrature\", [\"timeSecondsFromOpeningReference\", \"spatialQuadrature\", \"spectralQuadrature\", \"psf\", \"psfWavelengthBasis\", \"spatialModel\", \"inputMeaning\", \"samples\"]);\n if (!Number.isFinite(input.timeSecondsFromOpeningReference) || input.timeSecondsFromOpeningReference < 0) {\n throw new InvalidScientificInputError(\"PSF source time must be finite and nonnegative.\");\n }\n if (input.inputMeaning !== \"pre-psf-pre-sensor-stack-pre-aa-spectral-irradiance\" ||\n input.spatialModel?.kind !== \"destination-local-shift-invariant-approximation\" ||\n typeof input.spatialModel.limitation !== \"string\" || !input.spatialModel.limitation.trim()) {\n throw new InvalidScientificInputError(\"PSF execution requires explicit pre-PSF light and a limited local shift-invariant approximation.\");\n }\n if ((input.psfWavelengthBasis?.value !== \"air\" && input.psfWavelengthBasis?.value !== \"vacuum\") ||\n input.psfWavelengthBasis.value !== input.spectralQuadrature.wavelengthBasis) {\n throw new InvalidScientificInputError(\"PSF wavelength basis must explicitly match the spectral plan.\");\n }\n const spatialModelEvidence = parseEvidenceList(input.spatialModel.evidence, \"psfSpatialModel.evidence\");\n const wavelengthBasisEvidence = parseEvidenceList(input.psfWavelengthBasis.evidence, \"psfWavelengthBasis.evidence\");\n const bound = bindSensorSpatioSpectralSamples({ ...input, sampleValues: input.samples }, s => s);\n let count = 0;\n for (const sample of input.samples) {\n if (!Array.isArray(sample.sourceSamples)) throw new InvalidScientificInputError(\"PSF source samples must be a dense array.\");\n count += sample.sourceSamples.length;\n if (count > 100000) throw new InvalidScientificInputError(\"PSF support exceeds the 100000-source-node budget.\");\n }\n const samples: SensorPsfIrradianceQuadrature[\"samples\"][number][] = [];\n const irradianceSamples: ReduceSensorSpatioSpectralIrradianceInput[\"sampleValues\"][number][] = [];\n for (const spectral of input.spectralQuadrature.nodes) {\n for (const spatial of input.spatialQuadrature.nodes) {\n const spatialNode = { antiAliasingComponentIndex: spatial.antiAliasingComponentIndex,\n apertureSampleXIndex: spatial.apertureSampleXIndex, apertureSampleYIndex: spatial.apertureSampleYIndex };\n const node = { spatialNode, spectralSampleIndex: spectral.spectralSampleIndex, wavelengthNanometers: spectral.wavelengthNanometers };\n const declared = bound.valuesByKey.get(sensorSpatialQuadratureNodeIdentityKey(spatialNode) + \"|\" + spectral.spectralSampleIndex)!;\n const destination = spatial.preAntiAliasingSourcePointMm;\n const psf = resolveLensSampledPsf({ ...input.psf, wavelengthNm: spectral.wavelengthNanometers,\n fieldPointMm: { x: destination.x, y: -destination.y } });\n const kernel = psf.value.kernel;\n if (declared.sourceSamples.length !== kernel.widthSamples * kernel.heightSamples) {\n throw new InvalidScientificInputError(\"PSF source coverage must include every kernel tap without renormalization.\");\n }\n const byIndex = new Map<number, SensorPsfSourceSample>();\n for (const source of declared.sourceSamples) {\n if (!source || source.timeSecondsFromOpeningReference !== input.timeSecondsFromOpeningReference ||\n !Number.isSafeInteger(source.kernelSampleX) || !Number.isSafeInteger(source.kernelSampleY) ||\n source.kernelSampleX < 0 || source.kernelSampleX >= kernel.widthSamples ||\n source.kernelSampleY < 0 || source.kernelSampleY >= kernel.heightSamples ||\n !Number.isFinite(source.spectralIrradianceWattsPerSquareMeterPerNanometer) || source.spectralIrradianceWattsPerSquareMeterPerNanometer < 0) {\n throw new InvalidScientificInputError(\"PSF support requires valid unique tap indices and finite nonnegative irradiance.\");\n }\n const index = source.kernelSampleY * kernel.widthSamples + source.kernelSampleX;\n const { x, y } = sensorPsfSourcePoint(destination, kernel, source.kernelSampleX, source.kernelSampleY);\n if (byIndex.has(index) || source.sourcePointNativeSensorMm?.x !== x || source.sourcePointNativeSensorMm?.y !== y) {\n throw new InvalidScientificInputError(\"PSF source coordinate must match the exact inverse kernel offset in native sensor axes.\");\n }\n byIndex.set(index, { ...source, sourcePointNativeSensorMm: { x, y } });\n }\n const sourceSamples = Array.from({ length: declared.sourceSamples.length }, (_, i) => byIndex.get(i)!);\n const irradiance = sourceSamples.reduce((sum, s, i) => sum + kernel.normalizedIntensity[i]! * s.spectralIrradianceWattsPerSquareMeterPerNanometer, 0);\n if (!Number.isFinite(irradiance)) throw new InvalidScientificResultError(\"PSF weighted irradiance must remain finite.\");\n samples.push({ node, psf, sourceSamples });\n irradianceSamples.push({ node, spectralIrradianceWattsPerSquareMeterPerNanometer: irradiance });\n }\n }\n const reduction = reduceSensorSpatioSpectralIrradiance({ spatialQuadrature: input.spatialQuadrature,\n spectralQuadrature: input.spectralQuadrature, sampleValues: irradianceSamples });\n return approximationResult({ timeSecondsFromOpeningReference: input.timeSecondsFromOpeningReference,\n wavelengthBasis: input.psfWavelengthBasis.value,\n sourcePlane: \"sensor-package-incident\", outputMeaning: \"post-psf-pre-sensor-stack-pre-aa-irradiance-quadrature\",\n psfRedistributionApplied: true, localShiftInvarianceEstablished: false, globalFieldEnergyConservationEstablished: false,\n pupilThroughputApplied: false, sceneProviderExecutionVerified: false, spatialModelEvidence, wavelengthBasisEvidence,\n spatialModelLimitation: input.spatialModel.limitation, samples, irradianceSamples, reduction\n }, \"sensor-local-psf-irradiance-quadrature\", \"0.1.0\", [\n \"Destination-local shift invariance is a declared approximation, not a proof of full field-dependent energy transport.\",\n \"Normalized PSF shape is applied once; separate pupil throughput and source transport remain upstream responsibilities.\",\n \"Complete finite-kernel support does not establish infinite-support convergence or calibrated photographic accuracy.\"\n ]);\n}\n"]}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* @see docs/PHYSICS_FOUNDATION.md for equations, coordinate
|
|
5
|
-
* limits.
|
|
2
|
+
* Shared inverse support for a PSF (point-spread function). Support offsets use native sensor
|
|
3
|
+
* coordinates, where +Y is down; the PSF kernel itself uses +Y up.
|
|
4
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
5
|
+
* and support limits.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Shared inverse support for a PSF (point-spread function), in native sensor coordinates (+Y down).
|
|
9
|
+
* The PSF kernel itself uses +Y up.
|
|
6
10
|
*/
|
|
7
|
-
/** Shared inverse PSF support in native +Y-down coordinates; kernel +Y is up. */
|
|
8
11
|
export declare function sensorPsfSourcePoint(destination: {
|
|
9
12
|
x: number;
|
|
10
13
|
y: number;
|
|
@@ -17,4 +20,3 @@ export declare function sensorPsfSourcePoint(destination: {
|
|
|
17
20
|
x: number;
|
|
18
21
|
y: number;
|
|
19
22
|
};
|
|
20
|
-
//# sourceMappingURL=sensor-psf-support.d.ts.map
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* @see docs/PHYSICS_FOUNDATION.md for equations, coordinate
|
|
6
|
-
* limits.
|
|
3
|
+
* Shared inverse support for a PSF (point-spread function). Support offsets use native sensor
|
|
4
|
+
* coordinates, where +Y is down; the PSF kernel itself uses +Y up.
|
|
5
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
6
|
+
* and support limits.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Shared inverse support for a PSF (point-spread function), in native sensor coordinates (+Y down).
|
|
10
|
+
* The PSF kernel itself uses +Y up.
|
|
7
11
|
*/
|
|
8
|
-
/** Shared inverse PSF support in native +Y-down coordinates; kernel +Y is up. */
|
|
9
12
|
export function sensorPsfSourcePoint(destination, kernel, kernelSampleX, kernelSampleY) {
|
|
10
13
|
return { x: destination.x - (kernelSampleX - kernel.centerSampleX) * kernel.samplePitchMicrometersX / 1000,
|
|
11
14
|
y: destination.y + (kernelSampleY - kernel.centerSampleY) * kernel.samplePitchMicrometersY / 1000 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sensor-psf-support.js","sourceRoot":"","sources":["../../src/optics/sensor-psf-support.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;GAKG;AAEH
|
|
1
|
+
{"version":3,"file":"sensor-psf-support.js","sourceRoot":"","sources":["../../src/optics/sensor-psf-support.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAqC,EAAE,MAE3E,EAAE,aAAqB,EAAE,aAAqB;IAC7C,OAAO,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,aAAa,GAAC,MAAM,CAAC,aAAa,CAAC,GAAC,MAAM,CAAC,uBAAuB,GAAC,IAAI;QAClG,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,aAAa,GAAC,MAAM,CAAC,aAAa,CAAC,GAAC,MAAM,CAAC,uBAAuB,GAAC,IAAI,EAAE,CAAC;AAClG,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Shared inverse support for a PSF (point-spread function). Support offsets use native sensor\n * coordinates, where +Y is down; the PSF kernel itself uses +Y up.\n * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers\n * and support limits.\n */\n\n/**\n * Shared inverse support for a PSF (point-spread function), in native sensor coordinates (+Y down).\n * The PSF kernel itself uses +Y up.\n */\nexport function sensorPsfSourcePoint(destination: { x: number; y: number }, kernel: {\n centerSampleX: number; centerSampleY: number; samplePitchMicrometersX: number; samplePitchMicrometersY: number;\n}, kernelSampleX: number, kernelSampleY: number): { x: number; y: number } {\n return { x: destination.x - (kernelSampleX-kernel.centerSampleX)*kernel.samplePitchMicrometersX/1000,\n y: destination.y + (kernelSampleY-kernel.centerSampleY)*kernel.samplePitchMicrometersY/1000 };\n}\n"]}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
2
|
+
* Stray light (flare and veiling glare) from bright sources.
|
|
3
|
+
*
|
|
4
|
+
* The profile parser is strict. It checks that the profile stays passive (adds no energy) across the
|
|
5
|
+
* whole range of source angles.
|
|
6
|
+
*
|
|
7
|
+
* The model adds off-path spectral irradiance before the sensor integrates the exposure. It never
|
|
8
|
+
* adds it after tone mapping. Source powers are integrated over profile.referenceEntranceAreaMm2 at
|
|
9
|
+
* one instant and one wavelength. The Gaussian templates are independently parameterized
|
|
10
|
+
* approximations, not ray tracing through a lens prescription.
|
|
11
|
+
* @see docs/DIGITAL_OPTICS_FOUNDATION.md for the equations, units, coordinate conventions, known
|
|
12
|
+
* blockers and support limits.
|
|
10
13
|
*/
|
|
11
14
|
import { type CalculationResult } from "../core/calculation-result.js";
|
|
12
15
|
import { type GenericOpticalEvidence, type OpticalProfileState } from "./profile-contract.js";
|
|
13
16
|
import type { LensFieldPointMm } from "./radial-distortion.js";
|
|
14
|
-
/** One
|
|
17
|
+
/** One ghost (reflection path) or veil (broad scatter) response. Its shape is normalized over the infinite image plane. */
|
|
15
18
|
export interface ParametricStrayLightResponse {
|
|
16
19
|
id: string;
|
|
17
20
|
kind: "ghost" | "veil";
|
|
@@ -21,10 +24,10 @@ export interface ParametricStrayLightResponse {
|
|
|
21
24
|
sigmaMm: number;
|
|
22
25
|
/** Fraction of source power entering this response at the axis. */
|
|
23
26
|
axisPowerFraction: number;
|
|
24
|
-
/** F(rho)=F(0)*(1+slope*rho²), rho=source angle/
|
|
27
|
+
/** Power fraction versus angle: F(rho) = F(0) * (1 + slope * rho²), where rho = source angle / maximum angle. */
|
|
25
28
|
angularSlope: number;
|
|
26
29
|
}
|
|
27
|
-
/**
|
|
30
|
+
/** One explicit wavelength and an exact generic camera state. Models clean optics only. */
|
|
28
31
|
export interface LensStrayLightProfile {
|
|
29
32
|
schemaVersion: "0.1.0";
|
|
30
33
|
id: string;
|
|
@@ -39,13 +42,13 @@ export interface LensStrayLightProfile {
|
|
|
39
42
|
referenceEntranceAreaMm2: number;
|
|
40
43
|
responses: readonly ParametricStrayLightResponse[];
|
|
41
44
|
}
|
|
42
|
-
/**
|
|
45
|
+
/** The direction can lie outside the active frame. It is not clipped to the crop. */
|
|
43
46
|
export interface StrayLightSource {
|
|
44
47
|
id: string;
|
|
45
48
|
fieldAngleXDegrees: number;
|
|
46
49
|
fieldAngleYDegrees: number;
|
|
47
50
|
incidentSpectralPowerWPerNm: number;
|
|
48
|
-
/**
|
|
51
|
+
/** Fraction of this source let in, for example after a flag or hood decision. Not a global hood factor. */
|
|
49
52
|
admittedFraction: number;
|
|
50
53
|
}
|
|
51
54
|
export interface StrayLightIrradiance {
|
|
@@ -60,7 +63,7 @@ export interface StrayLightIrradiance {
|
|
|
60
63
|
ghostSpectralIrradianceWPerM2PerNm: number;
|
|
61
64
|
veilSpectralIrradianceWPerM2PerNm: number;
|
|
62
65
|
totalSpectralIrradianceWPerM2PerNm: number;
|
|
63
|
-
/** If primary-only, the meter
|
|
66
|
+
/** If primary-only, the meter leaves these additions out. The sensor always receives the total. */
|
|
64
67
|
meterDomain: "primary-only" | "primary-plus-stray";
|
|
65
68
|
meterSpectralIrradianceWPerM2PerNm: number;
|
|
66
69
|
contributions: readonly {
|
|
@@ -70,11 +73,12 @@ export interface StrayLightIrradiance {
|
|
|
70
73
|
spectralIrradianceWPerM2PerNm: number;
|
|
71
74
|
}[];
|
|
72
75
|
}
|
|
73
|
-
/** Strict generic profile parser
|
|
76
|
+
/** Strict generic profile parser. Checks that the profile adds no energy at any source angle in its range. */
|
|
74
77
|
export declare function parseLensStrayLightProfile(value: unknown): LensStrayLightProfile;
|
|
75
|
-
/** Adds off-path spectral irradiance before sensor
|
|
76
|
-
* Source powers are integrated over profile.referenceEntranceAreaMm2 at this instant
|
|
77
|
-
* Gaussian templates are independently parameterized approximations, not
|
|
78
|
+
/** Adds off-path spectral irradiance before the sensor integrates the exposure, never after tone mapping.
|
|
79
|
+
* Source powers are integrated over profile.referenceEntranceAreaMm2 at this instant and wavelength.
|
|
80
|
+
* The Gaussian templates are independently parameterized approximations, not ray tracing through a
|
|
81
|
+
* lens prescription.
|
|
78
82
|
*/
|
|
79
83
|
export declare function calculateLensStrayLightIrradiance(input: {
|
|
80
84
|
profile: LensStrayLightProfile;
|
|
@@ -88,4 +92,3 @@ export declare function calculateLensStrayLightIrradiance(input: {
|
|
|
88
92
|
sources: readonly StrayLightSource[];
|
|
89
93
|
meterDomain: "primary-only" | "primary-plus-stray";
|
|
90
94
|
}): CalculationResult<StrayLightIrradiance>;
|
|
91
|
-
//# sourceMappingURL=stray-light.d.ts.map
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
3
|
+
* Stray light (flare and veiling glare) from bright sources.
|
|
4
|
+
*
|
|
5
|
+
* The profile parser is strict. It checks that the profile stays passive (adds no energy) across the
|
|
6
|
+
* whole range of source angles.
|
|
7
|
+
*
|
|
8
|
+
* The model adds off-path spectral irradiance before the sensor integrates the exposure. It never
|
|
9
|
+
* adds it after tone mapping. Source powers are integrated over profile.referenceEntranceAreaMm2 at
|
|
10
|
+
* one instant and one wavelength. The Gaussian templates are independently parameterized
|
|
11
|
+
* approximations, not ray tracing through a lens prescription.
|
|
12
|
+
* @see docs/DIGITAL_OPTICS_FOUNDATION.md for the equations, units, coordinate conventions, known
|
|
13
|
+
* blockers and support limits.
|
|
11
14
|
*/
|
|
12
15
|
import { approximationResult } from "../core/calculation-result.js";
|
|
13
16
|
import { InvalidScientificInputError } from "../core/validation.js";
|
|
14
17
|
import { choice, finite, list, parseEvidence, parseOpticalProfileState, positive, record, requireSameState, textValue } from "./profile-contract.js";
|
|
18
|
+
import { requireInputKeys } from "../core/record-validation.js";
|
|
15
19
|
function fraction(value, name) {
|
|
16
20
|
const n = finite(value, name);
|
|
17
21
|
if (n < 0 || n > 1)
|
|
@@ -22,7 +26,7 @@ function point(value) {
|
|
|
22
26
|
const p = record(value, ["x", "y"]);
|
|
23
27
|
return { x: finite(p.x, "x"), y: finite(p.y, "y") };
|
|
24
28
|
}
|
|
25
|
-
/** Strict generic profile parser
|
|
29
|
+
/** Strict generic profile parser. Checks that the profile adds no energy at any source angle in its range. */
|
|
26
30
|
export function parseLensStrayLightProfile(value) {
|
|
27
31
|
const r = record(value, ["schemaVersion", "id", "version", "state", "evidence", "interaction",
|
|
28
32
|
"wavelengthNm", "wavelengthBasis", "maximumSourceAngleDegrees", "referenceEntranceAreaMm2", "responses"]);
|
|
@@ -52,11 +56,13 @@ export function parseLensStrayLightProfile(value) {
|
|
|
52
56
|
wavelengthNm: positive(r.wavelengthNm, "wavelengthNm"), wavelengthBasis: choice(r.wavelengthBasis, ["air", "vacuum"]),
|
|
53
57
|
maximumSourceAngleDegrees: maximum, referenceEntranceAreaMm2: positive(r.referenceEntranceAreaMm2, "referenceEntranceAreaMm2"), responses };
|
|
54
58
|
}
|
|
55
|
-
/** Adds off-path spectral irradiance before sensor
|
|
56
|
-
* Source powers are integrated over profile.referenceEntranceAreaMm2 at this instant
|
|
57
|
-
* Gaussian templates are independently parameterized approximations, not
|
|
59
|
+
/** Adds off-path spectral irradiance before the sensor integrates the exposure, never after tone mapping.
|
|
60
|
+
* Source powers are integrated over profile.referenceEntranceAreaMm2 at this instant and wavelength.
|
|
61
|
+
* The Gaussian templates are independently parameterized approximations, not ray tracing through a
|
|
62
|
+
* lens prescription.
|
|
58
63
|
*/
|
|
59
64
|
export function calculateLensStrayLightIrradiance(input) {
|
|
65
|
+
requireInputKeys(input, "calculateLensStrayLightIrradiance", ["profile", "state", "enabled", "imagePointMm", "wavelengthNm", "wavelengthBasis", "timeSeconds", "primarySpectralIrradianceWPerM2PerNm", "sources", "meterDomain"]);
|
|
60
66
|
const profile = parseLensStrayLightProfile(input.profile);
|
|
61
67
|
requireSameState(profile.state, input.state);
|
|
62
68
|
const p = point(input.imagePointMm), time = finite(input.timeSeconds, "timeSeconds");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stray-light.js","sourceRoot":"","sources":["../../src/optics/stray-light.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stray-light.js","sourceRoot":"","sources":["../../src/optics/stray-light.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Stray light (flare and veiling glare) from bright sources.\n *\n * The profile parser is strict. It checks that the profile stays passive (adds no energy) across the\n * whole range of source angles.\n *\n * The model adds off-path spectral irradiance before the sensor integrates the exposure. It never\n * adds it after tone mapping. Source powers are integrated over profile.referenceEntranceAreaMm2 at\n * one instant and one wavelength. The Gaussian templates are independently parameterized\n * approximations, not ray tracing through a lens prescription.\n * @see docs/DIGITAL_OPTICS_FOUNDATION.md for the equations, units, coordinate conventions, known\n * blockers and support limits.\n */\n\nimport { approximationResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport {\n choice, finite, list, parseEvidence, parseOpticalProfileState, positive, record,\n requireSameState, textValue, type GenericOpticalEvidence, type OpticalProfileState\n} from \"./profile-contract.js\";\nimport type { LensFieldPointMm } from \"./radial-distortion.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\n\n/** One ghost (reflection path) or veil (broad scatter) response. Its shape is normalized over the infinite image plane. */\nexport interface ParametricStrayLightResponse {\n id: string;\n kind: \"ghost\" | \"veil\";\n /** Centroid response in mm per degree of the two declared source field angles. */\n centroidMmPerDegree: readonly [number, number, number, number];\n offsetMm: LensFieldPointMm;\n sigmaMm: number;\n /** Fraction of source power entering this response at the axis. */\n axisPowerFraction: number;\n /** Power fraction versus angle: F(rho) = F(0) * (1 + slope * rho²), where rho = source angle / maximum angle. */\n angularSlope: number;\n}\n/** One explicit wavelength and an exact generic camera state. Models clean optics only. */\nexport interface LensStrayLightProfile {\n schemaVersion: \"0.1.0\";\n id: string;\n version: string;\n state: OpticalProfileState;\n evidence: GenericOpticalEvidence;\n interaction: \"lens-reflections\" | \"sensor-lens-reflections\";\n wavelengthNm: number;\n wavelengthBasis: \"air\" | \"vacuum\";\n maximumSourceAngleDegrees: number;\n /** Area over which the caller's incident source power was integrated. */\n referenceEntranceAreaMm2: number;\n responses: readonly ParametricStrayLightResponse[];\n}\n/** The direction can lie outside the active frame. It is not clipped to the crop. */\nexport interface StrayLightSource {\n id: string;\n fieldAngleXDegrees: number;\n fieldAngleYDegrees: number;\n incidentSpectralPowerWPerNm: number;\n /** Fraction of this source let in, for example after a flag or hood decision. Not a global hood factor. */\n admittedFraction: number;\n}\nexport interface StrayLightIrradiance {\n profileId: string;\n profileVersion: string;\n interaction: LensStrayLightProfile[\"interaction\"];\n imagePointMm: LensFieldPointMm;\n wavelengthNm: number;\n wavelengthBasis: \"air\" | \"vacuum\";\n timeSeconds: number;\n primarySpectralIrradianceWPerM2PerNm: number;\n ghostSpectralIrradianceWPerM2PerNm: number;\n veilSpectralIrradianceWPerM2PerNm: number;\n totalSpectralIrradianceWPerM2PerNm: number;\n /** If primary-only, the meter leaves these additions out. The sensor always receives the total. */\n meterDomain: \"primary-only\" | \"primary-plus-stray\";\n meterSpectralIrradianceWPerM2PerNm: number;\n contributions: readonly { sourceId: string; responseId: string; kind: \"ghost\" | \"veil\"; spectralIrradianceWPerM2PerNm: number }[];\n}\nfunction fraction(value: unknown, name: string): number {\n const n = finite(value, name);\n if (n < 0 || n > 1) throw new InvalidScientificInputError(`${name} must lie in [0,1].`);\n return n;\n}\nfunction point(value: unknown): LensFieldPointMm {\n const p = record(value, [\"x\", \"y\"]); return { x: finite(p.x, \"x\"), y: finite(p.y, \"y\") };\n}\n/** Strict generic profile parser. Checks that the profile adds no energy at any source angle in its range. */\nexport function parseLensStrayLightProfile(value: unknown): LensStrayLightProfile {\n const r = record(value, [\"schemaVersion\", \"id\", \"version\", \"state\", \"evidence\", \"interaction\",\n \"wavelengthNm\", \"wavelengthBasis\", \"maximumSourceAngleDegrees\", \"referenceEntranceAreaMm2\", \"responses\"]);\n const responses = list(r.responses, 32).map((value): ParametricStrayLightResponse => {\n const s = record(value, [\"id\", \"kind\", \"centroidMmPerDegree\", \"offsetMm\", \"sigmaMm\", \"axisPowerFraction\", \"angularSlope\"]);\n const matrix = list(s.centroidMmPerDegree, 4).map((v) => finite(v, \"centroid coefficient\"));\n if (matrix.length !== 4) throw new InvalidScientificInputError(\"Centroid matrix requires four entries.\");\n const slope = finite(s.angularSlope, \"angularSlope\");\n if (slope < -1) throw new InvalidScientificInputError(\"Angular response must be nonnegative.\");\n return { id: textValue(s.id), kind: choice(s.kind, [\"ghost\", \"veil\"]),\n centroidMmPerDegree: matrix as [number, number, number, number], offsetMm: point(s.offsetMm),\n sigmaMm: positive(s.sigmaMm, \"sigmaMm\"), axisPowerFraction: fraction(s.axisPowerFraction, \"axisPowerFraction\"), angularSlope: slope };\n });\n if (new Set(responses.map((s) => s.id)).size !== responses.length ||\n responses.reduce((sum, s) => sum+s.axisPowerFraction, 0) > 1 ||\n responses.reduce((sum, s) => sum+s.axisPowerFraction*(1+s.angularSlope), 0) > 1) {\n throw new InvalidScientificInputError(\"Duplicate response or nonpassive total response.\");\n }\n const maximum = positive(r.maximumSourceAngleDegrees, \"maximumSourceAngleDegrees\");\n if (maximum >= 90) throw new InvalidScientificInputError(\"Source angular domain must be below 90 degrees.\");\n return { schemaVersion: choice(r.schemaVersion, [\"0.1.0\"]), id: textValue(r.id), version: textValue(r.version),\n state: parseOpticalProfileState(r.state), evidence: parseEvidence(r.evidence),\n interaction: choice(r.interaction, [\"lens-reflections\", \"sensor-lens-reflections\"]),\n wavelengthNm: positive(r.wavelengthNm, \"wavelengthNm\"), wavelengthBasis: choice(r.wavelengthBasis, [\"air\", \"vacuum\"]),\n maximumSourceAngleDegrees: maximum, referenceEntranceAreaMm2: positive(r.referenceEntranceAreaMm2, \"referenceEntranceAreaMm2\"), responses };\n}\n\n/** Adds off-path spectral irradiance before the sensor integrates the exposure, never after tone mapping.\n * Source powers are integrated over profile.referenceEntranceAreaMm2 at this instant and wavelength.\n * The Gaussian templates are independently parameterized approximations, not ray tracing through a\n * lens prescription.\n */\nexport function calculateLensStrayLightIrradiance(input: {\n profile: LensStrayLightProfile; state: OpticalProfileState; enabled: boolean;\n imagePointMm: LensFieldPointMm; wavelengthNm: number; wavelengthBasis: \"air\" | \"vacuum\";\n timeSeconds: number; primarySpectralIrradianceWPerM2PerNm: number;\n sources: readonly StrayLightSource[]; meterDomain: \"primary-only\" | \"primary-plus-stray\";\n}): CalculationResult<StrayLightIrradiance> {\n requireInputKeys(input, \"calculateLensStrayLightIrradiance\", [\"profile\", \"state\", \"enabled\", \"imagePointMm\", \"wavelengthNm\", \"wavelengthBasis\", \"timeSeconds\", \"primarySpectralIrradianceWPerM2PerNm\", \"sources\", \"meterDomain\"]);\n const profile = parseLensStrayLightProfile(input.profile);\n requireSameState(profile.state, input.state);\n const p = point(input.imagePointMm), time = finite(input.timeSeconds, \"timeSeconds\");\n const primary = finite(input.primarySpectralIrradianceWPerM2PerNm, \"primary irradiance\");\n if (time < 0 || primary < 0 || typeof input.enabled !== \"boolean\") throw new InvalidScientificInputError(\"Invalid time, primary irradiance or enabled state.\");\n if (input.wavelengthNm !== profile.wavelengthNm || input.wavelengthBasis !== profile.wavelengthBasis) {\n throw new InvalidScientificInputError(\"Wavelength/basis mismatch; select an explicit profile slice.\");\n }\n const meter = choice(input.meterDomain, [\"primary-only\", \"primary-plus-stray\"]);\n const sources = list(input.sources, 128).map((value): StrayLightSource => {\n const s = record(value, [\"id\", \"fieldAngleXDegrees\", \"fieldAngleYDegrees\", \"incidentSpectralPowerWPerNm\", \"admittedFraction\"]);\n const x = finite(s.fieldAngleXDegrees, \"source angle X\"), y = finite(s.fieldAngleYDegrees, \"source angle Y\");\n const power = finite(s.incidentSpectralPowerWPerNm, \"source power\");\n if (Math.hypot(x, y) > profile.maximumSourceAngleDegrees || power < 0) throw new InvalidScientificInputError(\"Source outside profile domain or negative power.\");\n return { id: textValue(s.id), fieldAngleXDegrees: x, fieldAngleYDegrees: y,\n incidentSpectralPowerWPerNm: power, admittedFraction: fraction(s.admittedFraction, \"admittedFraction\") };\n });\n if (new Set(sources.map((s) => s.id)).size !== sources.length) throw new InvalidScientificInputError(\"Duplicate source IDs.\");\n const contributions: StrayLightIrradiance[\"contributions\"][number][] = [];\n let ghost = 0, veil = 0;\n if (input.enabled) for (const s of sources) for (const r of profile.responses) {\n const m = r.centroidMmPerDegree;\n const center = { x: m[0]*s.fieldAngleXDegrees+m[1]*s.fieldAngleYDegrees+r.offsetMm.x,\n y: m[2]*s.fieldAngleXDegrees+m[3]*s.fieldAngleYDegrees+r.offsetMm.y };\n const rho = Math.hypot(s.fieldAngleXDegrees, s.fieldAngleYDegrees)/profile.maximumSourceAngleDegrees;\n const response = r.axisPowerFraction*(1+r.angularSlope*rho*rho);\n // Infinite-plane unit-integral density in 1/mm², converted to 1/m².\n const densityPerM2 = Math.exp(-((p.x-center.x)**2+(p.y-center.y)**2)/(2*r.sigmaMm**2))/(2*Math.PI*r.sigmaMm**2)*1e6;\n const irradiance = s.incidentSpectralPowerWPerNm*s.admittedFraction*response*densityPerM2;\n contributions.push({ sourceId: s.id, responseId: r.id, kind: r.kind, spectralIrradianceWPerM2PerNm: irradiance });\n if (r.kind === \"ghost\") ghost += irradiance; else veil += irradiance;\n }\n const total = primary+ghost+veil;\n return approximationResult({ profileId: profile.id, profileVersion: profile.version, interaction: profile.interaction,\n imagePointMm: p, wavelengthNm: profile.wavelengthNm, wavelengthBasis: profile.wavelengthBasis,\n timeSeconds: time, primarySpectralIrradianceWPerM2PerNm: primary, ghostSpectralIrradianceWPerM2PerNm: ghost,\n veilSpectralIrradianceWPerM2PerNm: veil, totalSpectralIrradianceWPerM2PerNm: total,\n meterDomain: meter, meterSpectralIrradianceWPerM2PerNm: meter === \"primary-only\" ? primary : total, contributions },\n \"parametric-clean-lens-stray-light\", \"0.1.0\", [profile.evidence.basis, profile.evidence.residualNote,\n \"Additive pre-sensor irradiance; exposure, saturation and noise remain downstream\",\n \"No diffraction, primary PSF, contamination, cosmetic sprites or calibrated branded signature\",\n \"One instant and one wavelength slice; no implicit temporal or spectral averaging\"]);\n}\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
2
|
+
* Gaussian thin-lens image distance: 1/f = 1/s + 1/v, where f is the focal length, s the object
|
|
3
|
+
* distance and v the image distance.
|
|
4
|
+
*
|
|
5
|
+
* This is a paraxial (small-angle) ideal-lens model. It does not model real-lens focus breathing,
|
|
6
|
+
* pupil magnification, principal-plane movement or aberrations.
|
|
7
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
8
|
+
* and support limits.
|
|
8
9
|
*/
|
|
9
10
|
import { type CalculationResult } from "../core/calculation-result.js";
|
|
10
11
|
export interface CalculateThinLensImageDistanceInput {
|
|
@@ -31,8 +32,8 @@ export interface ThinLensImageDistance {
|
|
|
31
32
|
*
|
|
32
33
|
* where f is focal length, s is object distance, and v is image distance.
|
|
33
34
|
*
|
|
34
|
-
* This is a paraxial ideal-lens model. It does not model
|
|
35
|
-
* breathing, pupil magnification, principal-plane movement
|
|
35
|
+
* This is a paraxial (small-angle) ideal-lens model. It does not model
|
|
36
|
+
* real-lens focus breathing, pupil magnification, principal-plane movement
|
|
37
|
+
* or aberrations.
|
|
36
38
|
*/
|
|
37
39
|
export declare function calculateThinLensImageDistance(input: CalculateThinLensImageDistanceInput): CalculationResult<ThinLensImageDistance>;
|
|
38
|
-
//# sourceMappingURL=thin-lens.d.ts.map
|
package/dist/optics/thin-lens.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
3
|
+
* Gaussian thin-lens image distance: 1/f = 1/s + 1/v, where f is the focal length, s the object
|
|
4
|
+
* distance and v the image distance.
|
|
5
|
+
*
|
|
6
|
+
* This is a paraxial (small-angle) ideal-lens model. It does not model real-lens focus breathing,
|
|
7
|
+
* pupil magnification, principal-plane movement or aberrations.
|
|
8
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
9
|
+
* and support limits.
|
|
9
10
|
*/
|
|
10
11
|
import { calculatedResult } from "../core/calculation-result.js";
|
|
11
12
|
import { InvalidScientificInputError, requirePositiveFinite } from "../core/validation.js";
|
|
13
|
+
import { requireInputKeys } from "../core/record-validation.js";
|
|
12
14
|
/**
|
|
13
15
|
* Calculates Gaussian thin-lens image distance:
|
|
14
16
|
*
|
|
@@ -16,10 +18,12 @@ import { InvalidScientificInputError, requirePositiveFinite } from "../core/vali
|
|
|
16
18
|
*
|
|
17
19
|
* where f is focal length, s is object distance, and v is image distance.
|
|
18
20
|
*
|
|
19
|
-
* This is a paraxial ideal-lens model. It does not model
|
|
20
|
-
* breathing, pupil magnification, principal-plane movement
|
|
21
|
+
* This is a paraxial (small-angle) ideal-lens model. It does not model
|
|
22
|
+
* real-lens focus breathing, pupil magnification, principal-plane movement
|
|
23
|
+
* or aberrations.
|
|
21
24
|
*/
|
|
22
25
|
export function calculateThinLensImageDistance(input) {
|
|
26
|
+
requireInputKeys(input, "calculateThinLensImageDistance", ["focalLengthMm", "objectDistanceM"]);
|
|
23
27
|
requirePositiveFinite("focalLengthMm", input.focalLengthMm);
|
|
24
28
|
requirePositiveFinite("objectDistanceM", input.objectDistanceM);
|
|
25
29
|
const objectDistanceMm = input.objectDistanceM * 1000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thin-lens.js","sourceRoot":"","sources":["../../src/optics/thin-lens.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC
|
|
1
|
+
{"version":3,"file":"thin-lens.js","sourceRoot":"","sources":["../../src/optics/thin-lens.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;GAQG;AAEH,OAAO,EACL,gBAAgB,EAEjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAqBhE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,8BAA8B,CAC5C,KAA0C;IAE1C,gBAAgB,CAAC,KAAK,EAAE,gCAAgC,EAAE,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAChG,qBAAqB,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5D,qBAAqB,CAAC,iBAAiB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IAEhE,MAAM,gBAAgB,GAAG,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;IACtD,IAAI,gBAAgB,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,IAAI,2BAA2B,CACnC,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GACnB,CAAC,KAAK,CAAC,aAAa,GAAG,gBAAgB,CAAC;QACxC,CAAC,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IAE3C,OAAO,gBAAgB,CACrB;QACE,eAAe;QACf,aAAa,EAAE,eAAe,GAAG,gBAAgB;QACjD,uBAAuB,EAAE,eAAe,GAAG,KAAK,CAAC,aAAa;KAC/D,EACD,mCAAmC,EACnC,OAAO,EACP;QACE,mCAAmC;QACnC,oDAAoD;QACpD,mEAAmE;KACpE,CACF,CAAC;AACJ,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Gaussian thin-lens image distance: 1/f = 1/s + 1/v, where f is the focal length, s the object\n * distance and v the image distance.\n *\n * This is a paraxial (small-angle) ideal-lens model. It does not model real-lens focus breathing,\n * pupil magnification, principal-plane movement or aberrations.\n * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers\n * and support limits.\n */\n\nimport {\n calculatedResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveFinite\n} from \"../core/validation.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\n\nexport interface CalculateThinLensImageDistanceInput {\n /** Lens focal length in millimetres. */\n focalLengthMm: number;\n /** Object/focus-plane distance from the lens principal plane in metres. */\n objectDistanceM: number;\n}\n\nexport interface ThinLensImageDistance {\n /** Image/sensor-plane distance from the lens principal plane in millimetres. */\n imageDistanceMm: number;\n /** Absolute paraxial magnification at the supplied object distance. */\n magnification: number;\n /**\n * Image-distance scale relative to the infinity-focus approximation f.\n * Values approach 1 as object distance becomes large.\n */\n infinityProjectionScale: number;\n}\n\n/**\n * Calculates Gaussian thin-lens image distance:\n *\n * 1/f = 1/s + 1/v\n *\n * where f is focal length, s is object distance, and v is image distance.\n *\n * This is a paraxial (small-angle) ideal-lens model. It does not model\n * real-lens focus breathing, pupil magnification, principal-plane movement\n * or aberrations.\n */\nexport function calculateThinLensImageDistance(\n input: CalculateThinLensImageDistanceInput\n): CalculationResult<ThinLensImageDistance> {\n requireInputKeys(input, \"calculateThinLensImageDistance\", [\"focalLengthMm\", \"objectDistanceM\"]);\n requirePositiveFinite(\"focalLengthMm\", input.focalLengthMm);\n requirePositiveFinite(\"objectDistanceM\", input.objectDistanceM);\n\n const objectDistanceMm = input.objectDistanceM * 1000;\n if (objectDistanceMm <= input.focalLengthMm) {\n throw new InvalidScientificInputError(\n \"objectDistanceM must place the object plane beyond the focal length.\"\n );\n }\n\n const imageDistanceMm =\n (input.focalLengthMm * objectDistanceMm) /\n (objectDistanceMm - input.focalLengthMm);\n\n return calculatedResult(\n {\n imageDistanceMm,\n magnification: imageDistanceMm / objectDistanceMm,\n infinityProjectionScale: imageDistanceMm / input.focalLengthMm\n },\n \"gaussian-thin-lens-image-distance\",\n \"1.0.0\",\n [\n \"Paraxial Gaussian thin-lens model\",\n \"Distances are measured from ideal principal planes\",\n \"Real-lens focus breathing and pupil magnification are not modeled\"\n ]\n );\n}\n"]}
|