@photivra/engine 0.5.1 → 1.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/AGENTS.md +674 -0
- package/CHANGELOG.md +218 -0
- package/CITATION.cff +1 -1
- package/CONTRIBUTING.md +76 -0
- package/DCO +33 -0
- package/NODE_SUPPORT.md +37 -0
- package/NOTICE +2 -0
- package/README.md +157 -56
- package/SECURITY.md +55 -0
- package/THIRD_PARTY.md +63 -0
- package/dist/camera/equivalent-focal-length.d.ts +9 -0
- package/dist/camera/equivalent-focal-length.d.ts.map +1 -1
- package/dist/camera/equivalent-focal-length.js +9 -0
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +13 -0
- package/dist/camera/field-of-view.d.ts.map +1 -1
- package/dist/camera/field-of-view.js +13 -0
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/projected-object-size.d.ts +8 -0
- package/dist/camera/projected-object-size.d.ts.map +1 -1
- package/dist/camera/projected-object-size.js +8 -0
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +60 -0
- package/dist/capture/capture-export-metadata.d.ts.map +1 -0
- package/dist/capture/capture-export-metadata.js +62 -0
- package/dist/capture/capture-export-metadata.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +55 -0
- package/dist/capture/environment-raw-producer.d.ts.map +1 -0
- package/dist/capture/environment-raw-producer.js +88 -0
- package/dist/capture/environment-raw-producer.js.map +1 -0
- package/dist/capture/export-jpeg.d.ts +12 -0
- package/dist/capture/export-jpeg.d.ts.map +1 -0
- package/dist/capture/export-jpeg.js +126 -0
- package/dist/capture/export-jpeg.js.map +1 -0
- package/dist/capture/export-tiff.d.ts +45 -0
- package/dist/capture/export-tiff.d.ts.map +1 -0
- package/dist/capture/export-tiff.js +129 -0
- package/dist/capture/export-tiff.js.map +1 -0
- package/dist/capture/focus-control.d.ts +210 -0
- package/dist/capture/focus-control.d.ts.map +1 -0
- package/dist/capture/focus-control.js +664 -0
- package/dist/capture/focus-control.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +59 -0
- package/dist/capture/linear-encoding.d.ts.map +1 -0
- package/dist/capture/linear-encoding.js +98 -0
- package/dist/capture/linear-encoding.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +135 -0
- package/dist/capture/photographic-export.d.ts.map +1 -0
- package/dist/capture/photographic-export.js +273 -0
- package/dist/capture/photographic-export.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +12 -0
- package/dist/capture/raw-frame-limits.d.ts.map +1 -0
- package/dist/capture/raw-frame-limits.js +13 -0
- package/dist/capture/raw-frame-limits.js.map +1 -0
- package/dist/capture/raw-frame-reconstruction.d.ts +48 -0
- package/dist/capture/raw-frame-reconstruction.d.ts.map +1 -0
- package/dist/capture/raw-frame-reconstruction.js +146 -0
- package/dist/capture/raw-frame-reconstruction.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +120 -0
- package/dist/capture/release-sequence.d.ts.map +1 -0
- package/dist/capture/release-sequence.js +446 -0
- package/dist/capture/release-sequence.js.map +1 -0
- package/dist/capture/sensor-raw-frame.d.ts +34 -0
- package/dist/capture/sensor-raw-frame.d.ts.map +1 -0
- package/dist/capture/sensor-raw-frame.js +106 -0
- package/dist/capture/sensor-raw-frame.js.map +1 -0
- package/dist/capture/sensor-raw-producer.d.ts +51 -0
- package/dist/capture/sensor-raw-producer.d.ts.map +1 -0
- package/dist/capture/sensor-raw-producer.js +235 -0
- package/dist/capture/sensor-raw-producer.js.map +1 -0
- package/dist/capture/simulated-capture.d.ts +125 -0
- package/dist/capture/simulated-capture.d.ts.map +1 -0
- package/dist/capture/simulated-capture.js +248 -0
- package/dist/capture/simulated-capture.js.map +1 -0
- package/dist/color/capture-color.d.ts +73 -0
- package/dist/color/capture-color.d.ts.map +1 -0
- package/dist/color/capture-color.js +145 -0
- package/dist/color/capture-color.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +23 -0
- package/dist/color/sensor-color-development.d.ts.map +1 -0
- package/dist/color/sensor-color-development.js +56 -0
- package/dist/color/sensor-color-development.js.map +1 -0
- package/dist/color/white-balance.d.ts +175 -0
- package/dist/color/white-balance.d.ts.map +1 -0
- package/dist/color/white-balance.js +606 -0
- package/dist/color/white-balance.js.map +1 -0
- package/dist/composition/image-formation-plan.d.ts +481 -0
- package/dist/composition/image-formation-plan.d.ts.map +1 -0
- package/dist/composition/image-formation-plan.js +2499 -0
- package/dist/composition/image-formation-plan.js.map +1 -0
- package/dist/composition/plan-consumer.d.ts +53 -0
- package/dist/composition/plan-consumer.d.ts.map +1 -0
- package/dist/composition/plan-consumer.js +119 -0
- package/dist/composition/plan-consumer.js.map +1 -0
- package/dist/core/calculation-result.d.ts.map +1 -1
- package/dist/core/calculation-result.js +6 -0
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +18 -0
- package/dist/core/canonical-json.d.ts.map +1 -0
- package/dist/core/canonical-json.js +44 -0
- package/dist/core/canonical-json.js.map +1 -0
- package/dist/core/configuration-error.d.ts +6 -0
- package/dist/core/configuration-error.d.ts.map +1 -1
- package/dist/core/configuration-error.js +6 -0
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +6 -0
- package/dist/core/evidence-provenance.d.ts.map +1 -1
- package/dist/core/evidence-provenance.js +7 -0
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +9 -3
- package/dist/core/image-formation.d.ts.map +1 -1
- package/dist/core/image-formation.js +29 -5
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +25 -0
- package/dist/core/owned-data.d.ts.map +1 -0
- package/dist/core/owned-data.js +34 -0
- package/dist/core/owned-data.js.map +1 -0
- package/dist/core/record-validation.d.ts +17 -0
- package/dist/core/record-validation.d.ts.map +1 -0
- package/dist/core/record-validation.js +44 -0
- package/dist/core/record-validation.js.map +1 -0
- package/dist/core/scientific-assurance.d.ts +101 -0
- package/dist/core/scientific-assurance.d.ts.map +1 -0
- package/dist/core/scientific-assurance.js +301 -0
- package/dist/core/scientific-assurance.js.map +1 -0
- package/dist/core/spectral-composition.d.ts +106 -0
- package/dist/core/spectral-composition.d.ts.map +1 -0
- package/dist/core/spectral-composition.js +334 -0
- package/dist/core/spectral-composition.js.map +1 -0
- package/dist/core/spectral.d.ts +34 -0
- package/dist/core/spectral.d.ts.map +1 -0
- package/dist/core/spectral.js +57 -0
- package/dist/core/spectral.js.map +1 -0
- package/dist/core/validation.d.ts +6 -0
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +6 -0
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +14 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +15 -0
- package/dist/core/version.js.map +1 -0
- package/dist/equipment/exposure-capabilities.d.ts +125 -0
- package/dist/equipment/exposure-capabilities.d.ts.map +1 -0
- package/dist/equipment/exposure-capabilities.js +391 -0
- package/dist/equipment/exposure-capabilities.js.map +1 -0
- package/dist/equipment/generic-tier-assets.d.ts +82 -0
- package/dist/equipment/generic-tier-assets.d.ts.map +1 -0
- package/dist/equipment/generic-tier-assets.js +119 -0
- package/dist/equipment/generic-tier-assets.js.map +1 -0
- package/dist/equipment/generic-tier-presets.d.ts +57 -0
- package/dist/equipment/generic-tier-presets.d.ts.map +1 -0
- package/dist/equipment/generic-tier-presets.js +122 -0
- package/dist/equipment/generic-tier-presets.js.map +1 -0
- package/dist/equipment/iso-capabilities.d.ts +143 -0
- package/dist/equipment/iso-capabilities.d.ts.map +1 -0
- package/dist/equipment/iso-capabilities.js +578 -0
- package/dist/equipment/iso-capabilities.js.map +1 -0
- package/dist/equipment/metering-capabilities.d.ts +58 -0
- package/dist/equipment/metering-capabilities.d.ts.map +1 -0
- package/dist/equipment/metering-capabilities.js +151 -0
- package/dist/equipment/metering-capabilities.js.map +1 -0
- package/dist/equipment/release-capabilities.d.ts +33 -0
- package/dist/equipment/release-capabilities.d.ts.map +1 -0
- package/dist/equipment/release-capabilities.js +176 -0
- package/dist/equipment/release-capabilities.js.map +1 -0
- package/dist/exposure/exposure-duration-control.d.ts +72 -0
- package/dist/exposure/exposure-duration-control.d.ts.map +1 -0
- package/dist/exposure/exposure-duration-control.js +161 -0
- package/dist/exposure/exposure-duration-control.js.map +1 -0
- package/dist/exposure/exposure-mode-resolver.d.ts +637 -0
- package/dist/exposure/exposure-mode-resolver.d.ts.map +1 -0
- package/dist/exposure/exposure-mode-resolver.js +1905 -0
- package/dist/exposure/exposure-mode-resolver.js.map +1 -0
- package/dist/exposure/exposure.d.ts +8 -0
- package/dist/exposure/exposure.d.ts.map +1 -1
- package/dist/exposure/exposure.js +8 -0
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash.d.ts +179 -0
- package/dist/exposure/flash.d.ts.map +1 -0
- package/dist/exposure/flash.js +644 -0
- package/dist/exposure/flash.js.map +1 -0
- package/dist/exposure/metering-scene-radiance.d.ts +72 -0
- package/dist/exposure/metering-scene-radiance.d.ts.map +1 -0
- package/dist/exposure/metering-scene-radiance.js +222 -0
- package/dist/exposure/metering-scene-radiance.js.map +1 -0
- package/dist/exposure/metering-target.d.ts +67 -0
- package/dist/exposure/metering-target.d.ts.map +1 -0
- package/dist/exposure/metering-target.js +265 -0
- package/dist/exposure/metering-target.js.map +1 -0
- package/dist/exposure/metering-temporal.d.ts +76 -0
- package/dist/exposure/metering-temporal.d.ts.map +1 -0
- package/dist/exposure/metering-temporal.js +210 -0
- package/dist/exposure/metering-temporal.js.map +1 -0
- package/dist/exposure/metering.d.ts +124 -0
- package/dist/exposure/metering.d.ts.map +1 -0
- package/dist/exposure/metering.js +422 -0
- package/dist/exposure/metering.js.map +1 -0
- package/dist/exposure/program-line.d.ts +29 -0
- package/dist/exposure/program-line.d.ts.map +1 -0
- package/dist/exposure/program-line.js +126 -0
- package/dist/exposure/program-line.js.map +1 -0
- package/dist/index.d.ts +101 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +99 -7
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +76 -0
- package/dist/motion/camera-rotation.d.ts.map +1 -1
- package/dist/motion/camera-rotation.js +111 -0
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +113 -0
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -0
- package/dist/motion/capture-rotation-inverse-mapping.js +184 -0
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +104 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js +131 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -0
- package/dist/motion/capture-rotation-trajectory.d.ts +113 -0
- package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -0
- package/dist/motion/capture-rotation-trajectory.js +168 -0
- package/dist/motion/capture-rotation-trajectory.js.map +1 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +119 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +1 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +263 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -0
- package/dist/motion/extended-object-projection.d.ts +175 -0
- package/dist/motion/extended-object-projection.d.ts.map +1 -0
- package/dist/motion/extended-object-projection.js +402 -0
- package/dist/motion/extended-object-projection.js.map +1 -0
- package/dist/motion/projected-motion.d.ts +11 -0
- package/dist/motion/projected-motion.d.ts.map +1 -1
- package/dist/motion/projected-motion.js +11 -0
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/optics/aperture.d.ts +9 -0
- package/dist/optics/aperture.d.ts.map +1 -1
- package/dist/optics/aperture.js +9 -0
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/circle-of-confusion.d.ts +8 -0
- package/dist/optics/circle-of-confusion.d.ts.map +1 -1
- package/dist/optics/circle-of-confusion.js +8 -0
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +128 -0
- package/dist/optics/complex-pupil-psf.d.ts.map +1 -0
- package/dist/optics/complex-pupil-psf.js +462 -0
- package/dist/optics/complex-pupil-psf.js.map +1 -0
- package/dist/optics/depth-of-field.d.ts +18 -0
- package/dist/optics/depth-of-field.d.ts.map +1 -1
- package/dist/optics/depth-of-field.js +29 -4
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction.d.ts +8 -0
- package/dist/optics/diffraction.d.ts.map +1 -1
- package/dist/optics/diffraction.js +8 -0
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +13 -0
- package/dist/optics/focus-breathing.d.ts.map +1 -1
- package/dist/optics/focus-breathing.js +13 -0
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +47 -0
- package/dist/optics/focus-state.d.ts.map +1 -0
- package/dist/optics/focus-state.js +78 -0
- package/dist/optics/focus-state.js.map +1 -0
- package/dist/optics/front-of-lens-filter.d.ts +114 -0
- package/dist/optics/front-of-lens-filter.d.ts.map +1 -0
- package/dist/optics/front-of-lens-filter.js +468 -0
- package/dist/optics/front-of-lens-filter.js.map +1 -0
- package/dist/optics/illumination-vignetting.d.ts +9 -0
- package/dist/optics/illumination-vignetting.d.ts.map +1 -1
- package/dist/optics/illumination-vignetting.js +9 -0
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts +11 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +1 -1
- package/dist/optics/lateral-chromatic-aberration.js +23 -4
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-profile.d.ts +217 -0
- package/dist/optics/lens-psf-profile.d.ts.map +1 -0
- package/dist/optics/lens-psf-profile.js +823 -0
- package/dist/optics/lens-psf-profile.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +67 -0
- package/dist/optics/polygon-diffraction.d.ts.map +1 -0
- package/dist/optics/polygon-diffraction.js +145 -0
- package/dist/optics/polygon-diffraction.js.map +1 -0
- package/dist/optics/profile-contract.d.ts +42 -0
- package/dist/optics/profile-contract.d.ts.map +1 -0
- package/dist/optics/profile-contract.js +92 -0
- package/dist/optics/profile-contract.js.map +1 -0
- package/dist/optics/psf-foundation.d.ts +16 -3
- package/dist/optics/psf-foundation.d.ts.map +1 -1
- package/dist/optics/psf-foundation.js +28 -15
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/radial-distortion.d.ts +22 -2
- package/dist/optics/radial-distortion.d.ts.map +1 -1
- package/dist/optics/radial-distortion.js +101 -23
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +213 -0
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +1 -0
- package/dist/optics/scene-to-sensor-irradiance.js +662 -0
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -0
- package/dist/optics/scene-to-sensor-quadrature.d.ts +63 -0
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +1 -0
- package/dist/optics/scene-to-sensor-quadrature.js +82 -0
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -0
- package/dist/optics/sensor-environment-query.d.ts +60 -0
- package/dist/optics/sensor-environment-query.d.ts.map +1 -0
- package/dist/optics/sensor-environment-query.js +50 -0
- package/dist/optics/sensor-environment-query.js.map +1 -0
- package/dist/optics/sensor-psf-quadrature.d.ts +70 -0
- package/dist/optics/sensor-psf-quadrature.d.ts.map +1 -0
- package/dist/optics/sensor-psf-quadrature.js +101 -0
- package/dist/optics/sensor-psf-quadrature.js.map +1 -0
- package/dist/optics/sensor-psf-support.d.ts +20 -0
- package/dist/optics/sensor-psf-support.d.ts.map +1 -0
- package/dist/optics/sensor-psf-support.js +13 -0
- package/dist/optics/sensor-psf-support.js.map +1 -0
- package/dist/optics/stray-light.d.ts +91 -0
- package/dist/optics/stray-light.d.ts.map +1 -0
- package/dist/optics/stray-light.js +110 -0
- package/dist/optics/stray-light.js.map +1 -0
- package/dist/optics/thin-lens.d.ts +8 -0
- package/dist/optics/thin-lens.d.ts.map +1 -1
- package/dist/optics/thin-lens.js +8 -0
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/output/capture-corrected-sdr.d.ts +49 -0
- package/dist/output/capture-corrected-sdr.d.ts.map +1 -0
- package/dist/output/capture-corrected-sdr.js +149 -0
- package/dist/output/capture-corrected-sdr.js.map +1 -0
- package/dist/output/capture-geometry.d.ts.map +1 -1
- package/dist/output/capture-geometry.js +32 -11
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +49 -0
- package/dist/output/capture-sdr.d.ts.map +1 -0
- package/dist/output/capture-sdr.js +90 -0
- package/dist/output/capture-sdr.js.map +1 -0
- package/dist/output/crop.d.ts +6 -0
- package/dist/output/crop.d.ts.map +1 -1
- package/dist/output/crop.js +6 -0
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +137 -0
- package/dist/output/geometric-transforms.d.ts.map +1 -0
- package/dist/output/geometric-transforms.js +225 -0
- package/dist/output/geometric-transforms.js.map +1 -0
- package/dist/output/lens-corrections.d.ts +121 -0
- package/dist/output/lens-corrections.d.ts.map +1 -0
- package/dist/output/lens-corrections.js +210 -0
- package/dist/output/lens-corrections.js.map +1 -0
- package/dist/output/sdr-rendering.d.ts +81 -0
- package/dist/output/sdr-rendering.d.ts.map +1 -0
- package/dist/output/sdr-rendering.js +106 -0
- package/dist/output/sdr-rendering.js.map +1 -0
- package/dist/output/subject-framing-crop.d.ts +8 -0
- package/dist/output/subject-framing-crop.d.ts.map +1 -1
- package/dist/output/subject-framing-crop.js +8 -0
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/schema/camera.d.ts +6 -0
- package/dist/schema/camera.d.ts.map +1 -1
- package/dist/schema/illumination-spectral.d.ts +51 -0
- package/dist/schema/illumination-spectral.d.ts.map +1 -0
- package/dist/schema/illumination-spectral.js +132 -0
- package/dist/schema/illumination-spectral.js.map +1 -0
- package/dist/schema/illumination-temporal.d.ts +156 -0
- package/dist/schema/illumination-temporal.d.ts.map +1 -0
- package/dist/schema/illumination-temporal.js +554 -0
- package/dist/schema/illumination-temporal.js.map +1 -0
- package/dist/schema/illumination.d.ts +138 -0
- package/dist/schema/illumination.d.ts.map +1 -0
- package/dist/schema/illumination.js +483 -0
- package/dist/schema/illumination.js.map +1 -0
- package/dist/schema/scene-radiance-temporal.d.ts +107 -0
- package/dist/schema/scene-radiance-temporal.d.ts.map +1 -0
- package/dist/schema/scene-radiance-temporal.js +259 -0
- package/dist/schema/scene-radiance-temporal.js.map +1 -0
- package/dist/schema/scene-radiance.d.ts +185 -0
- package/dist/schema/scene-radiance.d.ts.map +1 -0
- package/dist/schema/scene-radiance.js +535 -0
- package/dist/schema/scene-radiance.js.map +1 -0
- package/dist/schema/scene.d.ts +7 -0
- package/dist/schema/scene.d.ts.map +1 -1
- package/dist/schema/validation.d.ts.map +1 -1
- package/dist/schema/validation.js +7 -0
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +199 -0
- package/dist/sensor/accumulated-charge.d.ts.map +1 -0
- package/dist/sensor/accumulated-charge.js +450 -0
- package/dist/sensor/accumulated-charge.js.map +1 -0
- package/dist/sensor/architecture.d.ts +48 -13
- package/dist/sensor/architecture.d.ts.map +1 -1
- package/dist/sensor/architecture.js +58 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +138 -0
- package/dist/sensor/camera-saturation-capacity.d.ts.map +1 -0
- package/dist/sensor/camera-saturation-capacity.js +356 -0
- package/dist/sensor/camera-saturation-capacity.js.map +1 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts +212 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -0
- package/dist/sensor/capture-color-sampling-binding.js +437 -0
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -0
- package/dist/sensor/capture-mode-timing.d.ts +63 -0
- package/dist/sensor/capture-mode-timing.d.ts.map +1 -0
- package/dist/sensor/capture-mode-timing.js +270 -0
- package/dist/sensor/capture-mode-timing.js.map +1 -0
- package/dist/sensor/capture-mode.d.ts +157 -0
- package/dist/sensor/capture-mode.d.ts.map +1 -0
- package/dist/sensor/capture-mode.js +447 -0
- package/dist/sensor/capture-mode.js.map +1 -0
- package/dist/sensor/color-sampling.d.ts +133 -0
- package/dist/sensor/color-sampling.d.ts.map +1 -0
- package/dist/sensor/color-sampling.js +245 -0
- package/dist/sensor/color-sampling.js.map +1 -0
- package/dist/sensor/constant-rate-temporal-integration.d.ts +126 -0
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +1 -0
- package/dist/sensor/constant-rate-temporal-integration.js +382 -0
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -0
- package/dist/sensor/dark-current.d.ts +169 -0
- package/dist/sensor/dark-current.d.ts.map +1 -0
- package/dist/sensor/dark-current.js +427 -0
- package/dist/sensor/dark-current.js.map +1 -0
- package/dist/sensor/environment-photo-signal.d.ts +123 -0
- package/dist/sensor/environment-photo-signal.d.ts.map +1 -0
- package/dist/sensor/environment-photo-signal.js +186 -0
- package/dist/sensor/environment-photo-signal.js.map +1 -0
- package/dist/sensor/eqe-electron-rate.d.ts +107 -0
- package/dist/sensor/eqe-electron-rate.d.ts.map +1 -0
- package/dist/sensor/eqe-electron-rate.js +561 -0
- package/dist/sensor/eqe-electron-rate.js.map +1 -0
- package/dist/sensor/eqe-local-exposure.d.ts +65 -0
- package/dist/sensor/eqe-local-exposure.d.ts.map +1 -0
- package/dist/sensor/eqe-local-exposure.js +84 -0
- package/dist/sensor/eqe-local-exposure.js.map +1 -0
- package/dist/sensor/eqe-temporal-exposure.d.ts +55 -0
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +1 -0
- package/dist/sensor/eqe-temporal-exposure.js +62 -0
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -0
- package/dist/sensor/exposure-window.d.ts +117 -0
- package/dist/sensor/exposure-window.d.ts.map +1 -0
- package/dist/sensor/exposure-window.js +305 -0
- package/dist/sensor/exposure-window.js.map +1 -0
- package/dist/sensor/iso-signal-chain.d.ts +148 -0
- package/dist/sensor/iso-signal-chain.d.ts.map +1 -0
- package/dist/sensor/iso-signal-chain.js +411 -0
- package/dist/sensor/iso-signal-chain.js.map +1 -0
- package/dist/sensor/local-exposure-binding.d.ts +87 -0
- package/dist/sensor/local-exposure-binding.d.ts.map +1 -0
- package/dist/sensor/local-exposure-binding.js +214 -0
- package/dist/sensor/local-exposure-binding.js.map +1 -0
- package/dist/sensor/optical-stack.d.ts +132 -0
- package/dist/sensor/optical-stack.d.ts.map +1 -0
- package/dist/sensor/optical-stack.js +303 -0
- package/dist/sensor/optical-stack.js.map +1 -0
- package/dist/sensor/photon-energy.d.ts +97 -0
- package/dist/sensor/photon-energy.d.ts.map +1 -0
- package/dist/sensor/photon-energy.js +390 -0
- package/dist/sensor/photon-energy.js.map +1 -0
- package/dist/sensor/physical-charge-capacity.d.ts +130 -0
- package/dist/sensor/physical-charge-capacity.d.ts.map +1 -0
- package/dist/sensor/physical-charge-capacity.js +345 -0
- package/dist/sensor/physical-charge-capacity.js.map +1 -0
- package/dist/sensor/pixel-pitch.d.ts +6 -0
- package/dist/sensor/pixel-pitch.d.ts.map +1 -1
- package/dist/sensor/pixel-pitch.js +6 -0
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +10 -0
- package/dist/sensor/radiometry-readiness.d.ts.map +1 -1
- package/dist/sensor/radiometry-readiness.js +10 -0
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +314 -0
- package/dist/sensor/raw-readout.d.ts.map +1 -0
- package/dist/sensor/raw-readout.js +914 -0
- package/dist/sensor/raw-readout.js.map +1 -0
- package/dist/sensor/raw-reconstruction.d.ts +170 -0
- package/dist/sensor/raw-reconstruction.d.ts.map +1 -0
- package/dist/sensor/raw-reconstruction.js +424 -0
- package/dist/sensor/raw-reconstruction.js.map +1 -0
- package/dist/sensor/readout-exposure-linkage.d.ts +123 -0
- package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -0
- package/dist/sensor/readout-exposure-linkage.js +222 -0
- package/dist/sensor/readout-exposure-linkage.js.map +1 -0
- package/dist/sensor/readout-timing.d.ts +137 -0
- package/dist/sensor/readout-timing.d.ts.map +1 -0
- package/dist/sensor/readout-timing.js +243 -0
- package/dist/sensor/readout-timing.js.map +1 -0
- package/dist/sensor/response-application-compatibility.d.ts +136 -0
- package/dist/sensor/response-application-compatibility.d.ts.map +1 -0
- package/dist/sensor/response-application-compatibility.js +408 -0
- package/dist/sensor/response-application-compatibility.js.map +1 -0
- package/dist/sensor/response-operating-range.d.ts +173 -0
- package/dist/sensor/response-operating-range.d.ts.map +1 -0
- package/dist/sensor/response-operating-range.js +672 -0
- package/dist/sensor/response-operating-range.js.map +1 -0
- package/dist/sensor/responsivity-photocurrent.d.ts +158 -0
- package/dist/sensor/responsivity-photocurrent.d.ts.map +1 -0
- package/dist/sensor/responsivity-photocurrent.js +644 -0
- package/dist/sensor/responsivity-photocurrent.js.map +1 -0
- package/dist/sensor/sampling-aperture.d.ts +154 -0
- package/dist/sensor/sampling-aperture.d.ts.map +1 -0
- package/dist/sensor/sampling-aperture.js +388 -0
- package/dist/sensor/sampling-aperture.js.map +1 -0
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +45 -0
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +1 -0
- package/dist/sensor/scene-eqe-temporal-exposure.js +64 -0
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -0
- package/dist/sensor/sensor-geometry.d.ts +12 -0
- package/dist/sensor/sensor-geometry.d.ts.map +1 -1
- package/dist/sensor/sensor-geometry.js +12 -0
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +10 -0
- package/dist/sensor/signal-noise.d.ts.map +1 -1
- package/dist/sensor/signal-noise.js +10 -0
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +171 -0
- package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -0
- package/dist/sensor/spatial-sample-reduction.js +345 -0
- package/dist/sensor/spatial-sample-reduction.js.map +1 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts +179 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -0
- package/dist/sensor/spatial-sampling-quadrature.js +224 -0
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -0
- package/dist/sensor/spatio-spectral-reduction.d.ts +187 -0
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +1 -0
- package/dist/sensor/spatio-spectral-reduction.js +373 -0
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -0
- package/dist/sensor/spectral-coverage.d.ts +24 -0
- package/dist/sensor/spectral-coverage.d.ts.map +1 -0
- package/dist/sensor/spectral-coverage.js +86 -0
- package/dist/sensor/spectral-coverage.js.map +1 -0
- package/dist/sensor/spectral-quadrature.d.ts +169 -0
- package/dist/sensor/spectral-quadrature.d.ts.map +1 -0
- package/dist/sensor/spectral-quadrature.js +542 -0
- package/dist/sensor/spectral-quadrature.js.map +1 -0
- package/dist/sensor/spectral-response.d.ts +192 -0
- package/dist/sensor/spectral-response.d.ts.map +1 -0
- package/dist/sensor/spectral-response.js +664 -0
- package/dist/sensor/spectral-response.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +15 -0
- package/dist/sensor/temporal-eqe-sum.d.ts.map +1 -0
- package/dist/sensor/temporal-eqe-sum.js +30 -0
- package/dist/sensor/temporal-eqe-sum.js.map +1 -0
- package/dist/sensor/temporal-photo-signal.d.ts +38 -0
- package/dist/sensor/temporal-photo-signal.d.ts.map +1 -0
- package/dist/sensor/temporal-photo-signal.js +110 -0
- package/dist/sensor/temporal-photo-signal.js.map +1 -0
- package/dist/sensor/temporal-sample-binding.d.ts +6 -0
- package/dist/sensor/temporal-sample-binding.d.ts.map +1 -0
- package/dist/sensor/temporal-sample-binding.js +32 -0
- package/dist/sensor/temporal-sample-binding.js.map +1 -0
- package/dist/simulation/poc-simulation.d.ts.map +1 -1
- package/dist/simulation/poc-simulation.js +34 -11
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +11 -0
- package/dist/stabilization/camera-shake.d.ts.map +1 -1
- package/dist/stabilization/camera-shake.js +11 -0
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +218 -0
- package/dist/stabilization/system.d.ts.map +1 -0
- package/dist/stabilization/system.js +695 -0
- package/dist/stabilization/system.js.map +1 -0
- package/docs/API_REFERENCE.md +2017 -0
- package/docs/API_STYLE.md +132 -0
- package/docs/ARCHITECTURE.md +150 -23
- package/docs/AUTOMATION_COORDINATION.md +190 -0
- package/docs/CAPTURE_COLOR.md +25 -0
- package/docs/CAPTURE_CORRECTED_SDR.md +25 -0
- package/docs/CAPTURE_EXPORT_METADATA.md +27 -0
- package/docs/CAPTURE_SDR.md +20 -0
- package/docs/DEVELOPERS.md +60 -0
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +69 -0
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +187 -0
- package/docs/EXPORT_ACCEPTANCE.md +133 -0
- package/docs/GENERIC_TIER_PRESETS.md +269 -0
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +141 -0
- package/docs/IMAGE_FORMATION.md +105 -9
- package/docs/LINEAR_CAPTURE_ENCODING.md +25 -0
- package/docs/MOTION_AND_SIGNAL.md +145 -1
- package/docs/NUMERICAL_CORRECTNESS.md +191 -0
- package/docs/PERFORMANCE_BASELINE.md +56 -0
- package/docs/PHOTOGRAPHIC_EXPORT.md +206 -0
- package/docs/PHYSICS_FOUNDATION.md +152 -5
- package/docs/POC_API.md +2 -0
- package/docs/POC_PROJECTION_REUSE.md +124 -0
- package/docs/PROCESSED_OUTPUT.md +157 -0
- package/docs/PRODUCTION_COMPOSITION.md +373 -0
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +131 -0
- package/docs/PROVENANCE.md +4 -0
- package/docs/PSF_FOUNDATION.md +110 -88
- package/docs/RAW_FRAME_ENVELOPE.md +56 -0
- package/docs/RAW_FRAME_RECONSTRUCTION.md +30 -0
- package/docs/RELEASE_1_0.md +65 -0
- package/docs/RELEASE_AUDIT.md +38 -0
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +298 -0
- package/docs/SCENE_SENSOR_QUADRATURE.md +98 -0
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +86 -0
- package/docs/SCIENTIFIC_ASSURANCE.md +280 -0
- package/docs/SCIENTIFIC_CONFORMANCE.md +83 -0
- package/docs/SDR_RENDERING.md +33 -0
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +86 -0
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +104 -0
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +74 -0
- package/docs/SENSOR_PSF_QUADRATURE.md +90 -0
- package/docs/SENSOR_RAW_FRAME.md +20 -0
- package/docs/SENSOR_RAW_PRODUCER.md +77 -0
- package/docs/SIGNAL_CONFORMANCE.md +23 -0
- package/docs/SIMULATED_CAPTURE.md +65 -0
- package/docs/STABILIZATION.md +160 -17
- package/docs/TEMPORAL_PHOTO_RAW.md +83 -0
- package/docs/TIER_ACCEPTANCE.md +129 -0
- package/docs/TIER_PRESET_ACCEPTANCE.md +59 -0
- package/docs/USAGE.md +5604 -331
- package/docs/V1_COMPOSITION_MAP.md +123 -0
- package/docs/V1_HELPER_REUSE_REVIEW.md +60 -0
- package/docs/V1_PERFORMANCE_DISPOSITION.md +88 -0
- package/docs/api/camera-equivalent-focal-length.md +53 -0
- package/docs/api/camera-field-of-view.md +119 -0
- package/docs/api/camera-projected-object-size.md +54 -0
- package/docs/api/capture-capture-export-metadata.md +107 -0
- package/docs/api/capture-environment-raw-producer.md +56 -0
- package/docs/api/capture-focus-control.md +419 -0
- package/docs/api/capture-linear-encoding.md +99 -0
- package/docs/api/capture-photographic-export.md +172 -0
- package/docs/api/capture-raw-frame-reconstruction.md +87 -0
- package/docs/api/capture-release-sequence.md +252 -0
- package/docs/api/capture-sensor-raw-frame.md +66 -0
- package/docs/api/capture-sensor-raw-producer.md +98 -0
- package/docs/api/capture-simulated-capture.md +179 -0
- package/docs/api/color-capture-color.md +122 -0
- package/docs/api/color-white-balance.md +386 -0
- package/docs/api/composition-image-formation-plan.md +825 -0
- package/docs/api/composition-plan-consumer.md +98 -0
- package/docs/api/core-calculation-result.md +220 -0
- package/docs/api/core-configuration-error.md +19 -0
- package/docs/api/core-image-formation.md +204 -0
- package/docs/api/core-scientific-assurance.md +214 -0
- package/docs/api/core-spectral-composition.md +268 -0
- package/docs/api/core-spectral.md +78 -0
- package/docs/api/core-validation.md +34 -0
- package/docs/api/core-version.md +14 -0
- package/docs/api/equipment-exposure-capabilities.md +270 -0
- package/docs/api/equipment-generic-tier-assets.md +82 -0
- package/docs/api/equipment-generic-tier-presets.md +103 -0
- package/docs/api/equipment-iso-capabilities.md +295 -0
- package/docs/api/equipment-metering-capabilities.md +126 -0
- package/docs/api/equipment-release-capabilities.md +91 -0
- package/docs/api/exports.json +5656 -0
- package/docs/api/exposure-exposure-duration-control.md +115 -0
- package/docs/api/exposure-exposure-mode-resolver.md +966 -0
- package/docs/api/exposure-exposure.md +150 -0
- package/docs/api/exposure-flash.md +327 -0
- package/docs/api/exposure-metering-scene-radiance.md +154 -0
- package/docs/api/exposure-metering-target.md +134 -0
- package/docs/api/exposure-metering-temporal.md +77 -0
- package/docs/api/exposure-metering.md +172 -0
- package/docs/api/exposure-program-line.md +64 -0
- package/docs/api/motion-camera-rotation.md +215 -0
- package/docs/api/motion-capture-rotation-inverse-mapping.md +128 -0
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +127 -0
- package/docs/api/motion-capture-rotation-trajectory.md +132 -0
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +171 -0
- package/docs/api/motion-extended-object-projection.md +312 -0
- package/docs/api/motion-projected-motion.md +60 -0
- package/docs/api/optics-aperture.md +69 -0
- package/docs/api/optics-circle-of-confusion.md +46 -0
- package/docs/api/optics-complex-pupil-psf.md +193 -0
- package/docs/api/optics-depth-of-field.md +92 -0
- package/docs/api/optics-diffraction.md +46 -0
- package/docs/api/optics-focus-breathing.md +119 -0
- package/docs/api/optics-focus-state.md +64 -0
- package/docs/api/optics-front-of-lens-filter.md +263 -0
- package/docs/api/optics-illumination-vignetting.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +225 -0
- package/docs/api/optics-lens-psf-profile.md +380 -0
- package/docs/api/optics-polygon-diffraction.md +68 -0
- package/docs/api/optics-profile-contract.md +47 -0
- package/docs/api/optics-psf-foundation.md +181 -0
- package/docs/api/optics-radial-distortion.md +194 -0
- package/docs/api/optics-scene-to-sensor-irradiance.md +371 -0
- package/docs/api/optics-scene-to-sensor-quadrature.md +78 -0
- package/docs/api/optics-sensor-environment-query.md +58 -0
- package/docs/api/optics-sensor-psf-quadrature.md +81 -0
- package/docs/api/optics-stray-light.md +109 -0
- package/docs/api/optics-thin-lens.md +53 -0
- package/docs/api/output-capture-corrected-sdr.md +71 -0
- package/docs/api/output-capture-geometry.md +500 -0
- package/docs/api/output-capture-sdr.md +69 -0
- package/docs/api/output-crop.md +47 -0
- package/docs/api/output-geometric-transforms.md +199 -0
- package/docs/api/output-lens-corrections.md +162 -0
- package/docs/api/output-sdr-rendering.md +122 -0
- package/docs/api/output-subject-framing-crop.md +59 -0
- package/docs/api/schema-camera.md +84 -0
- package/docs/api/schema-illumination-spectral.md +77 -0
- package/docs/api/schema-illumination-temporal.md +289 -0
- package/docs/api/schema-illumination.md +246 -0
- package/docs/api/schema-scene-radiance-temporal.md +215 -0
- package/docs/api/schema-scene-radiance.md +415 -0
- package/docs/api/schema-scene.md +105 -0
- package/docs/api/schema-validation.md +25 -0
- package/docs/api/sensor-accumulated-charge.md +273 -0
- package/docs/api/sensor-architecture.md +155 -0
- package/docs/api/sensor-camera-saturation-capacity.md +215 -0
- package/docs/api/sensor-capture-color-sampling-binding.md +323 -0
- package/docs/api/sensor-capture-mode-timing.md +123 -0
- package/docs/api/sensor-capture-mode.md +321 -0
- package/docs/api/sensor-color-sampling.md +228 -0
- package/docs/api/sensor-constant-rate-temporal-integration.md +152 -0
- package/docs/api/sensor-dark-current.md +227 -0
- package/docs/api/sensor-environment-photo-signal.md +77 -0
- package/docs/api/sensor-eqe-electron-rate.md +166 -0
- package/docs/api/sensor-eqe-local-exposure.md +68 -0
- package/docs/api/sensor-eqe-temporal-exposure.md +73 -0
- package/docs/api/sensor-exposure-window.md +183 -0
- package/docs/api/sensor-iso-signal-chain.md +264 -0
- package/docs/api/sensor-local-exposure-binding.md +126 -0
- package/docs/api/sensor-optical-stack.md +211 -0
- package/docs/api/sensor-photon-energy.md +149 -0
- package/docs/api/sensor-physical-charge-capacity.md +196 -0
- package/docs/api/sensor-pixel-pitch.md +41 -0
- package/docs/api/sensor-radiometry-readiness.md +240 -0
- package/docs/api/sensor-raw-readout.md +499 -0
- package/docs/api/sensor-raw-reconstruction.md +260 -0
- package/docs/api/sensor-readout-exposure-linkage.md +172 -0
- package/docs/api/sensor-readout-timing.md +209 -0
- package/docs/api/sensor-response-application-compatibility.md +256 -0
- package/docs/api/sensor-response-operating-range.md +293 -0
- package/docs/api/sensor-responsivity-photocurrent.md +245 -0
- package/docs/api/sensor-sampling-aperture.md +221 -0
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +56 -0
- package/docs/api/sensor-sensor-geometry.md +143 -0
- package/docs/api/sensor-signal-noise.md +75 -0
- package/docs/api/sensor-spatial-sample-reduction.md +186 -0
- package/docs/api/sensor-spatial-sampling-quadrature.md +188 -0
- package/docs/api/sensor-spatio-spectral-reduction.md +217 -0
- package/docs/api/sensor-spectral-coverage.md +33 -0
- package/docs/api/sensor-spectral-quadrature.md +183 -0
- package/docs/api/sensor-spectral-response.md +291 -0
- package/docs/api/sensor-temporal-photo-signal.md +62 -0
- package/docs/api/simulation-poc-simulation.md +364 -0
- package/docs/api/stabilization-camera-shake.md +71 -0
- package/docs/api/stabilization-system.md +442 -0
- package/docs/benchmarks/2026-10-01-main-baseline.json +694 -0
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +2190 -0
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +2423 -0
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +210 -0
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +187 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +756 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +711 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +711 -0
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +885 -0
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +868 -0
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +868 -0
- package/docs/examples/production-capture.mjs +34 -0
- package/docs/examples/production-request.json +4613 -0
- package/docs/examples/quick-start.mjs +12 -0
- package/docs/validation/documentation-fragments.json +212 -0
- package/docs/validation/release-audit-inventory.json +1306 -0
- package/docs/validation/tier-acceptance-report-v1.json +2538 -0
- package/package.json +18 -4
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Module boundary and integration notes.
|
|
4
|
+
* Compose validated irradiance reduction, response applicability/range, EQE conversion and stationary
|
|
5
|
+
* local integration. The exposure value is suitable for accumulated-charge photoSignal;
|
|
6
|
+
* dark/completeness/capacity/readout remain explicit downstream inputs. Invalid or unsupported
|
|
7
|
+
* evidence fails closed.
|
|
8
|
+
* Internal shared instantaneous path; no stationarity or exposure accumulation.
|
|
9
|
+
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
10
|
+
* limits.
|
|
11
|
+
*/
|
|
12
|
+
import { approximationResult } from "../core/calculation-result.js";
|
|
13
|
+
import { InvalidScientificInputError } from "../core/validation.js";
|
|
14
|
+
import { calculateSensorSpatialSamplingQuadrature } from "./spatial-sampling-quadrature.js";
|
|
15
|
+
import { calculateSensorSpectralQuadrature } from "./spectral-quadrature.js";
|
|
16
|
+
import { reduceSensorSpatioSpectralIrradiance } from "./spatio-spectral-reduction.js";
|
|
17
|
+
import { assessSensorResponseApplicationCompatibility } from "./response-application-compatibility.js";
|
|
18
|
+
import { assessSensorResponseOperatingRange } from "./response-operating-range.js";
|
|
19
|
+
import { calculateSensorEqeElectronRate } from "./eqe-electron-rate.js";
|
|
20
|
+
import { bindSensorRateToLocalExposure } from "./local-exposure-binding.js";
|
|
21
|
+
import { integrateStationarySensorRateOverLocalExposure } from "./constant-rate-temporal-integration.js";
|
|
22
|
+
/**
|
|
23
|
+
* Compose validated irradiance reduction, response applicability/range, EQE
|
|
24
|
+
* conversion and stationary local integration. The exposure value is suitable
|
|
25
|
+
* for accumulated-charge photoSignal; dark/completeness/capacity/readout remain
|
|
26
|
+
* explicit downstream inputs. Invalid or unsupported evidence fails closed.
|
|
27
|
+
*/
|
|
28
|
+
export function calculateSensorEqeLocalExposure(input) {
|
|
29
|
+
const stages = calculateSensorEqeLocalRate(input);
|
|
30
|
+
const { spatialQuadrature, spectralQuadrature, reduction, compatibility, operatingRange, electronRate, exposureBinding } = stages;
|
|
31
|
+
const exposure = integrateStationarySensorRateOverLocalExposure({
|
|
32
|
+
rate: electronRate.value, exposureBinding: exposureBinding.value,
|
|
33
|
+
stationarityProfile: input.stationarityProfile
|
|
34
|
+
});
|
|
35
|
+
if (exposure.value.kind !== "eqe-expected-counts") {
|
|
36
|
+
throw new InvalidScientificInputError("EQE local exposure requires expected electron counts.");
|
|
37
|
+
}
|
|
38
|
+
return approximationResult({
|
|
39
|
+
upstreamOrigin: "declared-spatio-spectral-irradiance-samples",
|
|
40
|
+
upstreamSceneAndOpticsVerified: false,
|
|
41
|
+
spatialQuadrature, spectralQuadrature, reduction, compatibility, operatingRange, electronRate, exposureBinding,
|
|
42
|
+
exposure: { ...exposure, value: exposure.value }
|
|
43
|
+
}, "sensor-eqe-local-exposure-composition", "0.1.0", [
|
|
44
|
+
"Irradiance node values and upstream scene/optics origin are declared, not verified.",
|
|
45
|
+
"Finite quadrature and explicit response/stationarity evidence retain their child limitations.",
|
|
46
|
+
"Uncertainty and quadrature convergence errors are not propagated or combined."
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
/** Internal shared instantaneous path; no stationarity or exposure accumulation. */
|
|
50
|
+
export function calculateSensorEqeLocalRate(input) {
|
|
51
|
+
const spatialQuadrature = calculateSensorSpatialSamplingQuadrature({
|
|
52
|
+
...input.spatialSampling, colorSamplingProfile: input.colorSamplingProfile,
|
|
53
|
+
colorSamplingBindingProfile: input.localExposure.bindingProfile,
|
|
54
|
+
nativeRaster: input.localExposure.exposureWindowInput.nativeRaster
|
|
55
|
+
});
|
|
56
|
+
const spectralQuadrature = calculateSensorSpectralQuadrature({
|
|
57
|
+
...input.spectralSampling, colorSamplingProfile: input.colorSamplingProfile,
|
|
58
|
+
spectralResponseProfile: input.spectralResponseProfile
|
|
59
|
+
});
|
|
60
|
+
const reduction = reduceSensorSpatioSpectralIrradiance({
|
|
61
|
+
spatialQuadrature: spatialQuadrature.value, spectralQuadrature: spectralQuadrature.value,
|
|
62
|
+
sampleValues: input.irradianceSamples
|
|
63
|
+
});
|
|
64
|
+
const compatibility = assessSensorResponseApplicationCompatibility({
|
|
65
|
+
...input.responseApplication, reduction: reduction.value
|
|
66
|
+
});
|
|
67
|
+
const operatingRange = assessSensorResponseOperatingRange({
|
|
68
|
+
reduction: reduction.value, compatibility: compatibility.value,
|
|
69
|
+
operatingRangeProfile: input.operatingRangeProfile
|
|
70
|
+
});
|
|
71
|
+
const electronRate = calculateSensorEqeElectronRate({
|
|
72
|
+
reduction: reduction.value, compatibility: compatibility.value,
|
|
73
|
+
operatingRange: operatingRange.value,
|
|
74
|
+
colorSamplingProfile: input.colorSamplingProfile,
|
|
75
|
+
spectralResponseProfile: input.spectralResponseProfile,
|
|
76
|
+
...(input.airPhotonEnergyContext === undefined ? {} : { airPhotonEnergyContext: input.airPhotonEnergyContext })
|
|
77
|
+
});
|
|
78
|
+
const exposureBinding = bindSensorRateToLocalExposure({
|
|
79
|
+
...input.localExposure, rate: electronRate.value,
|
|
80
|
+
colorSamplingProfile: input.colorSamplingProfile
|
|
81
|
+
});
|
|
82
|
+
return { spatialQuadrature, spectralQuadrature, reduction, compatibility, operatingRange, electronRate, exposureBinding };
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=eqe-local-exposure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eqe-local-exposure.js","sourceRoot":"","sources":["../../src/sensor/eqe-local-exposure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type CalculationResult } from "../core/calculation-result.js";
|
|
2
|
+
import { calculateSensorEqeLocalRate, type CalculateSensorEqeLocalExposureInput } from "./eqe-local-exposure.js";
|
|
3
|
+
/** Shared response/site/shutter state, with separately evaluated physical light at each time. */
|
|
4
|
+
export interface CalculateSensorEqeTemporalExposureInput extends Omit<CalculateSensorEqeLocalExposureInput, "irradianceSamples" | "stationarityProfile"> {
|
|
5
|
+
/** Complete uniform-midpoint coverage; array order is not temporal identity. */
|
|
6
|
+
samples: readonly {
|
|
7
|
+
temporalSampleIndex: number;
|
|
8
|
+
/** Seconds on the shutter's first-opening-boundary-phase reference. */
|
|
9
|
+
timeSecondsFromOpeningReference: number;
|
|
10
|
+
/** Complete W/m²/nm Cartesian irradiance coverage for this instant. */
|
|
11
|
+
irradianceSamples: CalculateSensorEqeLocalExposureInput["irradianceSamples"];
|
|
12
|
+
}[];
|
|
13
|
+
}
|
|
14
|
+
/** Nonstationary photo expectation, deliberately distinct from stationary RAW producer inputs. */
|
|
15
|
+
export interface SensorEqeTemporalExposure {
|
|
16
|
+
kind: "eqe-temporal-quadrature-expected-counts";
|
|
17
|
+
colorSamplingProfileId: string;
|
|
18
|
+
channelId: string;
|
|
19
|
+
site: {
|
|
20
|
+
x: number;
|
|
21
|
+
y: number;
|
|
22
|
+
};
|
|
23
|
+
bindingId: string;
|
|
24
|
+
timeReference: "first-opening-boundary-phase";
|
|
25
|
+
startOffsetSecondsFromOpeningReference: number;
|
|
26
|
+
endOffsetSecondsFromOpeningReference: number;
|
|
27
|
+
localExposureDurationSeconds: number;
|
|
28
|
+
expectedIncidentPhotonCount: number;
|
|
29
|
+
expectedGeneratedElectronCount: number;
|
|
30
|
+
integrationMethod: "uniform-midpoint-rate-quadrature";
|
|
31
|
+
timeStationarityEstablished: false;
|
|
32
|
+
timeVaryingSignalIntegrated: true;
|
|
33
|
+
temporalIntegrationApplied: true;
|
|
34
|
+
upstreamSceneAndOpticsVerified: false;
|
|
35
|
+
accumulatedSignalCompleteness: "photo-signal-only";
|
|
36
|
+
physicalFullWellAssessmentAuthorized: false;
|
|
37
|
+
shotNoiseApplied: false;
|
|
38
|
+
rawCodeValueProduced: false;
|
|
39
|
+
/** Canonical order, seconds-valued integration measures and independent child evidence. */
|
|
40
|
+
samples: readonly {
|
|
41
|
+
temporalSampleIndex: number;
|
|
42
|
+
timeSecondsFromOpeningReference: number;
|
|
43
|
+
integrationMeasureSeconds: number;
|
|
44
|
+
timeAverageWeight: number;
|
|
45
|
+
stages: ReturnType<typeof calculateSensorEqeLocalRate>;
|
|
46
|
+
}[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Evaluate response validity and EQE independently at each declared shutter
|
|
50
|
+
* midpoint, then sum rates times seconds. This is quadrature, not a stationarity
|
|
51
|
+
* claim or convergence proof. Shared profile/geometry state prevents combining
|
|
52
|
+
* rates from different sites or shutter events. No renderer executes here.
|
|
53
|
+
*/
|
|
54
|
+
export declare function calculateSensorEqeTemporalExposure(input: CalculateSensorEqeTemporalExposureInput): CalculationResult<SensorEqeTemporalExposure>;
|
|
55
|
+
//# sourceMappingURL=eqe-temporal-exposure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eqe-temporal-exposure.d.ts","sourceRoot":"","sources":["../../src/sensor/eqe-temporal-exposure.ts"],"names":[],"mappings":"AAcA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAE5F,OAAO,EAAE,2BAA2B,EAAE,KAAK,oCAAoC,EAAE,MAAM,yBAAyB,CAAC;AAEjH,iGAAiG;AACjG,MAAM,WAAW,uCACf,SAAQ,IAAI,CAAC,oCAAoC,EAAE,mBAAmB,GAAG,qBAAqB,CAAC;IAC/F,gFAAgF;IAChF,OAAO,EAAE,SAAS;QAChB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,uEAAuE;QACvE,+BAA+B,EAAE,MAAM,CAAC;QACxC,uEAAuE;QACvE,iBAAiB,EAAE,oCAAoC,CAAC,mBAAmB,CAAC,CAAC;KAC9E,EAAE,CAAC;CACL;AAED,kGAAkG;AAClG,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,yCAAyC,CAAC;IAChD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,8BAA8B,CAAC;IAC9C,sCAAsC,EAAE,MAAM,CAAC;IAC/C,oCAAoC,EAAE,MAAM,CAAC;IAC7C,4BAA4B,EAAE,MAAM,CAAC;IACrC,2BAA2B,EAAE,MAAM,CAAC;IACpC,8BAA8B,EAAE,MAAM,CAAC;IACvC,iBAAiB,EAAE,kCAAkC,CAAC;IACtD,2BAA2B,EAAE,KAAK,CAAC;IACnC,2BAA2B,EAAE,IAAI,CAAC;IAClC,0BAA0B,EAAE,IAAI,CAAC;IACjC,8BAA8B,EAAE,KAAK,CAAC;IACtC,6BAA6B,EAAE,mBAAmB,CAAC;IACnD,oCAAoC,EAAE,KAAK,CAAC;IAC5C,gBAAgB,EAAE,KAAK,CAAC;IACxB,oBAAoB,EAAE,KAAK,CAAC;IAC5B,2FAA2F;IAC3F,OAAO,EAAE,SAAS;QAChB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,+BAA+B,EAAE,MAAM,CAAC;QACxC,yBAAyB,EAAE,MAAM,CAAC;QAClC,iBAAiB,EAAE,MAAM,CAAC;QAC1B,MAAM,EAAE,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC;KACxD,EAAE,CAAC;CACL;AAED;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,uCAAuC,GAC7C,iBAAiB,CAAC,yBAAyB,CAAC,CAwC9C"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Module boundary and integration notes.
|
|
4
|
+
* Evaluate response validity and EQE independently at each declared shutter midpoint, then sum rates
|
|
5
|
+
* times seconds. This is quadrature, not a stationarity claim or convergence proof. Shared
|
|
6
|
+
* profile/geometry state prevents combining rates from different sites or shutter events. No renderer
|
|
7
|
+
* executes here.
|
|
8
|
+
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
9
|
+
* limits.
|
|
10
|
+
*/
|
|
11
|
+
import { sumTemporalEqeRateExpectations } from "./temporal-eqe-sum.js";
|
|
12
|
+
import { bindSensorTemporalSamples } from "./temporal-sample-binding.js";
|
|
13
|
+
import { approximationResult } from "../core/calculation-result.js";
|
|
14
|
+
import { InvalidScientificInputError } from "../core/validation.js";
|
|
15
|
+
import { calculateSensorEqeLocalRate } from "./eqe-local-exposure.js";
|
|
16
|
+
/**
|
|
17
|
+
* Evaluate response validity and EQE independently at each declared shutter
|
|
18
|
+
* midpoint, then sum rates times seconds. This is quadrature, not a stationarity
|
|
19
|
+
* claim or convergence proof. Shared profile/geometry state prevents combining
|
|
20
|
+
* rates from different sites or shutter events. No renderer executes here.
|
|
21
|
+
*/
|
|
22
|
+
export function calculateSensorEqeTemporalExposure(input) {
|
|
23
|
+
const ordered = bindSensorTemporalSamples(input.samples, sample => sample.irradianceSamples);
|
|
24
|
+
const count = ordered.length;
|
|
25
|
+
const samples = [];
|
|
26
|
+
let previousTime = -Infinity;
|
|
27
|
+
for (let index = 0; index < count; index++) {
|
|
28
|
+
const sample = ordered[index];
|
|
29
|
+
const stages = calculateSensorEqeLocalRate({ ...input, irradianceSamples: sample.irradianceSamples });
|
|
30
|
+
const binding = stages.exposureBinding.value;
|
|
31
|
+
const start = binding.localExposureWindow.startOffsetSecondsFromOpeningReference;
|
|
32
|
+
const measure = binding.localExposureDurationSeconds / count;
|
|
33
|
+
const time = start + (index + 0.5) * measure;
|
|
34
|
+
// Exact shared construction rejects stale/global-clock samples without an implicit tolerance.
|
|
35
|
+
if (sample.timeSecondsFromOpeningReference !== time || !Number.isFinite(measure) || measure <= 0 ||
|
|
36
|
+
!(time > start && time > previousTime && time < binding.localExposureWindow.endOffsetSecondsFromOpeningReference)) {
|
|
37
|
+
throw new InvalidScientificInputError("Temporal sample must match its representable local shutter midpoint exactly.");
|
|
38
|
+
}
|
|
39
|
+
previousTime = time;
|
|
40
|
+
samples.push({ temporalSampleIndex: index, timeSecondsFromOpeningReference: time,
|
|
41
|
+
integrationMeasureSeconds: measure, timeAverageWeight: 1 / count, stages });
|
|
42
|
+
}
|
|
43
|
+
const { photonCount, electronCount } = sumTemporalEqeRateExpectations(samples.map(s => s.stages.electronRate.value), samples[0].integrationMeasureSeconds);
|
|
44
|
+
const binding = samples[0].stages.exposureBinding.value;
|
|
45
|
+
return approximationResult({ kind: "eqe-temporal-quadrature-expected-counts",
|
|
46
|
+
colorSamplingProfileId: binding.colorSamplingProfileId, channelId: binding.channelId, site: { ...binding.site },
|
|
47
|
+
bindingId: binding.bindingId, timeReference: "first-opening-boundary-phase",
|
|
48
|
+
startOffsetSecondsFromOpeningReference: binding.localExposureWindow.startOffsetSecondsFromOpeningReference,
|
|
49
|
+
endOffsetSecondsFromOpeningReference: binding.localExposureWindow.endOffsetSecondsFromOpeningReference,
|
|
50
|
+
localExposureDurationSeconds: binding.localExposureDurationSeconds,
|
|
51
|
+
expectedIncidentPhotonCount: photonCount, expectedGeneratedElectronCount: electronCount,
|
|
52
|
+
integrationMethod: "uniform-midpoint-rate-quadrature", timeStationarityEstablished: false,
|
|
53
|
+
timeVaryingSignalIntegrated: true, temporalIntegrationApplied: true, upstreamSceneAndOpticsVerified: false,
|
|
54
|
+
accumulatedSignalCompleteness: "photo-signal-only", physicalFullWellAssessmentAuthorized: false,
|
|
55
|
+
shotNoiseApplied: false, rawCodeValueProduced: false, samples
|
|
56
|
+
}, "sensor-eqe-temporal-exposure", "0.1.0", [
|
|
57
|
+
"Irradiance at each time is declared; scene transport, projection and PSF execution are not verified.",
|
|
58
|
+
"Uniform midpoint quadrature has no asserted convergence bound or combined uncertainty.",
|
|
59
|
+
"Nonstationary counts are not the existing stationary charge/RAW producer contract; downstream integration remains required."
|
|
60
|
+
]);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=eqe-temporal-exposure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eqe-temporal-exposure.js","sourceRoot":"","sources":["../../src/sensor/eqe-temporal-exposure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module boundary and integration notes.
|
|
3
|
+
* Resolves local capture exposure windows from independent opening and closing boundary schedules. The
|
|
4
|
+
* returned time basis is seconds from the first opening-boundary phase. This is intentionally not the
|
|
5
|
+
* existing camera-rotation API's global "exposure start" semantic; a later integration layer must bind
|
|
6
|
+
* those time bases explicitly. The mechanism identifies whether each boundary is mechanical or
|
|
7
|
+
* electronic, but does not supply any traversal duration or direction. Every non-simultaneous timing
|
|
8
|
+
* value and direction is caller-declared with evidence. The first model supports simultaneous
|
|
9
|
+
* boundaries and uniform-linear single-axis native-sensor scans only. It does not model curtain
|
|
10
|
+
* acceleration, segmented/nonlinear electronic schedules, flash/flicker, rolling-shutter image
|
|
11
|
+
* distortion, shutter shock, or EFCS-specific pupil/bokeh behavior.
|
|
12
|
+
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
13
|
+
* limits.
|
|
14
|
+
*/
|
|
15
|
+
import { type CalculationResult } from "../core/calculation-result.js";
|
|
16
|
+
import { type EvidenceBackedFact } from "../core/evidence-provenance.js";
|
|
17
|
+
import type { RasterPoint, RasterRect, RasterVector } from "../output/capture-geometry.js";
|
|
18
|
+
import type { NativeImageRaster } from "./sensor-geometry.js";
|
|
19
|
+
import type { CaptureShutterMechanism, NativeSensorReadoutScanDirection, SourcedSensorTimingSeconds } from "./readout-timing.js";
|
|
20
|
+
export type CaptureExposureBoundaryActuator = "mechanical" | "electronic";
|
|
21
|
+
export type SourcedCaptureTimingSeconds = SourcedSensorTimingSeconds;
|
|
22
|
+
export type SourcedCaptureBoundaryDirection = EvidenceBackedFact<NativeSensorReadoutScanDirection>;
|
|
23
|
+
export interface SimultaneousExposureBoundarySchedule {
|
|
24
|
+
kind: "simultaneous";
|
|
25
|
+
directionNative?: never;
|
|
26
|
+
traversalDurationSeconds?: never;
|
|
27
|
+
}
|
|
28
|
+
export interface UniformLinearExposureBoundarySchedule {
|
|
29
|
+
kind: "uniform-linear-native-scan";
|
|
30
|
+
directionNative: SourcedCaptureBoundaryDirection;
|
|
31
|
+
traversalDurationSeconds: SourcedCaptureTimingSeconds;
|
|
32
|
+
}
|
|
33
|
+
export type ExposureBoundarySchedule = SimultaneousExposureBoundarySchedule | UniformLinearExposureBoundarySchedule;
|
|
34
|
+
export interface CalculateCaptureExposureWindowsInput {
|
|
35
|
+
nativeRaster: NativeImageRaster;
|
|
36
|
+
/**
|
|
37
|
+
* Active capture rectangle in invariant native-raster coordinates.
|
|
38
|
+
*
|
|
39
|
+
* Defaults to the complete native raster. Boundary traversal timing is never
|
|
40
|
+
* inferred by scaling a full-frame timing value to this rectangle.
|
|
41
|
+
*/
|
|
42
|
+
activeCaptureRect?: RasterRect;
|
|
43
|
+
shutterMechanism: CaptureShutterMechanism;
|
|
44
|
+
/**
|
|
45
|
+
* Nominal interval between the zero-phase opening and closing references.
|
|
46
|
+
*
|
|
47
|
+
* Local exposure duration may differ from this value when opening and closing
|
|
48
|
+
* boundary schedules have different spatial phase behavior.
|
|
49
|
+
*/
|
|
50
|
+
nominalExposureDurationSeconds: SourcedCaptureTimingSeconds;
|
|
51
|
+
opening: ExposureBoundarySchedule;
|
|
52
|
+
closing: ExposureBoundarySchedule;
|
|
53
|
+
/**
|
|
54
|
+
* Optional continuous native raster edge-coordinate points for diagnostics.
|
|
55
|
+
* Pixel centers may be represented with +0.5 offsets.
|
|
56
|
+
*/
|
|
57
|
+
samplePointsNative?: readonly RasterPoint[];
|
|
58
|
+
}
|
|
59
|
+
export interface ResolvedCaptureExposureBoundary {
|
|
60
|
+
actuator: CaptureExposureBoundaryActuator;
|
|
61
|
+
schedule: {
|
|
62
|
+
kind: "simultaneous";
|
|
63
|
+
} | {
|
|
64
|
+
kind: "uniform-linear-native-scan";
|
|
65
|
+
directionNative: SourcedCaptureBoundaryDirection;
|
|
66
|
+
unitVectorNative: RasterVector;
|
|
67
|
+
traversalDurationSeconds: SourcedCaptureTimingSeconds;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export interface CaptureExposureWindowSample {
|
|
71
|
+
pointNative: RasterPoint;
|
|
72
|
+
openingNormalizedScanPosition: number | null;
|
|
73
|
+
closingNormalizedScanPosition: number | null;
|
|
74
|
+
/**
|
|
75
|
+
* Seconds from the first opening-boundary phase.
|
|
76
|
+
*/
|
|
77
|
+
startOffsetSecondsFromOpeningReference: number;
|
|
78
|
+
/**
|
|
79
|
+
* Seconds from the first opening-boundary phase.
|
|
80
|
+
*/
|
|
81
|
+
endOffsetSecondsFromOpeningReference: number;
|
|
82
|
+
localExposureDurationSeconds: number;
|
|
83
|
+
}
|
|
84
|
+
export interface CaptureExposureWindows {
|
|
85
|
+
shutterMechanism: CaptureShutterMechanism;
|
|
86
|
+
timeReference: "first-opening-boundary-phase";
|
|
87
|
+
nativeRaster: NativeImageRaster;
|
|
88
|
+
activeCaptureRect: RasterRect;
|
|
89
|
+
nominalExposureDurationSeconds: SourcedCaptureTimingSeconds;
|
|
90
|
+
opening: ResolvedCaptureExposureBoundary;
|
|
91
|
+
closing: ResolvedCaptureExposureBoundary;
|
|
92
|
+
localExposureDurationRangeSeconds: {
|
|
93
|
+
minimum: number;
|
|
94
|
+
maximum: number;
|
|
95
|
+
};
|
|
96
|
+
samples: readonly CaptureExposureWindowSample[];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Resolves local capture exposure windows from independent opening and closing
|
|
100
|
+
* boundary schedules.
|
|
101
|
+
*
|
|
102
|
+
* The returned time basis is seconds from the first opening-boundary phase.
|
|
103
|
+
* This is intentionally not the existing camera-rotation API's global
|
|
104
|
+
* "exposure start" semantic; a later integration layer must bind those time
|
|
105
|
+
* bases explicitly.
|
|
106
|
+
*
|
|
107
|
+
* The mechanism identifies whether each boundary is mechanical or electronic,
|
|
108
|
+
* but does not supply any traversal duration or direction. Every non-simultaneous
|
|
109
|
+
* timing value and direction is caller-declared with evidence.
|
|
110
|
+
*
|
|
111
|
+
* The first model supports simultaneous boundaries and uniform-linear
|
|
112
|
+
* single-axis native-sensor scans only. It does not model curtain acceleration,
|
|
113
|
+
* segmented/nonlinear electronic schedules, flash/flicker, rolling-shutter
|
|
114
|
+
* image distortion, shutter shock, or EFCS-specific pupil/bokeh behavior.
|
|
115
|
+
*/
|
|
116
|
+
export declare function calculateCaptureExposureWindows(input: CalculateCaptureExposureWindowsInput): CalculationResult<CaptureExposureWindows>;
|
|
117
|
+
//# sourceMappingURL=exposure-window.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exposure-window.d.ts","sourceRoot":"","sources":["../../src/sensor/exposure-window.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,gCAAgC,CAAC;AAKxC,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACb,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EACV,uBAAuB,EACvB,gCAAgC,EAChC,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,+BAA+B,GAAG,YAAY,GAAG,YAAY,CAAC;AAE1E,MAAM,MAAM,2BAA2B,GAAG,0BAA0B,CAAC;AAErE,MAAM,MAAM,+BAA+B,GACzC,kBAAkB,CAAC,gCAAgC,CAAC,CAAC;AAEvD,MAAM,WAAW,oCAAoC;IACnD,IAAI,EAAE,cAAc,CAAC;IACrB,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,wBAAwB,CAAC,EAAE,KAAK,CAAC;CAClC;AAED,MAAM,WAAW,qCAAqC;IACpD,IAAI,EAAE,4BAA4B,CAAC;IACnC,eAAe,EAAE,+BAA+B,CAAC;IACjD,wBAAwB,EAAE,2BAA2B,CAAC;CACvD;AAED,MAAM,MAAM,wBAAwB,GAChC,oCAAoC,GACpC,qCAAqC,CAAC;AAE1C,MAAM,WAAW,oCAAoC;IACnD,YAAY,EAAE,iBAAiB,CAAC;IAChC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C;;;;;OAKG;IACH,8BAA8B,EAAE,2BAA2B,CAAC;IAC5D,OAAO,EAAE,wBAAwB,CAAC;IAClC,OAAO,EAAE,wBAAwB,CAAC;IAClC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,+BAA+B,CAAC;IAC1C,QAAQ,EACJ;QACE,IAAI,EAAE,cAAc,CAAC;KACtB,GACD;QACE,IAAI,EAAE,4BAA4B,CAAC;QACnC,eAAe,EAAE,+BAA+B,CAAC;QACjD,gBAAgB,EAAE,YAAY,CAAC;QAC/B,wBAAwB,EAAE,2BAA2B,CAAC;KACvD,CAAC;CACP;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,WAAW,CAAC;IACzB,6BAA6B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,6BAA6B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C;;OAEG;IACH,sCAAsC,EAAE,MAAM,CAAC;IAC/C;;OAEG;IACH,oCAAoC,EAAE,MAAM,CAAC;IAC7C,4BAA4B,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,aAAa,EAAE,8BAA8B,CAAC;IAC9C,YAAY,EAAE,iBAAiB,CAAC;IAChC,iBAAiB,EAAE,UAAU,CAAC;IAC9B,8BAA8B,EAAE,2BAA2B,CAAC;IAC5D,OAAO,EAAE,+BAA+B,CAAC;IACzC,OAAO,EAAE,+BAA+B,CAAC;IACzC,iCAAiC,EAAE;QACjC,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,EAAE,SAAS,2BAA2B,EAAE,CAAC;CACjD;AAoVD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,oCAAoC,GAC1C,iBAAiB,CAAC,sBAAsB,CAAC,CAkG3C"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Module boundary and integration notes.
|
|
4
|
+
* Resolves local capture exposure windows from independent opening and closing boundary schedules. The
|
|
5
|
+
* returned time basis is seconds from the first opening-boundary phase. This is intentionally not the
|
|
6
|
+
* existing camera-rotation API's global "exposure start" semantic; a later integration layer must bind
|
|
7
|
+
* those time bases explicitly. The mechanism identifies whether each boundary is mechanical or
|
|
8
|
+
* electronic, but does not supply any traversal duration or direction. Every non-simultaneous timing
|
|
9
|
+
* value and direction is caller-declared with evidence. The first model supports simultaneous
|
|
10
|
+
* boundaries and uniform-linear single-axis native-sensor scans only. It does not model curtain
|
|
11
|
+
* acceleration, segmented/nonlinear electronic schedules, flash/flicker, rolling-shutter image
|
|
12
|
+
* distortion, shutter shock, or EFCS-specific pupil/bokeh behavior.
|
|
13
|
+
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
14
|
+
* limits.
|
|
15
|
+
*/
|
|
16
|
+
import { approximationResult } from "../core/calculation-result.js";
|
|
17
|
+
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
18
|
+
import { InvalidScientificInputError, requirePositiveInteger } from "../core/validation.js";
|
|
19
|
+
const SHUTTER_MECHANISMS = new Set([
|
|
20
|
+
"mechanical",
|
|
21
|
+
"electronic-first-curtain",
|
|
22
|
+
"electronic"
|
|
23
|
+
]);
|
|
24
|
+
const SCAN_DIRECTIONS = new Set([
|
|
25
|
+
"top-to-bottom",
|
|
26
|
+
"bottom-to-top",
|
|
27
|
+
"left-to-right",
|
|
28
|
+
"right-to-left"
|
|
29
|
+
]);
|
|
30
|
+
const BOUNDARY_KINDS = new Set([
|
|
31
|
+
"simultaneous",
|
|
32
|
+
"uniform-linear-native-scan"
|
|
33
|
+
]);
|
|
34
|
+
function requireRecord(value, path) {
|
|
35
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
36
|
+
throw new InvalidScientificInputError(path + " must be an object.");
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function requireNonNegativeInteger(name, value) {
|
|
41
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
42
|
+
throw new InvalidScientificInputError(name + " must be a non-negative safe integer.");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function requirePositiveFinite(name, value) {
|
|
46
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
|
|
47
|
+
throw new InvalidScientificInputError(name + " must be a finite number greater than zero.");
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
function parseSecondsFact(value, path) {
|
|
52
|
+
const record = requireRecord(value, path);
|
|
53
|
+
if (record.unit !== "s") {
|
|
54
|
+
throw new InvalidScientificInputError(path + '.unit must be "s".');
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
value: requirePositiveFinite(path + ".value", record.value),
|
|
58
|
+
unit: "s",
|
|
59
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function parseDirectionFact(value, path) {
|
|
63
|
+
const record = requireRecord(value, path);
|
|
64
|
+
if (typeof record.value !== "string" ||
|
|
65
|
+
!SCAN_DIRECTIONS.has(record.value)) {
|
|
66
|
+
throw new InvalidScientificInputError(path + ".value is invalid.");
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
value: record.value,
|
|
70
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function parseBoundarySchedule(value, path) {
|
|
74
|
+
const record = requireRecord(value, path);
|
|
75
|
+
if (typeof record.kind !== "string" ||
|
|
76
|
+
!BOUNDARY_KINDS.has(record.kind)) {
|
|
77
|
+
throw new InvalidScientificInputError(path + ".kind is invalid.");
|
|
78
|
+
}
|
|
79
|
+
if (record.kind === "simultaneous") {
|
|
80
|
+
if (record.directionNative !== undefined) {
|
|
81
|
+
throw new InvalidScientificInputError(path + ".directionNative must be omitted for a simultaneous boundary.");
|
|
82
|
+
}
|
|
83
|
+
if (record.traversalDurationSeconds !== undefined) {
|
|
84
|
+
throw new InvalidScientificInputError(path +
|
|
85
|
+
".traversalDurationSeconds must be omitted for a simultaneous boundary.");
|
|
86
|
+
}
|
|
87
|
+
return { kind: "simultaneous" };
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
kind: "uniform-linear-native-scan",
|
|
91
|
+
directionNative: parseDirectionFact(record.directionNative, path + ".directionNative"),
|
|
92
|
+
traversalDurationSeconds: parseSecondsFact(record.traversalDurationSeconds, path + ".traversalDurationSeconds")
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function validateNativeRaster(raster) {
|
|
96
|
+
requirePositiveInteger("nativeRaster.pixelWidth", raster.pixelWidth);
|
|
97
|
+
requirePositiveInteger("nativeRaster.pixelHeight", raster.pixelHeight);
|
|
98
|
+
}
|
|
99
|
+
function fullRect(raster) {
|
|
100
|
+
return {
|
|
101
|
+
x: 0,
|
|
102
|
+
y: 0,
|
|
103
|
+
width: raster.pixelWidth,
|
|
104
|
+
height: raster.pixelHeight
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function validateActiveCaptureRect(rect, raster) {
|
|
108
|
+
requireNonNegativeInteger("activeCaptureRect.x", rect.x);
|
|
109
|
+
requireNonNegativeInteger("activeCaptureRect.y", rect.y);
|
|
110
|
+
requirePositiveInteger("activeCaptureRect.width", rect.width);
|
|
111
|
+
requirePositiveInteger("activeCaptureRect.height", rect.height);
|
|
112
|
+
if (rect.x + rect.width > raster.pixelWidth ||
|
|
113
|
+
rect.y + rect.height > raster.pixelHeight) {
|
|
114
|
+
throw new InvalidScientificInputError("activeCaptureRect must fit entirely within nativeRaster.");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function validateShutterMechanism(value) {
|
|
118
|
+
if (typeof value !== "string" ||
|
|
119
|
+
!SHUTTER_MECHANISMS.has(value)) {
|
|
120
|
+
throw new InvalidScientificInputError("shutterMechanism is invalid.");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function validatePointWithinActiveCapture(point, rect, path) {
|
|
124
|
+
if (!Number.isFinite(point.x) || !Number.isFinite(point.y)) {
|
|
125
|
+
throw new InvalidScientificInputError(path + " coordinates must be finite.");
|
|
126
|
+
}
|
|
127
|
+
if (point.x < rect.x ||
|
|
128
|
+
point.x > rect.x + rect.width ||
|
|
129
|
+
point.y < rect.y ||
|
|
130
|
+
point.y > rect.y + rect.height) {
|
|
131
|
+
throw new InvalidScientificInputError(path + " must lie within activeCaptureRect edge-coordinate bounds.");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function scanVector(direction) {
|
|
135
|
+
switch (direction) {
|
|
136
|
+
case "top-to-bottom":
|
|
137
|
+
return { x: 0, y: 1 };
|
|
138
|
+
case "bottom-to-top":
|
|
139
|
+
return { x: 0, y: -1 };
|
|
140
|
+
case "left-to-right":
|
|
141
|
+
return { x: 1, y: 0 };
|
|
142
|
+
case "right-to-left":
|
|
143
|
+
return { x: -1, y: 0 };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function normalizedScanPosition(point, rect, direction) {
|
|
147
|
+
switch (direction) {
|
|
148
|
+
case "top-to-bottom":
|
|
149
|
+
return (point.y - rect.y) / rect.height;
|
|
150
|
+
case "bottom-to-top":
|
|
151
|
+
return 1 - (point.y - rect.y) / rect.height;
|
|
152
|
+
case "left-to-right":
|
|
153
|
+
return (point.x - rect.x) / rect.width;
|
|
154
|
+
case "right-to-left":
|
|
155
|
+
return 1 - (point.x - rect.x) / rect.width;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function boundaryPhase(point, rect, schedule) {
|
|
159
|
+
if (schedule.kind === "simultaneous") {
|
|
160
|
+
return {
|
|
161
|
+
normalizedScanPosition: null,
|
|
162
|
+
phaseOffsetSeconds: 0
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const normalized = normalizedScanPosition(point, rect, schedule.directionNative.value);
|
|
166
|
+
return {
|
|
167
|
+
normalizedScanPosition: normalized,
|
|
168
|
+
phaseOffsetSeconds: normalized * schedule.traversalDurationSeconds.value
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function resolveBoundaryActuators(mechanism) {
|
|
172
|
+
switch (mechanism) {
|
|
173
|
+
case "mechanical":
|
|
174
|
+
return {
|
|
175
|
+
opening: "mechanical",
|
|
176
|
+
closing: "mechanical"
|
|
177
|
+
};
|
|
178
|
+
case "electronic-first-curtain":
|
|
179
|
+
return {
|
|
180
|
+
opening: "electronic",
|
|
181
|
+
closing: "mechanical"
|
|
182
|
+
};
|
|
183
|
+
case "electronic":
|
|
184
|
+
return {
|
|
185
|
+
opening: "electronic",
|
|
186
|
+
closing: "electronic"
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function resolveBoundary(actuator, schedule) {
|
|
191
|
+
if (schedule.kind === "simultaneous") {
|
|
192
|
+
return {
|
|
193
|
+
actuator,
|
|
194
|
+
schedule: {
|
|
195
|
+
kind: "simultaneous"
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
actuator,
|
|
201
|
+
schedule: {
|
|
202
|
+
kind: "uniform-linear-native-scan",
|
|
203
|
+
directionNative: schedule.directionNative,
|
|
204
|
+
unitVectorNative: scanVector(schedule.directionNative.value),
|
|
205
|
+
traversalDurationSeconds: schedule.traversalDurationSeconds
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function createWindowSample(point, rect, opening, closing, nominalExposureDurationSeconds) {
|
|
210
|
+
const openingPhase = boundaryPhase(point, rect, opening);
|
|
211
|
+
const closingPhase = boundaryPhase(point, rect, closing);
|
|
212
|
+
const startOffsetSecondsFromOpeningReference = openingPhase.phaseOffsetSeconds;
|
|
213
|
+
const endOffsetSecondsFromOpeningReference = nominalExposureDurationSeconds + closingPhase.phaseOffsetSeconds;
|
|
214
|
+
const localExposureDurationSeconds = endOffsetSecondsFromOpeningReference -
|
|
215
|
+
startOffsetSecondsFromOpeningReference;
|
|
216
|
+
return {
|
|
217
|
+
pointNative: { ...point },
|
|
218
|
+
openingNormalizedScanPosition: openingPhase.normalizedScanPosition,
|
|
219
|
+
closingNormalizedScanPosition: closingPhase.normalizedScanPosition,
|
|
220
|
+
startOffsetSecondsFromOpeningReference,
|
|
221
|
+
endOffsetSecondsFromOpeningReference,
|
|
222
|
+
localExposureDurationSeconds
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function activeRectCorners(rect) {
|
|
226
|
+
return [
|
|
227
|
+
{ x: rect.x, y: rect.y },
|
|
228
|
+
{ x: rect.x + rect.width, y: rect.y },
|
|
229
|
+
{ x: rect.x, y: rect.y + rect.height },
|
|
230
|
+
{
|
|
231
|
+
x: rect.x + rect.width,
|
|
232
|
+
y: rect.y + rect.height
|
|
233
|
+
}
|
|
234
|
+
];
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Resolves local capture exposure windows from independent opening and closing
|
|
238
|
+
* boundary schedules.
|
|
239
|
+
*
|
|
240
|
+
* The returned time basis is seconds from the first opening-boundary phase.
|
|
241
|
+
* This is intentionally not the existing camera-rotation API's global
|
|
242
|
+
* "exposure start" semantic; a later integration layer must bind those time
|
|
243
|
+
* bases explicitly.
|
|
244
|
+
*
|
|
245
|
+
* The mechanism identifies whether each boundary is mechanical or electronic,
|
|
246
|
+
* but does not supply any traversal duration or direction. Every non-simultaneous
|
|
247
|
+
* timing value and direction is caller-declared with evidence.
|
|
248
|
+
*
|
|
249
|
+
* The first model supports simultaneous boundaries and uniform-linear
|
|
250
|
+
* single-axis native-sensor scans only. It does not model curtain acceleration,
|
|
251
|
+
* segmented/nonlinear electronic schedules, flash/flicker, rolling-shutter
|
|
252
|
+
* image distortion, shutter shock, or EFCS-specific pupil/bokeh behavior.
|
|
253
|
+
*/
|
|
254
|
+
export function calculateCaptureExposureWindows(input) {
|
|
255
|
+
validateNativeRaster(input.nativeRaster);
|
|
256
|
+
validateShutterMechanism(input.shutterMechanism);
|
|
257
|
+
const nominalExposureDurationSeconds = parseSecondsFact(input.nominalExposureDurationSeconds, "nominalExposureDurationSeconds");
|
|
258
|
+
const opening = parseBoundarySchedule(input.opening, "opening");
|
|
259
|
+
const closing = parseBoundarySchedule(input.closing, "closing");
|
|
260
|
+
const activeCaptureRect = input.activeCaptureRect ?? fullRect(input.nativeRaster);
|
|
261
|
+
validateActiveCaptureRect(activeCaptureRect, input.nativeRaster);
|
|
262
|
+
if (input.samplePointsNative !== undefined &&
|
|
263
|
+
!Array.isArray(input.samplePointsNative)) {
|
|
264
|
+
throw new InvalidScientificInputError("samplePointsNative must be an array when supplied.");
|
|
265
|
+
}
|
|
266
|
+
const cornerSamples = activeRectCorners(activeCaptureRect).map((point) => createWindowSample(point, activeCaptureRect, opening, closing, nominalExposureDurationSeconds.value));
|
|
267
|
+
const localDurations = cornerSamples.map((sample) => sample.localExposureDurationSeconds);
|
|
268
|
+
const minimumLocalExposureDurationSeconds = Math.min(...localDurations);
|
|
269
|
+
const maximumLocalExposureDurationSeconds = Math.max(...localDurations);
|
|
270
|
+
if (!Number.isFinite(minimumLocalExposureDurationSeconds) ||
|
|
271
|
+
minimumLocalExposureDurationSeconds <= 0) {
|
|
272
|
+
throw new InvalidScientificInputError("The declared opening/closing schedules produce a zero or negative local exposure duration somewhere within activeCaptureRect.");
|
|
273
|
+
}
|
|
274
|
+
const samples = (input.samplePointsNative ?? []).map((point, index) => {
|
|
275
|
+
validatePointWithinActiveCapture(point, activeCaptureRect, "samplePointsNative[" + index + "]");
|
|
276
|
+
return createWindowSample(point, activeCaptureRect, opening, closing, nominalExposureDurationSeconds.value);
|
|
277
|
+
});
|
|
278
|
+
const actuators = resolveBoundaryActuators(input.shutterMechanism);
|
|
279
|
+
return approximationResult({
|
|
280
|
+
shutterMechanism: input.shutterMechanism,
|
|
281
|
+
timeReference: "first-opening-boundary-phase",
|
|
282
|
+
nativeRaster: { ...input.nativeRaster },
|
|
283
|
+
activeCaptureRect: { ...activeCaptureRect },
|
|
284
|
+
nominalExposureDurationSeconds,
|
|
285
|
+
opening: resolveBoundary(actuators.opening, opening),
|
|
286
|
+
closing: resolveBoundary(actuators.closing, closing),
|
|
287
|
+
localExposureDurationRangeSeconds: {
|
|
288
|
+
minimum: minimumLocalExposureDurationSeconds,
|
|
289
|
+
maximum: maximumLocalExposureDurationSeconds
|
|
290
|
+
},
|
|
291
|
+
samples
|
|
292
|
+
}, "capture-exposure-window-schedule", "1.0.0", [
|
|
293
|
+
"Time is reported in seconds from the first opening-boundary phase, not from a universal local exposure-start event.",
|
|
294
|
+
"Nominal exposure duration, opening traversal, and closing traversal are independent declared quantities.",
|
|
295
|
+
"Mechanical, electronic-first-curtain, and electronic mechanisms determine boundary actuator categories only; they do not supply timing or direction.",
|
|
296
|
+
"Uniform-linear scan boundaries are an explicit approximation over continuous effective native-raster coordinates and do not assert one raster row/column equals one physical curtain line, photodiode row, or hardware readout line.",
|
|
297
|
+
"Opening and closing directions and traversal durations are independent and may produce spatially varying local exposure duration.",
|
|
298
|
+
"The complete active rectangle is validated using the extrema of the affine boundary schedules, so unsampled invalid corners cannot pass.",
|
|
299
|
+
"Active-capture timing is caller-declared and is not inferred by scaling full-frame timing from crop dimensions.",
|
|
300
|
+
"Physical camera orientation and digital output crop/resolution remain downstream of the invariant native timing schedule.",
|
|
301
|
+
"Sensor readout timing remains a separate contract; this model does not automatically equate a sensor readout phase with an exposure boundary.",
|
|
302
|
+
"This model does not include curtain acceleration, segmented/nonlinear electronic timing, rolling-shutter image distortion, motion integration, flash/flicker interaction, shutter shock, or EFCS-specific pupil/bokeh behavior."
|
|
303
|
+
]);
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=exposure-window.js.map
|