@photivra/engine 0.6.0 → 1.0.1
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 +191 -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 +139 -72
- 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 +9 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +10 -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 +87 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +85 -6
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +16 -0
- package/dist/motion/camera-rotation.d.ts.map +1 -1
- package/dist/motion/camera-rotation.js +16 -0
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +13 -0
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.js +13 -0
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +15 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.js +15 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +15 -0
- package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -1
- package/dist/motion/capture-rotation-trajectory.js +15 -0
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- 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 +11 -0
- 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 +18 -0
- package/dist/optics/radial-distortion.d.ts.map +1 -1
- package/dist/optics/radial-distortion.js +18 -0
- 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 +8 -0
- 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 +1 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.js +14 -0
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- 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.map +1 -1
- package/dist/sensor/capture-mode.js +13 -0
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts.map +1 -1
- package/dist/sensor/color-sampling.js +19 -0
- package/dist/sensor/color-sampling.js.map +1 -1
- 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 +14 -0
- package/dist/sensor/exposure-window.d.ts.map +1 -1
- package/dist/sensor/exposure-window.js +14 -0
- package/dist/sensor/exposure-window.js.map +1 -1
- 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.map +1 -1
- package/dist/sensor/optical-stack.js +17 -0
- package/dist/sensor/optical-stack.js.map +1 -1
- 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 +12 -0
- package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -1
- package/dist/sensor/readout-exposure-linkage.js +12 -0
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +13 -0
- package/dist/sensor/readout-timing.d.ts.map +1 -1
- package/dist/sensor/readout-timing.js +13 -0
- package/dist/sensor/readout-timing.js.map +1 -1
- 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.map +1 -1
- package/dist/sensor/sampling-aperture.js +14 -0
- package/dist/sensor/sampling-aperture.js.map +1 -1
- 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 +44 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -1
- package/dist/sensor/spatial-sample-reduction.js +51 -5
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +24 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.js +27 -0
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- 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 +139 -3
- package/docs/ARCHITECTURE.md +134 -24
- package/docs/AUTOMATION_COORDINATION.md +2 -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 +80 -10
- package/docs/LINEAR_CAPTURE_ENCODING.md +25 -0
- package/docs/MOTION_AND_SIGNAL.md +5 -3
- 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 +66 -0
- package/docs/RELEASE_1_0_1.md +61 -0
- package/docs/RELEASE_AUDIT.md +39 -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 +5050 -1047
- 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 +15 -3
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Motion and Signal Foundation
|
|
2
2
|
|
|
3
|
+
Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
|
|
4
|
+
|
|
3
5
|
## Projected subject motion
|
|
4
6
|
|
|
5
7
|
Subject-motion blur is modeled from image-plane displacement rather than broad labels such as "fast sport" or "slow subject."
|
|
@@ -113,7 +115,7 @@ Mechanical, EFCS, and electronic shutter mechanisms determine only which concept
|
|
|
113
115
|
|
|
114
116
|
The complete active rectangle is validated so a zero/negative local exposure duration cannot hide in an unsampled region.
|
|
115
117
|
|
|
116
|
-
This contract remains deliberately separate from `calculateSensorReadoutTiming()`. Sensor readout phase is not automatically an exposure boundary. It also remains separate from `calculateCameraRotationImageMapping()`: that API still accepts seconds from its existing exposure-start reference, and
|
|
118
|
+
This contract remains deliberately separate from `calculateSensorReadoutTiming()`. Sensor readout phase is not automatically an exposure boundary. It also remains separate from `calculateCameraRotationImageMapping()`: that API still accepts seconds from its existing exposure-start reference, and the capture rotation and production adapters explicitly bind local capture-window times to that motion basis.
|
|
117
119
|
|
|
118
120
|
The first exposure-window model does not include curtain acceleration, nonlinear or segmented electronic scheduling, flash/flicker interaction, shutter shock, EFCS-specific pupil/bokeh behavior, or rolling-shutter image distortion.
|
|
119
121
|
|
|
@@ -160,7 +162,7 @@ These are intentionally separate. The seconds-valued measure is not shutter tran
|
|
|
160
162
|
|
|
161
163
|
The local exposure interval remains destination-dependent. A scanned opening/closing schedule can therefore shift node times between sensor locations, and different opening/closing traversal schedules can produce different local durations and therefore different `timeMeasureSeconds` values.
|
|
162
164
|
|
|
163
|
-
The first temporal-response model is `uniform-over-local-exposure`. That is an explicit approximation.
|
|
165
|
+
The first temporal-response model is `uniform-over-local-exposure`. That is an explicit approximation. This geometric primitive does not model shutter-transmission ramps or exposure-dependent sensor response. Registered temporal illumination/manual flash and explicit scene/EQE exposure APIs separately integrate declared changing light; geometry nodes alone provide no radiometric weighting.
|
|
164
166
|
|
|
165
167
|
The API returns **nodes and weights only**. It does not average reference coordinates, compute a blur radius/kernel, sample scene radiance, resolve visibility/occlusion, or write output pixels. Averaging geometric coordinates is not a substitute for integrating the radiance seen along the time-varying rays.
|
|
166
168
|
|
|
@@ -197,7 +199,7 @@ The current inverse does not claim that an arbitrary rolling/capture-scan camera
|
|
|
197
199
|
|
|
198
200
|
The image-formation contract defines physical time in **seconds from exposure start**.
|
|
199
201
|
|
|
200
|
-
|
|
202
|
+
The separate spatial camera-rotation model is evaluable at arbitrary supported physical times rather than returning only one finished full-frame displacement. That allows global exposure and later rolling readout to consume the same camera-motion model.
|
|
201
203
|
|
|
202
204
|
Exposure duration and sensor readout timing are independent concepts:
|
|
203
205
|
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# Numerical Correctness and Physical Units
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
|
|
4
|
+
|
|
5
|
+
Photivra is a scientific engine. Numerical behavior and physical-unit meaning are public-contract concerns, not implementation details.
|
|
6
|
+
|
|
7
|
+
This document defines the repository-wide numerical policy used by public calculations, parsers, schemas, tests, and composed image-formation work.
|
|
8
|
+
|
|
9
|
+
## Core rules
|
|
10
|
+
|
|
11
|
+
- Public physical quantities must use explicit units in field names unless the type itself unambiguously owns the unit.
|
|
12
|
+
- The same physical concept should use the same unit and property name across modules.
|
|
13
|
+
- Coordinate-system identity is part of the quantity definition. A number is not interchangeable merely because it has the same dimensional unit.
|
|
14
|
+
- Public calculation results must remain JSON-safe. `NaN` and numeric infinities are not valid calculation outputs.
|
|
15
|
+
- Invalid scientific inputs fail explicitly rather than being silently clamped, coerced, defaulted, or reinterpreted.
|
|
16
|
+
- Unknown, unbounded, absent, and unsupported states must be represented semantically rather than by magic numeric sentinels.
|
|
17
|
+
- Unit conversion happens exactly once at an explicit boundary.
|
|
18
|
+
- Mathematical simplifications must not erase axis dependence, sign conventions, physical stage, provenance, or applicability.
|
|
19
|
+
|
|
20
|
+
These rules supplement `docs/API_STYLE.md` and the coordinate/model rules in `docs/PHYSICS_FOUNDATION.md`.
|
|
21
|
+
|
|
22
|
+
## Canonical public units
|
|
23
|
+
|
|
24
|
+
Photivra does not require one internal SI-only representation. It does require explicit, stable units at public boundaries.
|
|
25
|
+
|
|
26
|
+
Common conventions include:
|
|
27
|
+
|
|
28
|
+
| Quantity | Public convention |
|
|
29
|
+
| --- | --- |
|
|
30
|
+
| focal/image/sensor distances | millimetres when named `*Mm` |
|
|
31
|
+
| scene/object/focus distance | metres when named `*M` |
|
|
32
|
+
| sampling pitch | micrometres when named `*Micrometers` |
|
|
33
|
+
| time / exposure duration | seconds when named `*Seconds` |
|
|
34
|
+
| wavelength | nanometres when named `*Nanometers` / `*Nm` |
|
|
35
|
+
| angle | explicit radians/degrees fields, never an unlabeled angle |
|
|
36
|
+
| ISO / exposure index | dimensionless named camera setting |
|
|
37
|
+
| normalized factors / weights | dimensionless; document normalization and valid range |
|
|
38
|
+
| spectral irradiance | explicit radiometric unit including wavelength-density basis |
|
|
39
|
+
| irradiance | W/m² when physically calibrated |
|
|
40
|
+
| radiance | W/m²/sr, with /nm when spectrally resolved |
|
|
41
|
+
| electrons / photons / RAW codes | explicit domain-specific counts/codes; do not interchange |
|
|
42
|
+
|
|
43
|
+
Do not infer units from neighboring fields or documentation when the public field name/type is ambiguous.
|
|
44
|
+
|
|
45
|
+
## Coordinate identity
|
|
46
|
+
|
|
47
|
+
A physical unit alone does not identify a coordinate.
|
|
48
|
+
|
|
49
|
+
For example, these are different domains even when expressed in millimetres or pixels:
|
|
50
|
+
|
|
51
|
+
- native sensor raster coordinates;
|
|
52
|
+
- oriented capture raster coordinates;
|
|
53
|
+
- output raster coordinates;
|
|
54
|
+
- optical image-plane coordinates;
|
|
55
|
+
- sensor physical coordinates;
|
|
56
|
+
- scene/world coordinates.
|
|
57
|
+
|
|
58
|
+
Crossing coordinate systems requires an explicit exported transform or a documented model boundary. Do not implement ad-hoc sign changes, axis swaps, recentering, or crop-local reinterpretation.
|
|
59
|
+
|
|
60
|
+
## Finite-number policy
|
|
61
|
+
|
|
62
|
+
Public calculation envelopes must not contain non-finite numbers.
|
|
63
|
+
|
|
64
|
+
The existing `CalculationResult<T>` constructors recursively validate returned numeric values. If a calculation would emit `NaN`, `Infinity`, or `-Infinity`, it fails with `InvalidScientificResultError`.
|
|
65
|
+
|
|
66
|
+
Inputs that are required to be finite must fail with a typed/domain validation error before the calculation proceeds.
|
|
67
|
+
|
|
68
|
+
When the scientific state is genuinely unbounded, represent that state semantically. Example: depth of field uses `null` for an infinite far limit rather than numeric `Infinity`.
|
|
69
|
+
|
|
70
|
+
Do not rely on JSON serialization to convert or erase non-finite numbers.
|
|
71
|
+
|
|
72
|
+
## Domains and ranges
|
|
73
|
+
|
|
74
|
+
Validation should distinguish:
|
|
75
|
+
|
|
76
|
+
1. **structural validity** — correct type/shape/discriminant;
|
|
77
|
+
2. **numeric validity** — finite, integer, nonnegative, positive, bounded fraction, etc.;
|
|
78
|
+
3. **scientific applicability** — value lies inside the model/profile/calibration operating range;
|
|
79
|
+
4. **composition compatibility** — independently valid inputs are valid together.
|
|
80
|
+
|
|
81
|
+
Do not silently widen a model's operating envelope to accept a caller value.
|
|
82
|
+
|
|
83
|
+
For reusable bounded ranges:
|
|
84
|
+
|
|
85
|
+
- state units;
|
|
86
|
+
- state whether endpoints are inclusive;
|
|
87
|
+
- reject reversed ranges;
|
|
88
|
+
- preserve exact evidence/applicability when calibrated;
|
|
89
|
+
- do not extrapolate unless the model explicitly defines and labels extrapolation.
|
|
90
|
+
|
|
91
|
+
## Exact equality vs tolerance
|
|
92
|
+
|
|
93
|
+
Photivra does not use one global epsilon.
|
|
94
|
+
|
|
95
|
+
Use exact equality when the contract is exact, including:
|
|
96
|
+
|
|
97
|
+
- IDs, versions, enum/discriminant values;
|
|
98
|
+
- integer/raster identities;
|
|
99
|
+
- explicit zero/no-op states when represented exactly;
|
|
100
|
+
- deterministic serialized/canonical structures where bitwise identity is part of the contract;
|
|
101
|
+
- algebraic results whose implementation is expected to be exact in the represented arithmetic.
|
|
102
|
+
|
|
103
|
+
Use a documented tolerance when floating-point evaluation is inherently approximate, including:
|
|
104
|
+
|
|
105
|
+
- transcendental functions;
|
|
106
|
+
- iterative numerical methods;
|
|
107
|
+
- quadrature/integration;
|
|
108
|
+
- interpolated calibration data;
|
|
109
|
+
- numerically conditioned inverse mappings.
|
|
110
|
+
|
|
111
|
+
Tolerance selection must be tied to the quantity, numerical scale, conditioning, algorithm, and scientific claim. A looser tolerance must never be used merely to hide an unexplained regression.
|
|
112
|
+
|
|
113
|
+
Prefer:
|
|
114
|
+
|
|
115
|
+
- absolute tolerance near a known scale/zero;
|
|
116
|
+
- relative tolerance for scale-proportional quantities;
|
|
117
|
+
- convergence/refinement tests for sampled numerical methods;
|
|
118
|
+
- independently derived analytical/reference values where available.
|
|
119
|
+
|
|
120
|
+
## Rounding and quantization
|
|
121
|
+
|
|
122
|
+
Rounding is a scientific/output operation when it changes represented data.
|
|
123
|
+
|
|
124
|
+
- Keep calculations in the highest practical deterministic precision until a defined output boundary.
|
|
125
|
+
- Pixel/raster integer rounding rules must be explicit.
|
|
126
|
+
- RAW/export quantization must define scale, offset/black level, clipping, rounding/tie behavior, and code range.
|
|
127
|
+
- Do not round intermediate physical values for display convenience.
|
|
128
|
+
- Do not let serializer/container limitations redefine the authoritative scientific value.
|
|
129
|
+
|
|
130
|
+
## Signed zero and tiny values
|
|
131
|
+
|
|
132
|
+
Do not use `-0` as a semantic state.
|
|
133
|
+
|
|
134
|
+
When a public result is mathematically zero, normalize or test it according to the owning model if signed zero could leak into serialization/identity. Do not indiscriminately clamp small nonzero values to zero; that requires a documented model/tolerance decision.
|
|
135
|
+
|
|
136
|
+
## Overflow, underflow, and extreme inputs
|
|
137
|
+
|
|
138
|
+
Public functions must fail safely when arithmetic leaves the valid numerical/scientific domain.
|
|
139
|
+
|
|
140
|
+
- A finite input does not guarantee a finite computed result.
|
|
141
|
+
- Check derived values where overflow or invalid denominators can occur.
|
|
142
|
+
- Avoid transformations that turn a detectable invalid state into an apparently plausible finite number.
|
|
143
|
+
- Extreme-value tests should target the model boundary, not arbitrary machine limits alone.
|
|
144
|
+
|
|
145
|
+
If a stable reformulation is needed for numerical conditioning, it must preserve the documented scientific model and provenance.
|
|
146
|
+
|
|
147
|
+
## Determinism and runtime expectations
|
|
148
|
+
|
|
149
|
+
For identical validated inputs and fixed stochastic seeds, the engine should produce deterministic scientific results within the documented contract.
|
|
150
|
+
|
|
151
|
+
Do not depend on:
|
|
152
|
+
|
|
153
|
+
- object iteration order that is not part of the serialized contract;
|
|
154
|
+
- current wall-clock time;
|
|
155
|
+
- random state without an explicit seed;
|
|
156
|
+
- network/service responses;
|
|
157
|
+
- renderer/UI state;
|
|
158
|
+
- machine-specific hidden calibration.
|
|
159
|
+
|
|
160
|
+
Browser-safe public code and supported Node runtimes must share the same semantic result contract. If an implementation permits small runtime-dependent floating-point differences, acceptance tolerances must be explicit and scientifically harmless.
|
|
161
|
+
|
|
162
|
+
## Testing requirements
|
|
163
|
+
|
|
164
|
+
Numerical tests should use the strongest applicable form:
|
|
165
|
+
|
|
166
|
+
1. exact identity/invariant;
|
|
167
|
+
2. independently derived analytical constant;
|
|
168
|
+
3. dimensional/unit relation;
|
|
169
|
+
4. monotonic/bounded behavior;
|
|
170
|
+
5. round-trip/inverse invariant;
|
|
171
|
+
6. numerical convergence/refinement;
|
|
172
|
+
7. calibrated/reference tolerance with provenance.
|
|
173
|
+
|
|
174
|
+
The canonical `test/fixtures/basic-reference-scene.json` fixture is the preferred shared reference for cross-domain deterministic cases once available.
|
|
175
|
+
|
|
176
|
+
Do not generate the only expected value by calling the same production function under test.
|
|
177
|
+
|
|
178
|
+
## Changes to numerical behavior
|
|
179
|
+
|
|
180
|
+
A change that alters public numerical meaning must document:
|
|
181
|
+
|
|
182
|
+
- equation/model change;
|
|
183
|
+
- units and coordinate system;
|
|
184
|
+
- assumptions/applicability;
|
|
185
|
+
- old vs new behavior;
|
|
186
|
+
- tolerance/precision impact;
|
|
187
|
+
- API/schema/version impact;
|
|
188
|
+
- provenance/uncertainty consequences;
|
|
189
|
+
- migration implications when relevant.
|
|
190
|
+
|
|
191
|
+
A pure implementation optimization must preserve the same scientific result semantics and provenance within the existing contract.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Measured-performance baseline: #43 / #45
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
|
|
4
|
+
|
|
5
|
+
This independent first slice records merged main `83a99a4c1ec525fd1add7cccff134fcee0f5159b`, root API 0.93.0, POC API 0.20.0, in `docs/benchmarks/2026-10-01-main-baseline.json`. No pending capture/output/correction/preset implementation is consumed. It does not close either issue or justify an optimization by itself.
|
|
6
|
+
|
|
7
|
+
## Context and method
|
|
8
|
+
|
|
9
|
+
Measurements used Node 24.19.0/V8 13.6.233.17-node.51 on shared Linux x64 execution infrastructure reporting AMD EPYC 9V74 and 9 logical CPUs. This is not the user's Mac, a browser frame-time result or a dedicated machine. Local source was restored to the recorded main snapshot and transpiled with Node's type stripper because canonical TypeScript tooling is unavailable locally; this build method is explicit in the artifact. The script's source commit/build label is operator-attested, not independently verified by the script. CI separately verifies the canonical build/gates.
|
|
10
|
+
|
|
11
|
+
The existing #43 sampling benchmark retains its 33x33 field and 5 temporal samples, alternating scalar/batch pairs, nine measured repeats and five inner repeats. It is reused unchanged. New `scripts/benchmark-composed-baseline.mjs` measures four whole POC request shapes against #130: base, 16 defocus samples, 16 samples each of defocus/size/motion, and the same mixed set with portrait/off-center staged capture. Each scenario has 200 warmup requests and nine 100-request blocks; scenario order rotates. Both ordinary and forced-GC-assisted runs are recorded, not combined. Net post-GC retained heap is **not** allocation count or GC-pause evidence.
|
|
12
|
+
|
|
13
|
+
| POC scenario | Ordinary median µs/request | Forced-GC-assisted median µs/request |
|
|
14
|
+
| --- | ---: | ---: |
|
|
15
|
+
| Base | 13.17 | 16.88 |
|
|
16
|
+
| Defocus 16 | 29.20 | 36.77 |
|
|
17
|
+
| Mixed 16 per kind | 62.46 | 76.05 |
|
|
18
|
+
| Staged portrait mixed | 124.76 | 130.16 |
|
|
19
|
+
|
|
20
|
+
These distributions establish reproducible request shapes, not portable speed constants or ordinary-vs-GC causality. Raw timing/heap samples are retained in the artifact.
|
|
21
|
+
|
|
22
|
+
## Findings and disposition
|
|
23
|
+
|
|
24
|
+
For #43, existing lateral-CA batch/scalar median ratio was 0.628 (about 37% shorter in this run); radial batch ratio 1.019 showed no benefit in this run. Vignetting and temporal rotation remain recorded microbenchmark candidates, not demonstrated consumer hotspots. This supports retaining the existing narrow CA batch surface, not adding a generic prepared engine abstraction now.
|
|
25
|
+
|
|
26
|
+
For #45, a separate ordinary V8 CPU-profile run had 250 sampled stacks inside `simulatePocCamera`; 83 included `calculateThinLensImageDistance` (33.2%). 157 included recursive finite-result validation (62.8%). These are **overlapping inclusive sampled stacks** and cannot be summed or equated to exact time/savings. Zero samples attributed to `requirePositiveFinite` do not imply zero validation work; sampling/inlining can hide frames. Startup/outside-call samples are excluded from the fraction denominator. The profiled run's timings are not used in the unprofiled timing table.
|
|
27
|
+
|
|
28
|
+
Repeated projection/result validation is therefore a plausible bounded investigation target, but no reuse candidate, amortization break-even, retained prepared-state cost, exact equivalence corpus, actual consumer frequency or browser behavior has been demonstrated. **No runtime optimization is implemented and neither issue receives a final no-change closure.** After representative V1 composition/output paths merge, repeat profiling with those paths and relevant browser/worker consumers; then compare the smallest internal request-scoped reuse candidate, or record a supported no-change decision. No public context/cache or API/version change is justified here.
|
|
29
|
+
|
|
30
|
+
## Reproduction
|
|
31
|
+
|
|
32
|
+
Use a checkout of the commit being measured and build it before measuring; retain runtime/hardware/commit context for every comparison. The new script is developer tooling, not the browser root. Example after `npm ci` / `npm run build`, replacing the commit with the exact source revision used:
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
node scripts/benchmark-composed-baseline.mjs --commit=83a99a4c1ec525fd1add7cccff134fcee0f5159b --build-method=tsc
|
|
36
|
+
node --expose-gc scripts/benchmark-composed-baseline.mjs --commit=83a99a4c1ec525fd1add7cccff134fcee0f5159b --build-method=tsc
|
|
37
|
+
node --expose-gc scripts/benchmark-image-formation.mjs
|
|
38
|
+
node --cpu-prof --cpu-prof-name=poc.cpuprofile scripts/benchmark-composed-baseline.mjs --commit=83a99a4c1ec525fd1add7cccff134fcee0f5159b --build-method=tsc
|
|
39
|
+
node scripts/summarize-composed-cpu-profile.mjs poc.cpuprofile
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
To reproduce this historical engine baseline after the tooling lands, use the recorded engine checkout plus these tooling scripts, rather than labeling a newer engine build with the old SHA. Do not commit raw CPU profiles: they can contain private local paths. The summary emits fixed public function categories only. The archived artifact contains no raw profile/path or source-private metadata.
|
|
43
|
+
|
|
44
|
+
Scripts and scenarios are independently authored using the owned canonical fixture and existing benchmark. No third-party code/data or dependency is incorporated. AI-assisted draft remains subject to human review and DCO certification; performance evidence is not scientific/provenance certification.
|
|
45
|
+
|
|
46
|
+
## Subsequent bounded #45 experiment
|
|
47
|
+
|
|
48
|
+
The baseline conclusions above are historical. [POC_PROJECTION_REUSE.md](POC_PROJECTION_REUSE.md) records the main 0.103.0 request-local defocus candidate, paired whole-request timing, preparation, separate allocation sampling and complete-response equivalence. It advances #45 independently; it does not change #43's disposition or establish browser performance.
|
|
49
|
+
|
|
50
|
+
## Subsequent bounded #43 experiment
|
|
51
|
+
|
|
52
|
+
The baseline conclusions above are historical. [GEOMETRIC_PREPARATION_REUSE.md](GEOMETRIC_PREPARATION_REUSE.md) records the main 0.103.0 call-local geometry-preparation candidate, real merged sampling/correction consumers, separate CPU/allocation evidence and scalar/copy-safety tests. It advances #43 independently and does not establish browser performance or #45's conclusion.
|
|
53
|
+
|
|
54
|
+
## Final V1 remeasurement
|
|
55
|
+
|
|
56
|
+
[Final V1 performance disposition](V1_PERFORMANCE_DISPOSITION.md) records current main #204, fresh paired timing/equivalence, preparation/memory profiles and dense executed environment-to-RAW evidence. PR #205 merged the final reviewed/signed no-further-change disposition; PR #206 merged final conformance. The measured engine commit remains the historical benchmark identity. Earlier candidate and pending-remeasurement statements above are historical.
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# Simulated Sensor RAW DNG / JPEG export
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.1 candidate / root API 1.0.1**. Subsystem/model versions and dated introduction or measurement records below are independent historical identities; they are not distribution versions. See [developer navigation](DEVELOPERS.md) and [release contract](RELEASE_1_0_1.md).
|
|
4
|
+
|
|
5
|
+
Current producer-derived files and external closure gates are recorded in
|
|
6
|
+
[Export acceptance](EXPORT_ACCEPTANCE.md). The new reproducible generator uses
|
|
7
|
+
current typed fixtures; the earlier pinned serializer-only files remain historical.
|
|
8
|
+
|
|
9
|
+
See [Reference RAW frame compatibility](RAW_FRAME_ENVELOPE.md) for stage-specific
|
|
10
|
+
limits, full-native counting and parser preflight behavior.
|
|
11
|
+
|
|
12
|
+
`createPhotographicExportPair()` is an optional browser-safe asynchronous export
|
|
13
|
+
boundary. Both owned byte arrays come from one revalidated, privately copied RAW
|
|
14
|
+
input. The JPEG never uses the capture's independent float planes. Web Crypto
|
|
15
|
+
SHA-256 is required. No filesystem, clock, random generator, network or encoder
|
|
16
|
+
dependency is added. Callers supply public identities and an explicit UTC event
|
|
17
|
+
timestamp, and own saving the bytes.
|
|
18
|
+
|
|
19
|
+
This is a bounded reference implementation. The entire native frame must contain
|
|
20
|
+
at most **4,096 sites**, with complete single-frame, one-site-per-native-sample,
|
|
21
|
+
registered 2×2 RGB Bayer coverage. RAW codes remain in native row-major CFA
|
|
22
|
+
coordinates. A fixed repeating black tile and common digital white code are
|
|
23
|
+
required. Below-black codes and original saturation codes are preserved without
|
|
24
|
+
stretching to the 16-bit container limit. This does not support typical camera
|
|
25
|
+
resolutions or establish calibrated camera behavior.
|
|
26
|
+
|
|
27
|
+
## Explicit development
|
|
28
|
+
|
|
29
|
+
`RawFrameReconstructionInput` supplies complete absolute CFA phase profiles and
|
|
30
|
+
a native region covering the final crop. Existing reconstruction preserves
|
|
31
|
+
signed black-subtracted values and exact weighted source contributions. Missing
|
|
32
|
+
edge support fails; no automatic kernel, padding, sharpening or denoising runs.
|
|
33
|
+
|
|
34
|
+
`ExportSensorColorProfile` explicitly declares an invertible 3×3 normalized
|
|
35
|
+
camera-channel-to-XYZ/D65 matrix, owned/reusable numeric evidence, profile
|
|
36
|
+
identity and limitations. Only approximation status is accepted. RGB/CFA names
|
|
37
|
+
do not establish primaries, spectral response or calibration. Output kernels
|
|
38
|
+
must use the declared RGB order and exact CFA profile. The reference white must
|
|
39
|
+
map to positive camera-neutral coordinates.
|
|
40
|
+
|
|
41
|
+
WB is explicitly `not-required` with no captured intent, or
|
|
42
|
+
`apply-resolved-sensor-gains` with intent. Existing resolved camera-channel gains
|
|
43
|
+
apply once before camera-to-XYZ and the existing XYZ-to-linear-sRGB transform.
|
|
44
|
+
No second WB estimator runs. Existing SDR rendering handles rendering exposure,
|
|
45
|
+
named tone mapping, clipping, transfer and 8-bit quantization. Rendering clipping
|
|
46
|
+
is separate from RAW saturation.
|
|
47
|
+
|
|
48
|
+
Only 1:1 output cropping is supported. The final oriented crop is translated
|
|
49
|
+
through the active crop to exact native coordinates. JPEG pixels receive
|
|
50
|
+
orientation once and EXIF Orientation=1. DNG keeps native pixels and records
|
|
51
|
+
orientation, native ActiveArea and DefaultCrop. Resampling fails closed. JPEG
|
|
52
|
+
coding replicates edges solely to fill partial 8×8 coding blocks; it does not
|
|
53
|
+
supply missing reconstruction samples or change photograph dimensions.
|
|
54
|
+
|
|
55
|
+
## Optional correction of the JPEG view
|
|
56
|
+
|
|
57
|
+
The optional `correction` field reuses the choice contract documented in
|
|
58
|
+
[CAPTURE_CORRECTED_SDR.md](CAPTURE_CORRECTED_SDR.md). Order is exact attached RAW
|
|
59
|
+
reconstruction → resolved camera-channel WB → declared camera-to-XYZ/D65 →
|
|
60
|
+
existing linear-sRGB transform → native-optical geometry/CA/gain correction →
|
|
61
|
+
SDR → JPEG. The private intermediate plane contains only RAW-derived RGB; it
|
|
62
|
+
replaces all independent float planes for this calculation and is never returned
|
|
63
|
+
as a replacement capture. Parent `source` retains the exact RAW reconstruction,
|
|
64
|
+
its provenance, site-level physical/digital saturation and source history.
|
|
65
|
+
Intermediate RGB capture saturation is explicitly unmodeled; no scalar RGB white
|
|
66
|
+
level is inferred from heterogeneous RAW site saturation flags.
|
|
67
|
+
|
|
68
|
+
This branch requires reconstruction of the **full active native area**, square
|
|
69
|
+
physical pixel pitch and 1:1 declared output crop sampling. The exporter supplies
|
|
70
|
+
no prefilter, so `resampler.antialias` must be `none`; maps requiring compression
|
|
71
|
+
filtering fail through the existing executor. It cannot claim a prefiltered input
|
|
72
|
+
or silently create a filter. Correction state uses native output dimensions,
|
|
73
|
+
exact committed optics and exposure-local time, independently of scene time.
|
|
74
|
+
Profiles remain generic declarations for the post-color/WB linear-sRGB basis,
|
|
75
|
+
not physical sensor-channel CA calibration. The pipeline does not redraw noise,
|
|
76
|
+
blur or photons and does not activate reserved production stages.
|
|
77
|
+
|
|
78
|
+
`invalidSupport` either rejects unavailable samples or chooses the existing
|
|
79
|
+
largest joint-valid rectangle. `processedOutputView.rect` records that rectangle
|
|
80
|
+
in the full oriented output raster, with dimensions used by JPEG SOF and EXIF.
|
|
81
|
+
It is relative to the declared output crop, not the active/native sensor origin.
|
|
82
|
+
The DNG's native codes, ActiveArea and original DefaultCrop remain unchanged;
|
|
83
|
+
a nonlinear corrected JPEG cannot be represented by moving an uncorrected RAW
|
|
84
|
+
crop. These paired files share the exact capture and source codes, while their
|
|
85
|
+
processed geometry can differ. Physical focal equivalence remains capture-owned.
|
|
86
|
+
|
|
87
|
+
The result exposes the processed `correction` calculation and a separate
|
|
88
|
+
`rawCorrectionIntent` plan with application `metadata-only`. Custom XMP in both
|
|
89
|
+
files records CorrectionProfileID/version, CorrectionSelectionKind/selections,
|
|
90
|
+
ProcessedOutputRect and ProcessedIlluminationClippingEvents. CorrectionDisposition
|
|
91
|
+
is `informational-intent-only` in DNG and `processed-view` in JPEG. This is
|
|
92
|
+
informational metadata, not standardized DNG opcodes or a promise that editors
|
|
93
|
+
apply the profile. Gain clipping events precede joint cropping and remain
|
|
94
|
+
separate from RAW saturation and SDR gamut clipping. Full profile and choices
|
|
95
|
+
enter SimulationHash; RawDataUniqueID still depends only on the exact RAW codes.
|
|
96
|
+
Omitting correction preserves the original rendering/hash inputs and emits no
|
|
97
|
+
correction XMP. The additive contract retains export schema 0.1.0.
|
|
98
|
+
|
|
99
|
+
## Files and metadata
|
|
100
|
+
|
|
101
|
+
DNG uses little-endian TIFF, version/backward version 1.1, one uncompressed
|
|
102
|
+
16-bit CFA strip, CFA/black/white tags, inverse XYZ-to-camera ColorMatrix1,
|
|
103
|
+
D65 CalibrationIlluminant1 and normalized AsShotNeutral. Rational values use
|
|
104
|
+
bounded decimal approximations (maximum denominator 10^9); unsupported range
|
|
105
|
+
or nonzero values rounding to zero fail. AsShotNeutral records development intent
|
|
106
|
+
and does not alter RAW codes. No preview, compression, opcodes, NoiseProfile,
|
|
107
|
+
calibration signature, RawImageDigest or NewRawImageDigest is claimed.
|
|
108
|
+
|
|
109
|
+
JPEG is baseline sequential 8-bit YCbCr444 with an explicit constant quantization
|
|
110
|
+
step 1..255, analytical DCT, custom canonical Huffman tables and byte stuffing.
|
|
111
|
+
The step is not a manufacturer's quality scale. JPEG remains lossy at step 1.
|
|
112
|
+
JFIF and EXIF ColorSpace=1 declare rendered sRGB; DNG is unclassified and carries
|
|
113
|
+
the explicit virtual-camera matrix.
|
|
114
|
+
|
|
115
|
+
EXIF records exposure, aperture, focal length, rounded 35mm equivalent when
|
|
116
|
+
representable, dimensions, UTC event time/subseconds/offset, and ImageUniqueID.
|
|
117
|
+
Integer selected virtual ISO ≤65535 is recorded as RecommendedExposureIndex
|
|
118
|
+
with SensitivityType=REI: a simulation setting, not measured ISO speed or
|
|
119
|
+
standard-output-sensitivity calibration. Make/Model identify Photivra's virtual
|
|
120
|
+
camera, not a commercial device.
|
|
121
|
+
|
|
122
|
+
XMP contains distinct xmpMM DocumentID/InstanceID and IPTC DigitalImageGUID per
|
|
123
|
+
file, the caller-selected non-generative IPTC workflow type and the namespace
|
|
124
|
+
`https://photivra.com/ns/simulation/1.0/`. SceneID/version are caller-declared
|
|
125
|
+
public profiles bound to the capture's sceneStateId. SensorProfileID identifies
|
|
126
|
+
the export color interpretation. SceneTime is simulation seconds, not wall-clock
|
|
127
|
+
time. Finite focus distance is recorded; infinity never becomes a fake number.
|
|
128
|
+
Private paths/GPS/serials and unsupported rights/calibration/AI fields are rejected.
|
|
129
|
+
|
|
130
|
+
## Identity and lineage
|
|
131
|
+
|
|
132
|
+
- SimulationHash is SHA-256 over sorted finite canonical JSON containing the
|
|
133
|
+
entire RAW frame, including capture identity/history/float planes, phase
|
|
134
|
+
profiles, region, color/scene profiles, WB policy, rendering, JPEG step and
|
|
135
|
+
the optional correction choice.
|
|
136
|
+
Save timestamp and artifact IDs are excluded. History changes may change the
|
|
137
|
+
hash without changing decoded pixels.
|
|
138
|
+
- RawDataUniqueID is the first 128 bits of SHA-256 over versioned native
|
|
139
|
+
dimensions, CFA layout, 16-bit container declaration and exact codes. It is
|
|
140
|
+
not a standard RawImageDigest.
|
|
141
|
+
- UniqueCameraModel includes public color profile identity/version and its full
|
|
142
|
+
hash; profile changes cannot silently keep the same family identity. File
|
|
143
|
+
SHA-256 fields hash exact returned bytes at creation.
|
|
144
|
+
- Top-level pairing records JPEG generation from the exact attached RAW. Nested
|
|
145
|
+
metadata-only `imageDataPairing="not-verified"` retains its earlier projection
|
|
146
|
+
semantics. Upstream producer origin remains caller-declared/unverified. Hashes
|
|
147
|
+
are not signatures, C2PA or tamper-proof attestations.
|
|
148
|
+
|
|
149
|
+
Returned arrays are owned and mutable; hashes describe creation-time bytes.
|
|
150
|
+
Reconstruction/rendering calculation envelopes remain available for review.
|
|
151
|
+
|
|
152
|
+
## Use and acceptance
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
import { createPhotographicExportPair, parsePhotographicExportInput,
|
|
156
|
+
type PhotographicExportInput } from "@photivra/engine";
|
|
157
|
+
|
|
158
|
+
async function exportCommittedRaw(input: PhotographicExportInput) {
|
|
159
|
+
return createPhotographicExportPair(parsePhotographicExportInput(input));
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Callers supply actual committed input and explicit profile evidence. Test profiles
|
|
164
|
+
are synthetic and are not suggested physical calibrations.
|
|
165
|
+
|
|
166
|
+
Generate concrete acceptance files with `npm run build`, then
|
|
167
|
+
`node scripts/generate-photographic-export-fixtures.mjs OUTPUT_DIRECTORY`.
|
|
168
|
+
With an existing Pillow installation, run
|
|
169
|
+
`python scripts/verify-photographic-export-fixtures.py OUTPUT_DIRECTORY`.
|
|
170
|
+
This repository-only optional checker adds no engine dependency. It also uses
|
|
171
|
+
existing lxml and LibRaw installations when available, and reports skipped
|
|
172
|
+
checks explicitly. Both the 2×2 strip regression and 64×64 owned grayscale
|
|
173
|
+
chart are generated with separate capture/artifact identities. The manifest
|
|
174
|
+
records elapsed time and before/after heap usage for each bounded fixture;
|
|
175
|
+
these are not peak-memory measurements or high-resolution evidence.
|
|
176
|
+
|
|
177
|
+
Supplemental local checks use Pillow's independent TIFF-directory reader plus
|
|
178
|
+
direct strip unpacking for exact RAW codes; Pillow decodes JPEG/EXIF and extracts
|
|
179
|
+
XMP, and Python DOM parses both packets. Diverse 1×1, 7×8, 9×13 and 64×64 patterns
|
|
180
|
+
decode at steps 1, 7 and 255; measured step-1 maximum channel error is ≤2 codes.
|
|
181
|
+
Pillow cannot render the CFA photometric profile. LibRaw 0.21.2 independently
|
|
182
|
+
opens, unpacks and processes the 64×64 DNG, retaining the native 64×64 size and
|
|
183
|
+
WhiteLevel=1023. It rejects the 2×2 file as unsupported; that tiny file remains
|
|
184
|
+
a strip/tag regression fixture, not an editor acceptance file. XMP attributes
|
|
185
|
+
in both pair members are independently decoded and compared through DOM/Expat
|
|
186
|
+
and lxml/libxml2. These checks do not establish Adobe acceptance, exact
|
|
187
|
+
agreement between different demosaic/rendering algorithms or a complete
|
|
188
|
+
schema-aware XMP implementation conformance claim.
|
|
189
|
+
|
|
190
|
+
Concrete 64×64 files are checked into `test/fixtures/paired-export-acceptance/`
|
|
191
|
+
for external review. Their owned synthetic ramp codes exercise the serializer,
|
|
192
|
+
not the physical sensor producer. See its README for hashes and the exact
|
|
193
|
+
remaining acceptance steps. No commercial-camera calibration is used.
|
|
194
|
+
|
|
195
|
+
#16 is closed through reviewed/signed PR #201. [Export acceptance](EXPORT_ACCEPTANCE.md) records producer-derived pairs, independent LibRaw/TIFF/JPEG/XML checks, owner Lightroom orientation/as-shot/exposure/WB screenshots and landscape JPEG Photoshop/Chrome review, with unverified user-Mac hashes/builds explicitly preserved. The per-call API retains `independent-decode-required-editor-validation-pending`: it cannot attest that arbitrary newly generated bytes were checked in an external editor. That conservative result field is not the current issue status.
|
|
196
|
+
|
|
197
|
+
Format references and DNG patent-license notice are recorded in `THIRD_PARTY.md`
|
|
198
|
+
and `NOTICE`. No Adobe SDK or external encoder source is incorporated.
|
|
199
|
+
|
|
200
|
+
Internal ownership: `src/color/sensor-color-development.ts` owns the declared
|
|
201
|
+
sensor-channel gain → camera-to-XYZ → linear-sRGB calculation and conditioned
|
|
202
|
+
inversion. Export retains profile/evidence validation, CFA binding, one-time WB
|
|
203
|
+
authorization, geometry and DNG/JPEG container mapping. The adapter consumes
|
|
204
|
+
validated data and does not infer sensor calibration or reuse the distinct ideal
|
|
205
|
+
virtual-camera input contract. Existing arithmetic order and error policies are
|
|
206
|
+
preserved; no public API or schema change is introduced.
|