@photivra/engine 1.5.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 +393 -6
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +64 -12
- package/README.md +301 -182
- package/SECURITY.md +37 -28
- package/THIRD_PARTY.md +148 -4
- package/dist/camera/equivalent-focal-length.d.ts +13 -14
- package/dist/camera/equivalent-focal-length.js +15 -13
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +30 -19
- package/dist/camera/field-of-view.js +67 -18
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/lens-projection.d.ts +170 -0
- package/dist/camera/lens-projection.js +444 -0
- package/dist/camera/lens-projection.js.map +1 -0
- package/dist/camera/projected-object-size.d.ts +10 -11
- package/dist/camera/projected-object-size.js +12 -10
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +9 -10
- package/dist/capture/capture-export-metadata.js +8 -5
- package/dist/capture/capture-export-metadata.js.map +1 -1
- package/dist/capture/dng-import.d.ts +91 -0
- package/dist/capture/dng-import.js +343 -0
- package/dist/capture/dng-import.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +37 -17
- package/dist/capture/environment-raw-producer.js +43 -19
- package/dist/capture/environment-raw-producer.js.map +1 -1
- package/dist/capture/export-jpeg.d.ts +35 -4
- package/dist/capture/export-jpeg.js +133 -47
- package/dist/capture/export-jpeg.js.map +1 -1
- package/dist/capture/export-tiff.d.ts +48 -24
- package/dist/capture/export-tiff.js +91 -31
- package/dist/capture/export-tiff.js.map +1 -1
- package/dist/capture/focus-control.d.ts +42 -65
- package/dist/capture/focus-control.js +56 -75
- package/dist/capture/focus-control.js.map +1 -1
- package/dist/capture/host-yield-cadence.d.ts +25 -0
- package/dist/capture/host-yield-cadence.js +25 -0
- package/dist/capture/host-yield-cadence.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +14 -12
- package/dist/capture/linear-encoding.js +14 -13
- package/dist/capture/linear-encoding.js.map +1 -1
- package/dist/capture/lossless-jpeg.d.ts +27 -0
- package/dist/capture/lossless-jpeg.js +237 -0
- package/dist/capture/lossless-jpeg.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +227 -0
- package/dist/capture/native-environment-lean.js +974 -0
- package/dist/capture/native-environment-lean.js.map +1 -0
- package/dist/capture/native-environment-optical-stage.d.ts +97 -0
- package/dist/capture/native-environment-optical-stage.js +340 -0
- package/dist/capture/native-environment-optical-stage.js.map +1 -0
- package/dist/capture/native-environment-raw.d.ts +140 -6
- package/dist/capture/native-environment-raw.js +435 -34
- package/dist/capture/native-environment-raw.js.map +1 -1
- package/dist/capture/native-raw-development.d.ts +116 -9
- package/dist/capture/native-raw-development.js +221 -62
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/capture/native-raw-dng.d.ts +60 -0
- package/dist/capture/native-raw-dng.js +167 -0
- package/dist/capture/native-raw-dng.js.map +1 -0
- package/dist/capture/native-raw.d.ts +65 -12
- package/dist/capture/native-raw.js +81 -19
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/packed-sensor-raw.d.ts +160 -0
- package/dist/capture/packed-sensor-raw.js +221 -0
- package/dist/capture/packed-sensor-raw.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +58 -35
- package/dist/capture/photographic-export.js +177 -70
- package/dist/capture/photographic-export.js.map +1 -1
- package/dist/capture/raw-development-kernel.d.ts +52 -0
- package/dist/capture/raw-development-kernel.js +88 -0
- package/dist/capture/raw-development-kernel.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +7 -7
- package/dist/capture/raw-frame-limits.js +7 -6
- package/dist/capture/raw-frame-limits.js.map +1 -1
- package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
- package/dist/capture/raw-frame-reconstruction.js +9 -8
- package/dist/capture/raw-frame-reconstruction.js.map +1 -1
- package/dist/capture/raw-white-level.d.ts +55 -0
- package/dist/capture/raw-white-level.js +165 -0
- package/dist/capture/raw-white-level.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +5 -7
- package/dist/capture/release-sequence.js +15 -13
- package/dist/capture/release-sequence.js.map +1 -1
- package/dist/capture/sensor-raw-frame.d.ts +5 -6
- package/dist/capture/sensor-raw-frame.js +26 -9
- package/dist/capture/sensor-raw-frame.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +21 -13
- package/dist/capture/sensor-raw-producer.js +86 -25
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/capture/simulated-capture.d.ts +15 -16
- package/dist/capture/simulated-capture.js +22 -12
- package/dist/capture/simulated-capture.js.map +1 -1
- package/dist/color/camera-color-matrix.d.ts +69 -0
- package/dist/color/camera-color-matrix.js +132 -0
- package/dist/color/camera-color-matrix.js.map +1 -0
- package/dist/color/capture-color.d.ts +17 -10
- package/dist/color/capture-color.js +50 -17
- package/dist/color/capture-color.js.map +1 -1
- package/dist/color/chromatic-adaptation.d.ts +63 -0
- package/dist/color/chromatic-adaptation.js +91 -0
- package/dist/color/chromatic-adaptation.js.map +1 -0
- package/dist/color/color-difference.d.ts +104 -0
- package/dist/color/color-difference.js +205 -0
- package/dist/color/color-difference.js.map +1 -0
- package/dist/color/color-matching-functions.d.ts +168 -0
- package/dist/color/color-matching-functions.js +309 -0
- package/dist/color/color-matching-functions.js.map +1 -0
- package/dist/color/colorimetry-math.d.ts +52 -0
- package/dist/color/colorimetry-math.js +144 -0
- package/dist/color/colorimetry-math.js.map +1 -0
- package/dist/color/gamut-mapping.d.ts +54 -0
- package/dist/color/gamut-mapping.js +107 -0
- package/dist/color/gamut-mapping.js.map +1 -0
- package/dist/color/illuminants.d.ts +182 -0
- package/dist/color/illuminants.js +434 -0
- package/dist/color/illuminants.js.map +1 -0
- package/dist/color/rgb-color-spaces.d.ts +79 -0
- package/dist/color/rgb-color-spaces.js +115 -0
- package/dist/color/rgb-color-spaces.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +33 -11
- package/dist/color/sensor-color-development.js +104 -30
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/srgb-icc.d.ts +9 -2
- package/dist/color/srgb-icc.js +16 -5
- package/dist/color/srgb-icc.js.map +1 -1
- package/dist/color/srgb-transfer.d.ts +1 -2
- package/dist/color/srgb-transfer.js +1 -1
- package/dist/color/srgb-transfer.js.map +1 -1
- package/dist/color/white-balance.d.ts +68 -19
- package/dist/color/white-balance.js +168 -35
- package/dist/color/white-balance.js.map +1 -1
- package/dist/composition/image-formation-plan.d.ts +152 -128
- package/dist/composition/image-formation-plan.js +292 -138
- package/dist/composition/image-formation-plan.js.map +1 -1
- package/dist/composition/plan-consumer.d.ts +6 -7
- package/dist/composition/plan-consumer.js +14 -11
- package/dist/composition/plan-consumer.js.map +1 -1
- package/dist/core/calculation-result.d.ts +21 -14
- package/dist/core/calculation-result.js +209 -11
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +13 -8
- package/dist/core/canonical-json.js +34 -15
- package/dist/core/canonical-json.js.map +1 -1
- package/dist/core/configuration-error.d.ts +5 -4
- package/dist/core/configuration-error.js +5 -3
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +12 -12
- package/dist/core/evidence-provenance.js +10 -9
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +11 -10
- package/dist/core/image-formation.js +11 -9
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +9 -17
- package/dist/core/owned-data.js +9 -16
- package/dist/core/owned-data.js.map +1 -1
- package/dist/core/portable-math.d.ts +15 -0
- package/dist/core/portable-math.js +56 -0
- package/dist/core/portable-math.js.map +1 -0
- package/dist/core/record-validation.d.ts +48 -9
- package/dist/core/record-validation.js +93 -19
- package/dist/core/record-validation.js.map +1 -1
- package/dist/core/scientific-assurance.d.ts +16 -14
- package/dist/core/scientific-assurance.js +22 -18
- package/dist/core/scientific-assurance.js.map +1 -1
- package/dist/core/spectral-composition.d.ts +13 -14
- package/dist/core/spectral-composition.js +30 -27
- package/dist/core/spectral-composition.js.map +1 -1
- package/dist/core/spectral.d.ts +5 -6
- package/dist/core/spectral.js +9 -7
- package/dist/core/spectral.js.map +1 -1
- package/dist/core/validation.d.ts +3 -6
- package/dist/core/validation.js +3 -5
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +6 -6
- package/dist/core/version.js +6 -5
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/exposure-capabilities.d.ts +10 -10
- package/dist/equipment/exposure-capabilities.js +40 -30
- package/dist/equipment/exposure-capabilities.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +13 -6
- package/dist/equipment/generic-tier-assets.js +34 -15
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/generic-tier-presets.d.ts +5 -6
- package/dist/equipment/generic-tier-presets.js +15 -13
- package/dist/equipment/generic-tier-presets.js.map +1 -1
- package/dist/equipment/iso-capabilities.d.ts +21 -22
- package/dist/equipment/iso-capabilities.js +49 -44
- package/dist/equipment/iso-capabilities.js.map +1 -1
- package/dist/equipment/metering-capabilities.d.ts +5 -6
- package/dist/equipment/metering-capabilities.js +22 -19
- package/dist/equipment/metering-capabilities.js.map +1 -1
- package/dist/equipment/release-capabilities.d.ts +3 -4
- package/dist/equipment/release-capabilities.js +18 -14
- package/dist/equipment/release-capabilities.js.map +1 -1
- package/dist/exposure/exposure-duration-control.d.ts +19 -17
- package/dist/exposure/exposure-duration-control.js +27 -23
- package/dist/exposure/exposure-duration-control.js.map +1 -1
- package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
- package/dist/exposure/exposure-mode-resolver.js +127 -82
- package/dist/exposure/exposure-mode-resolver.js.map +1 -1
- package/dist/exposure/exposure.d.ts +17 -16
- package/dist/exposure/exposure.js +22 -15
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash-ttl.d.ts +135 -0
- package/dist/exposure/flash-ttl.js +193 -0
- package/dist/exposure/flash-ttl.js.map +1 -0
- package/dist/exposure/flash.d.ts +144 -36
- package/dist/exposure/flash.js +259 -59
- package/dist/exposure/flash.js.map +1 -1
- package/dist/exposure/metering-scene-radiance.d.ts +10 -10
- package/dist/exposure/metering-scene-radiance.js +42 -23
- package/dist/exposure/metering-scene-radiance.js.map +1 -1
- package/dist/exposure/metering-target.d.ts +8 -8
- package/dist/exposure/metering-target.js +30 -20
- package/dist/exposure/metering-target.js.map +1 -1
- package/dist/exposure/metering-temporal.d.ts +16 -15
- package/dist/exposure/metering-temporal.js +41 -19
- package/dist/exposure/metering-temporal.js.map +1 -1
- package/dist/exposure/metering.d.ts +64 -17
- package/dist/exposure/metering.js +159 -30
- package/dist/exposure/metering.js.map +1 -1
- package/dist/exposure/program-line.d.ts +5 -5
- package/dist/exposure/program-line.js +20 -13
- package/dist/exposure/program-line.js.map +1 -1
- package/dist/facade/camera-preset.d.ts +8 -0
- package/dist/facade/camera-preset.js +102 -0
- package/dist/facade/camera-preset.js.map +1 -0
- package/dist/facade/chart-radiance-batch.d.ts +57 -0
- package/dist/facade/chart-radiance-batch.js +121 -0
- package/dist/facade/chart-radiance-batch.js.map +1 -0
- package/dist/facade/chart-scenes.d.ts +177 -0
- package/dist/facade/chart-scenes.js +232 -0
- package/dist/facade/chart-scenes.js.map +1 -0
- package/dist/facade/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 -8
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +21 -10
- package/docs/api/capture-packed-sensor-raw.md +156 -0
- package/docs/api/capture-photographic-export.md +69 -31
- package/docs/api/capture-raw-frame-reconstruction.md +8 -8
- package/docs/api/capture-raw-white-level.md +37 -0
- package/docs/api/capture-release-sequence.md +6 -7
- package/docs/api/capture-sensor-raw-frame.md +6 -6
- package/docs/api/capture-sensor-raw-producer.md +17 -11
- package/docs/api/capture-simulated-capture.md +15 -15
- package/docs/api/color-camera-color-matrix.md +103 -0
- package/docs/api/color-capture-color.md +22 -11
- package/docs/api/color-chromatic-adaptation.md +82 -0
- package/docs/api/color-color-difference.md +134 -0
- package/docs/api/color-color-matching-functions.md +259 -0
- package/docs/api/color-colorimetry-math.md +54 -0
- package/docs/api/color-gamut-mapping.md +72 -0
- package/docs/api/color-illuminants.md +280 -0
- package/docs/api/color-rgb-color-spaces.md +151 -0
- package/docs/api/color-sensor-color-development.md +27 -0
- package/docs/api/color-srgb-icc.md +2 -4
- package/docs/api/color-white-balance.md +95 -19
- package/docs/api/composition-image-formation-plan.md +124 -95
- package/docs/api/composition-plan-consumer.md +7 -7
- package/docs/api/core-calculation-result.md +18 -14
- package/docs/api/core-configuration-error.md +1 -1
- package/docs/api/core-image-formation.md +7 -7
- package/docs/api/core-scientific-assurance.md +12 -10
- package/docs/api/core-spectral-composition.md +14 -14
- package/docs/api/core-spectral.md +6 -6
- package/docs/api/core-validation.md +3 -3
- package/docs/api/core-version.md +7 -6
- package/docs/api/equipment-exposure-capabilities.md +11 -10
- package/docs/api/equipment-generic-tier-assets.md +7 -2
- package/docs/api/equipment-generic-tier-presets.md +6 -6
- package/docs/api/equipment-iso-capabilities.md +18 -18
- package/docs/api/equipment-metering-capabilities.md +6 -6
- package/docs/api/equipment-release-capabilities.md +4 -4
- package/docs/api/exports.json +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/DENSE_PUPIL_QUALIFICATION.md +0 -121
- package/docs/DEVELOPERS.md +0 -68
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
- package/docs/EXPORT_ACCEPTANCE.md +0 -133
- package/docs/GENERIC_TIER_PRESETS.md +0 -269
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
- package/docs/IMAGE_FORMATION.md +0 -247
- package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
- package/docs/MOTION_AND_SIGNAL.md +0 -250
- package/docs/NATIVE_CAPTURE_SDR.md +0 -70
- package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
- package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
- package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
- package/docs/NUMERICAL_CORRECTNESS.md +0 -191
- package/docs/PERFORMANCE_BASELINE.md +0 -56
- package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
- package/docs/PHYSICS_FOUNDATION.md +0 -426
- package/docs/POC_API.md +0 -278
- package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
- package/docs/POC_PROJECTION_REUSE.md +0 -124
- package/docs/PRINT_195_196_REVIEW.md +0 -93
- package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
- package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
- package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
- package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
- package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
- package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
- package/docs/PRINT_PLANNING.md +0 -75
- package/docs/PRINT_REGION_STATISTICS.md +0 -38
- package/docs/PROCESSED_OUTPUT.md +0 -157
- package/docs/PRODUCTION_COMPOSITION.md +0 -373
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
- package/docs/PROVENANCE.md +0 -115
- package/docs/PSF_FOUNDATION.md +0 -165
- package/docs/RAW_FRAME_ENVELOPE.md +0 -56
- package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
- package/docs/RELEASE_1_0.md +0 -66
- package/docs/RELEASE_1_0_1.md +0 -61
- package/docs/RELEASE_1_1_0.md +0 -25
- package/docs/RELEASE_1_2_0.md +0 -51
- package/docs/RELEASE_1_3_0.md +0 -15
- package/docs/RELEASE_1_4_0.md +0 -23
- package/docs/RELEASE_1_5_0.md +0 -105
- package/docs/RELEASE_AUDIT.md +0 -39
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
- package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
- package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
- package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
- package/docs/SDR_RENDERING.md +0 -33
- package/docs/SENSOR_APERTURE_RAYS.md +0 -23
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
- package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
- package/docs/SENSOR_RAW_FRAME.md +0 -20
- package/docs/SENSOR_RAW_PRODUCER.md +0 -77
- package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
- package/docs/SIGNAL_CONFORMANCE.md +0 -23
- package/docs/SIMULATED_CAPTURE.md +0 -65
- package/docs/STABILIZATION.md +0 -234
- package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
- package/docs/TIER_ACCEPTANCE.md +0 -129
- package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
- package/docs/V1_COMPOSITION_MAP.md +0 -123
- package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
- package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
- package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
- package/docs/licenses/castleCSF-MIT.txt +0 -21
- package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
- package/docs/validation/documentation-fragments.json +0 -212
- package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
- package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
- package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
- package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
- package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
- package/docs/validation/print-196-candidate-capabilities.json +0 -28
- package/docs/validation/print-196-candidate-evidence.json +0 -356
- package/docs/validation/print-196-engine-acceptance.json +0 -81
- package/docs/validation/print-detail-capabilities.json +0 -103
- package/docs/validation/print-detail-jpeg-evidence.json +0 -116
- package/docs/validation/print-detail-sdr-evidence.json +0 -81
- package/docs/validation/release-audit-inventory.json +0 -1306
- package/docs/validation/tier-acceptance-report-v1.json +0 -2538
|
@@ -1,25 +1,31 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
3
|
+
* Generic relative exposure metering.
|
|
4
|
+
*
|
|
5
|
+
* The profile parser reads one metering profile. Schema 0.1.0 is an approximation only. It works on
|
|
6
|
+
* relative linear signal measured before the exposure (pre-exposure). It deliberately does not claim
|
|
7
|
+
* luminance, spectral radiance, sensor-plane irradiance or any manufacturer's meter calibration.
|
|
8
|
+
*
|
|
9
|
+
* The meter works over the actual active capture frame, in its capture orientation. This first
|
|
10
|
+
* contract is an educational, relative approximation. It deliberately ignores the final output crop,
|
|
11
|
+
* display and tone mapping, exposure compensation and the choice of automatic exposure settings.
|
|
12
|
+
* @see docs/USAGE.md for the equations, units, coordinate conventions, known blockers and support
|
|
13
|
+
* limits.
|
|
11
14
|
*/
|
|
12
15
|
import { approximationResult } from "../core/calculation-result.js";
|
|
13
16
|
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
14
17
|
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
15
18
|
import { InvalidScientificInputError } from "../core/validation.js";
|
|
19
|
+
import { requireInputKeys, requireInputObject, rejectUnknownFields, rejectUnknownVariantFields } from "../core/record-validation.js";
|
|
16
20
|
export const EXPOSURE_METERING_PROFILE_SCHEMA_VERSION = "0.1.0";
|
|
17
|
-
function requireRecord(value, path) {
|
|
21
|
+
function requireRecord(value, path, allowedKeys) {
|
|
18
22
|
if (typeof value !== "object" ||
|
|
19
23
|
value === null ||
|
|
20
24
|
Array.isArray(value)) {
|
|
21
25
|
throw new InvalidConfigurationError(path + " must be an object.");
|
|
22
26
|
}
|
|
27
|
+
if (allowedKeys !== null)
|
|
28
|
+
rejectUnknownFields(value, allowedKeys, path);
|
|
23
29
|
return value;
|
|
24
30
|
}
|
|
25
31
|
function requireNonEmptyString(value, path) {
|
|
@@ -52,7 +58,7 @@ function requireFraction(value, path) {
|
|
|
52
58
|
return parsed;
|
|
53
59
|
}
|
|
54
60
|
function parseUv(value, path) {
|
|
55
|
-
const record = requireRecord(value, path);
|
|
61
|
+
const record = requireRecord(value, path, ["u", "v"]);
|
|
56
62
|
const u = requireFinite(record.u, path + ".u");
|
|
57
63
|
const v = requireFinite(record.v, path + ".v");
|
|
58
64
|
if (u < 0 ||
|
|
@@ -76,7 +82,14 @@ function parseLimitations(value, path) {
|
|
|
76
82
|
return limitations;
|
|
77
83
|
}
|
|
78
84
|
function parsePolicy(value, path) {
|
|
79
|
-
const record = requireRecord(value, path);
|
|
85
|
+
const record = requireRecord(value, path, null);
|
|
86
|
+
rejectUnknownVariantFields(record, "kind", {
|
|
87
|
+
"multi-zone-uniform": ["kind"],
|
|
88
|
+
"center-weighted-radial": ["kind", "edgeWeight", "exponent"],
|
|
89
|
+
spot: ["kind", "centerOrientedCaptureUv", "radiusFractionOfCaptureDiagonal"],
|
|
90
|
+
"highlight-weighted": ["kind", "minimumWeightFraction", "exponent"],
|
|
91
|
+
"highlight-priority": ["kind", "highlightPercentile", "saturationRelativeSignal", "headroomStops"]
|
|
92
|
+
}, path);
|
|
80
93
|
if (record.kind ===
|
|
81
94
|
"multi-zone-uniform") {
|
|
82
95
|
return {
|
|
@@ -117,17 +130,85 @@ function parsePolicy(value, path) {
|
|
|
117
130
|
exponent: requirePositiveFinite(record.exponent, path + ".exponent")
|
|
118
131
|
};
|
|
119
132
|
}
|
|
133
|
+
if (record.kind ===
|
|
134
|
+
"highlight-priority") {
|
|
135
|
+
const percentile = requirePositiveFinite(record.highlightPercentile, path + ".highlightPercentile");
|
|
136
|
+
if (percentile > 1) {
|
|
137
|
+
throw new InvalidConfigurationError(path +
|
|
138
|
+
".highlightPercentile must lie in (0, 1].");
|
|
139
|
+
}
|
|
140
|
+
const headroom = record.headroomStops;
|
|
141
|
+
if (typeof headroom !== "number" ||
|
|
142
|
+
!Number.isFinite(headroom) ||
|
|
143
|
+
headroom < 0) {
|
|
144
|
+
throw new InvalidConfigurationError(path +
|
|
145
|
+
".headroomStops must be a finite number greater than or equal to zero.");
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
kind: "highlight-priority",
|
|
149
|
+
highlightPercentile: percentile,
|
|
150
|
+
saturationRelativeSignal: requirePositiveFinite(record.saturationRelativeSignal, path +
|
|
151
|
+
".saturationRelativeSignal"),
|
|
152
|
+
headroomStops: headroom
|
|
153
|
+
};
|
|
154
|
+
}
|
|
120
155
|
throw new InvalidConfigurationError(path + ".kind is invalid.");
|
|
121
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Relative signal at which a highlight-priority profile places its highlight
|
|
159
|
+
* percentile: `saturationRelativeSignal * 2^-headroomStops`.
|
|
160
|
+
*/
|
|
161
|
+
export function calculateHighlightPriorityPlacementSignal(saturationRelativeSignal, headroomStops) {
|
|
162
|
+
if (!Number.isFinite(saturationRelativeSignal) ||
|
|
163
|
+
saturationRelativeSignal <= 0 ||
|
|
164
|
+
!Number.isFinite(headroomStops) ||
|
|
165
|
+
headroomStops < 0) {
|
|
166
|
+
throw new InvalidScientificInputError("Highlight placement requires a positive saturation signal and non-negative headroom.");
|
|
167
|
+
}
|
|
168
|
+
return saturationRelativeSignal *
|
|
169
|
+
Math.pow(2, -headroomStops);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Lower area-weighted quantile (inverse empirical CDF). Sort samples by
|
|
173
|
+
* ascending signal and add up their area weights. The result is the smallest
|
|
174
|
+
* sample signal at which the running weight fraction reaches `percentile`.
|
|
175
|
+
* Ties keep their input order, so the result is deterministic.
|
|
176
|
+
*/
|
|
177
|
+
function areaWeightedLowerQuantile(samples, percentile) {
|
|
178
|
+
const ordered = samples
|
|
179
|
+
.map((sample, index) => ({
|
|
180
|
+
signal: sample.relativeLinearSignal,
|
|
181
|
+
weight: sample.areaWeight,
|
|
182
|
+
index
|
|
183
|
+
}))
|
|
184
|
+
.sort((a, b) => a.signal - b.signal ||
|
|
185
|
+
a.index - b.index);
|
|
186
|
+
let total = 0;
|
|
187
|
+
for (const entry of ordered)
|
|
188
|
+
total += entry.weight;
|
|
189
|
+
const threshold = percentile * total;
|
|
190
|
+
let cumulative = 0;
|
|
191
|
+
for (const entry of ordered) {
|
|
192
|
+
cumulative += entry.weight;
|
|
193
|
+
// Relative tolerance absorbs summation rounding at exact quantile boundaries.
|
|
194
|
+
if (cumulative >=
|
|
195
|
+
threshold * (1 - 1e-12)) {
|
|
196
|
+
return entry.signal;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return ordered[ordered.length - 1]
|
|
200
|
+
.signal;
|
|
201
|
+
}
|
|
122
202
|
/**
|
|
123
203
|
* Parses one generic relative exposure-metering profile.
|
|
124
204
|
*
|
|
125
|
-
* Schema 0.1.0 is approximation
|
|
126
|
-
*
|
|
127
|
-
* sensor-plane irradiance
|
|
205
|
+
* Schema 0.1.0 is an approximation only. It works on relative linear signal
|
|
206
|
+
* measured before the exposure. It deliberately does not claim luminance,
|
|
207
|
+
* spectral radiance, sensor-plane irradiance or any manufacturer's meter
|
|
208
|
+
* calibration.
|
|
128
209
|
*/
|
|
129
210
|
export function parseExposureMeteringProfile(value) {
|
|
130
|
-
const record = requireRecord(value, "exposureMeteringProfile");
|
|
211
|
+
const record = requireRecord(value, "exposureMeteringProfile", ["schemaVersion", "scientificStatus", "inputDomain", "captureRegion", "target", "policy", "profileId", "evidence", "limitations"]);
|
|
131
212
|
if (record.schemaVersion !==
|
|
132
213
|
EXPOSURE_METERING_PROFILE_SCHEMA_VERSION) {
|
|
133
214
|
throw new InvalidConfigurationError('exposureMeteringProfile.schemaVersion must be "' +
|
|
@@ -146,21 +227,31 @@ export function parseExposureMeteringProfile(value) {
|
|
|
146
227
|
"oriented-active-capture") {
|
|
147
228
|
throw new InvalidConfigurationError('exposureMeteringProfile.captureRegion must be "oriented-active-capture".');
|
|
148
229
|
}
|
|
149
|
-
const target = requireRecord(record.target, "exposureMeteringProfile.target");
|
|
230
|
+
const target = requireRecord(record.target, "exposureMeteringProfile.target", ["kind", "targetRelativeSignal", "evidence"]);
|
|
150
231
|
if (target.kind !==
|
|
151
232
|
"relative-signal-reference") {
|
|
152
233
|
throw new InvalidConfigurationError('exposureMeteringProfile.target.kind must be "relative-signal-reference".');
|
|
153
234
|
}
|
|
235
|
+
const policy = parsePolicy(record.policy, "exposureMeteringProfile.policy");
|
|
236
|
+
const targetRelativeSignal = requirePositiveFinite(target.targetRelativeSignal, "exposureMeteringProfile.target.targetRelativeSignal");
|
|
237
|
+
if (policy.kind === "highlight-priority") {
|
|
238
|
+
const placement = calculateHighlightPriorityPlacementSignal(policy.saturationRelativeSignal, policy.headroomStops);
|
|
239
|
+
if (Math.abs(targetRelativeSignal -
|
|
240
|
+
placement) >
|
|
241
|
+
1e-12 * placement) {
|
|
242
|
+
throw new InvalidConfigurationError("exposureMeteringProfile.target.targetRelativeSignal must equal saturationRelativeSignal * 2^-headroomStops for highlight-priority metering.");
|
|
243
|
+
}
|
|
244
|
+
}
|
|
154
245
|
return {
|
|
155
246
|
schemaVersion: EXPOSURE_METERING_PROFILE_SCHEMA_VERSION,
|
|
156
247
|
profileId: requireNonEmptyString(record.profileId, "exposureMeteringProfile.profileId"),
|
|
157
248
|
scientificStatus: "approximation",
|
|
158
249
|
inputDomain: "relative-pre-exposure-linear-signal",
|
|
159
250
|
captureRegion: "oriented-active-capture",
|
|
160
|
-
policy
|
|
251
|
+
policy,
|
|
161
252
|
target: {
|
|
162
253
|
kind: "relative-signal-reference",
|
|
163
|
-
targetRelativeSignal
|
|
254
|
+
targetRelativeSignal,
|
|
164
255
|
evidence: parseEvidenceList(target.evidence, "exposureMeteringProfile.target.evidence")
|
|
165
256
|
},
|
|
166
257
|
evidence: parseEvidenceList(record.evidence, "exposureMeteringProfile.evidence"),
|
|
@@ -170,7 +261,7 @@ export function parseExposureMeteringProfile(value) {
|
|
|
170
261
|
function requireInputString(value, path) {
|
|
171
262
|
if (typeof value !== "string" ||
|
|
172
263
|
value.trim().length === 0) {
|
|
173
|
-
throw new
|
|
264
|
+
throw new InvalidConfigurationError(path + " must be a non-empty string.");
|
|
174
265
|
}
|
|
175
266
|
return value.trim();
|
|
176
267
|
}
|
|
@@ -197,6 +288,7 @@ function requireInputNonNegativeFinite(value, path) {
|
|
|
197
288
|
return parsed;
|
|
198
289
|
}
|
|
199
290
|
function validateSampleUv(uv, path) {
|
|
291
|
+
requireInputObject(uv, path);
|
|
200
292
|
const u = requireInputFinite(uv.u, path + ".u");
|
|
201
293
|
const v = requireInputFinite(uv.v, path + ".v");
|
|
202
294
|
if (u < 0 ||
|
|
@@ -208,6 +300,9 @@ function validateSampleUv(uv, path) {
|
|
|
208
300
|
}
|
|
209
301
|
}
|
|
210
302
|
function validateCaptureGeometry(geometry) {
|
|
303
|
+
requireInputObject(geometry, "sampleSet.captureGeometry");
|
|
304
|
+
requireInputObject(geometry.orientedCapture, "sampleSet.captureGeometry.orientedCapture");
|
|
305
|
+
requireInputObject(geometry.orientedCapture.imagingArea, "sampleSet.captureGeometry.orientedCapture.imagingArea");
|
|
211
306
|
const width = requireInputPositiveFinite(geometry.orientedCapture
|
|
212
307
|
.imagingArea.widthMm, "sampleSet.captureGeometry.orientedCapture.imagingArea.widthMm");
|
|
213
308
|
const height = requireInputPositiveFinite(geometry.orientedCapture
|
|
@@ -219,6 +314,7 @@ function validateCaptureGeometry(geometry) {
|
|
|
219
314
|
}
|
|
220
315
|
function validateProcessingState(sampleSet) {
|
|
221
316
|
const state = sampleSet.processingState;
|
|
317
|
+
requireInputObject(state, "sampleSet.processingState");
|
|
222
318
|
if (state.exposureSettingsApplied !==
|
|
223
319
|
false ||
|
|
224
320
|
state.whiteBalanceApplied !==
|
|
@@ -269,6 +365,10 @@ function policyWeight(policy, sample, widthMm, heightMm, maximumSignal) {
|
|
|
269
365
|
? 1
|
|
270
366
|
: 0;
|
|
271
367
|
}
|
|
368
|
+
if (policy.kind === "highlight-priority") {
|
|
369
|
+
// Quantile placement is not a weighted mean; meterRelativeExposure handles it separately.
|
|
370
|
+
return 1;
|
|
371
|
+
}
|
|
272
372
|
if (maximumSignal <= 0) {
|
|
273
373
|
return policy
|
|
274
374
|
.minimumWeightFraction;
|
|
@@ -281,16 +381,18 @@ function policyWeight(policy, sample, widthMm, heightMm, maximumSignal) {
|
|
|
281
381
|
Math.pow(normalizedHighlight, policy.exponent));
|
|
282
382
|
}
|
|
283
383
|
/**
|
|
284
|
-
* Meters relative pre-exposure linear signal over the actual
|
|
285
|
-
* capture
|
|
384
|
+
* Meters relative pre-exposure linear signal over the actual active capture
|
|
385
|
+
* frame, in its capture orientation.
|
|
286
386
|
*
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
* exposure compensation
|
|
387
|
+
* This first contract is an educational, relative approximation. It
|
|
388
|
+
* deliberately ignores the final output crop, display and tone mapping,
|
|
389
|
+
* exposure compensation and the choice of automatic exposure settings.
|
|
290
390
|
*/
|
|
291
391
|
export function meterRelativeExposure(input) {
|
|
392
|
+
requireInputKeys(input, "meterRelativeExposure", ["profile", "sampleSet"]);
|
|
292
393
|
const profile = parseExposureMeteringProfile(input.profile);
|
|
293
394
|
const sampleSet = input.sampleSet;
|
|
395
|
+
requireInputObject(sampleSet, "sampleSet");
|
|
294
396
|
requireInputString(sampleSet.measurementId, "sampleSet.measurementId");
|
|
295
397
|
requireInputString(sampleSet.sceneStateId, "sampleSet.sceneStateId");
|
|
296
398
|
if (sampleSet.inputDomain !==
|
|
@@ -305,7 +407,7 @@ export function meterRelativeExposure(input) {
|
|
|
305
407
|
validateProcessingState(sampleSet);
|
|
306
408
|
if (!Array.isArray(sampleSet.samples) ||
|
|
307
409
|
sampleSet.samples.length === 0) {
|
|
308
|
-
throw new
|
|
410
|
+
throw new InvalidConfigurationError("sampleSet.samples must be a non-empty array.");
|
|
309
411
|
}
|
|
310
412
|
const sampleIds = [];
|
|
311
413
|
let maximumSignal = 0;
|
|
@@ -314,6 +416,7 @@ export function meterRelativeExposure(input) {
|
|
|
314
416
|
const path = "sampleSet.samples[" +
|
|
315
417
|
index +
|
|
316
418
|
"]";
|
|
419
|
+
requireInputObject(sample, path);
|
|
317
420
|
sampleIds.push(requireInputString(sample.sampleId, path + ".sampleId"));
|
|
318
421
|
validateSampleUv(sample
|
|
319
422
|
.positionOrientedCaptureUv, path +
|
|
@@ -336,7 +439,11 @@ export function meterRelativeExposure(input) {
|
|
|
336
439
|
let weightedSignal = 0;
|
|
337
440
|
let weightSum = 0;
|
|
338
441
|
let selectedSampleCount = 0;
|
|
339
|
-
|
|
442
|
+
const highlightPolicy = profile.policy.kind ===
|
|
443
|
+
"highlight-priority"
|
|
444
|
+
? profile.policy
|
|
445
|
+
: null;
|
|
446
|
+
for (const sample of highlightPolicy === null ? sampleSet.samples : []) {
|
|
340
447
|
const policyMultiplier = policyWeight(profile.policy, sample, widthMm, heightMm, maximumSignal);
|
|
341
448
|
if (policyMultiplier <= 0) {
|
|
342
449
|
continue;
|
|
@@ -353,10 +460,18 @@ export function meterRelativeExposure(input) {
|
|
|
353
460
|
!Number.isFinite(weightSum)) {
|
|
354
461
|
throw new InvalidScientificInputError("Metering weighted sums must remain finite.");
|
|
355
462
|
}
|
|
463
|
+
if (highlightPolicy !== null) {
|
|
464
|
+
// Every sample participates in the quantile with its area weight.
|
|
465
|
+
weightSum = 1;
|
|
466
|
+
selectedSampleCount =
|
|
467
|
+
sampleSet.samples.length;
|
|
468
|
+
}
|
|
356
469
|
if (weightSum <= 0) {
|
|
357
470
|
throw new InvalidScientificInputError("Metering policy selected no samples with positive weight.");
|
|
358
471
|
}
|
|
359
|
-
const meteredRelativeSignal =
|
|
472
|
+
const meteredRelativeSignal = highlightPolicy === null
|
|
473
|
+
? weightedSignal / weightSum
|
|
474
|
+
: areaWeightedLowerQuantile(sampleSet.samples, highlightPolicy.highlightPercentile);
|
|
360
475
|
if (!Number.isFinite(meteredRelativeSignal) ||
|
|
361
476
|
meteredRelativeSignal < 0) {
|
|
362
477
|
throw new InvalidScientificInputError("Metered relative signal must remain finite and non-negative.");
|
|
@@ -388,7 +503,20 @@ export function meterRelativeExposure(input) {
|
|
|
388
503
|
calibratedLuminanceClaimAuthorized: false,
|
|
389
504
|
calibratedSceneRadianceClaimAuthorized: false,
|
|
390
505
|
automaticExposureResolved: false,
|
|
391
|
-
resultReusableForAeLock: true
|
|
506
|
+
resultReusableForAeLock: true,
|
|
507
|
+
...(highlightPolicy === null
|
|
508
|
+
? {}
|
|
509
|
+
: {
|
|
510
|
+
highlightPriority: {
|
|
511
|
+
highlightPercentile: highlightPolicy.highlightPercentile,
|
|
512
|
+
percentileRelativeSignal: meteredRelativeSignal,
|
|
513
|
+
saturationRelativeSignal: highlightPolicy.saturationRelativeSignal,
|
|
514
|
+
headroomStops: highlightPolicy.headroomStops,
|
|
515
|
+
placementRelativeSignal: profile.target
|
|
516
|
+
.targetRelativeSignal,
|
|
517
|
+
quantileDefinition: "area-weighted-lower-quantile-inverse-empirical-cdf"
|
|
518
|
+
}
|
|
519
|
+
})
|
|
392
520
|
};
|
|
393
521
|
const value = meteredRelativeSignal === 0
|
|
394
522
|
? {
|
|
@@ -407,11 +535,12 @@ export function meterRelativeExposure(input) {
|
|
|
407
535
|
.targetRelativeSignal /
|
|
408
536
|
meteredRelativeSignal)
|
|
409
537
|
};
|
|
410
|
-
return approximationResult(value, "relative-pre-exposure-metering", "1.
|
|
538
|
+
return approximationResult(value, "relative-pre-exposure-metering", "1.1.0", [
|
|
411
539
|
"Input samples are relative pre-exposure linear signal, not calibrated luminance, scene spectral radiance, sensor-plane irradiance, or final rendered output.",
|
|
412
540
|
"Sample areaWeight is supplied by the producer and is assumed to represent the active capture frame consistently.",
|
|
413
541
|
"Metering coordinates are normalized over the physically oriented active capture frame, not the final output crop or CSS/display box.",
|
|
414
|
-
"Multi-zone, center-weighted, spot, and highlight-
|
|
542
|
+
"Multi-zone, center-weighted, spot, highlight-weighted and highlight-priority policies are generic explicit approximations and do not claim to reproduce a specific commercial camera.",
|
|
543
|
+
"highlight-weighted is a highlight-emphasis weighted average placed at the target; it does not place highlights relative to saturation. highlight-priority places an area-weighted signal quantile at a declared headroom below a declared relative saturation signal.",
|
|
415
544
|
"The declared relative target is profile policy, not a universal 18% gray truth.",
|
|
416
545
|
"Exposure compensation is not applied by the meter.",
|
|
417
546
|
"Automatic aperture, shutter, and ISO resolution remains downstream.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metering.js","sourceRoot":"","sources":["../../src/exposure/metering.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"metering.js","sourceRoot":"","sources":["../../src/exposure/metering.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Generic relative exposure metering.\n *\n * The profile parser reads one metering profile. Schema 0.1.0 is an approximation only. It works on\n * relative linear signal measured before the exposure (pre-exposure). It deliberately does not claim\n * luminance, spectral radiance, sensor-plane irradiance or any manufacturer's meter calibration.\n *\n * The meter works over the actual active capture frame, in its capture orientation. This first\n * contract is an educational, relative approximation. It deliberately ignores the final output crop,\n * display and tone mapping, exposure compensation and the choice of automatic exposure settings.\n * @see docs/USAGE.md for the equations, units, coordinate conventions, known blockers and support\n * limits.\n */\n\nimport {\n approximationResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport {\n parseEvidenceList,\n type EvidenceProvenance\n} from \"../core/evidence-provenance.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport type {\n NormalizedRasterUv,\n ResolvedCaptureGeometry\n} from \"../output/capture-geometry.js\";\nimport { requireInputKeys, requireInputObject, rejectUnknownFields, rejectUnknownVariantFields } from \"../core/record-validation.js\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport const EXPOSURE_METERING_PROFILE_SCHEMA_VERSION =\n \"0.1.0\" as const;\n\nexport type ExposureMeteringPolicy =\n | {\n kind: \"multi-zone-uniform\";\n }\n | {\n kind: \"center-weighted-radial\";\n edgeWeight: number;\n exponent: number;\n }\n | {\n kind: \"spot\";\n centerOrientedCaptureUv:\n NormalizedRasterUv;\n radiusFractionOfCaptureDiagonal:\n number;\n }\n | {\n /**\n * Weighted average that emphasises highlights (unchanged since 1.x).\n * Brighter samples get the weight `minimumWeightFraction + (1 -\n * minimumWeightFraction) * (signal / maximum)^exponent`. The weighted mean\n * is then placed at the profile target.\n *\n * This is NOT highlight protection. No sample is placed relative to\n * saturation. In a mostly mid-grey scene with a small bright area, it\n * underexposes the mid-tones compared with uniform metering, yet does not\n * guarantee headroom. Use `highlight-priority` to keep highlights below\n * saturation.\n */\n kind: \"highlight-weighted\";\n minimumWeightFraction: number;\n exponent: number;\n }\n | {\n /**\n * Highlight-priority placement. The area-weighted `highlightPercentile`\n * quantile of the relative pre-exposure signal is placed `headroomStops`\n * below `saturationRelativeSignal`. The profile target must state that\n * placement exactly: `targetRelativeSignal = saturationRelativeSignal *\n * 2^-headroomStops` (see {@link calculateHighlightPriorityPlacementSignal}).\n */\n kind: \"highlight-priority\";\n /** Area-weighted quantile in (0, 1]; 1 places the brightest sample. */\n highlightPercentile: number;\n /** Relative pre-exposure signal at which the declared output saturates. */\n saturationRelativeSignal: number;\n /** Non-negative headroom in stops between the placed highlight and saturation. */\n headroomStops: number;\n };\n\n/** Diagnostics reported only for the highlight-priority policy. */\nexport interface HighlightPriorityMeteringDiagnostics {\n highlightPercentile: number;\n /** Lower area-weighted quantile (inverse empirical CDF) of the samples. */\n percentileRelativeSignal: number;\n saturationRelativeSignal: number;\n headroomStops: number;\n placementRelativeSignal: number;\n quantileDefinition:\n \"area-weighted-lower-quantile-inverse-empirical-cdf\";\n}\n\nexport interface ExposureMeteringProfile {\n schemaVersion:\n typeof EXPOSURE_METERING_PROFILE_SCHEMA_VERSION;\n profileId: string;\n scientificStatus: \"approximation\";\n inputDomain:\n \"relative-pre-exposure-linear-signal\";\n captureRegion:\n \"oriented-active-capture\";\n policy: ExposureMeteringPolicy;\n target: {\n kind: \"relative-signal-reference\";\n targetRelativeSignal: number;\n evidence: readonly EvidenceProvenance[];\n };\n evidence: readonly EvidenceProvenance[];\n limitations: readonly string[];\n}\n\nexport interface ExposureMeteringZoneSample {\n sampleId: string;\n positionOrientedCaptureUv:\n NormalizedRasterUv;\n relativeLinearSignal: number;\n areaWeight: number;\n}\n\nexport interface ExposureMeteringSampleSet {\n measurementId: string;\n sceneStateId: string;\n inputDomain:\n \"relative-pre-exposure-linear-signal\";\n captureRegion:\n \"oriented-active-capture\";\n captureGeometry:\n ResolvedCaptureGeometry;\n processingState: {\n exposureSettingsApplied: false;\n whiteBalanceApplied: false;\n toneMappingApplied: false;\n displayGammaApplied: false;\n sharpeningApplied: false;\n };\n samples:\n readonly ExposureMeteringZoneSample[];\n}\n\ninterface ExposureMeteringResultBase {\n measurementId: string;\n sceneStateId: string;\n profileId: string;\n scientificStatus: \"approximation\";\n inputDomain:\n \"relative-pre-exposure-linear-signal\";\n captureRegion:\n \"oriented-active-capture\";\n orientation:\n ResolvedCaptureGeometry[\"orientedCapture\"][\"orientation\"];\n activeCaptureImagingAreaMm: {\n width: number;\n height: number;\n };\n policyKind:\n ExposureMeteringPolicy[\"kind\"];\n targetRelativeSignal: number;\n meteredRelativeSignal: number;\n totalSampleCount: number;\n selectedSampleCount: number;\n normalizedWeightSum: number;\n outputCropUsedForMetering: false;\n exposureCompensationApplied: false;\n finalToneMappingUsed: false;\n displayGammaUsed: false;\n calibratedLuminanceClaimAuthorized: false;\n calibratedSceneRadianceClaimAuthorized: false;\n automaticExposureResolved: false;\n resultReusableForAeLock: true;\n /** Present only for the highlight-priority policy. */\n highlightPriority?: HighlightPriorityMeteringDiagnostics;\n}\n\nexport type ExposureMeteringResult =\n | (ExposureMeteringResultBase & {\n status: \"resolved\";\n requiredExposureScaleToTarget:\n number;\n exposureOffsetStopsToTarget:\n number;\n })\n | (ExposureMeteringResultBase & {\n status: \"no-signal\";\n requiredExposureScaleResolved:\n false;\n exposureOffsetStopsResolved:\n false;\n });\n\nexport interface MeterRelativeExposureInput {\n profile: ExposureMeteringProfile;\n sampleSet: ExposureMeteringSampleSet;\n}\n\nfunction requireRecord(\n value: unknown,\n path: string,\n allowedKeys: readonly string[] | null\n): UnknownRecord {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be an object.\"\n );\n }\n if (allowedKeys !== null) rejectUnknownFields(value, allowedKeys, path);\n return value as UnknownRecord;\n}\n\nfunction requireNonEmptyString(\n value: unknown,\n path: string\n): string {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a non-empty string.\"\n );\n }\n return value.trim();\n}\n\nfunction requireFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be finite.\"\n );\n }\n return value;\n}\n\nfunction requirePositiveFinite(\n value: unknown,\n path: string\n): number {\n const parsed = requireFinite(\n value,\n path\n );\n if (parsed <= 0) {\n throw new InvalidConfigurationError(\n path + \" must be greater than zero.\"\n );\n }\n return parsed;\n}\n\nfunction requireFraction(\n value: unknown,\n path: string\n): number {\n const parsed = requireFinite(\n value,\n path\n );\n if (parsed < 0 || parsed > 1) {\n throw new InvalidConfigurationError(\n path +\n \" must be a finite fraction from 0 through 1.\"\n );\n }\n return parsed;\n}\n\nfunction parseUv(\n value: unknown,\n path: string\n): NormalizedRasterUv {\n const record = requireRecord(\n value,\n path, [\"u\", \"v\"]\n );\n const u = requireFinite(\n record.u,\n path + \".u\"\n );\n const v = requireFinite(\n record.v,\n path + \".v\"\n );\n if (\n u < 0 ||\n u > 1 ||\n v < 0 ||\n v > 1\n ) {\n throw new InvalidConfigurationError(\n path +\n \" coordinates must lie within [0, 1].\"\n );\n }\n return { u, v };\n}\n\nfunction parseLimitations(\n value: unknown,\n path: string\n): readonly string[] {\n if (!Array.isArray(value)) {\n throw new InvalidConfigurationError(\n path + \" must be an array.\"\n );\n }\n const limitations = value.map(\n (entry, index) =>\n requireNonEmptyString(\n entry,\n path + \"[\" + index + \"]\"\n )\n );\n if (\n new Set(limitations).size !==\n limitations.length\n ) {\n throw new InvalidConfigurationError(\n path + \" must not contain duplicates.\"\n );\n }\n return limitations;\n}\n\nfunction parsePolicy(\n value: unknown,\n path: string\n): ExposureMeteringPolicy {\n const record = requireRecord(\n value,\n path, null\n );\n rejectUnknownVariantFields(record, \"kind\", {\n \"multi-zone-uniform\": [\"kind\"],\n \"center-weighted-radial\": [\"kind\", \"edgeWeight\", \"exponent\"],\n spot: [\"kind\", \"centerOrientedCaptureUv\", \"radiusFractionOfCaptureDiagonal\"],\n \"highlight-weighted\": [\"kind\", \"minimumWeightFraction\", \"exponent\"],\n \"highlight-priority\": [\"kind\", \"highlightPercentile\", \"saturationRelativeSignal\", \"headroomStops\"]\n }, path);\n\n if (\n record.kind ===\n \"multi-zone-uniform\"\n ) {\n return {\n kind: \"multi-zone-uniform\"\n };\n }\n\n if (\n record.kind ===\n \"center-weighted-radial\"\n ) {\n return {\n kind:\n \"center-weighted-radial\",\n edgeWeight: requireFraction(\n record.edgeWeight,\n path + \".edgeWeight\"\n ),\n exponent:\n requirePositiveFinite(\n record.exponent,\n path + \".exponent\"\n )\n };\n }\n\n if (record.kind === \"spot\") {\n const radius =\n requirePositiveFinite(\n record\n .radiusFractionOfCaptureDiagonal,\n path +\n \".radiusFractionOfCaptureDiagonal\"\n );\n if (radius > 1) {\n throw new InvalidConfigurationError(\n path +\n \".radiusFractionOfCaptureDiagonal must be at most 1.\"\n );\n }\n return {\n kind: \"spot\",\n centerOrientedCaptureUv:\n parseUv(\n record\n .centerOrientedCaptureUv,\n path +\n \".centerOrientedCaptureUv\"\n ),\n radiusFractionOfCaptureDiagonal:\n radius\n };\n }\n\n if (\n record.kind ===\n \"highlight-weighted\"\n ) {\n return {\n kind: \"highlight-weighted\",\n minimumWeightFraction:\n requireFraction(\n record\n .minimumWeightFraction,\n path +\n \".minimumWeightFraction\"\n ),\n exponent:\n requirePositiveFinite(\n record.exponent,\n path + \".exponent\"\n )\n };\n }\n\n if (\n record.kind ===\n \"highlight-priority\"\n ) {\n const percentile =\n requirePositiveFinite(\n record.highlightPercentile,\n path + \".highlightPercentile\"\n );\n if (percentile > 1) {\n throw new InvalidConfigurationError(\n path +\n \".highlightPercentile must lie in (0, 1].\"\n );\n }\n const headroom =\n record.headroomStops;\n if (\n typeof headroom !== \"number\" ||\n !Number.isFinite(headroom) ||\n headroom < 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \".headroomStops must be a finite number greater than or equal to zero.\"\n );\n }\n return {\n kind: \"highlight-priority\",\n highlightPercentile:\n percentile,\n saturationRelativeSignal:\n requirePositiveFinite(\n record.saturationRelativeSignal,\n path +\n \".saturationRelativeSignal\"\n ),\n headroomStops: headroom\n };\n }\n\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\n/**\n * Relative signal at which a highlight-priority profile places its highlight\n * percentile: `saturationRelativeSignal * 2^-headroomStops`.\n */\nexport function calculateHighlightPriorityPlacementSignal(\n saturationRelativeSignal: number,\n headroomStops: number\n): number {\n if (\n !Number.isFinite(saturationRelativeSignal) ||\n saturationRelativeSignal <= 0 ||\n !Number.isFinite(headroomStops) ||\n headroomStops < 0\n ) {\n throw new InvalidScientificInputError(\n \"Highlight placement requires a positive saturation signal and non-negative headroom.\"\n );\n }\n return saturationRelativeSignal *\n Math.pow(2, -headroomStops);\n}\n\n/**\n * Lower area-weighted quantile (inverse empirical CDF). Sort samples by\n * ascending signal and add up their area weights. The result is the smallest\n * sample signal at which the running weight fraction reaches `percentile`.\n * Ties keep their input order, so the result is deterministic.\n */\nfunction areaWeightedLowerQuantile(\n samples:\n readonly ExposureMeteringZoneSample[],\n percentile: number\n): number {\n const ordered = samples\n .map((sample, index) => ({\n signal:\n sample.relativeLinearSignal,\n weight: sample.areaWeight,\n index\n }))\n .sort((a, b) =>\n a.signal - b.signal ||\n a.index - b.index\n );\n let total = 0;\n for (const entry of ordered) total += entry.weight;\n const threshold =\n percentile * total;\n let cumulative = 0;\n for (const entry of ordered) {\n cumulative += entry.weight;\n // Relative tolerance absorbs summation rounding at exact quantile boundaries.\n if (\n cumulative >=\n threshold * (1 - 1e-12)\n ) {\n return entry.signal;\n }\n }\n return ordered[ordered.length - 1]!\n .signal;\n}\n\n/**\n * Parses one generic relative exposure-metering profile.\n *\n * Schema 0.1.0 is an approximation only. It works on relative linear signal\n * measured before the exposure. It deliberately does not claim luminance,\n * spectral radiance, sensor-plane irradiance or any manufacturer's meter\n * calibration.\n */\nexport function parseExposureMeteringProfile(\n value: unknown\n): ExposureMeteringProfile {\n const record = requireRecord(\n value,\n \"exposureMeteringProfile\", [\"schemaVersion\", \"scientificStatus\", \"inputDomain\", \"captureRegion\", \"target\", \"policy\", \"profileId\", \"evidence\", \"limitations\"]\n );\n\n if (\n record.schemaVersion !==\n EXPOSURE_METERING_PROFILE_SCHEMA_VERSION\n ) {\n throw new InvalidConfigurationError(\n 'exposureMeteringProfile.schemaVersion must be \"' +\n EXPOSURE_METERING_PROFILE_SCHEMA_VERSION +\n '\".'\n );\n }\n if (\n record.scientificStatus !==\n \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureMeteringProfile.scientificStatus must be \"approximation\" in schema 0.1.0.'\n );\n }\n if (\n record.inputDomain !==\n \"relative-pre-exposure-linear-signal\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureMeteringProfile.inputDomain must be \"relative-pre-exposure-linear-signal\".'\n );\n }\n if (\n record.captureRegion !==\n \"oriented-active-capture\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureMeteringProfile.captureRegion must be \"oriented-active-capture\".'\n );\n }\n\n const target = requireRecord(\n record.target,\n \"exposureMeteringProfile.target\", [\"kind\", \"targetRelativeSignal\", \"evidence\"]\n );\n if (\n target.kind !==\n \"relative-signal-reference\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureMeteringProfile.target.kind must be \"relative-signal-reference\".'\n );\n }\n\n const policy = parsePolicy(\n record.policy,\n \"exposureMeteringProfile.policy\"\n );\n const targetRelativeSignal =\n requirePositiveFinite(\n target.targetRelativeSignal,\n \"exposureMeteringProfile.target.targetRelativeSignal\"\n );\n if (policy.kind === \"highlight-priority\") {\n const placement =\n calculateHighlightPriorityPlacementSignal(\n policy.saturationRelativeSignal,\n policy.headroomStops\n );\n if (\n Math.abs(\n targetRelativeSignal -\n placement\n ) >\n 1e-12 * placement\n ) {\n throw new InvalidConfigurationError(\n \"exposureMeteringProfile.target.targetRelativeSignal must equal saturationRelativeSignal * 2^-headroomStops for highlight-priority metering.\"\n );\n }\n }\n\n return {\n schemaVersion:\n EXPOSURE_METERING_PROFILE_SCHEMA_VERSION,\n profileId:\n requireNonEmptyString(\n record.profileId,\n \"exposureMeteringProfile.profileId\"\n ),\n scientificStatus: \"approximation\",\n inputDomain:\n \"relative-pre-exposure-linear-signal\",\n captureRegion:\n \"oriented-active-capture\",\n policy,\n target: {\n kind:\n \"relative-signal-reference\",\n targetRelativeSignal,\n evidence: parseEvidenceList(\n target.evidence,\n \"exposureMeteringProfile.target.evidence\"\n )\n },\n evidence: parseEvidenceList(\n record.evidence,\n \"exposureMeteringProfile.evidence\"\n ),\n limitations: parseLimitations(\n record.limitations,\n \"exposureMeteringProfile.limitations\"\n )\n };\n}\n\nfunction requireInputString(\n value: unknown,\n path: string\n): string {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a non-empty string.\"\n );\n }\n return value.trim();\n}\n\nfunction requireInputFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value)\n ) {\n throw new InvalidScientificInputError(\n path + \" must be finite.\"\n );\n }\n return value;\n}\n\nfunction requireInputPositiveFinite(\n value: unknown,\n path: string\n): number {\n const parsed = requireInputFinite(\n value,\n path\n );\n if (parsed <= 0) {\n throw new InvalidScientificInputError(\n path + \" must be greater than zero.\"\n );\n }\n return parsed;\n}\n\nfunction requireInputNonNegativeFinite(\n value: unknown,\n path: string\n): number {\n const parsed = requireInputFinite(\n value,\n path\n );\n if (parsed < 0) {\n throw new InvalidScientificInputError(\n path +\n \" must be greater than or equal to zero.\"\n );\n }\n return parsed;\n}\n\nfunction validateSampleUv(\n uv: NormalizedRasterUv,\n path: string\n): void {\n requireInputObject(uv, path);\n const u = requireInputFinite(\n uv.u,\n path + \".u\"\n );\n const v = requireInputFinite(\n uv.v,\n path + \".v\"\n );\n if (\n u < 0 ||\n u > 1 ||\n v < 0 ||\n v > 1\n ) {\n throw new InvalidScientificInputError(\n path +\n \" coordinates must lie within [0, 1].\"\n );\n }\n}\n\nfunction validateCaptureGeometry(\n geometry:\n ResolvedCaptureGeometry\n): void {\n requireInputObject(geometry, \"sampleSet.captureGeometry\");\n requireInputObject(geometry.orientedCapture, \"sampleSet.captureGeometry.orientedCapture\");\n requireInputObject(geometry.orientedCapture.imagingArea, \"sampleSet.captureGeometry.orientedCapture.imagingArea\");\n const width =\n requireInputPositiveFinite(\n geometry.orientedCapture\n .imagingArea.widthMm,\n \"sampleSet.captureGeometry.orientedCapture.imagingArea.widthMm\"\n );\n const height =\n requireInputPositiveFinite(\n geometry.orientedCapture\n .imagingArea.heightMm,\n \"sampleSet.captureGeometry.orientedCapture.imagingArea.heightMm\"\n );\n const diagonal = Math.hypot(\n width,\n height\n );\n if (!Number.isFinite(diagonal)) {\n throw new InvalidScientificInputError(\n \"sampleSet.captureGeometry oriented capture diagonal must remain finite.\"\n );\n }\n}\n\nfunction validateProcessingState(\n sampleSet:\n ExposureMeteringSampleSet\n): void {\n const state =\n sampleSet.processingState;\n requireInputObject(state, \"sampleSet.processingState\");\n if (\n state.exposureSettingsApplied !==\n false ||\n state.whiteBalanceApplied !==\n false ||\n state.toneMappingApplied !==\n false ||\n state.displayGammaApplied !==\n false ||\n state.sharpeningApplied !==\n false\n ) {\n throw new InvalidScientificInputError(\n \"Relative exposure metering requires pre-exposure linear samples before exposure settings, white balance, tone mapping, display gamma, and sharpening.\"\n );\n }\n}\n\nfunction physicalNormalizedDistanceFromCenter(\n uv: NormalizedRasterUv,\n widthMm: number,\n heightMm: number\n): number {\n const x =\n (uv.u - 0.5) * widthMm;\n const y =\n (uv.v - 0.5) * heightMm;\n const halfDiagonal =\n Math.hypot(\n widthMm,\n heightMm\n ) / 2;\n return Math.hypot(x, y) /\n halfDiagonal;\n}\n\nfunction physicalDistanceFractionOfDiagonal(\n a: NormalizedRasterUv,\n b: NormalizedRasterUv,\n widthMm: number,\n heightMm: number\n): number {\n const dx =\n (a.u - b.u) * widthMm;\n const dy =\n (a.v - b.v) * heightMm;\n const diagonal =\n Math.hypot(\n widthMm,\n heightMm\n );\n return Math.hypot(dx, dy) /\n diagonal;\n}\n\nfunction policyWeight(\n policy: ExposureMeteringPolicy,\n sample:\n ExposureMeteringZoneSample,\n widthMm: number,\n heightMm: number,\n maximumSignal: number\n): number {\n if (\n policy.kind ===\n \"multi-zone-uniform\"\n ) {\n return 1;\n }\n\n if (\n policy.kind ===\n \"center-weighted-radial\"\n ) {\n const radialPhase = Math.min(\n 1,\n physicalNormalizedDistanceFromCenter(\n sample\n .positionOrientedCaptureUv,\n widthMm,\n heightMm\n )\n );\n return (\n policy.edgeWeight +\n (1 - policy.edgeWeight) *\n Math.pow(\n 1 - radialPhase,\n policy.exponent\n )\n );\n }\n\n if (policy.kind === \"spot\") {\n const distance =\n physicalDistanceFractionOfDiagonal(\n sample\n .positionOrientedCaptureUv,\n policy\n .centerOrientedCaptureUv,\n widthMm,\n heightMm\n );\n return distance <=\n policy\n .radiusFractionOfCaptureDiagonal\n ? 1\n : 0;\n }\n\n if (policy.kind === \"highlight-priority\") {\n // Quantile placement is not a weighted mean; meterRelativeExposure handles it separately.\n return 1;\n }\n if (maximumSignal <= 0) {\n return policy\n .minimumWeightFraction;\n }\n const normalizedHighlight =\n sample.relativeLinearSignal /\n maximumSignal;\n return (\n policy.minimumWeightFraction +\n (1 -\n policy.minimumWeightFraction) *\n Math.pow(\n normalizedHighlight,\n policy.exponent\n )\n );\n}\n\n/**\n * Meters relative pre-exposure linear signal over the actual active capture\n * frame, in its capture orientation.\n *\n * This first contract is an educational, relative approximation. It\n * deliberately ignores the final output crop, display and tone mapping,\n * exposure compensation and the choice of automatic exposure settings.\n */\nexport function meterRelativeExposure(\n input:\n MeterRelativeExposureInput\n): CalculationResult<ExposureMeteringResult> {\n requireInputKeys(input, \"meterRelativeExposure\", [\"profile\", \"sampleSet\"]);\n const profile =\n parseExposureMeteringProfile(\n input.profile\n );\n const sampleSet = input.sampleSet;\n requireInputObject(sampleSet, \"sampleSet\");\n\n requireInputString(\n sampleSet.measurementId,\n \"sampleSet.measurementId\"\n );\n requireInputString(\n sampleSet.sceneStateId,\n \"sampleSet.sceneStateId\"\n );\n\n if (\n sampleSet.inputDomain !==\n profile.inputDomain\n ) {\n throw new InvalidScientificInputError(\n \"sampleSet.inputDomain must match the metering profile.\"\n );\n }\n if (\n sampleSet.captureRegion !==\n profile.captureRegion\n ) {\n throw new InvalidScientificInputError(\n \"sampleSet.captureRegion must match the metering profile.\"\n );\n }\n\n validateCaptureGeometry(\n sampleSet.captureGeometry\n );\n validateProcessingState(\n sampleSet\n );\n\n if (\n !Array.isArray(\n sampleSet.samples\n ) ||\n sampleSet.samples.length === 0\n ) {\n throw new InvalidConfigurationError(\n \"sampleSet.samples must be a non-empty array.\"\n );\n }\n\n const sampleIds: string[] = [];\n let maximumSignal = 0;\n for (\n let index = 0;\n index < sampleSet.samples.length;\n index += 1\n ) {\n const sample =\n sampleSet.samples[index]!;\n const path =\n \"sampleSet.samples[\" +\n index +\n \"]\";\n requireInputObject(sample, path);\n sampleIds.push(\n requireInputString(\n sample.sampleId,\n path + \".sampleId\"\n )\n );\n validateSampleUv(\n sample\n .positionOrientedCaptureUv,\n path +\n \".positionOrientedCaptureUv\"\n );\n const signal =\n requireInputNonNegativeFinite(\n sample.relativeLinearSignal,\n path +\n \".relativeLinearSignal\"\n );\n requireInputPositiveFinite(\n sample.areaWeight,\n path + \".areaWeight\"\n );\n maximumSignal = Math.max(\n maximumSignal,\n signal\n );\n }\n\n if (\n new Set(sampleIds).size !==\n sampleIds.length\n ) {\n throw new InvalidScientificInputError(\n \"sampleSet.samples[].sampleId must not contain duplicates.\"\n );\n }\n\n const widthMm =\n sampleSet.captureGeometry\n .orientedCapture.imagingArea\n .widthMm;\n const heightMm =\n sampleSet.captureGeometry\n .orientedCapture.imagingArea\n .heightMm;\n\n let weightedSignal = 0;\n let weightSum = 0;\n let selectedSampleCount = 0;\n const highlightPolicy =\n profile.policy.kind ===\n \"highlight-priority\"\n ? profile.policy\n : null;\n\n for (const sample of highlightPolicy === null ? sampleSet.samples : []) {\n const policyMultiplier =\n policyWeight(\n profile.policy,\n sample,\n widthMm,\n heightMm,\n maximumSignal\n );\n if (policyMultiplier <= 0) {\n continue;\n }\n const weight =\n sample.areaWeight *\n policyMultiplier;\n weightedSignal +=\n sample.relativeLinearSignal *\n weight;\n weightSum += weight;\n selectedSampleCount += 1;\n }\n\n if (\n !Number.isFinite(\n weightedSignal\n ) ||\n !Number.isFinite(weightSum)\n ) {\n throw new InvalidScientificInputError(\n \"Metering weighted sums must remain finite.\"\n );\n }\n if (highlightPolicy !== null) {\n // Every sample participates in the quantile with its area weight.\n weightSum = 1;\n selectedSampleCount =\n sampleSet.samples.length;\n }\n if (weightSum <= 0) {\n throw new InvalidScientificInputError(\n \"Metering policy selected no samples with positive weight.\"\n );\n }\n\n const meteredRelativeSignal =\n highlightPolicy === null\n ? weightedSignal / weightSum\n : areaWeightedLowerQuantile(\n sampleSet.samples,\n highlightPolicy.highlightPercentile\n );\n if (\n !Number.isFinite(\n meteredRelativeSignal\n ) ||\n meteredRelativeSignal < 0\n ) {\n throw new InvalidScientificInputError(\n \"Metered relative signal must remain finite and non-negative.\"\n );\n }\n\n const base = {\n measurementId:\n sampleSet.measurementId,\n sceneStateId:\n sampleSet.sceneStateId,\n profileId: profile.profileId,\n scientificStatus:\n \"approximation\" as const,\n inputDomain:\n \"relative-pre-exposure-linear-signal\" as const,\n captureRegion:\n \"oriented-active-capture\" as const,\n orientation:\n sampleSet.captureGeometry\n .orientedCapture.orientation,\n activeCaptureImagingAreaMm: {\n width: widthMm,\n height: heightMm\n },\n policyKind:\n profile.policy.kind,\n targetRelativeSignal:\n profile.target\n .targetRelativeSignal,\n meteredRelativeSignal,\n totalSampleCount:\n sampleSet.samples.length,\n selectedSampleCount,\n normalizedWeightSum: 1,\n outputCropUsedForMetering:\n false as const,\n exposureCompensationApplied:\n false as const,\n finalToneMappingUsed:\n false as const,\n displayGammaUsed: false as const,\n calibratedLuminanceClaimAuthorized:\n false as const,\n calibratedSceneRadianceClaimAuthorized:\n false as const,\n automaticExposureResolved:\n false as const,\n resultReusableForAeLock:\n true as const,\n ...(highlightPolicy === null\n ? {}\n : {\n highlightPriority: {\n highlightPercentile:\n highlightPolicy.highlightPercentile,\n percentileRelativeSignal:\n meteredRelativeSignal,\n saturationRelativeSignal:\n highlightPolicy.saturationRelativeSignal,\n headroomStops:\n highlightPolicy.headroomStops,\n placementRelativeSignal:\n profile.target\n .targetRelativeSignal,\n quantileDefinition:\n \"area-weighted-lower-quantile-inverse-empirical-cdf\" as const\n }\n })\n };\n\n const value:\n ExposureMeteringResult =\n meteredRelativeSignal === 0\n ? {\n ...base,\n status: \"no-signal\",\n requiredExposureScaleResolved:\n false,\n exposureOffsetStopsResolved:\n false\n }\n : {\n ...base,\n status: \"resolved\",\n requiredExposureScaleToTarget:\n profile.target\n .targetRelativeSignal /\n meteredRelativeSignal,\n exposureOffsetStopsToTarget:\n Math.log2(\n profile.target\n .targetRelativeSignal /\n meteredRelativeSignal\n )\n };\n\n return approximationResult(\n value,\n \"relative-pre-exposure-metering\",\n \"1.1.0\",\n [\n \"Input samples are relative pre-exposure linear signal, not calibrated luminance, scene spectral radiance, sensor-plane irradiance, or final rendered output.\",\n \"Sample areaWeight is supplied by the producer and is assumed to represent the active capture frame consistently.\",\n \"Metering coordinates are normalized over the physically oriented active capture frame, not the final output crop or CSS/display box.\",\n \"Multi-zone, center-weighted, spot, highlight-weighted and highlight-priority policies are generic explicit approximations and do not claim to reproduce a specific commercial camera.\",\n \"highlight-weighted is a highlight-emphasis weighted average placed at the target; it does not place highlights relative to saturation. highlight-priority places an area-weighted signal quantile at a declared headroom below a declared relative saturation signal.\",\n \"The declared relative target is profile policy, not a universal 18% gray truth.\",\n \"Exposure compensation is not applied by the meter.\",\n \"Automatic aperture, shutter, and ISO resolution remains downstream.\",\n \"White balance, tone mapping, display gamma, sharpening, and final output crop do not participate in this metering calculation.\",\n \"A no-signal result does not fabricate an infinite exposure correction.\"\n ]\n );\n}\n"]}
|
|
@@ -20,10 +20,10 @@ export interface ExposureProgramLineProfile {
|
|
|
20
20
|
/**
|
|
21
21
|
* Parses a generic educational/product exposure program line.
|
|
22
22
|
*
|
|
23
|
-
* A program line is control policy, not physics.
|
|
24
|
-
* aperture/shutter
|
|
25
|
-
* resolver's reference exposure.
|
|
26
|
-
* physically consistent with that reference and
|
|
23
|
+
* A program line is control policy, not physics. Each node declares a wanted
|
|
24
|
+
* aperture/shutter pair at an explicit number of stops of optical exposure,
|
|
25
|
+
* relative to the resolver's reference exposure. The resolver later checks
|
|
26
|
+
* that every node is physically consistent with that reference and with what
|
|
27
|
+
* the equipment can do.
|
|
27
28
|
*/
|
|
28
29
|
export declare function parseExposureProgramLineProfile(value: unknown): ExposureProgramLineProfile;
|
|
29
|
-
//# sourceMappingURL=program-line.d.ts.map
|
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
3
|
+
* Generic exposure program lines, for teaching and for products. A program line is the curve of
|
|
4
|
+
* aperture/shutter pairs a camera's Program mode follows.
|
|
5
|
+
*
|
|
6
|
+
* A program line is control policy, not physics. Each node declares a wanted aperture/shutter pair at
|
|
7
|
+
* an explicit number of stops of optical exposure, relative to the resolver's reference exposure.
|
|
8
|
+
* The resolver later checks that every node is physically consistent with that reference and with
|
|
9
|
+
* what the equipment can do.
|
|
10
|
+
* @see docs/USAGE.md for the equations, units, coordinate conventions, known blockers and support
|
|
11
|
+
* limits.
|
|
9
12
|
*/
|
|
13
|
+
import { rejectUnknownFields } from "../core/record-validation.js";
|
|
10
14
|
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
11
15
|
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
12
16
|
export const EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION = "0.1.0";
|
|
13
|
-
function requireRecord(value, path) {
|
|
17
|
+
function requireRecord(value, path, allowedKeys) {
|
|
14
18
|
if (typeof value !== "object" ||
|
|
15
19
|
value === null ||
|
|
16
20
|
Array.isArray(value)) {
|
|
17
21
|
throw new InvalidConfigurationError(path + " must be an object.");
|
|
18
22
|
}
|
|
23
|
+
if (allowedKeys !== null)
|
|
24
|
+
rejectUnknownFields(value, allowedKeys, path);
|
|
19
25
|
return value;
|
|
20
26
|
}
|
|
21
27
|
function requireNonEmptyString(value, path) {
|
|
@@ -55,13 +61,14 @@ function parseLimitations(value, path) {
|
|
|
55
61
|
/**
|
|
56
62
|
* Parses a generic educational/product exposure program line.
|
|
57
63
|
*
|
|
58
|
-
* A program line is control policy, not physics.
|
|
59
|
-
* aperture/shutter
|
|
60
|
-
* resolver's reference exposure.
|
|
61
|
-
* physically consistent with that reference and
|
|
64
|
+
* A program line is control policy, not physics. Each node declares a wanted
|
|
65
|
+
* aperture/shutter pair at an explicit number of stops of optical exposure,
|
|
66
|
+
* relative to the resolver's reference exposure. The resolver later checks
|
|
67
|
+
* that every node is physically consistent with that reference and with what
|
|
68
|
+
* the equipment can do.
|
|
62
69
|
*/
|
|
63
70
|
export function parseExposureProgramLineProfile(value) {
|
|
64
|
-
const record = requireRecord(value, "exposureProgramLineProfile");
|
|
71
|
+
const record = requireRecord(value, "exposureProgramLineProfile", ["schemaVersion", "scientificStatus", "policyKind", "interpolation", "nodes", "profileId", "profileVersion", "evidence", "limitations"]);
|
|
65
72
|
if (record.schemaVersion !==
|
|
66
73
|
EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION) {
|
|
67
74
|
throw new InvalidConfigurationError('exposureProgramLineProfile.schemaVersion must be "' +
|
|
@@ -90,7 +97,7 @@ export function parseExposureProgramLineProfile(value) {
|
|
|
90
97
|
const path = "exposureProgramLineProfile.nodes[" +
|
|
91
98
|
index +
|
|
92
99
|
"]";
|
|
93
|
-
const node = requireRecord(entry, path);
|
|
100
|
+
const node = requireRecord(entry, path, ["nodeId", "opticalExposureStopsFromReference", "aperture", "shutterSeconds"]);
|
|
94
101
|
const nodeId = requireNonEmptyString(node.nodeId, path + ".nodeId");
|
|
95
102
|
const stops = requireFinite(node
|
|
96
103
|
.opticalExposureStopsFromReference, path +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program-line.js","sourceRoot":"","sources":["../../src/exposure/program-line.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"program-line.js","sourceRoot":"","sources":["../../src/exposure/program-line.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Generic exposure program lines, for teaching and for products. A program line is the curve of\n * aperture/shutter pairs a camera's Program mode follows.\n *\n * A program line is control policy, not physics. Each node declares a wanted aperture/shutter pair at\n * an explicit number of stops of optical exposure, relative to the resolver's reference exposure.\n * The resolver later checks that every node is physically consistent with that reference and with\n * what the equipment can do.\n * @see docs/USAGE.md for the equations, units, coordinate conventions, known blockers and support\n * limits.\n */\n\nimport { rejectUnknownFields } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport {\n parseEvidenceList,\n type EvidenceProvenance\n} from \"../core/evidence-provenance.js\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport const EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION =\n \"0.1.0\" as const;\n\nexport interface ExposureProgramLineNode {\n nodeId: string;\n opticalExposureStopsFromReference: number;\n aperture: number;\n shutterSeconds: number;\n}\n\nexport interface ExposureProgramLineProfile {\n schemaVersion:\n typeof EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION;\n profileId: string;\n profileVersion: string;\n scientificStatus: \"approximation\";\n policyKind:\n \"generic-program-line\";\n interpolation:\n \"log2-aperture-shutter\";\n evidence: readonly EvidenceProvenance[];\n limitations: readonly string[];\n nodes:\n readonly ExposureProgramLineNode[];\n}\n\nfunction requireRecord(\n value: unknown,\n path: string,\n allowedKeys: readonly string[] | null\n): UnknownRecord {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be an object.\"\n );\n }\n if (allowedKeys !== null) rejectUnknownFields(value, allowedKeys, path);\n return value as UnknownRecord;\n}\n\nfunction requireNonEmptyString(\n value: unknown,\n path: string\n): string {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a non-empty string.\"\n );\n }\n return value.trim();\n}\n\nfunction requireFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be finite.\"\n );\n }\n return value;\n}\n\nfunction requirePositiveFinite(\n value: unknown,\n path: string\n): number {\n const parsed =\n requireFinite(value, path);\n if (parsed <= 0) {\n throw new InvalidConfigurationError(\n path +\n \" must be greater than zero.\"\n );\n }\n return parsed;\n}\n\nfunction parseLimitations(\n value: unknown,\n path: string\n): readonly string[] {\n if (!Array.isArray(value)) {\n throw new InvalidConfigurationError(\n path + \" must be an array.\"\n );\n }\n const parsed = value.map(\n (entry, index) =>\n requireNonEmptyString(\n entry,\n path + \"[\" + index + \"]\"\n )\n );\n if (\n new Set(parsed).size !==\n parsed.length\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must not contain duplicates.\"\n );\n }\n return parsed;\n}\n\n/**\n * Parses a generic educational/product exposure program line.\n *\n * A program line is control policy, not physics. Each node declares a wanted\n * aperture/shutter pair at an explicit number of stops of optical exposure,\n * relative to the resolver's reference exposure. The resolver later checks\n * that every node is physically consistent with that reference and with what\n * the equipment can do.\n */\nexport function parseExposureProgramLineProfile(\n value: unknown\n): ExposureProgramLineProfile {\n const record = requireRecord(\n value,\n \"exposureProgramLineProfile\", [\"schemaVersion\", \"scientificStatus\", \"policyKind\", \"interpolation\", \"nodes\", \"profileId\", \"profileVersion\", \"evidence\", \"limitations\"]\n );\n\n if (\n record.schemaVersion !==\n EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION\n ) {\n throw new InvalidConfigurationError(\n 'exposureProgramLineProfile.schemaVersion must be \"' +\n EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION +\n '\".'\n );\n }\n if (\n record.scientificStatus !==\n \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureProgramLineProfile.scientificStatus must be \"approximation\".'\n );\n }\n if (\n record.policyKind !==\n \"generic-program-line\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureProgramLineProfile.policyKind must be \"generic-program-line\".'\n );\n }\n if (\n record.interpolation !==\n \"log2-aperture-shutter\"\n ) {\n throw new InvalidConfigurationError(\n 'exposureProgramLineProfile.interpolation must be \"log2-aperture-shutter\".'\n );\n }\n if (\n !Array.isArray(record.nodes) ||\n record.nodes.length < 2\n ) {\n throw new InvalidConfigurationError(\n \"exposureProgramLineProfile.nodes must contain at least two nodes.\"\n );\n }\n\n let previousStops =\n Number.NEGATIVE_INFINITY;\n const ids: string[] = [];\n\n const nodes = record.nodes.map(\n (entry, index) => {\n const path =\n \"exposureProgramLineProfile.nodes[\" +\n index +\n \"]\";\n const node =\n requireRecord(entry, path, [\"nodeId\", \"opticalExposureStopsFromReference\", \"aperture\", \"shutterSeconds\"]);\n const nodeId =\n requireNonEmptyString(\n node.nodeId,\n path + \".nodeId\"\n );\n const stops =\n requireFinite(\n node\n .opticalExposureStopsFromReference,\n path +\n \".opticalExposureStopsFromReference\"\n );\n if (stops <= previousStops) {\n throw new InvalidConfigurationError(\n \"exposureProgramLineProfile.nodes opticalExposureStopsFromReference must be strictly increasing.\"\n );\n }\n previousStops = stops;\n ids.push(nodeId);\n\n return {\n nodeId,\n opticalExposureStopsFromReference:\n stops,\n aperture:\n requirePositiveFinite(\n node.aperture,\n path + \".aperture\"\n ),\n shutterSeconds:\n requirePositiveFinite(\n node.shutterSeconds,\n path +\n \".shutterSeconds\"\n )\n };\n }\n );\n\n if (\n new Set(ids).size !== ids.length\n ) {\n throw new InvalidConfigurationError(\n \"exposureProgramLineProfile.nodes[].nodeId must not contain duplicates.\"\n );\n }\n\n return {\n schemaVersion:\n EXPOSURE_PROGRAM_LINE_SCHEMA_VERSION,\n profileId:\n requireNonEmptyString(\n record.profileId,\n \"exposureProgramLineProfile.profileId\"\n ),\n profileVersion:\n requireNonEmptyString(\n record.profileVersion,\n \"exposureProgramLineProfile.profileVersion\"\n ),\n scientificStatus:\n \"approximation\",\n policyKind:\n \"generic-program-line\",\n interpolation:\n \"log2-aperture-shutter\",\n evidence: parseEvidenceList(\n record.evidence,\n \"exposureProgramLineProfile.evidence\"\n ),\n limitations:\n parseLimitations(\n record.limitations,\n \"exposureProgramLineProfile.limitations\"\n ),\n nodes\n };\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { GenericEquipmentTierPreset } from "../equipment/generic-tier-assets.js";
|
|
2
|
+
/**
|
|
3
|
+
* Checks a caller-supplied camera preset object and returns it unchanged. Throws InvalidConfigurationError
|
|
4
|
+
* (or the profile parser's domain error) for a missing or malformed part or an unknown field.
|
|
5
|
+
* Readout-timing declarations have no standalone parser; they are checked for shape only and are not
|
|
6
|
+
* read by simulateCapture().
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseCallerCameraPreset(value: unknown): GenericEquipmentTierPreset;
|