@photivra/engine 1.4.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +401 -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 +118 -5
- package/dist/capture/native-raw-development.js +224 -59
- 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 +67 -10
- package/dist/capture/native-raw.js +90 -24
- 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/host-yield.d.ts +7 -0
- package/dist/facade/host-yield.js +23 -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 +284 -0
- package/dist/facade/simulate-capture.js +1026 -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 +89 -25
- package/dist/index.js +59 -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.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 +761 -2
- package/docs/QUICK_START.md +495 -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 -4
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +23 -8
- 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 +2213 -8
- 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 +324 -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.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 -12
- 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/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 -47
- 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_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/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/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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile-contract.js","sourceRoot":"","sources":["../../src/optics/profile-contract.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC
|
|
1
|
+
{"version":3,"file":"profile-contract.js","sourceRoot":"","sources":["../../src/optics/profile-contract.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Generic optical state. It ties one camera body, lens, version, acquisition setting and output\n * configuration to explicit evidence for the approximation used.\n *\n * These identities do not certify manufacturer calibration. Correction and stray-light code checks\n * that the state matches exactly before it applies any declared coefficients.\n * @see docs/RELEASE_1_0.md and the corresponding domain guide.\n */\n\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport { parseEvidenceList, type EvidenceProvenance } from \"../core/evidence-provenance.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\n/** Exact, generic camera, lens and acquisition state. Nothing is interpolated implicitly. */\nexport interface OpticalProfileState {\n bodyId: string;\n bodyVersion: string;\n lensId: string;\n lensVersion: string;\n focalLengthMm: number;\n aperture: number;\n focusDistanceM: number;\n captureMode: \"still\" | \"video\";\n outputWidth: number;\n outputHeight: number;\n frameRateHz: number;\n stabilizationMode: string;\n}\n\n/** Evidence for a generic approximation. It never implies a measured calibration. */\nexport interface GenericOpticalEvidence {\n kind: \"generic-parametric\";\n basis: string;\n residualNote: string;\n sources: readonly EvidenceProvenance[];\n}\n\n/** @internal Strict shared profile parser helpers. */\nexport function record(value: unknown, keys: readonly string[]): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new InvalidConfigurationError(\"Expected a profile object.\");\n }\n const result = value as Record<string, unknown>;\n const unknown = Object.keys(result).find((key) => !keys.includes(key));\n if (unknown !== undefined) {\n throw new InvalidConfigurationError(`Unknown profile field. Unknown field ${JSON.stringify(unknown)}.`);\n }\n return result;\n}\n\n/** @internal */\nexport function finite(value: unknown, name: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new InvalidScientificInputError(`${name} must be finite.`);\n }\n return value;\n}\n\n/** @internal */\nexport function positive(value: unknown, name: string): number {\n const number = finite(value, name);\n if (number <= 0) throw new InvalidScientificInputError(`${name} must be positive.`);\n return number;\n}\n\n/** @internal */\nexport function textValue(value: unknown): string {\n if (typeof value !== \"string\" || value.trim() === \"\") {\n throw new InvalidScientificInputError(\"Expected a nonempty identity or evidence string.\");\n }\n return value;\n}\n\n/** @internal */\nexport function choice<T extends string>(value: unknown, choices: readonly T[]): T {\n if (!choices.includes(value as T)) throw new InvalidConfigurationError(\"Unknown profile enum.\");\n return value as T;\n}\n\n/** @internal Rejects gaps and unbounded work. Consumers reject duplicates. */\nexport function list(value: unknown, maximum = 4096): unknown[] {\n if (!Array.isArray(value) || value.length > maximum ||\n Array.from({ length: value.length }, (_, index) => index in value).includes(false)) {\n throw new InvalidScientificInputError(\"Expected a bounded dense array.\");\n }\n return value;\n}\n\n/** Parses a complete exact-state binding, including still, video and output settings. */\nexport function parseOpticalProfileState(value: unknown): OpticalProfileState {\n const r = record(value, [\"bodyId\", \"bodyVersion\", \"lensId\", \"lensVersion\", \"focalLengthMm\",\n \"aperture\", \"focusDistanceM\", \"captureMode\", \"outputWidth\", \"outputHeight\", \"frameRateHz\", \"stabilizationMode\"]);\n const width = positive(r.outputWidth, \"outputWidth\");\n const height = positive(r.outputHeight, \"outputHeight\");\n if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height)) {\n throw new InvalidScientificInputError(\"Output dimensions must be safe integers.\");\n }\n const mode = choice(r.captureMode, [\"still\", \"video\"]);\n const rate = finite(r.frameRateHz, \"frameRateHz\");\n if (mode === \"still\" ? rate !== 0 : rate <= 0) {\n throw new InvalidScientificInputError(\"Still frameRateHz must be zero; video must be positive.\");\n }\n return {\n bodyId: textValue(r.bodyId), bodyVersion: textValue(r.bodyVersion),\n lensId: textValue(r.lensId), lensVersion: textValue(r.lensVersion),\n focalLengthMm: positive(r.focalLengthMm, \"focalLengthMm\"), aperture: positive(r.aperture, \"aperture\"),\n focusDistanceM: positive(r.focusDistanceM, \"focusDistanceM\"), captureMode: mode,\n outputWidth: width, outputHeight: height, frameRateHz: rate,\n stabilizationMode: textValue(r.stabilizationMode)\n };\n}\n\n/** @internal Exact binding. A mismatch fails; it is never extrapolated. */\nexport function requireSameState(expected: OpticalProfileState, actual: OpticalProfileState): void {\n if (JSON.stringify(parseOpticalProfileState(expected)) !== JSON.stringify(parseOpticalProfileState(actual))) {\n throw new InvalidScientificInputError(\"Profile is not applicable to this exact camera/lens state.\");\n }\n}\n\n/** @internal */\nexport function parseEvidence(value: unknown): GenericOpticalEvidence {\n const r = record(value, [\"kind\", \"basis\", \"residualNote\", \"sources\"]);\n const sources = parseEvidenceList(list(r.sources, 32), \"evidence.sources\");\n return { kind: choice(r.kind, [\"generic-parametric\"]), basis: textValue(r.basis), residualNote: textValue(r.residualNote), sources };\n}\n"]}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* implemented.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* field
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
2
|
+
* Foundation contract for the PSF (point-spread function) and pupil.
|
|
3
|
+
*
|
|
4
|
+
* The contract lists the diagnostics that exist today. It also reserves names for future
|
|
5
|
+
* contributions. A reserved contribution is not implemented.
|
|
6
|
+
*
|
|
7
|
+
* The evaluator runs today's PSF-related diagnostics in one explicit context: field position,
|
|
8
|
+
* depth, wavelength and pupil. It does not combine them into a synthetic PSF or blur radius. The
|
|
9
|
+
* field position is recorded even though the current defocus-circle and circular-Airy diagnostics
|
|
10
|
+
* do not depend on it. Future field-dependent contributions can use the same context without
|
|
11
|
+
* changing these primitives.
|
|
12
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
13
|
+
* and support limits.
|
|
13
14
|
*/
|
|
14
15
|
import { type CalculationProvenance, type CalculationResult } from "../core/calculation-result.js";
|
|
15
16
|
import type { LensFieldPointMm } from "./radial-distortion.js";
|
|
@@ -46,8 +47,9 @@ export interface CalculatePsfFoundationComponentsInput {
|
|
|
46
47
|
*/
|
|
47
48
|
fieldPointMm: LensFieldPointMm;
|
|
48
49
|
/**
|
|
49
|
-
* Physical image-plane radius used only to normalize field
|
|
50
|
-
*
|
|
50
|
+
* Physical image-plane radius. It is used only to normalize the field
|
|
51
|
+
* position so diagnostics can be compared across cases. It is not a lens
|
|
52
|
+
* calibration or a validity limit.
|
|
51
53
|
*/
|
|
52
54
|
fieldNormalizationRadiusMm: number;
|
|
53
55
|
spectralBasis: {
|
|
@@ -97,19 +99,17 @@ export interface PsfFoundationComponents {
|
|
|
97
99
|
/**
|
|
98
100
|
* Returns the public PSF/pupil foundation contract.
|
|
99
101
|
*
|
|
100
|
-
* The contract
|
|
101
|
-
*
|
|
102
|
+
* The contract lists today's diagnostics and reserves names for future
|
|
103
|
+
* contributions. A reserved contribution is not implemented.
|
|
102
104
|
*/
|
|
103
105
|
export declare function getPsfFoundationContract(): PsfFoundationContract;
|
|
104
106
|
/**
|
|
105
|
-
* Evaluates
|
|
106
|
-
*
|
|
107
|
-
* PSF or blur radius.
|
|
107
|
+
* Evaluates today's PSF-related diagnostics in one explicit context (field
|
|
108
|
+
* position, depth, wavelength and pupil). It does not combine them into a
|
|
109
|
+
* synthetic PSF or blur radius.
|
|
108
110
|
*
|
|
109
|
-
*
|
|
110
|
-
* circular-Airy diagnostics
|
|
111
|
-
* contributions can
|
|
112
|
-
* primitives.
|
|
111
|
+
* The field position is recorded even though the current defocus-circle and
|
|
112
|
+
* circular-Airy diagnostics do not depend on it. Future field-dependent
|
|
113
|
+
* contributions can use the same context without changing these primitives.
|
|
113
114
|
*/
|
|
114
115
|
export declare function calculatePsfFoundationComponents(input: CalculatePsfFoundationComponentsInput): CalculationResult<PsfFoundationComponents>;
|
|
115
|
-
//# sourceMappingURL=psf-foundation.d.ts.map
|
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* implemented.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* field
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
3
|
+
* Foundation contract for the PSF (point-spread function) and pupil.
|
|
4
|
+
*
|
|
5
|
+
* The contract lists the diagnostics that exist today. It also reserves names for future
|
|
6
|
+
* contributions. A reserved contribution is not implemented.
|
|
7
|
+
*
|
|
8
|
+
* The evaluator runs today's PSF-related diagnostics in one explicit context: field position,
|
|
9
|
+
* depth, wavelength and pupil. It does not combine them into a synthetic PSF or blur radius. The
|
|
10
|
+
* field position is recorded even though the current defocus-circle and circular-Airy diagnostics
|
|
11
|
+
* do not depend on it. Future field-dependent contributions can use the same context without
|
|
12
|
+
* changing these primitives.
|
|
13
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
14
|
+
* and support limits.
|
|
14
15
|
*/
|
|
15
16
|
import { calculatedResult } from "../core/calculation-result.js";
|
|
16
17
|
import { InvalidScientificInputError, requirePositiveFinite } from "../core/validation.js";
|
|
17
18
|
import { calculateDefocusCircle } from "./depth-of-field.js";
|
|
18
19
|
import { calculateAiryDisk } from "./diffraction.js";
|
|
20
|
+
import { requireInputKeys } from "../core/record-validation.js";
|
|
21
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
19
22
|
export const PSF_FOUNDATION_VERSION = "0.3.0";
|
|
20
23
|
const CONTRIBUTIONS = [
|
|
21
24
|
{
|
|
@@ -71,8 +74,8 @@ const NOTES = [
|
|
|
71
74
|
/**
|
|
72
75
|
* Returns the public PSF/pupil foundation contract.
|
|
73
76
|
*
|
|
74
|
-
* The contract
|
|
75
|
-
*
|
|
77
|
+
* The contract lists today's diagnostics and reserves names for future
|
|
78
|
+
* contributions. A reserved contribution is not implemented.
|
|
76
79
|
*/
|
|
77
80
|
export function getPsfFoundationContract() {
|
|
78
81
|
return {
|
|
@@ -93,23 +96,23 @@ export function getPsfFoundationContract() {
|
|
|
93
96
|
};
|
|
94
97
|
}
|
|
95
98
|
/**
|
|
96
|
-
* Evaluates
|
|
97
|
-
*
|
|
98
|
-
* PSF or blur radius.
|
|
99
|
+
* Evaluates today's PSF-related diagnostics in one explicit context (field
|
|
100
|
+
* position, depth, wavelength and pupil). It does not combine them into a
|
|
101
|
+
* synthetic PSF or blur radius.
|
|
99
102
|
*
|
|
100
|
-
*
|
|
101
|
-
* circular-Airy diagnostics
|
|
102
|
-
* contributions can
|
|
103
|
-
* primitives.
|
|
103
|
+
* The field position is recorded even though the current defocus-circle and
|
|
104
|
+
* circular-Airy diagnostics do not depend on it. Future field-dependent
|
|
105
|
+
* contributions can use the same context without changing these primitives.
|
|
104
106
|
*/
|
|
105
107
|
export function calculatePsfFoundationComponents(input) {
|
|
108
|
+
requireInputKeys(input, "calculatePsfFoundationComponents", ["focalLengthMm", "aperture", "focusDistanceM", "subjectDistanceM", "fieldPointMm", "fieldNormalizationRadiusMm", "spectralBasis"]);
|
|
106
109
|
requirePositiveFinite("focalLengthMm", input.focalLengthMm);
|
|
107
110
|
requirePositiveFinite("aperture", input.aperture);
|
|
108
111
|
requirePositiveFinite("focusDistanceM", input.focusDistanceM);
|
|
109
112
|
requirePositiveFinite("subjectDistanceM", input.subjectDistanceM);
|
|
110
113
|
requirePositiveFinite("fieldNormalizationRadiusMm", input.fieldNormalizationRadiusMm);
|
|
111
114
|
if (input.spectralBasis?.kind !== "monochromatic") {
|
|
112
|
-
throw new
|
|
115
|
+
throw new InvalidConfigurationError('spectralBasis.kind must be "monochromatic".');
|
|
113
116
|
}
|
|
114
117
|
requirePositiveFinite("spectralBasis.wavelengthNm", input.spectralBasis.wavelengthNm);
|
|
115
118
|
if (!Number.isFinite(input.fieldPointMm.x)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"psf-foundation.js","sourceRoot":"","sources":["../../src/optics/psf-foundation.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,gBAAgB,EAGjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAgB,CAAC;AAwGvD,MAAM,aAAa,GAAG;IACpB;QACE,EAAE,EAAE,0BAA0B;QAC9B,MAAM,EAAE,wBAAwB;QAChC,SAAS,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC;QACnC,IAAI,EACF,gHAAgH;KACnH;IACD;QACE,EAAE,EAAE,iCAAiC;QACrC,MAAM,EAAE,wBAAwB;QAChC,SAAS,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;QAClC,IAAI,EACF,6HAA6H;KAChI;IACD;QACE,EAAE,EAAE,0BAA0B;QAC9B,MAAM,EAAE,uBAAuB;QAC/B,SAAS,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;QAClC,IAAI,EACF,gMAAgM;KACnM;IACD;QACE,EAAE,EAAE,2BAA2B;QAC/B,MAAM,EAAE,uBAAuB;QAC/B,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC;QACtC,IAAI,EACF,wKAAwK;KAC3K;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,MAAM,EAAE,uBAAuB;QAC/B,SAAS,EAAE,CAAC,gBAAgB,EAAE,aAAa,CAAC;QAC5C,IAAI,EACF,yJAAyJ;KAC5J;IACD;QACE,EAAE,EAAE,4BAA4B;QAChC,MAAM,EAAE,uBAAuB;QAC/B,SAAS,EAAE,CAAC,gBAAgB,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,CAAC;QACnE,IAAI,EACF,mJAAmJ;KACtJ;IACD;QACE,EAAE,EAAE,uBAAuB;QAC3B,MAAM,EAAE,uBAAuB;QAC/B,SAAS,EAAE,CAAC,gBAAgB,EAAE,aAAa,EAAE,OAAO,CAAC;QACrD,IAAI,EACF,+IAA+I;KAClJ;CACoD,CAAC;AAExD,MAAM,KAAK,GAAG;IACZ,6NAA6N;IAC7N,mIAAmI;IACnI,yLAAyL;IACzL,4FAA4F;IAC5F,0HAA0H;CAClH,CAAC;AAEX;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,OAAO,EAAE,sBAAsB;QAC/B,eAAe,EAAE,oBAAoB;QACrC,SAAS,EAAE,iBAAiB;QAC5B,iBAAiB,EACf,0DAA0D;QAC5D,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAClD,GAAG,YAAY;YACf,SAAS,EAAE,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC;SACvC,CAAC,CAAC;QACH,sBAAsB,EAAE;YACtB,qBAAqB,EAAE,IAAI;YAC3B,6BAA6B,EAAE,IAAI;YACnC,iCAAiC,EAAE,IAAI;SACxC;QACD,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;KAClB,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gCAAgC,CAC9C,KAA4C;IAE5C,qBAAqB,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5D,qBAAqB,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClD,qBAAqB,CAAC,gBAAgB,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAC9D,qBAAqB,CAAC,kBAAkB,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAClE,qBAAqB,CACnB,4BAA4B,EAC5B,KAAK,CAAC,0BAA0B,CACjC,CAAC;IACF,IAAI,KAAK,CAAC,aAAa,EAAE,IAAI,KAAK,eAAe,EAAE,CAAC;QAClD,MAAM,IAAI,2BAA2B,CACnC,6CAA6C,CAC9C,CAAC;IACJ,CAAC;IACD,qBAAqB,CACnB,4BAA4B,EAC5B,KAAK,CAAC,aAAa,CAAC,YAAY,CACjC,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,2BAA2B,CACnC,gCAAgC,CACjC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,2BAA2B,CACnC,gCAAgC,CACjC,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC;QACrC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;KACzC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,iBAAiB,CAAC;QACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC,YAAY;KAC/C,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,KAAK,CAAC,YAAY,CAAC,CAAC,EACpB,KAAK,CAAC,YAAY,CAAC,CAAC,CACrB,CAAC;IAEF,OAAO,gBAAgB,CACrB;QACE,OAAO,EAAE;YACP,KAAK,EAAE;gBACL,YAAY,EAAE,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE;gBACvC,QAAQ;gBACR,qBAAqB,EAAE,KAAK,CAAC,0BAA0B;gBACvD,gBAAgB,EAAE,QAAQ,GAAG,KAAK,CAAC,0BAA0B;aAC9D;YACD,KAAK,EAAE;gBACL,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;aACzC;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,eAAe;gBACrB,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC,YAAY;aAC/C;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,iCAAiC;gBACvC,eAAe,EAAE,KAAK,CAAC,QAAQ;gBAC/B,UAAU,EAAE,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,QAAQ;aACjD;SACF;QACD,aAAa,EAAE;YACb,gBAAgB,EAAE;gBAChB,EAAE,EAAE,0BAA0B;gBAC9B,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;gBACpC,UAAU,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE;aACtC;YACD,mBAAmB,EAAE;gBACnB,EAAE,EAAE,iCAAiC;gBACrC,4BAA4B,EAC1B,WAAW,CAAC,KAAK,CAAC,4BAA4B;gBAChD,UAAU,EAAE,EAAE,GAAG,WAAW,CAAC,UAAU,EAAE;aAC1C;SACF;QACD,WAAW,EAAE;YACX,MAAM,EAAE,cAAc;YACtB,IAAI,EACF,0FAA0F;SAC7F;KACF,EACD,qCAAqC,EACrC,OAAO,EACP;QACE,wGAAwG;QACxG,yGAAyG;QACzG,+FAA+F;QAC/F,oFAAoF;KACrF,CACF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"psf-foundation.js","sourceRoot":"","sources":["../../src/optics/psf-foundation.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Foundation contract for the PSF (point-spread function) and pupil.\n *\n * The contract lists the diagnostics that exist today. It also reserves names for future\n * contributions. A reserved contribution is not implemented.\n *\n * The evaluator runs today's PSF-related diagnostics in one explicit context: field position,\n * depth, wavelength and pupil. It does not combine them into a synthetic PSF or blur radius. The\n * field position is recorded even though the current defocus-circle and circular-Airy diagnostics\n * do not depend on it. Future field-dependent contributions can use the same context without\n * changing these primitives.\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 CalculationProvenance,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveFinite\n} from \"../core/validation.js\";\nimport type { LensFieldPointMm } from \"./radial-distortion.js\";\nimport { calculateDefocusCircle } from \"./depth-of-field.js\";\nimport { calculateAiryDisk } from \"./diffraction.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nexport const PSF_FOUNDATION_VERSION = \"0.3.0\" as const;\n\nexport type PsfContributionId =\n | \"geometric-defocus-circle\"\n | \"circular-diffraction-first-zero\"\n | \"non-circular-diffraction\"\n | \"mechanical-pupil-clipping\"\n | \"field-curvature\"\n | \"field-dependent-aberration\"\n | \"field-dependent-bokeh\";\n\nexport type PsfContributionStatus =\n | \"implemented-diagnostic\"\n | \"implemented-framework\"\n | \"reserved-contract\";\n\nexport interface PsfContributionContract {\n id: PsfContributionId;\n status: PsfContributionStatus;\n dependsOn: readonly (\n | \"field-position\"\n | \"focus-depth\"\n | \"pupil\"\n | \"wavelength\"\n )[];\n note: string;\n}\n\nexport interface PsfFoundationContract {\n version: typeof PSF_FOUNDATION_VERSION;\n coordinateSpace: \"image-plane-metric\";\n fieldAxes: \"+X right, +Y up\";\n compositionPolicy:\n \"separate-diagnostics-plus-explicit-profiled-combined-psf\";\n contributions: readonly PsfContributionContract[];\n previewReferencePolicy: {\n previewMayApproximate: true;\n referenceMayUseHigherFidelity: true;\n mustPreserveContributionSemantics: true;\n };\n notes: readonly string[];\n}\n\nexport interface CalculatePsfFoundationComponentsInput {\n focalLengthMm: number;\n aperture: number;\n focusDistanceM: number;\n subjectDistanceM: number;\n /**\n * Image-plane field position relative to the optical axis, in millimetres.\n * +X is right and +Y is up.\n */\n fieldPointMm: LensFieldPointMm;\n /**\n * Physical image-plane radius. It is used only to normalize the field\n * position so diagnostics can be compared across cases. It is not a lens\n * calibration or a validity limit.\n */\n fieldNormalizationRadiusMm: number;\n spectralBasis: {\n kind: \"monochromatic\";\n wavelengthNm: number;\n };\n}\n\nexport interface PsfFoundationComponents {\n context: {\n field: {\n imagePointMm: LensFieldPointMm;\n radiusMm: number;\n normalizationRadiusMm: number;\n normalizedRadius: number;\n };\n depth: {\n focusDistanceM: number;\n subjectDistanceM: number;\n };\n spectralBasis: {\n kind: \"monochromatic\";\n wavelengthNm: number;\n };\n pupil: {\n kind: \"ideal-circular-f-number-derived\";\n apertureFNumber: number;\n diameterMm: number;\n };\n };\n contributions: {\n geometricDefocus: {\n id: \"geometric-defocus-circle\";\n diameterMm: number;\n provenance: CalculationProvenance;\n };\n circularDiffraction: {\n id: \"circular-diffraction-first-zero\";\n firstZeroDiameterMicrometers: number;\n provenance: CalculationProvenance;\n };\n };\n composition: {\n status: \"not-composed\";\n note: string;\n };\n}\n\nconst CONTRIBUTIONS = [\n {\n id: \"geometric-defocus-circle\",\n status: \"implemented-diagnostic\",\n dependsOn: [\"focus-depth\", \"pupil\"],\n note:\n \"Existing thin-lens geometric defocus diameter. This is a blur-circle diagnostic, not a complete intensity PSF.\"\n },\n {\n id: \"circular-diffraction-first-zero\",\n status: \"implemented-diagnostic\",\n dependsOn: [\"pupil\", \"wavelength\"],\n note:\n \"Existing ideal circular-pupil first-zero Airy diameter. This is a diffraction-size diagnostic, not a sampled intensity PSF.\"\n },\n {\n id: \"non-circular-diffraction\",\n status: \"implemented-framework\",\n dependsOn: [\"pupil\", \"wavelength\"],\n note:\n \"Implemented ideal on-axis regular-polygon Fraunhofer PSF density with explicit equal-area physical pupil scaling. Curved blades, aberration and off-axis/clipped real pupils are not inferred.\"\n },\n {\n id: \"mechanical-pupil-clipping\",\n status: \"implemented-framework\",\n dependsOn: [\"pupil\", \"field-position\"],\n note:\n \"Implemented through explicit sampled-PSF or complex-pupil profile semantics. PSF shape and relative pupil throughput remain separately owned to avoid double counting.\"\n },\n {\n id: \"field-curvature\",\n status: \"implemented-framework\",\n dependsOn: [\"field-position\", \"focus-depth\"],\n note:\n \"Implemented as explicit field-dependent best-focus image-plane offset in the lens-PSF profile framework. It remains separate from geometric distortion.\"\n },\n {\n id: \"field-dependent-aberration\",\n status: \"implemented-framework\",\n dependsOn: [\"field-position\", \"focus-depth\", \"pupil\", \"wavelength\"],\n note:\n \"Implemented through full 2D sampled PSF kernels and explicit complex-pupil amplitude/OPD propagation. No scalar lens-sharpness score is produced.\"\n },\n {\n id: \"field-dependent-bokeh\",\n status: \"implemented-framework\",\n dependsOn: [\"field-position\", \"focus-depth\", \"pupil\"],\n note:\n \"Implemented through signed-defocus sampled PSF context and optional pupil-clipping shape. Visibility/depth compositing remains renderer work.\"\n }\n] as const satisfies readonly PsfContributionContract[];\n\nconst NOTES = [\n \"This foundation preserves the legacy defocus/Airy diagnostics separately while the lens-PSF framework can resolve explicitly profiled combined primary-optical PSFs. It still never emits one scalar lens-sharpness result.\",\n \"Existing geometric defocus and circular Airy outputs remain independently named scientific diagnostics with their own provenance.\",\n \"Framework contributions require explicit profile/evaluator APIs; the ideal polygon diffraction evaluator is standalone and is not silently composed into the legacy diagnostics or POC.\",\n \"Illumination vignetting is a separate throughput-only model and is not a PSF contribution.\",\n \"Real-lens PSF calibration requires defensible provenance, compatible reuse rights, and explicit limitations/uncertainty.\"\n] as const;\n\n/**\n * Returns the public PSF/pupil foundation contract.\n *\n * The contract lists today's diagnostics and reserves names for future\n * contributions. A reserved contribution is not implemented.\n */\nexport function getPsfFoundationContract(): PsfFoundationContract {\n return {\n version: PSF_FOUNDATION_VERSION,\n coordinateSpace: \"image-plane-metric\",\n fieldAxes: \"+X right, +Y up\",\n compositionPolicy:\n \"separate-diagnostics-plus-explicit-profiled-combined-psf\",\n contributions: CONTRIBUTIONS.map((contribution) => ({\n ...contribution,\n dependsOn: [...contribution.dependsOn]\n })),\n previewReferencePolicy: {\n previewMayApproximate: true,\n referenceMayUseHigherFidelity: true,\n mustPreserveContributionSemantics: true\n },\n notes: [...NOTES]\n };\n}\n\n/**\n * Evaluates today's PSF-related diagnostics in one explicit context (field\n * position, depth, wavelength and pupil). It does not combine them into a\n * synthetic PSF or blur radius.\n *\n * The field position is recorded even though the current defocus-circle and\n * circular-Airy diagnostics do not depend on it. Future field-dependent\n * contributions can use the same context without changing these primitives.\n */\nexport function calculatePsfFoundationComponents(\n input: CalculatePsfFoundationComponentsInput\n): CalculationResult<PsfFoundationComponents> {\n requireInputKeys(input, \"calculatePsfFoundationComponents\", [\"focalLengthMm\", \"aperture\", \"focusDistanceM\", \"subjectDistanceM\", \"fieldPointMm\", \"fieldNormalizationRadiusMm\", \"spectralBasis\"]);\n requirePositiveFinite(\"focalLengthMm\", input.focalLengthMm);\n requirePositiveFinite(\"aperture\", input.aperture);\n requirePositiveFinite(\"focusDistanceM\", input.focusDistanceM);\n requirePositiveFinite(\"subjectDistanceM\", input.subjectDistanceM);\n requirePositiveFinite(\n \"fieldNormalizationRadiusMm\",\n input.fieldNormalizationRadiusMm\n );\n if (input.spectralBasis?.kind !== \"monochromatic\") {\n throw new InvalidConfigurationError(\n 'spectralBasis.kind must be \"monochromatic\".'\n );\n }\n requirePositiveFinite(\n \"spectralBasis.wavelengthNm\",\n input.spectralBasis.wavelengthNm\n );\n\n if (!Number.isFinite(input.fieldPointMm.x)) {\n throw new InvalidScientificInputError(\n \"fieldPointMm.x must be finite.\"\n );\n }\n if (!Number.isFinite(input.fieldPointMm.y)) {\n throw new InvalidScientificInputError(\n \"fieldPointMm.y must be finite.\"\n );\n }\n\n const defocus = calculateDefocusCircle({\n focalLengthMm: input.focalLengthMm,\n aperture: input.aperture,\n focusDistanceM: input.focusDistanceM,\n subjectDistanceM: input.subjectDistanceM\n });\n const diffraction = calculateAiryDisk({\n aperture: input.aperture,\n wavelengthNm: input.spectralBasis.wavelengthNm\n });\n\n const radiusMm = Math.hypot(\n input.fieldPointMm.x,\n input.fieldPointMm.y\n );\n\n return calculatedResult(\n {\n context: {\n field: {\n imagePointMm: { ...input.fieldPointMm },\n radiusMm,\n normalizationRadiusMm: input.fieldNormalizationRadiusMm,\n normalizedRadius: radiusMm / input.fieldNormalizationRadiusMm\n },\n depth: {\n focusDistanceM: input.focusDistanceM,\n subjectDistanceM: input.subjectDistanceM\n },\n spectralBasis: {\n kind: \"monochromatic\",\n wavelengthNm: input.spectralBasis.wavelengthNm\n },\n pupil: {\n kind: \"ideal-circular-f-number-derived\",\n apertureFNumber: input.aperture,\n diameterMm: input.focalLengthMm / input.aperture\n }\n },\n contributions: {\n geometricDefocus: {\n id: \"geometric-defocus-circle\",\n diameterMm: defocus.value.diameterMm,\n provenance: { ...defocus.provenance }\n },\n circularDiffraction: {\n id: \"circular-diffraction-first-zero\",\n firstZeroDiameterMicrometers:\n diffraction.value.firstZeroDiameterMicrometers,\n provenance: { ...diffraction.provenance }\n }\n },\n composition: {\n status: \"not-composed\",\n note:\n \"No combined PSF, MTF, convolution kernel, or scalar sharpness value has been calculated.\"\n }\n },\n \"psf-foundation-separated-components\",\n \"1.0.0\",\n [\n \"Current geometric defocus and ideal circular-pupil diffraction diagnostics are evaluated independently\",\n \"Field position is explicit context but does not alter the current field-invariant diagnostic primitives\",\n \"The result intentionally does not combine defocus and diffraction into one blur radius or PSF\",\n \"Illumination vignetting is excluded because it is a separate throughput-only stage\"\n ]\n );\n}\n"]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Physical vignetting models derived from pupil geometry. They are separate from the
|
|
3
|
+
* calculateIlluminationVignetting() polynomial, whose coefficients the caller supplies.
|
|
4
|
+
*
|
|
5
|
+
* Apply at most one field-throughput model to a signal. Do not stack these results on top of a
|
|
6
|
+
* supplied field-throughput profile.
|
|
7
|
+
*
|
|
8
|
+
* Natural vignetting (relative illumination of an aberration-free system with a uniform Lambertian
|
|
9
|
+
* exit pupil):
|
|
10
|
+
* - cosine-fourth: E(theta) / E(0) = cos^4(theta), theta the image-space chief-ray angle with
|
|
11
|
+
* tan(theta) = h / z for image height h and exit-pupil distance z (Greivenkamp, OPTI-502 course
|
|
12
|
+
* notes, University of Arizona, sec. 11, free. Also see: Slater 1980 Photographic Systems for
|
|
13
|
+
* Engineers; Kingslake, Lens Design Fundamentals, 2nd ed., sec. 6.5; Ray, Applied Photographic
|
|
14
|
+
* Optics, 3rd ed., sec. 12). It is the small-pupil limit of the next model.
|
|
15
|
+
* - finite-lambertian-pupil: exact irradiance from a uniform Lambertian disk of radius a at distance z
|
|
16
|
+
* onto a parallel plane at lateral offset h (Foote 1915, Bull. Bureau of Standards 12:583):
|
|
17
|
+
* E = (pi L / 2) [1 - (z^2 + h^2 - a^2) / sqrt((z^2 + h^2 + a^2)^2 - 4 a^2 h^2)],
|
|
18
|
+
* normalised by its on-axis value pi L a^2 / (z^2 + a^2). For a -> 0 it tends to cos^4(theta).
|
|
19
|
+
* Pupil aberration and pupil distortion are not modeled.
|
|
20
|
+
*
|
|
21
|
+
* Mechanical (optical) vignetting and the cat's-eye pupil:
|
|
22
|
+
* - At field angle theta, each clipping aperture (a lens barrel or element rim, referred to the
|
|
23
|
+
* entrance-pupil plane) appears as a circle of its declared radius. The circle is shifted by
|
|
24
|
+
* shiftPerTanFieldMm * tan(theta) along the field azimuth.
|
|
25
|
+
* - The open pupil is where the entrance-pupil circle overlaps every shifted circle. Off axis, the
|
|
26
|
+
* bundle stays circular and centred on the chief ray, and an aperture passes only the part of it
|
|
27
|
+
* that it covers (Greivenkamp, OPTI-502 course notes, University of Arizona, sec. 10, free. Also
|
|
28
|
+
* see: Kingslake, Lens Design Fundamentals, sec. 6.4; Smith, Modern Optical Engineering, 4th ed.,
|
|
29
|
+
* sec. 6.3).
|
|
30
|
+
* - With one aperture, the area is the exact area of the two-circle overlap.
|
|
31
|
+
* - With any number of apertures, the exact convex boundary is also returned, sampled as a polygon
|
|
32
|
+
* in pupil-plane mm (+X right, +Y up). Use it as a polygon pupil for
|
|
33
|
+
* calculatePolygonPupilFraunhoferPsf() or as a mask for createWavefrontPupilGrid().
|
|
34
|
+
* The combined relative illumination is cos^4(theta) x open-area ratio. This assumes an object at
|
|
35
|
+
* infinity, a stop imaged without pupil aberration, and an object-space field angle equal to the
|
|
36
|
+
* chief-ray angle.
|
|
37
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
38
|
+
* and support limits.
|
|
39
|
+
*/
|
|
40
|
+
import { type CalculationResult } from "../core/calculation-result.js";
|
|
41
|
+
export type NaturalVignettingModel = "cosine-fourth" | "finite-lambertian-pupil";
|
|
42
|
+
export interface CalculateNaturalVignettingInput {
|
|
43
|
+
model: NaturalVignettingModel;
|
|
44
|
+
/** Image-plane point relative to the optical axis, mm. */
|
|
45
|
+
imagePointMm: {
|
|
46
|
+
x: number;
|
|
47
|
+
y: number;
|
|
48
|
+
};
|
|
49
|
+
/** Axial distance from the exit pupil to the image plane, mm. */
|
|
50
|
+
exitPupilDistanceMm: number;
|
|
51
|
+
/** Exit-pupil diameter, mm; required for finite-lambertian-pupil. */
|
|
52
|
+
exitPupilDiameterMm?: number;
|
|
53
|
+
}
|
|
54
|
+
export interface NaturalVignetting {
|
|
55
|
+
model: NaturalVignettingModel;
|
|
56
|
+
/** Image-space chief-ray angle, radians. */
|
|
57
|
+
chiefRayAngleRadians: number;
|
|
58
|
+
/** Relative illumination E / E(axis), in (0, 1]. */
|
|
59
|
+
relativeIllumination: number;
|
|
60
|
+
/** Positive exposure loss, stops. */
|
|
61
|
+
attenuationStops: number;
|
|
62
|
+
/** cos^4 of the chief-ray angle, reported for comparison. */
|
|
63
|
+
cosineFourthFactor: number;
|
|
64
|
+
}
|
|
65
|
+
export interface MechanicalVignettingAperture {
|
|
66
|
+
/** Aperture radius referred to the entrance-pupil plane, mm. */
|
|
67
|
+
radiusMm: number;
|
|
68
|
+
/**
|
|
69
|
+
* Signed shift of the aperture's projected centre per unit tan(field angle), in mm, along the
|
|
70
|
+
* field azimuth. Positive means toward the field point.
|
|
71
|
+
*/
|
|
72
|
+
shiftPerTanFieldMm: number;
|
|
73
|
+
}
|
|
74
|
+
export interface CalculateMechanicalVignettingInput {
|
|
75
|
+
/** Unclipped entrance-pupil diameter, mm. */
|
|
76
|
+
entrancePupilDiameterMm: number;
|
|
77
|
+
/** Object-space field angle from the optical axis, degrees, in [0, 90). */
|
|
78
|
+
fieldAngleDegrees: number;
|
|
79
|
+
/** Image-plane direction of the field point, degrees counter-clockwise from +X. */
|
|
80
|
+
fieldAzimuthDegrees: number;
|
|
81
|
+
/** One through eight clipping apertures. */
|
|
82
|
+
apertures: readonly MechanicalVignettingAperture[];
|
|
83
|
+
/** Boundary samples per circle for the polygon, from 16 to 4096 (default 256). */
|
|
84
|
+
boundarySamplesPerCircle?: number;
|
|
85
|
+
}
|
|
86
|
+
export interface MechanicalVignetting {
|
|
87
|
+
fieldAngleDegrees: number;
|
|
88
|
+
fieldAzimuthDegrees: number;
|
|
89
|
+
entrancePupilAreaSquareMm: number;
|
|
90
|
+
/** Open area in mm^2. Exact for a single aperture; the polygon area otherwise. */
|
|
91
|
+
openAreaSquareMm: number;
|
|
92
|
+
areaMethod: "exact-circle-circle-intersection" | "boundary-polygon";
|
|
93
|
+
/** Open area / unclipped pupil area, in [0, 1]. */
|
|
94
|
+
openAreaRatio: number;
|
|
95
|
+
/** cos^4(field angle). */
|
|
96
|
+
cosineFourthFactor: number;
|
|
97
|
+
/** cos^4(theta) x openAreaRatio. */
|
|
98
|
+
combinedRelativeIllumination: number;
|
|
99
|
+
/** Counter-clockwise convex boundary of the open pupil (empty when fully vignetted), mm. */
|
|
100
|
+
openPupilPolygonMm: readonly {
|
|
101
|
+
x: number;
|
|
102
|
+
y: number;
|
|
103
|
+
}[];
|
|
104
|
+
/** Area centroid of the boundary polygon, mm (null when fully vignetted). */
|
|
105
|
+
openPupilCentroidMm: {
|
|
106
|
+
x: number;
|
|
107
|
+
y: number;
|
|
108
|
+
} | null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Natural (cos^4 or finite Lambertian pupil) relative illumination at one image point.
|
|
112
|
+
*/
|
|
113
|
+
export declare function calculateNaturalVignetting(input: CalculateNaturalVignettingInput): CalculationResult<NaturalVignetting>;
|
|
114
|
+
/**
|
|
115
|
+
* Mechanical vignetting at one field angle: the open (cat's-eye) pupil from intersecting the
|
|
116
|
+
* entrance pupil with displaced clipping apertures, its area ratio, and cos^4 x area ratio.
|
|
117
|
+
*/
|
|
118
|
+
export declare function calculateMechanicalVignetting(input: CalculateMechanicalVignettingInput): CalculationResult<MechanicalVignetting>;
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Physical vignetting models derived from pupil geometry. They are separate from the
|
|
4
|
+
* calculateIlluminationVignetting() polynomial, whose coefficients the caller supplies.
|
|
5
|
+
*
|
|
6
|
+
* Apply at most one field-throughput model to a signal. Do not stack these results on top of a
|
|
7
|
+
* supplied field-throughput profile.
|
|
8
|
+
*
|
|
9
|
+
* Natural vignetting (relative illumination of an aberration-free system with a uniform Lambertian
|
|
10
|
+
* exit pupil):
|
|
11
|
+
* - cosine-fourth: E(theta) / E(0) = cos^4(theta), theta the image-space chief-ray angle with
|
|
12
|
+
* tan(theta) = h / z for image height h and exit-pupil distance z (Greivenkamp, OPTI-502 course
|
|
13
|
+
* notes, University of Arizona, sec. 11, free. Also see: Slater 1980 Photographic Systems for
|
|
14
|
+
* Engineers; Kingslake, Lens Design Fundamentals, 2nd ed., sec. 6.5; Ray, Applied Photographic
|
|
15
|
+
* Optics, 3rd ed., sec. 12). It is the small-pupil limit of the next model.
|
|
16
|
+
* - finite-lambertian-pupil: exact irradiance from a uniform Lambertian disk of radius a at distance z
|
|
17
|
+
* onto a parallel plane at lateral offset h (Foote 1915, Bull. Bureau of Standards 12:583):
|
|
18
|
+
* E = (pi L / 2) [1 - (z^2 + h^2 - a^2) / sqrt((z^2 + h^2 + a^2)^2 - 4 a^2 h^2)],
|
|
19
|
+
* normalised by its on-axis value pi L a^2 / (z^2 + a^2). For a -> 0 it tends to cos^4(theta).
|
|
20
|
+
* Pupil aberration and pupil distortion are not modeled.
|
|
21
|
+
*
|
|
22
|
+
* Mechanical (optical) vignetting and the cat's-eye pupil:
|
|
23
|
+
* - At field angle theta, each clipping aperture (a lens barrel or element rim, referred to the
|
|
24
|
+
* entrance-pupil plane) appears as a circle of its declared radius. The circle is shifted by
|
|
25
|
+
* shiftPerTanFieldMm * tan(theta) along the field azimuth.
|
|
26
|
+
* - The open pupil is where the entrance-pupil circle overlaps every shifted circle. Off axis, the
|
|
27
|
+
* bundle stays circular and centred on the chief ray, and an aperture passes only the part of it
|
|
28
|
+
* that it covers (Greivenkamp, OPTI-502 course notes, University of Arizona, sec. 10, free. Also
|
|
29
|
+
* see: Kingslake, Lens Design Fundamentals, sec. 6.4; Smith, Modern Optical Engineering, 4th ed.,
|
|
30
|
+
* sec. 6.3).
|
|
31
|
+
* - With one aperture, the area is the exact area of the two-circle overlap.
|
|
32
|
+
* - With any number of apertures, the exact convex boundary is also returned, sampled as a polygon
|
|
33
|
+
* in pupil-plane mm (+X right, +Y up). Use it as a polygon pupil for
|
|
34
|
+
* calculatePolygonPupilFraunhoferPsf() or as a mask for createWavefrontPupilGrid().
|
|
35
|
+
* The combined relative illumination is cos^4(theta) x open-area ratio. This assumes an object at
|
|
36
|
+
* infinity, a stop imaged without pupil aberration, and an object-space field angle equal to the
|
|
37
|
+
* chief-ray angle.
|
|
38
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
39
|
+
* and support limits.
|
|
40
|
+
*/
|
|
41
|
+
import { approximationResult, calculatedResult } from "../core/calculation-result.js";
|
|
42
|
+
import { InvalidScientificInputError, requirePositiveFinite } from "../core/validation.js";
|
|
43
|
+
import { requireInputKeys } from "../core/record-validation.js";
|
|
44
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
45
|
+
function requireFinite(name, value) {
|
|
46
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
47
|
+
throw new InvalidScientificInputError(`${name} must be finite.`);
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Natural (cos^4 or finite Lambertian pupil) relative illumination at one image point.
|
|
53
|
+
*/
|
|
54
|
+
export function calculateNaturalVignetting(input) {
|
|
55
|
+
requireInputKeys(input, "calculateNaturalVignetting", ["model", "imagePointMm", "exitPupilDistanceMm", "exitPupilDiameterMm"]);
|
|
56
|
+
if (input.model !== "cosine-fourth" && input.model !== "finite-lambertian-pupil") {
|
|
57
|
+
throw new InvalidConfigurationError("model must be cosine-fourth or finite-lambertian-pupil.");
|
|
58
|
+
}
|
|
59
|
+
if (typeof input.imagePointMm !== "object" || input.imagePointMm === null) {
|
|
60
|
+
throw new InvalidConfigurationError("imagePointMm must be an object.");
|
|
61
|
+
}
|
|
62
|
+
const h = Math.hypot(requireFinite("imagePointMm.x", input.imagePointMm.x), requireFinite("imagePointMm.y", input.imagePointMm.y));
|
|
63
|
+
requirePositiveFinite("exitPupilDistanceMm", input.exitPupilDistanceMm);
|
|
64
|
+
const z = input.exitPupilDistanceMm;
|
|
65
|
+
const theta = Math.atan2(h, z);
|
|
66
|
+
const cos2 = (z * z) / (z * z + h * h);
|
|
67
|
+
const cosineFourthFactor = cos2 * cos2;
|
|
68
|
+
let relativeIllumination;
|
|
69
|
+
if (input.model === "cosine-fourth") {
|
|
70
|
+
if (input.exitPupilDiameterMm !== undefined) {
|
|
71
|
+
throw new InvalidScientificInputError("exitPupilDiameterMm is not used by the cosine-fourth model; omit it.");
|
|
72
|
+
}
|
|
73
|
+
relativeIllumination = cosineFourthFactor;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
requirePositiveFinite("exitPupilDiameterMm", input.exitPupilDiameterMm);
|
|
77
|
+
const a = input.exitPupilDiameterMm / 2;
|
|
78
|
+
const z2 = z * z;
|
|
79
|
+
const h2 = h * h;
|
|
80
|
+
const a2 = a * a;
|
|
81
|
+
// Bracket term written as 2 a^2 (...) / (sqrt + ...) to avoid cancellation for small pupils:
|
|
82
|
+
// 1 - P / Q = (Q - P) / Q with Q - P = (Q^2 - P^2) / (Q + P) = 4 a^2 z^2 / (Q + P).
|
|
83
|
+
const p = z2 + h2 - a2;
|
|
84
|
+
const q = Math.sqrt((z2 + h2 + a2) ** 2 - 4 * a2 * h2);
|
|
85
|
+
const offAxis = (4 * a2 * z2) / (q * (q + p)) / 2;
|
|
86
|
+
const onAxis = a2 / (z2 + a2);
|
|
87
|
+
relativeIllumination = offAxis / onAxis;
|
|
88
|
+
}
|
|
89
|
+
if (!(relativeIllumination > 0) || !Number.isFinite(relativeIllumination)) {
|
|
90
|
+
throw new InvalidScientificInputError("Natural vignetting relative illumination must remain finite and positive.");
|
|
91
|
+
}
|
|
92
|
+
relativeIllumination = Math.min(1, relativeIllumination);
|
|
93
|
+
return calculatedResult({
|
|
94
|
+
model: input.model,
|
|
95
|
+
chiefRayAngleRadians: theta,
|
|
96
|
+
relativeIllumination,
|
|
97
|
+
attenuationStops: relativeIllumination === 1 ? 0 : -Math.log2(relativeIllumination),
|
|
98
|
+
cosineFourthFactor
|
|
99
|
+
}, input.model === "cosine-fourth"
|
|
100
|
+
? "cosine-fourth-natural-vignetting"
|
|
101
|
+
: "finite-lambertian-pupil-natural-vignetting", "1.0.0", [
|
|
102
|
+
input.model === "cosine-fourth"
|
|
103
|
+
? "Relative illumination cos^4 of the image-space chief-ray angle from the exit-pupil centre"
|
|
104
|
+
: "Exact irradiance from a uniform Lambertian circular exit pupil onto a parallel image plane, normalised on axis",
|
|
105
|
+
"Aberration-free pupil: pupil aberration, pupil distortion and mechanical clipping are not modeled",
|
|
106
|
+
"Throughput only; apply at most one field-throughput model, in scene-linear signal"
|
|
107
|
+
]);
|
|
108
|
+
}
|
|
109
|
+
/** Exact area of the intersection of two circles. */
|
|
110
|
+
function circleIntersectionArea(r1, r2, d) {
|
|
111
|
+
if (d >= r1 + r2)
|
|
112
|
+
return 0;
|
|
113
|
+
if (d <= Math.abs(r1 - r2))
|
|
114
|
+
return Math.PI * Math.min(r1, r2) ** 2;
|
|
115
|
+
const clamp = (v) => Math.max(-1, Math.min(1, v));
|
|
116
|
+
const a1 = Math.acos(clamp((d * d + r1 * r1 - r2 * r2) / (2 * d * r1)));
|
|
117
|
+
const a2 = Math.acos(clamp((d * d + r2 * r2 - r1 * r1) / (2 * d * r2)));
|
|
118
|
+
const k = Math.sqrt(Math.max(0, (-d + r1 + r2) * (d + r1 - r2) * (d - r1 + r2) * (d + r1 + r2)));
|
|
119
|
+
return r1 * r1 * a1 + r2 * r2 * a2 - k / 2;
|
|
120
|
+
}
|
|
121
|
+
function insideAll(point, circles, skip) {
|
|
122
|
+
return circles.every((circle, index) => index === skip ||
|
|
123
|
+
Math.hypot(point.x - circle.x, point.y - circle.y) <= circle.r * (1 + 1e-12));
|
|
124
|
+
}
|
|
125
|
+
/** Convex boundary of the intersection of circles, sampled with vertices on the true boundary. */
|
|
126
|
+
function intersectionPolygon(circles, samples) {
|
|
127
|
+
const points = [];
|
|
128
|
+
circles.forEach((circle, index) => {
|
|
129
|
+
for (let k = 0; k < samples; k += 1) {
|
|
130
|
+
const angle = (2 * Math.PI * k) / samples;
|
|
131
|
+
const point = {
|
|
132
|
+
x: circle.x + circle.r * Math.cos(angle),
|
|
133
|
+
y: circle.y + circle.r * Math.sin(angle)
|
|
134
|
+
};
|
|
135
|
+
if (insideAll(point, circles, index))
|
|
136
|
+
points.push(point);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
// Pairwise boundary intersection points (the cusps of the cat's eye).
|
|
140
|
+
for (let i = 0; i < circles.length; i += 1) {
|
|
141
|
+
for (let j = i + 1; j < circles.length; j += 1) {
|
|
142
|
+
const a = circles[i];
|
|
143
|
+
const b = circles[j];
|
|
144
|
+
const d = Math.hypot(b.x - a.x, b.y - a.y);
|
|
145
|
+
if (d === 0 || d >= a.r + b.r || d <= Math.abs(a.r - b.r))
|
|
146
|
+
continue;
|
|
147
|
+
const along = (d * d + a.r * a.r - b.r * b.r) / (2 * d);
|
|
148
|
+
const half = Math.sqrt(Math.max(0, a.r * a.r - along * along));
|
|
149
|
+
const ux = (b.x - a.x) / d;
|
|
150
|
+
const uy = (b.y - a.y) / d;
|
|
151
|
+
for (const sign of [1, -1]) {
|
|
152
|
+
const point = {
|
|
153
|
+
x: a.x + along * ux - sign * half * uy,
|
|
154
|
+
y: a.y + along * uy + sign * half * ux
|
|
155
|
+
};
|
|
156
|
+
if (circles.every((c) => Math.hypot(point.x - c.x, point.y - c.y) <= c.r * (1 + 1e-9))) {
|
|
157
|
+
points.push(point);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (points.length < 3)
|
|
163
|
+
return [];
|
|
164
|
+
const cx = points.reduce((s, p) => s + p.x, 0) / points.length;
|
|
165
|
+
const cy = points.reduce((s, p) => s + p.y, 0) / points.length;
|
|
166
|
+
points.sort((p, q) => Math.atan2(p.y - cy, p.x - cx) - Math.atan2(q.y - cy, q.x - cx));
|
|
167
|
+
// Drop coincident neighbours.
|
|
168
|
+
const unique = points.filter((p, index) => {
|
|
169
|
+
const prev = points[(index + points.length - 1) % points.length];
|
|
170
|
+
return index === 0 || Math.hypot(p.x - prev.x, p.y - prev.y) > 1e-12 * (1 + Math.abs(p.x) + Math.abs(p.y));
|
|
171
|
+
});
|
|
172
|
+
return unique.length >= 3 ? unique : [];
|
|
173
|
+
}
|
|
174
|
+
function polygonAreaAndCentroid(polygon) {
|
|
175
|
+
let twiceArea = 0;
|
|
176
|
+
let cx = 0;
|
|
177
|
+
let cy = 0;
|
|
178
|
+
for (let i = 0; i < polygon.length; i += 1) {
|
|
179
|
+
const a = polygon[i];
|
|
180
|
+
const b = polygon[(i + 1) % polygon.length];
|
|
181
|
+
const cross = a.x * b.y - b.x * a.y;
|
|
182
|
+
twiceArea += cross;
|
|
183
|
+
cx += (a.x + b.x) * cross;
|
|
184
|
+
cy += (a.y + b.y) * cross;
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
area: twiceArea / 2,
|
|
188
|
+
centroid: { x: cx / (3 * twiceArea), y: cy / (3 * twiceArea) }
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Mechanical vignetting at one field angle: the open (cat's-eye) pupil from intersecting the
|
|
193
|
+
* entrance pupil with displaced clipping apertures, its area ratio, and cos^4 x area ratio.
|
|
194
|
+
*/
|
|
195
|
+
export function calculateMechanicalVignetting(input) {
|
|
196
|
+
requireInputKeys(input, "calculateMechanicalVignetting", ["entrancePupilDiameterMm", "fieldAngleDegrees", "fieldAzimuthDegrees", "apertures", "boundarySamplesPerCircle"]);
|
|
197
|
+
requirePositiveFinite("entrancePupilDiameterMm", input.entrancePupilDiameterMm);
|
|
198
|
+
const fieldAngleDegrees = requireFinite("fieldAngleDegrees", input.fieldAngleDegrees);
|
|
199
|
+
if (fieldAngleDegrees < 0 || fieldAngleDegrees >= 90) {
|
|
200
|
+
throw new InvalidScientificInputError("fieldAngleDegrees must lie in [0, 90).");
|
|
201
|
+
}
|
|
202
|
+
const fieldAzimuthDegrees = requireFinite("fieldAzimuthDegrees", input.fieldAzimuthDegrees);
|
|
203
|
+
if (!Array.isArray(input.apertures) || input.apertures.length < 1 || input.apertures.length > 8) {
|
|
204
|
+
throw new InvalidScientificInputError("apertures must contain 1 through 8 entries.");
|
|
205
|
+
}
|
|
206
|
+
const samples = input.boundarySamplesPerCircle ?? 256;
|
|
207
|
+
if (!Number.isSafeInteger(samples) || samples < 16 || samples > 4096) {
|
|
208
|
+
throw new InvalidScientificInputError("boundarySamplesPerCircle must be an integer from 16 through 4096.");
|
|
209
|
+
}
|
|
210
|
+
const theta = (fieldAngleDegrees * Math.PI) / 180;
|
|
211
|
+
const azimuth = (fieldAzimuthDegrees * Math.PI) / 180;
|
|
212
|
+
const tanTheta = Math.tan(theta);
|
|
213
|
+
const pupilRadius = input.entrancePupilDiameterMm / 2;
|
|
214
|
+
const circles = [{ x: 0, y: 0, r: pupilRadius }];
|
|
215
|
+
input.apertures.forEach((aperture, index) => {
|
|
216
|
+
if (typeof aperture !== "object" || aperture === null) {
|
|
217
|
+
throw new InvalidConfigurationError(`apertures[${index}] must be an object.`);
|
|
218
|
+
}
|
|
219
|
+
requirePositiveFinite(`apertures[${index}].radiusMm`, aperture.radiusMm);
|
|
220
|
+
const shift = requireFinite(`apertures[${index}].shiftPerTanFieldMm`, aperture.shiftPerTanFieldMm) *
|
|
221
|
+
tanTheta;
|
|
222
|
+
circles.push({
|
|
223
|
+
x: shift * Math.cos(azimuth),
|
|
224
|
+
y: shift * Math.sin(azimuth),
|
|
225
|
+
r: aperture.radiusMm
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
const pupilArea = Math.PI * pupilRadius * pupilRadius;
|
|
229
|
+
const polygon = intersectionPolygon(circles, samples);
|
|
230
|
+
const geometry = polygon.length >= 3 ? polygonAreaAndCentroid(polygon) : undefined;
|
|
231
|
+
let openArea;
|
|
232
|
+
let areaMethod;
|
|
233
|
+
if (circles.length === 2) {
|
|
234
|
+
const other = circles[1];
|
|
235
|
+
openArea = circleIntersectionArea(pupilRadius, other.r, Math.hypot(other.x, other.y));
|
|
236
|
+
areaMethod = "exact-circle-circle-intersection";
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
openArea = geometry?.area ?? 0;
|
|
240
|
+
areaMethod = "boundary-polygon";
|
|
241
|
+
}
|
|
242
|
+
const openAreaRatio = Math.min(1, Math.max(0, openArea / pupilArea));
|
|
243
|
+
const cos2 = Math.cos(theta) ** 2;
|
|
244
|
+
const cosineFourthFactor = cos2 * cos2;
|
|
245
|
+
return approximationResult({
|
|
246
|
+
fieldAngleDegrees,
|
|
247
|
+
fieldAzimuthDegrees,
|
|
248
|
+
entrancePupilAreaSquareMm: pupilArea,
|
|
249
|
+
openAreaSquareMm: openArea,
|
|
250
|
+
areaMethod,
|
|
251
|
+
openAreaRatio,
|
|
252
|
+
cosineFourthFactor,
|
|
253
|
+
combinedRelativeIllumination: cosineFourthFactor * openAreaRatio,
|
|
254
|
+
openPupilPolygonMm: polygon,
|
|
255
|
+
openPupilCentroidMm: geometry?.centroid ?? null
|
|
256
|
+
}, "cats-eye-mechanical-vignetting", "1.0.0", [
|
|
257
|
+
"Clipping apertures are circles referred to the entrance-pupil plane, displaced linearly with tan(field angle) along the field azimuth",
|
|
258
|
+
"Open pupil = intersection of the entrance pupil with every displaced aperture; boundary vertices lie exactly on the circles",
|
|
259
|
+
"Combined relative illumination cos^4(theta) x open-area ratio assumes an object at infinity and no pupil aberration",
|
|
260
|
+
"Pupil coordinates are metric and aligned with the image plane (+X right, +Y up)",
|
|
261
|
+
"Geometry is caller-declared; no named-lens barrel data is implied"
|
|
262
|
+
]);
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=pupil-vignetting.js.map
|