@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,21 +1,27 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
3
|
+
* Exposure windows: when each point on the sensor starts and stops collecting light.
|
|
4
|
+
*
|
|
5
|
+
* The shutter has an opening boundary and a closing boundary, each with its own schedule. With a
|
|
6
|
+
* rolling or curtain shutter the boundaries sweep across the sensor, so each point has its own
|
|
7
|
+
* (local) window. Times are seconds from the first opening boundary. That is deliberately not the
|
|
8
|
+
* same as the camera-rotation API's global "exposure start"; a later layer must link the two
|
|
9
|
+
* explicitly.
|
|
10
|
+
*
|
|
11
|
+
* The mechanism records whether each boundary is mechanical or electronic, but supplies no sweep
|
|
12
|
+
* duration or direction. Every timing value and direction for a non-simultaneous boundary is declared
|
|
13
|
+
* by the caller, with evidence. Only simultaneous boundaries and a uniform linear sweep along one
|
|
14
|
+
* native sensor axis are supported. Not modelled: curtain acceleration, segmented or non-linear
|
|
15
|
+
* electronic schedules, flash or flicker, rolling-shutter image distortion, shutter shock, and
|
|
16
|
+
* EFCS (electronic first-curtain shutter) effects on the pupil or bokeh.
|
|
13
17
|
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
14
18
|
* limits.
|
|
15
19
|
*/
|
|
16
20
|
import { approximationResult } from "../core/calculation-result.js";
|
|
17
21
|
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
18
22
|
import { InvalidScientificInputError, requirePositiveInteger } from "../core/validation.js";
|
|
23
|
+
import { requireInputObject, requireInputKeys, rejectUnknownFields } from "../core/record-validation.js";
|
|
24
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
19
25
|
const SHUTTER_MECHANISMS = new Set([
|
|
20
26
|
"mechanical",
|
|
21
27
|
"electronic-first-curtain",
|
|
@@ -31,10 +37,12 @@ const BOUNDARY_KINDS = new Set([
|
|
|
31
37
|
"simultaneous",
|
|
32
38
|
"uniform-linear-native-scan"
|
|
33
39
|
]);
|
|
34
|
-
function requireRecord(value, path) {
|
|
40
|
+
function requireRecord(value, path, allowedKeys) {
|
|
35
41
|
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
36
|
-
throw new
|
|
42
|
+
throw new InvalidConfigurationError(path + " must be an object.");
|
|
37
43
|
}
|
|
44
|
+
if (allowedKeys !== null)
|
|
45
|
+
rejectUnknownFields(value, allowedKeys, path);
|
|
38
46
|
return value;
|
|
39
47
|
}
|
|
40
48
|
function requireNonNegativeInteger(name, value) {
|
|
@@ -48,10 +56,11 @@ function requirePositiveFinite(name, value) {
|
|
|
48
56
|
}
|
|
49
57
|
return value;
|
|
50
58
|
}
|
|
51
|
-
|
|
52
|
-
|
|
59
|
+
/** Parses a sourced duration in seconds (`{ unit: "s", value, evidence }`). Not a root export. */
|
|
60
|
+
export function parseSecondsFact(value, path) {
|
|
61
|
+
const record = requireRecord(value, path, ["unit", "value", "evidence"]);
|
|
53
62
|
if (record.unit !== "s") {
|
|
54
|
-
throw new
|
|
63
|
+
throw new InvalidConfigurationError(path + '.unit must be "s".');
|
|
55
64
|
}
|
|
56
65
|
return {
|
|
57
66
|
value: requirePositiveFinite(path + ".value", record.value),
|
|
@@ -60,21 +69,23 @@ function parseSecondsFact(value, path) {
|
|
|
60
69
|
};
|
|
61
70
|
}
|
|
62
71
|
function parseDirectionFact(value, path) {
|
|
63
|
-
const record = requireRecord(value, path);
|
|
72
|
+
const record = requireRecord(value, path, ["value", "evidence"]);
|
|
64
73
|
if (typeof record.value !== "string" ||
|
|
65
74
|
!SCAN_DIRECTIONS.has(record.value)) {
|
|
66
|
-
throw new
|
|
75
|
+
throw new InvalidConfigurationError(path + ".value is invalid.");
|
|
67
76
|
}
|
|
68
77
|
return {
|
|
69
78
|
value: record.value,
|
|
70
79
|
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
71
80
|
};
|
|
72
81
|
}
|
|
73
|
-
|
|
74
|
-
|
|
82
|
+
/** Parses one exposure boundary schedule (opening or closing). Not a root export. */
|
|
83
|
+
export function parseBoundarySchedule(value, path) {
|
|
84
|
+
// unitVectorNative is the derived field of a resolved schedule; it may be passed back if it matches.
|
|
85
|
+
const record = requireRecord(value, path, ["kind", "directionNative", "traversalDurationSeconds", "unitVectorNative"]);
|
|
75
86
|
if (typeof record.kind !== "string" ||
|
|
76
87
|
!BOUNDARY_KINDS.has(record.kind)) {
|
|
77
|
-
throw new
|
|
88
|
+
throw new InvalidConfigurationError(path + ".kind is invalid.");
|
|
78
89
|
}
|
|
79
90
|
if (record.kind === "simultaneous") {
|
|
80
91
|
if (record.directionNative !== undefined) {
|
|
@@ -84,15 +95,27 @@ function parseBoundarySchedule(value, path) {
|
|
|
84
95
|
throw new InvalidScientificInputError(path +
|
|
85
96
|
".traversalDurationSeconds must be omitted for a simultaneous boundary.");
|
|
86
97
|
}
|
|
98
|
+
if (record.unitVectorNative !== undefined) {
|
|
99
|
+
throw new InvalidScientificInputError(path + ".unitVectorNative must be omitted for a simultaneous boundary.");
|
|
100
|
+
}
|
|
87
101
|
return { kind: "simultaneous" };
|
|
88
102
|
}
|
|
103
|
+
const directionNative = parseDirectionFact(record.directionNative, path + ".directionNative");
|
|
104
|
+
if (record.unitVectorNative !== undefined) {
|
|
105
|
+
const supplied = requireRecord(record.unitVectorNative, path + ".unitVectorNative", ["x", "y"]);
|
|
106
|
+
const derived = scanVector(directionNative.value);
|
|
107
|
+
if (supplied.x !== derived.x || supplied.y !== derived.y) {
|
|
108
|
+
throw new InvalidConfigurationError(path + ".unitVectorNative must match directionNative.");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
89
111
|
return {
|
|
90
112
|
kind: "uniform-linear-native-scan",
|
|
91
|
-
directionNative
|
|
113
|
+
directionNative,
|
|
92
114
|
traversalDurationSeconds: parseSecondsFact(record.traversalDurationSeconds, path + ".traversalDurationSeconds")
|
|
93
115
|
};
|
|
94
116
|
}
|
|
95
117
|
function validateNativeRaster(raster) {
|
|
118
|
+
requireInputObject(raster, "raster input");
|
|
96
119
|
requirePositiveInteger("nativeRaster.pixelWidth", raster.pixelWidth);
|
|
97
120
|
requirePositiveInteger("nativeRaster.pixelHeight", raster.pixelHeight);
|
|
98
121
|
}
|
|
@@ -117,7 +140,7 @@ function validateActiveCaptureRect(rect, raster) {
|
|
|
117
140
|
function validateShutterMechanism(value) {
|
|
118
141
|
if (typeof value !== "string" ||
|
|
119
142
|
!SHUTTER_MECHANISMS.has(value)) {
|
|
120
|
-
throw new
|
|
143
|
+
throw new InvalidConfigurationError("shutterMechanism is invalid.");
|
|
121
144
|
}
|
|
122
145
|
}
|
|
123
146
|
function validatePointWithinActiveCapture(point, rect, path) {
|
|
@@ -234,24 +257,25 @@ function activeRectCorners(rect) {
|
|
|
234
257
|
];
|
|
235
258
|
}
|
|
236
259
|
/**
|
|
237
|
-
*
|
|
238
|
-
* boundary schedules.
|
|
260
|
+
* Works out each point's local exposure window from separate opening and
|
|
261
|
+
* closing boundary schedules.
|
|
239
262
|
*
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
*
|
|
243
|
-
* bases explicitly.
|
|
263
|
+
* Times are seconds from the first opening boundary. This is deliberately not
|
|
264
|
+
* the camera-rotation API's global "exposure start"; a later layer must link the
|
|
265
|
+
* two explicitly.
|
|
244
266
|
*
|
|
245
|
-
* The mechanism
|
|
246
|
-
*
|
|
247
|
-
*
|
|
267
|
+
* The mechanism records whether each boundary is mechanical or electronic, but
|
|
268
|
+
* supplies no sweep duration or direction. Every timing value and direction for
|
|
269
|
+
* a non-simultaneous boundary is declared by the caller, with evidence.
|
|
248
270
|
*
|
|
249
|
-
*
|
|
250
|
-
*
|
|
251
|
-
*
|
|
252
|
-
*
|
|
271
|
+
* Only simultaneous boundaries and a uniform linear sweep along one native
|
|
272
|
+
* sensor axis are supported. Not modelled: curtain acceleration, segmented or
|
|
273
|
+
* non-linear electronic schedules, flash or flicker, rolling-shutter image
|
|
274
|
+
* distortion, shutter shock, and EFCS (electronic first-curtain shutter)
|
|
275
|
+
* effects on the pupil or bokeh.
|
|
253
276
|
*/
|
|
254
277
|
export function calculateCaptureExposureWindows(input) {
|
|
278
|
+
requireInputKeys(input, "calculateCaptureExposureWindows", ["nativeRaster", "activeCaptureRect", "shutterMechanism", "nominalExposureDurationSeconds", "opening", "closing", "samplePointsNative"]);
|
|
255
279
|
validateNativeRaster(input.nativeRaster);
|
|
256
280
|
validateShutterMechanism(input.shutterMechanism);
|
|
257
281
|
const nominalExposureDurationSeconds = parseSecondsFact(input.nominalExposureDurationSeconds, "nominalExposureDurationSeconds");
|
|
@@ -261,7 +285,7 @@ export function calculateCaptureExposureWindows(input) {
|
|
|
261
285
|
validateActiveCaptureRect(activeCaptureRect, input.nativeRaster);
|
|
262
286
|
if (input.samplePointsNative !== undefined &&
|
|
263
287
|
!Array.isArray(input.samplePointsNative)) {
|
|
264
|
-
throw new
|
|
288
|
+
throw new InvalidConfigurationError("samplePointsNative must be an array when supplied.");
|
|
265
289
|
}
|
|
266
290
|
const cornerSamples = activeRectCorners(activeCaptureRect).map((point) => createWindowSample(point, activeCaptureRect, opening, closing, nominalExposureDurationSeconds.value));
|
|
267
291
|
const localDurations = cornerSamples.map((sample) => sample.localExposureDurationSeconds);
|
|
@@ -302,4 +326,21 @@ export function calculateCaptureExposureWindows(input) {
|
|
|
302
326
|
"This model does not include curtain acceleration, segmented/nonlinear electronic timing, rolling-shutter image distortion, motion integration, flash/flicker interaction, shutter shock, or EFCS-specific pupil/bokeh behavior."
|
|
303
327
|
]);
|
|
304
328
|
}
|
|
329
|
+
/**
|
|
330
|
+
* Internal, for the faster ("lean") native environment executor (a 2.0 performance change). It checks a
|
|
331
|
+
* schedule once with every check of calculateCaptureExposureWindows, then returns a per-point sampler that
|
|
332
|
+
* uses the same point validation and the same createWindowSample arithmetic. So each sampled window is
|
|
333
|
+
* identical to what calculateCaptureExposureWindows returns for that point. Not exported from the package.
|
|
334
|
+
*/
|
|
335
|
+
export function prepareCaptureExposureWindowSampler(input) {
|
|
336
|
+
const admitted = calculateCaptureExposureWindows({ ...input, samplePointsNative: [] }).value;
|
|
337
|
+
const rect = { ...admitted.activeCaptureRect };
|
|
338
|
+
const opening = parseBoundarySchedule(input.opening, "opening");
|
|
339
|
+
const closing = parseBoundarySchedule(input.closing, "closing");
|
|
340
|
+
const nominal = admitted.nominalExposureDurationSeconds.value;
|
|
341
|
+
return (point) => {
|
|
342
|
+
validatePointWithinActiveCapture(point, rect, "samplePointsNative[0]");
|
|
343
|
+
return createWindowSample(point, rect, opening, closing, nominal);
|
|
344
|
+
};
|
|
345
|
+
}
|
|
305
346
|
//# sourceMappingURL=exposure-window.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exposure-window.js","sourceRoot":"","sources":["../../src/sensor/exposure-window.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"exposure-window.js","sourceRoot":"","sources":["../../src/sensor/exposure-window.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Exposure windows: when each point on the sensor starts and stops collecting light.\n *\n * The shutter has an opening boundary and a closing boundary, each with its own schedule. With a\n * rolling or curtain shutter the boundaries sweep across the sensor, so each point has its own\n * (local) window. Times are seconds from the first opening boundary. That is deliberately not the\n * same as the camera-rotation API's global \"exposure start\"; a later layer must link the two\n * explicitly.\n *\n * The mechanism records whether each boundary is mechanical or electronic, but supplies no sweep\n * duration or direction. Every timing value and direction for a non-simultaneous boundary is declared\n * by the caller, with evidence. Only simultaneous boundaries and a uniform linear sweep along one\n * native sensor axis are supported. Not modelled: curtain acceleration, segmented or non-linear\n * electronic schedules, flash or flicker, rolling-shutter image distortion, shutter shock, and\n * EFCS (electronic first-curtain shutter) effects on the pupil or bokeh.\n * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport {\n approximationResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport {\n parseEvidenceList,\n type EvidenceBackedFact\n} from \"../core/evidence-provenance.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveInteger\n} from \"../core/validation.js\";\nimport type {\n RasterPoint,\n RasterRect,\n RasterVector\n} from \"../output/capture-geometry.js\";\nimport type { NativeImageRaster } from \"./sensor-geometry.js\";\nimport type {\n CaptureShutterMechanism,\n NativeSensorReadoutScanDirection,\n SourcedSensorTimingSeconds\n} from \"./readout-timing.js\";\nimport { requireInputObject, requireInputKeys, rejectUnknownFields } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nexport type CaptureExposureBoundaryActuator = \"mechanical\" | \"electronic\";\n\nexport type SourcedCaptureTimingSeconds = SourcedSensorTimingSeconds;\n\nexport type SourcedCaptureBoundaryDirection =\n EvidenceBackedFact<NativeSensorReadoutScanDirection>;\n\nexport interface SimultaneousExposureBoundarySchedule {\n kind: \"simultaneous\";\n directionNative?: never;\n traversalDurationSeconds?: never;\n}\n\nexport interface UniformLinearExposureBoundarySchedule {\n kind: \"uniform-linear-native-scan\";\n directionNative: SourcedCaptureBoundaryDirection;\n traversalDurationSeconds: SourcedCaptureTimingSeconds;\n}\n\nexport type ExposureBoundarySchedule =\n | SimultaneousExposureBoundarySchedule\n | UniformLinearExposureBoundarySchedule;\n\nexport interface CalculateCaptureExposureWindowsInput {\n nativeRaster: NativeImageRaster;\n /**\n * Active capture rectangle, in fixed native pixel coordinates.\n *\n * Defaults to the whole native image. Sweep timing is never worked out by\n * scaling a full-frame timing value to this rectangle.\n */\n activeCaptureRect?: RasterRect;\n shutterMechanism: CaptureShutterMechanism;\n /**\n * Nominal time between the opening and closing reference points (phase zero).\n *\n * A point's local exposure can differ from this when the opening and closing\n * boundaries sweep differently across the sensor.\n */\n nominalExposureDurationSeconds: SourcedCaptureTimingSeconds;\n opening: ExposureBoundarySchedule;\n closing: ExposureBoundarySchedule;\n /**\n * Optional points, in continuous native pixel coordinates measured from pixel\n * edges, to report windows for. A pixel centre is at +0.5.\n */\n samplePointsNative?: readonly RasterPoint[];\n}\n\nexport interface ResolvedCaptureExposureBoundary {\n actuator: CaptureExposureBoundaryActuator;\n schedule:\n | {\n kind: \"simultaneous\";\n }\n | {\n kind: \"uniform-linear-native-scan\";\n directionNative: SourcedCaptureBoundaryDirection;\n unitVectorNative: RasterVector;\n traversalDurationSeconds: SourcedCaptureTimingSeconds;\n };\n}\n\nexport interface CaptureExposureWindowSample {\n pointNative: RasterPoint;\n openingNormalizedScanPosition: number | null;\n closingNormalizedScanPosition: number | null;\n /**\n * Seconds from the first opening boundary.\n */\n startOffsetSecondsFromOpeningReference: number;\n /**\n * Seconds from the first opening boundary.\n */\n endOffsetSecondsFromOpeningReference: number;\n localExposureDurationSeconds: number;\n}\n\nexport interface CaptureExposureWindows {\n shutterMechanism: CaptureShutterMechanism;\n timeReference: \"first-opening-boundary-phase\";\n nativeRaster: NativeImageRaster;\n activeCaptureRect: RasterRect;\n nominalExposureDurationSeconds: SourcedCaptureTimingSeconds;\n opening: ResolvedCaptureExposureBoundary;\n closing: ResolvedCaptureExposureBoundary;\n localExposureDurationRangeSeconds: {\n minimum: number;\n maximum: number;\n };\n samples: readonly CaptureExposureWindowSample[];\n}\n\ntype UnknownRecord = Record<string, unknown>;\n\nconst SHUTTER_MECHANISMS = new Set<CaptureShutterMechanism>([\n \"mechanical\",\n \"electronic-first-curtain\",\n \"electronic\"\n]);\n\nconst SCAN_DIRECTIONS = new Set<NativeSensorReadoutScanDirection>([\n \"top-to-bottom\",\n \"bottom-to-top\",\n \"left-to-right\",\n \"right-to-left\"\n]);\n\nconst BOUNDARY_KINDS = new Set<ExposureBoundarySchedule[\"kind\"]>([\n \"simultaneous\",\n \"uniform-linear-native-scan\"\n]);\n\nfunction requireRecord(\n value: unknown,\n path: string,\n allowedKeys: readonly string[] | null\n): UnknownRecord {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new InvalidConfigurationError(path + \" must be an object.\");\n }\n if (allowedKeys !== null) rejectUnknownFields(value, allowedKeys, path);\n return value as UnknownRecord;\n}\n\nfunction requireNonNegativeInteger(name: string, value: number): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new InvalidScientificInputError(\n name + \" must be a non-negative safe integer.\"\n );\n }\n}\n\nfunction requirePositiveFinite(name: string, value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n throw new InvalidScientificInputError(\n name + \" must be a finite number greater than zero.\"\n );\n }\n return value;\n}\n\n/** Parses a sourced duration in seconds (`{ unit: \"s\", value, evidence }`). Not a root export. */\nexport function parseSecondsFact(\n value: unknown,\n path: string\n): SourcedCaptureTimingSeconds {\n const record = requireRecord(value, path, [\"unit\", \"value\", \"evidence\"]);\n if (record.unit !== \"s\") {\n throw new InvalidConfigurationError(path + '.unit must be \"s\".');\n }\n\n return {\n value: requirePositiveFinite(path + \".value\", record.value),\n unit: \"s\",\n evidence: parseEvidenceList(record.evidence, path + \".evidence\")\n };\n}\n\nfunction parseDirectionFact(\n value: unknown,\n path: string\n): SourcedCaptureBoundaryDirection {\n const record = requireRecord(value, path, [\"value\", \"evidence\"]);\n if (\n typeof record.value !== \"string\" ||\n !SCAN_DIRECTIONS.has(\n record.value as NativeSensorReadoutScanDirection\n )\n ) {\n throw new InvalidConfigurationError(path + \".value is invalid.\");\n }\n\n return {\n value: record.value as NativeSensorReadoutScanDirection,\n evidence: parseEvidenceList(record.evidence, path + \".evidence\")\n };\n}\n\n/** Parses one exposure boundary schedule (opening or closing). Not a root export. */\nexport function parseBoundarySchedule(\n value: unknown,\n path: string\n): ExposureBoundarySchedule {\n // unitVectorNative is the derived field of a resolved schedule; it may be passed back if it matches.\n const record = requireRecord(value, path, [\"kind\", \"directionNative\", \"traversalDurationSeconds\", \"unitVectorNative\"]);\n if (\n typeof record.kind !== \"string\" ||\n !BOUNDARY_KINDS.has(record.kind as ExposureBoundarySchedule[\"kind\"])\n ) {\n throw new InvalidConfigurationError(path + \".kind is invalid.\");\n }\n\n if (record.kind === \"simultaneous\") {\n if (record.directionNative !== undefined) {\n throw new InvalidScientificInputError(\n path + \".directionNative must be omitted for a simultaneous boundary.\"\n );\n }\n if (record.traversalDurationSeconds !== undefined) {\n throw new InvalidScientificInputError(\n path +\n \".traversalDurationSeconds must be omitted for a simultaneous boundary.\"\n );\n }\n if (record.unitVectorNative !== undefined) {\n throw new InvalidScientificInputError(\n path + \".unitVectorNative must be omitted for a simultaneous boundary.\"\n );\n }\n\n return { kind: \"simultaneous\" };\n }\n\n const directionNative = parseDirectionFact(\n record.directionNative,\n path + \".directionNative\"\n );\n if (record.unitVectorNative !== undefined) {\n const supplied = requireRecord(record.unitVectorNative, path + \".unitVectorNative\", [\"x\", \"y\"]);\n const derived = scanVector(directionNative.value);\n if (supplied.x !== derived.x || supplied.y !== derived.y) {\n throw new InvalidConfigurationError(path + \".unitVectorNative must match directionNative.\");\n }\n }\n return {\n kind: \"uniform-linear-native-scan\",\n directionNative,\n traversalDurationSeconds: parseSecondsFact(\n record.traversalDurationSeconds,\n path + \".traversalDurationSeconds\"\n )\n };\n}\n\nfunction validateNativeRaster(raster: NativeImageRaster): void {\n requireInputObject(raster, \"raster input\");\n requirePositiveInteger(\"nativeRaster.pixelWidth\", raster.pixelWidth);\n requirePositiveInteger(\"nativeRaster.pixelHeight\", raster.pixelHeight);\n}\n\nfunction fullRect(raster: NativeImageRaster): RasterRect {\n return {\n x: 0,\n y: 0,\n width: raster.pixelWidth,\n height: raster.pixelHeight\n };\n}\n\nfunction validateActiveCaptureRect(\n rect: RasterRect,\n raster: NativeImageRaster\n): void {\n requireNonNegativeInteger(\"activeCaptureRect.x\", rect.x);\n requireNonNegativeInteger(\"activeCaptureRect.y\", rect.y);\n requirePositiveInteger(\"activeCaptureRect.width\", rect.width);\n requirePositiveInteger(\"activeCaptureRect.height\", rect.height);\n\n if (\n rect.x + rect.width > raster.pixelWidth ||\n rect.y + rect.height > raster.pixelHeight\n ) {\n throw new InvalidScientificInputError(\n \"activeCaptureRect must fit entirely within nativeRaster.\"\n );\n }\n}\n\nfunction validateShutterMechanism(\n value: unknown\n): asserts value is CaptureShutterMechanism {\n if (\n typeof value !== \"string\" ||\n !SHUTTER_MECHANISMS.has(value as CaptureShutterMechanism)\n ) {\n throw new InvalidConfigurationError(\"shutterMechanism is invalid.\");\n }\n}\n\nfunction validatePointWithinActiveCapture(\n point: RasterPoint,\n rect: RasterRect,\n path: string\n): void {\n if (!Number.isFinite(point.x) || !Number.isFinite(point.y)) {\n throw new InvalidScientificInputError(\n path + \" coordinates must be finite.\"\n );\n }\n\n if (\n point.x < rect.x ||\n point.x > rect.x + rect.width ||\n point.y < rect.y ||\n point.y > rect.y + rect.height\n ) {\n throw new InvalidScientificInputError(\n path + \" must lie within activeCaptureRect edge-coordinate bounds.\"\n );\n }\n}\n\nfunction scanVector(\n direction: NativeSensorReadoutScanDirection\n): RasterVector {\n switch (direction) {\n case \"top-to-bottom\":\n return { x: 0, y: 1 };\n case \"bottom-to-top\":\n return { x: 0, y: -1 };\n case \"left-to-right\":\n return { x: 1, y: 0 };\n case \"right-to-left\":\n return { x: -1, y: 0 };\n }\n}\n\nfunction normalizedScanPosition(\n point: RasterPoint,\n rect: RasterRect,\n direction: NativeSensorReadoutScanDirection\n): number {\n switch (direction) {\n case \"top-to-bottom\":\n return (point.y - rect.y) / rect.height;\n case \"bottom-to-top\":\n return 1 - (point.y - rect.y) / rect.height;\n case \"left-to-right\":\n return (point.x - rect.x) / rect.width;\n case \"right-to-left\":\n return 1 - (point.x - rect.x) / rect.width;\n }\n}\n\nfunction boundaryPhase(\n point: RasterPoint,\n rect: RasterRect,\n schedule: ExposureBoundarySchedule\n): {\n normalizedScanPosition: number | null;\n phaseOffsetSeconds: number;\n} {\n if (schedule.kind === \"simultaneous\") {\n return {\n normalizedScanPosition: null,\n phaseOffsetSeconds: 0\n };\n }\n\n const normalized = normalizedScanPosition(\n point,\n rect,\n schedule.directionNative.value\n );\n\n return {\n normalizedScanPosition: normalized,\n phaseOffsetSeconds:\n normalized * schedule.traversalDurationSeconds.value\n };\n}\n\nfunction resolveBoundaryActuators(\n mechanism: CaptureShutterMechanism\n): {\n opening: CaptureExposureBoundaryActuator;\n closing: CaptureExposureBoundaryActuator;\n} {\n switch (mechanism) {\n case \"mechanical\":\n return {\n opening: \"mechanical\",\n closing: \"mechanical\"\n };\n case \"electronic-first-curtain\":\n return {\n opening: \"electronic\",\n closing: \"mechanical\"\n };\n case \"electronic\":\n return {\n opening: \"electronic\",\n closing: \"electronic\"\n };\n }\n}\n\nfunction resolveBoundary(\n actuator: CaptureExposureBoundaryActuator,\n schedule: ExposureBoundarySchedule\n): ResolvedCaptureExposureBoundary {\n if (schedule.kind === \"simultaneous\") {\n return {\n actuator,\n schedule: {\n kind: \"simultaneous\"\n }\n };\n }\n\n return {\n actuator,\n schedule: {\n kind: \"uniform-linear-native-scan\",\n directionNative: schedule.directionNative,\n unitVectorNative: scanVector(schedule.directionNative.value),\n traversalDurationSeconds: schedule.traversalDurationSeconds\n }\n };\n}\n\nfunction createWindowSample(\n point: RasterPoint,\n rect: RasterRect,\n opening: ExposureBoundarySchedule,\n closing: ExposureBoundarySchedule,\n nominalExposureDurationSeconds: number\n): CaptureExposureWindowSample {\n const openingPhase = boundaryPhase(point, rect, opening);\n const closingPhase = boundaryPhase(point, rect, closing);\n const startOffsetSecondsFromOpeningReference =\n openingPhase.phaseOffsetSeconds;\n const endOffsetSecondsFromOpeningReference =\n nominalExposureDurationSeconds + closingPhase.phaseOffsetSeconds;\n const localExposureDurationSeconds =\n endOffsetSecondsFromOpeningReference -\n startOffsetSecondsFromOpeningReference;\n\n return {\n pointNative: { ...point },\n openingNormalizedScanPosition:\n openingPhase.normalizedScanPosition,\n closingNormalizedScanPosition:\n closingPhase.normalizedScanPosition,\n startOffsetSecondsFromOpeningReference,\n endOffsetSecondsFromOpeningReference,\n localExposureDurationSeconds\n };\n}\n\nfunction activeRectCorners(rect: RasterRect): readonly RasterPoint[] {\n return [\n { x: rect.x, y: rect.y },\n { x: rect.x + rect.width, y: rect.y },\n { x: rect.x, y: rect.y + rect.height },\n {\n x: rect.x + rect.width,\n y: rect.y + rect.height\n }\n ];\n}\n\n/**\n * Works out each point's local exposure window from separate opening and\n * closing boundary schedules.\n *\n * Times are seconds from the first opening boundary. This is deliberately not\n * the camera-rotation API's global \"exposure start\"; a later layer must link the\n * two explicitly.\n *\n * The mechanism records whether each boundary is mechanical or electronic, but\n * supplies no sweep duration or direction. Every timing value and direction for\n * a non-simultaneous boundary is declared by the caller, with evidence.\n *\n * Only simultaneous boundaries and a uniform linear sweep along one native\n * sensor axis are supported. Not modelled: curtain acceleration, segmented or\n * non-linear electronic schedules, flash or flicker, rolling-shutter image\n * distortion, shutter shock, and EFCS (electronic first-curtain shutter)\n * effects on the pupil or bokeh.\n */\nexport function calculateCaptureExposureWindows(\n input: CalculateCaptureExposureWindowsInput\n): CalculationResult<CaptureExposureWindows> {\n requireInputKeys(input, \"calculateCaptureExposureWindows\", [\"nativeRaster\", \"activeCaptureRect\", \"shutterMechanism\", \"nominalExposureDurationSeconds\", \"opening\", \"closing\", \"samplePointsNative\"]);\n validateNativeRaster(input.nativeRaster);\n validateShutterMechanism(input.shutterMechanism);\n\n const nominalExposureDurationSeconds = parseSecondsFact(\n input.nominalExposureDurationSeconds,\n \"nominalExposureDurationSeconds\"\n );\n const opening = parseBoundarySchedule(input.opening, \"opening\");\n const closing = parseBoundarySchedule(input.closing, \"closing\");\n\n const activeCaptureRect =\n input.activeCaptureRect ?? fullRect(input.nativeRaster);\n validateActiveCaptureRect(activeCaptureRect, input.nativeRaster);\n\n if (\n input.samplePointsNative !== undefined &&\n !Array.isArray(input.samplePointsNative)\n ) {\n throw new InvalidConfigurationError(\n \"samplePointsNative must be an array when supplied.\"\n );\n }\n\n const cornerSamples = activeRectCorners(activeCaptureRect).map(\n (point) =>\n createWindowSample(\n point,\n activeCaptureRect,\n opening,\n closing,\n nominalExposureDurationSeconds.value\n )\n );\n\n const localDurations = cornerSamples.map(\n (sample) => sample.localExposureDurationSeconds\n );\n const minimumLocalExposureDurationSeconds = Math.min(...localDurations);\n const maximumLocalExposureDurationSeconds = Math.max(...localDurations);\n\n if (\n !Number.isFinite(minimumLocalExposureDurationSeconds) ||\n minimumLocalExposureDurationSeconds <= 0\n ) {\n throw new InvalidScientificInputError(\n \"The declared opening/closing schedules produce a zero or negative local exposure duration somewhere within activeCaptureRect.\"\n );\n }\n\n const samples = (input.samplePointsNative ?? []).map((point, index) => {\n validatePointWithinActiveCapture(\n point,\n activeCaptureRect,\n \"samplePointsNative[\" + index + \"]\"\n );\n\n return createWindowSample(\n point,\n activeCaptureRect,\n opening,\n closing,\n nominalExposureDurationSeconds.value\n );\n });\n\n const actuators = resolveBoundaryActuators(input.shutterMechanism);\n\n return approximationResult(\n {\n shutterMechanism: input.shutterMechanism,\n timeReference: \"first-opening-boundary-phase\",\n nativeRaster: { ...input.nativeRaster },\n activeCaptureRect: { ...activeCaptureRect },\n nominalExposureDurationSeconds,\n opening: resolveBoundary(actuators.opening, opening),\n closing: resolveBoundary(actuators.closing, closing),\n localExposureDurationRangeSeconds: {\n minimum: minimumLocalExposureDurationSeconds,\n maximum: maximumLocalExposureDurationSeconds\n },\n samples\n },\n \"capture-exposure-window-schedule\",\n \"1.0.0\",\n [\n \"Time is reported in seconds from the first opening-boundary phase, not from a universal local exposure-start event.\",\n \"Nominal exposure duration, opening traversal, and closing traversal are independent declared quantities.\",\n \"Mechanical, electronic-first-curtain, and electronic mechanisms determine boundary actuator categories only; they do not supply timing or direction.\",\n \"Uniform-linear scan boundaries are an explicit approximation over continuous effective native-raster coordinates and do not assert one raster row/column equals one physical curtain line, photodiode row, or hardware readout line.\",\n \"Opening and closing directions and traversal durations are independent and may produce spatially varying local exposure duration.\",\n \"The complete active rectangle is validated using the extrema of the affine boundary schedules, so unsampled invalid corners cannot pass.\",\n \"Active-capture timing is caller-declared and is not inferred by scaling full-frame timing from crop dimensions.\",\n \"Physical camera orientation and digital output crop/resolution remain downstream of the invariant native timing schedule.\",\n \"Sensor readout timing remains a separate contract; this model does not automatically equate a sensor readout phase with an exposure boundary.\",\n \"This model does not include curtain acceleration, segmented/nonlinear electronic timing, rolling-shutter image distortion, motion integration, flash/flicker interaction, shutter shock, or EFCS-specific pupil/bokeh behavior.\"\n ]\n );\n}\n\n/**\n * Internal, for the faster (\"lean\") native environment executor (a 2.0 performance change). It checks a\n * schedule once with every check of calculateCaptureExposureWindows, then returns a per-point sampler that\n * uses the same point validation and the same createWindowSample arithmetic. So each sampled window is\n * identical to what calculateCaptureExposureWindows returns for that point. Not exported from the package.\n */\nexport function prepareCaptureExposureWindowSampler(\n input: Omit<CalculateCaptureExposureWindowsInput, \"samplePointsNative\">\n): (point: RasterPoint) => CaptureExposureWindowSample {\n const admitted = calculateCaptureExposureWindows({ ...input, samplePointsNative: [] }).value;\n const rect = { ...admitted.activeCaptureRect };\n const opening = parseBoundarySchedule(input.opening, \"opening\");\n const closing = parseBoundarySchedule(input.closing, \"closing\");\n const nominal = admitted.nominalExposureDurationSeconds.value;\n return (point) => {\n validatePointWithinActiveCapture(point, rect, \"samplePointsNative[0]\");\n return createWindowSample(point, rect, opening, closing, nominal);\n };\n}\n"]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { type EvidenceBackedFact, type EvidenceProvenance } from "../core/evidence-provenance.js";
|
|
2
|
+
export declare const SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION: "0.1.0";
|
|
3
|
+
/** Versioned identity of the pattern-generation equations and seed schedule. */
|
|
4
|
+
export declare const SENSOR_FIXED_PATTERN_NOISE_MODEL: Readonly<{
|
|
5
|
+
readonly id: "photivra-sensor-fixed-pattern";
|
|
6
|
+
readonly version: "1.0.0";
|
|
7
|
+
}>;
|
|
8
|
+
/**
|
|
9
|
+
* Explicit fixed-pattern parameters for one sensor instance. Every component is required; a zero
|
|
10
|
+
* standard deviation, fraction or RMS disables that component.
|
|
11
|
+
*/
|
|
12
|
+
export interface SensorFixedPatternNoiseProfile {
|
|
13
|
+
schemaVersion: typeof SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION;
|
|
14
|
+
profileId: string;
|
|
15
|
+
/** The colour-sampling grid whose absolute site coordinates index the pattern. */
|
|
16
|
+
colorSamplingProfileId: string;
|
|
17
|
+
scientificStatus: "approximation";
|
|
18
|
+
/** Identifies the physical sensor. Independent of every per-capture noise seed. */
|
|
19
|
+
sensorInstanceSeedUint32: number;
|
|
20
|
+
/** EMVA 1288 PRNU: spatial standard deviation of the photo response divided by its mean. */
|
|
21
|
+
photoResponseNonUniformity: {
|
|
22
|
+
relativeStandardDeviation: EvidenceBackedFact<number>;
|
|
23
|
+
};
|
|
24
|
+
/** Spatial standard deviation of the dark-current rate divided by the population-mean rate. */
|
|
25
|
+
darkSignalNonUniformity: {
|
|
26
|
+
relativeStandardDeviation: EvidenceBackedFact<number>;
|
|
27
|
+
};
|
|
28
|
+
/** Fraction of sites whose dark-current rate is the population mean times the multiplier. */
|
|
29
|
+
hotPixels: {
|
|
30
|
+
siteFraction: EvidenceBackedFact<number>;
|
|
31
|
+
darkCurrentMultiplier: EvidenceBackedFact<number>;
|
|
32
|
+
};
|
|
33
|
+
/** Fixed readout offset per row, in input-referred electrons, normally distributed with zero mean. */
|
|
34
|
+
rowOffset: {
|
|
35
|
+
rmsElectrons: EvidenceBackedFact<number>;
|
|
36
|
+
};
|
|
37
|
+
/** Fixed readout offset per column, in input-referred electrons, normally distributed with zero mean. */
|
|
38
|
+
columnOffset: {
|
|
39
|
+
rmsElectrons: EvidenceBackedFact<number>;
|
|
40
|
+
};
|
|
41
|
+
patternDistribution: "normal-factors-truncated-at-zero";
|
|
42
|
+
evidence: readonly EvidenceProvenance[];
|
|
43
|
+
limitations: readonly string[];
|
|
44
|
+
}
|
|
45
|
+
/** The deterministic pattern values of one colour-sampling site. */
|
|
46
|
+
export interface SensorFixedPatternSiteValues {
|
|
47
|
+
profileId: string;
|
|
48
|
+
modelId: typeof SENSOR_FIXED_PATTERN_NOISE_MODEL.id;
|
|
49
|
+
modelVersion: typeof SENSOR_FIXED_PATTERN_NOISE_MODEL.version;
|
|
50
|
+
site: {
|
|
51
|
+
x: number;
|
|
52
|
+
y: number;
|
|
53
|
+
};
|
|
54
|
+
/** Multiplies the expected photo charge (1 = no PRNU); never negative. */
|
|
55
|
+
photoResponseGainFactor: number;
|
|
56
|
+
/** Multiplies the population-mean dark expectation (1 = no DSNU); never negative. */
|
|
57
|
+
darkCurrentFactor: number;
|
|
58
|
+
hotPixel: boolean;
|
|
59
|
+
rowOffsetElectrons: number;
|
|
60
|
+
columnOffsetElectrons: number;
|
|
61
|
+
/** rowOffsetElectrons + columnOffsetElectrons, added at readout. */
|
|
62
|
+
readoutOffsetElectrons: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Validates an untrusted fixed-pattern noise profile. Unknown keys, out-of-range parameters and
|
|
66
|
+
* missing evidence are rejected. The PRNU and DSNU relative standard deviations are limited to 0.5
|
|
67
|
+
* and 5, and the hot-pixel multiplier to 1–1e6.
|
|
68
|
+
* @param value - Untrusted data. TypeScript types alone are not validation.
|
|
69
|
+
* @returns The validated profile.
|
|
70
|
+
* @see docs/MOTION_AND_SIGNAL.md for the model and its sources.
|
|
71
|
+
*/
|
|
72
|
+
export declare function parseSensorFixedPatternNoiseProfile(value: unknown): SensorFixedPatternNoiseProfile;
|
|
73
|
+
/**
|
|
74
|
+
* Computes the fixed-pattern values of one absolute colour-sampling site.
|
|
75
|
+
*
|
|
76
|
+
* - PRNU gain g = max(0, 1 + σ_PRNU·z₁);
|
|
77
|
+
* - hot pixel when u < f_hot, then dark factor d = m_hot; otherwise d = max(0, 1 + σ_DSNU·z₂);
|
|
78
|
+
* - row offset σ_row·z(row y), column offset σ_col·z(column x), in input-referred electrons.
|
|
79
|
+
*
|
|
80
|
+
* Each z is a standard normal value and u a uniform value, each from its own stream hashed with
|
|
81
|
+
* MurmurHash3 from (sensorInstanceSeed, x, y, stream). Row values use x = 0 and column values y = 0,
|
|
82
|
+
* so a whole row or column shares one value. Cutting negative factors off at zero shifts the mean
|
|
83
|
+
* factor by less than 1e-6 for σ ≤ 0.2.
|
|
84
|
+
* @param input - A parsed or untrusted profile plus a nonnegative integer site.
|
|
85
|
+
* @returns The site's fixed-pattern values.
|
|
86
|
+
*/
|
|
87
|
+
export declare function calculateSensorFixedPatternSite(input: {
|
|
88
|
+
profile: SensorFixedPatternNoiseProfile;
|
|
89
|
+
site: {
|
|
90
|
+
x: number;
|
|
91
|
+
y: number;
|
|
92
|
+
};
|
|
93
|
+
}): SensorFixedPatternSiteValues;
|
|
94
|
+
/** Internal: the PRNU gain, dark-current factor and hot-pixel state of one site (no readout offsets). */
|
|
95
|
+
export declare function evaluateFixedPatternSiteFactors(profile: SensorFixedPatternNoiseProfile, x: number, y: number): {
|
|
96
|
+
photoResponseGainFactor: number;
|
|
97
|
+
darkCurrentFactor: number;
|
|
98
|
+
hotPixel: boolean;
|
|
99
|
+
};
|
|
100
|
+
/** Internal: the fixed readout offset of row `y`, in input-referred electrons. */
|
|
101
|
+
export declare function evaluateFixedPatternRowOffset(profile: SensorFixedPatternNoiseProfile, y: number): number;
|
|
102
|
+
/** Internal: the fixed readout offset of column `x`, in input-referred electrons. */
|
|
103
|
+
export declare function evaluateFixedPatternColumnOffset(profile: SensorFixedPatternNoiseProfile, x: number): number;
|
|
104
|
+
/** Internal: the same calculation for an already parsed profile. */
|
|
105
|
+
export declare function evaluateParsedFixedPatternSite(profile: SensorFixedPatternNoiseProfile, site: {
|
|
106
|
+
x: number;
|
|
107
|
+
y: number;
|
|
108
|
+
}): SensorFixedPatternSiteValues;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Fixed-pattern noise (FPN): the part of sensor noise that stays the same from shot to shot for one
|
|
4
|
+
* physical sensor. It covers photo-response non-uniformity (PRNU), dark-signal non-uniformity (DSNU),
|
|
5
|
+
* hot pixels and row and column readout offsets, as defined in EMVA Standard 1288 Release 4.0 (spatial
|
|
6
|
+
* non-uniformity of the photo response and of the dark signal).
|
|
7
|
+
*
|
|
8
|
+
* The pattern is deterministic. It is seeded from an explicit sensor-instance seed and absolute
|
|
9
|
+
* colour-sampling site coordinates, never from the per-capture noise seed, so the same sensor shows
|
|
10
|
+
* the same pattern in every capture.
|
|
11
|
+
*
|
|
12
|
+
* Application points in the readout chain (see raw-readout.ts):
|
|
13
|
+
* - PRNU multiplies the expected photo charge before photo shot-noise sampling;
|
|
14
|
+
* - DSNU and hot pixels multiply the population-mean dark-current expectation before dark shot-noise
|
|
15
|
+
* sampling, so their excess charge scales with exposure duration and with the declared
|
|
16
|
+
* temperature model of the dark-current profile;
|
|
17
|
+
* - row and column offsets are input-referred electron offsets added with read noise, before the
|
|
18
|
+
* pre-ADC threshold.
|
|
19
|
+
*
|
|
20
|
+
* The dark-current model itself stays a population mean; this module is a separate spatial model that
|
|
21
|
+
* must be attached explicitly. Values are declared by the caller (or are synthetic preset values).
|
|
22
|
+
* Nothing here is a measured calibration.
|
|
23
|
+
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
24
|
+
* limits.
|
|
25
|
+
*/
|
|
26
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
27
|
+
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
28
|
+
import { requireAllowlistedRecord, requirePublicOpaqueId, requireInputKeys } from "../core/record-validation.js";
|
|
29
|
+
import { InvalidScientificInputError } from "../core/validation.js";
|
|
30
|
+
import { createDeterministicUniformStream, deriveSensorFixedPatternSeedUint32, sampleDeterministicStandardNormal, SENSOR_FIXED_PATTERN_COLUMN_STREAM_ID, SENSOR_FIXED_PATTERN_DSNU_STREAM_ID, SENSOR_FIXED_PATTERN_HOT_PIXEL_STREAM_ID, SENSOR_FIXED_PATTERN_PRNU_STREAM_ID, SENSOR_FIXED_PATTERN_ROW_STREAM_ID } from "./stochastic-seed.js";
|
|
31
|
+
export const SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION = "0.1.0";
|
|
32
|
+
/** Versioned identity of the pattern-generation equations and seed schedule. */
|
|
33
|
+
export const SENSOR_FIXED_PATTERN_NOISE_MODEL = Object.freeze({ id: "photivra-sensor-fixed-pattern", version: "1.0.0" });
|
|
34
|
+
const FACT_KEYS = ["value", "evidence"];
|
|
35
|
+
function fact(value, path, maximum, minimum = 0) {
|
|
36
|
+
const record = requireAllowlistedRecord(value, FACT_KEYS, path + " must be an evidence-backed fact.");
|
|
37
|
+
const v = record.value;
|
|
38
|
+
if (typeof v !== "number" || !Number.isFinite(v) || v < minimum || v > maximum) {
|
|
39
|
+
throw new InvalidConfigurationError(path + ".value must be finite from " + minimum + " through " + maximum + ".");
|
|
40
|
+
}
|
|
41
|
+
return { value: v, evidence: parseEvidenceList(record.evidence, path + ".evidence") };
|
|
42
|
+
}
|
|
43
|
+
function limitations(value) {
|
|
44
|
+
if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string" || entry.trim().length === 0)) {
|
|
45
|
+
throw new InvalidConfigurationError("sensorFixedPatternNoise.limitations must be an array of non-empty strings.");
|
|
46
|
+
}
|
|
47
|
+
if (new Set(value).size !== value.length) {
|
|
48
|
+
throw new InvalidConfigurationError("sensorFixedPatternNoise.limitations must not contain duplicates.");
|
|
49
|
+
}
|
|
50
|
+
return value.map((entry) => entry.trim());
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Validates an untrusted fixed-pattern noise profile. Unknown keys, out-of-range parameters and
|
|
54
|
+
* missing evidence are rejected. The PRNU and DSNU relative standard deviations are limited to 0.5
|
|
55
|
+
* and 5, and the hot-pixel multiplier to 1–1e6.
|
|
56
|
+
* @param value - Untrusted data. TypeScript types alone are not validation.
|
|
57
|
+
* @returns The validated profile.
|
|
58
|
+
* @see docs/MOTION_AND_SIGNAL.md for the model and its sources.
|
|
59
|
+
*/
|
|
60
|
+
export function parseSensorFixedPatternNoiseProfile(value) {
|
|
61
|
+
const r = requireAllowlistedRecord(value, ["schemaVersion", "profileId", "colorSamplingProfileId", "scientificStatus",
|
|
62
|
+
"sensorInstanceSeedUint32", "photoResponseNonUniformity", "darkSignalNonUniformity", "hotPixels", "rowOffset", "columnOffset",
|
|
63
|
+
"patternDistribution", "evidence", "limitations"], "Invalid sensor fixed-pattern noise profile fields.");
|
|
64
|
+
if (r.schemaVersion !== SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION) {
|
|
65
|
+
throw new InvalidConfigurationError('sensorFixedPatternNoise.schemaVersion must be "' + SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION + '".');
|
|
66
|
+
}
|
|
67
|
+
if (r.scientificStatus !== "approximation") {
|
|
68
|
+
throw new InvalidConfigurationError('sensorFixedPatternNoise.scientificStatus must be "approximation".');
|
|
69
|
+
}
|
|
70
|
+
if (r.patternDistribution !== "normal-factors-truncated-at-zero") {
|
|
71
|
+
throw new InvalidConfigurationError('sensorFixedPatternNoise.patternDistribution must be "normal-factors-truncated-at-zero".');
|
|
72
|
+
}
|
|
73
|
+
const seed = r.sensorInstanceSeedUint32;
|
|
74
|
+
if (typeof seed !== "number" || !Number.isSafeInteger(seed) || seed < 0 || seed > 0xffff_ffff) {
|
|
75
|
+
throw new InvalidConfigurationError("sensorFixedPatternNoise.sensorInstanceSeedUint32 must be an unsigned 32-bit integer.");
|
|
76
|
+
}
|
|
77
|
+
const prnu = requireAllowlistedRecord(r.photoResponseNonUniformity, ["relativeStandardDeviation"], "Invalid PRNU fields.");
|
|
78
|
+
const dsnu = requireAllowlistedRecord(r.darkSignalNonUniformity, ["relativeStandardDeviation"], "Invalid DSNU fields.");
|
|
79
|
+
const hot = requireAllowlistedRecord(r.hotPixels, ["siteFraction", "darkCurrentMultiplier"], "Invalid hot-pixel fields.");
|
|
80
|
+
const row = requireAllowlistedRecord(r.rowOffset, ["rmsElectrons"], "Invalid row-offset fields.");
|
|
81
|
+
const column = requireAllowlistedRecord(r.columnOffset, ["rmsElectrons"], "Invalid column-offset fields.");
|
|
82
|
+
return {
|
|
83
|
+
schemaVersion: SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION,
|
|
84
|
+
profileId: requirePublicOpaqueId(r.profileId, "sensorFixedPatternNoise.profileId must be a public opaque identifier."),
|
|
85
|
+
colorSamplingProfileId: requirePublicOpaqueId(r.colorSamplingProfileId, "sensorFixedPatternNoise.colorSamplingProfileId must be a public opaque identifier."),
|
|
86
|
+
scientificStatus: "approximation",
|
|
87
|
+
sensorInstanceSeedUint32: seed,
|
|
88
|
+
photoResponseNonUniformity: { relativeStandardDeviation: fact(prnu.relativeStandardDeviation, "photoResponseNonUniformity.relativeStandardDeviation", 0.5) },
|
|
89
|
+
darkSignalNonUniformity: { relativeStandardDeviation: fact(dsnu.relativeStandardDeviation, "darkSignalNonUniformity.relativeStandardDeviation", 5) },
|
|
90
|
+
hotPixels: { siteFraction: fact(hot.siteFraction, "hotPixels.siteFraction", 1),
|
|
91
|
+
darkCurrentMultiplier: fact(hot.darkCurrentMultiplier, "hotPixels.darkCurrentMultiplier", 1e6, 1) },
|
|
92
|
+
rowOffset: { rmsElectrons: fact(row.rmsElectrons, "rowOffset.rmsElectrons", 1e6) },
|
|
93
|
+
columnOffset: { rmsElectrons: fact(column.rmsElectrons, "columnOffset.rmsElectrons", 1e6) },
|
|
94
|
+
patternDistribution: "normal-factors-truncated-at-zero",
|
|
95
|
+
evidence: parseEvidenceList(r.evidence, "sensorFixedPatternNoise.evidence"),
|
|
96
|
+
limitations: limitations(r.limitations)
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function normal(seed, x, y, stream) {
|
|
100
|
+
return sampleDeterministicStandardNormal(createDeterministicUniformStream(deriveSensorFixedPatternSeedUint32(seed, x, y, stream)));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Computes the fixed-pattern values of one absolute colour-sampling site.
|
|
104
|
+
*
|
|
105
|
+
* - PRNU gain g = max(0, 1 + σ_PRNU·z₁);
|
|
106
|
+
* - hot pixel when u < f_hot, then dark factor d = m_hot; otherwise d = max(0, 1 + σ_DSNU·z₂);
|
|
107
|
+
* - row offset σ_row·z(row y), column offset σ_col·z(column x), in input-referred electrons.
|
|
108
|
+
*
|
|
109
|
+
* Each z is a standard normal value and u a uniform value, each from its own stream hashed with
|
|
110
|
+
* MurmurHash3 from (sensorInstanceSeed, x, y, stream). Row values use x = 0 and column values y = 0,
|
|
111
|
+
* so a whole row or column shares one value. Cutting negative factors off at zero shifts the mean
|
|
112
|
+
* factor by less than 1e-6 for σ ≤ 0.2.
|
|
113
|
+
* @param input - A parsed or untrusted profile plus a nonnegative integer site.
|
|
114
|
+
* @returns The site's fixed-pattern values.
|
|
115
|
+
*/
|
|
116
|
+
export function calculateSensorFixedPatternSite(input) {
|
|
117
|
+
requireInputKeys(input, "calculateSensorFixedPatternSite", ["profile", "site"]);
|
|
118
|
+
const profile = parseSensorFixedPatternNoiseProfile(input.profile);
|
|
119
|
+
return evaluateParsedFixedPatternSite(profile, input.site);
|
|
120
|
+
}
|
|
121
|
+
/** Internal: the PRNU gain, dark-current factor and hot-pixel state of one site (no readout offsets). */
|
|
122
|
+
export function evaluateFixedPatternSiteFactors(profile, x, y) {
|
|
123
|
+
const seed = profile.sensorInstanceSeedUint32;
|
|
124
|
+
const prnuSd = profile.photoResponseNonUniformity.relativeStandardDeviation.value;
|
|
125
|
+
const dsnuSd = profile.darkSignalNonUniformity.relativeStandardDeviation.value;
|
|
126
|
+
const hotFraction = profile.hotPixels.siteFraction.value;
|
|
127
|
+
const photoResponseGainFactor = prnuSd === 0 ? 1 : Math.max(0, 1 + prnuSd * normal(seed, x, y, SENSOR_FIXED_PATTERN_PRNU_STREAM_ID));
|
|
128
|
+
const hotPixel = hotFraction > 0 &&
|
|
129
|
+
createDeterministicUniformStream(deriveSensorFixedPatternSeedUint32(seed, x, y, SENSOR_FIXED_PATTERN_HOT_PIXEL_STREAM_ID)).next() < hotFraction;
|
|
130
|
+
const darkCurrentFactor = hotPixel ? profile.hotPixels.darkCurrentMultiplier.value :
|
|
131
|
+
dsnuSd === 0 ? 1 : Math.max(0, 1 + dsnuSd * normal(seed, x, y, SENSOR_FIXED_PATTERN_DSNU_STREAM_ID));
|
|
132
|
+
return { photoResponseGainFactor, darkCurrentFactor, hotPixel };
|
|
133
|
+
}
|
|
134
|
+
/** Internal: the fixed readout offset of row `y`, in input-referred electrons. */
|
|
135
|
+
export function evaluateFixedPatternRowOffset(profile, y) {
|
|
136
|
+
const rms = profile.rowOffset.rmsElectrons.value;
|
|
137
|
+
return rms === 0 ? 0 : rms * normal(profile.sensorInstanceSeedUint32, 0, y, SENSOR_FIXED_PATTERN_ROW_STREAM_ID);
|
|
138
|
+
}
|
|
139
|
+
/** Internal: the fixed readout offset of column `x`, in input-referred electrons. */
|
|
140
|
+
export function evaluateFixedPatternColumnOffset(profile, x) {
|
|
141
|
+
const rms = profile.columnOffset.rmsElectrons.value;
|
|
142
|
+
return rms === 0 ? 0 : rms * normal(profile.sensorInstanceSeedUint32, x, 0, SENSOR_FIXED_PATTERN_COLUMN_STREAM_ID);
|
|
143
|
+
}
|
|
144
|
+
/** Internal: the same calculation for an already parsed profile. */
|
|
145
|
+
export function evaluateParsedFixedPatternSite(profile, site) {
|
|
146
|
+
const { x, y } = site ?? {};
|
|
147
|
+
if (!Number.isSafeInteger(x) || !Number.isSafeInteger(y) || x < 0 || y < 0 || x > 0xffff_ffff || y > 0xffff_ffff) {
|
|
148
|
+
throw new InvalidScientificInputError("Fixed-pattern site coordinates must be nonnegative uint32 integers.");
|
|
149
|
+
}
|
|
150
|
+
const { photoResponseGainFactor, darkCurrentFactor, hotPixel } = evaluateFixedPatternSiteFactors(profile, x, y);
|
|
151
|
+
const rowOffsetElectrons = evaluateFixedPatternRowOffset(profile, y);
|
|
152
|
+
const columnOffsetElectrons = evaluateFixedPatternColumnOffset(profile, x);
|
|
153
|
+
return {
|
|
154
|
+
profileId: profile.profileId,
|
|
155
|
+
modelId: SENSOR_FIXED_PATTERN_NOISE_MODEL.id,
|
|
156
|
+
modelVersion: SENSOR_FIXED_PATTERN_NOISE_MODEL.version,
|
|
157
|
+
site: { x, y },
|
|
158
|
+
photoResponseGainFactor,
|
|
159
|
+
darkCurrentFactor,
|
|
160
|
+
hotPixel,
|
|
161
|
+
rowOffsetElectrons,
|
|
162
|
+
columnOffsetElectrons,
|
|
163
|
+
readoutOffsetElectrons: rowOffsetElectrons + columnOffsetElectrons
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=fixed-pattern-noise.js.map
|