@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,25 @@
|
|
|
1
|
+
# Virtual-camera linear color: #15B
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.0 candidate / root API 0.116.0**. 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.md).
|
|
4
|
+
|
|
5
|
+
`resolveCaptureColorModel()` defines an ideal CIE 1931 2-degree colorimetric camera: co-sited red/green/blue channels are an invertible encoding of XYZ in the linear-sRGB primary basis, with D65 reference white. They are relative linear values, not electrons, spectral response measurements or commercial-camera RGB. Choosing this profile is an upstream producer assertion about sample meaning; naming arbitrary sensor data with its ID does not establish validity.
|
|
6
|
+
|
|
7
|
+
The primary chromaticities are red (0.64,0.33), green (0.30,0.60), blue (0.15,0.06), and D65 (0.3127,0.3290). Matrices are independently derived: form each primary column `(x/y,1,(1-x-y)/y)`, solve its scale against normalized D65 XYZ, scale columns, then invert the resulting 3x3 matrix. Model `0.1.0` exposes both row-major matrices, observer, reference illuminant/white, evidence identity and valid conditions. No transfer curve, gamut mapping or nominal [0,1] clamp is applied. Mathematical conversion is calculated, not calibrated.
|
|
8
|
+
|
|
9
|
+
`calculateCaptureColorTransform()` consumes a validated `SimulatedCapture` and one untreated inline XYZ or exact `photivra-colorimetric-rgb-d65` virtual-camera plane. It returns a new immutable transformed RGB plane, model data, source plane/state IDs and the selected WB policy. It leaves the capture/exposure/focus/noise/source manifest unchanged. Consumers use the same API for preview/export; no renderer or file-format dependence is introduced.
|
|
10
|
+
|
|
11
|
+
| Explicit policy | Meaning |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| preserve-intent | Convert the color basis only; retain resolved WB as intent without applying it. XYZ reference white must match the documented D65 convention exactly. |
|
|
14
|
+
| apply-resolved-rgb-gains | Convert XYZ to the camera RGB basis, then multiply the resolved #108 red/green/blue gains. Caller must bind gains to the exact camera profile/version. No AWB estimator or implicit adopted-white adaptation runs. |
|
|
15
|
+
| adopted-white-xyz-scaling | In XYZ, multiply X and Z by target-D65/adopted-white ratios, leave Y unchanged, then convert to linear RGB. Requires explicit adopted white; consumes no RGB gains. Reports approximation provenance. |
|
|
16
|
+
|
|
17
|
+
XYZ diagonal scaling is intentionally a limited adaptation approximation, not Bradford, a physiological cone model or a full color-appearance model. It maps the chosen normalized adopted white to D65 while preserving its Y; this invariant does not prove perceptual accuracy for other colors. Ratios must lie in [1e-6,1e6] for the supported numerical domain; no validated physical accuracy envelope is claimed. Under mixed illumination, the selected adopted white remains a camera/photographer choice. The result always states `claimsUniqueSceneWhite:false`. Encoding white and adopted white are separate records; RGB gains do not derive/update the adopted white.
|
|
18
|
+
|
|
19
|
+
Signed samples, above-white headroom and the source reference-value normalization are retained; non-finite arithmetic fails with the scientific-result error. Source saturation is retained as **upstream capture history in the original source-channel domain**, not an output clipping threshold or transformed RGB white level. The result performs no clipping and creates no new saturation count. Existing digital-lens-correction history is retained; color/adaptation/gain history rejects a second color invocation. Missing/wrong profile versions, unsupported spectral channel identities, transformed input, external storage, reused output IDs and malformed policies fail closed. External data must be independently loaded/verified before a future streaming color executor; this API does no IO.
|
|
20
|
+
|
|
21
|
+
To commit the returned plane into a new container, carry the original source manifest and capture settings, add the returned model/evidence to `models` as appropriate, and include the derived plane. `createSimulatedCapture()` revalidates the aggregate inline budget; callers decide whether to retain both master and derived planes. A transform result does not assert an external artifact checksum for newly generated bytes. Schema `0.2.0` explicitly records applied-chromatic-adaptation; `0.1.0` archives migrate without inventing adaptation.
|
|
22
|
+
|
|
23
|
+
The fixed ideal basis has no illumination-dependent sensor calibration. Future measured/spectral sensor models need their own versioned channel→XYZ profiles with explicit reference illumination/validity and approximation/calibration evidence; this implementation rejects them instead of inventing a universal matrix or interpolating undocumented illuminants. #15C owns quantization, #112 tone/look/gamut/transfer/display, #16 file mapping and #111 production ordering. No stage is activated here.
|
|
24
|
+
|
|
25
|
+
Factual research: [W3C CSS Color 4 linear sRGB definition](https://www.w3.org/TR/css-color-4/#predefined-sRGB) documents primary/white chromaticities and distinguishes linear-light values from the transfer-encoded space. Only these public numerical facts and color-space distinctions are used; source code, published conversion matrices, protected prose and calibration/color tables were not incorporated. Reference coefficient tests check independently stated numerical values to absolute tolerance about 5e-14; invariants check primary chromaticities, black and D65 white. AI-assisted draft remains subject to substantive human science/provenance review and DCO certification.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Capture-bound corrections and SDR: #112 integration slice
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.0 candidate / root API 0.116.0**. 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.md).
|
|
4
|
+
|
|
5
|
+
`calculateCaptureCorrectedSdr()` consumes the same immutable `SimulatedCapture` and explicit source/color/WB choice as `calculateCaptureSdr()`, then executes existing #117/#118 corrections before the existing SDR renderer. This bounded reference bridge does not replace the #111 composer, activate production stages, or complete #112/V1.
|
|
6
|
+
|
|
7
|
+
Order: validated inline source → existing color/WB → native-optical reconstructed-linear geometry/CA → illumination gain → exact orientation permutation → explicit support crop → SDR. Profiles must be authored for **post-color/WB linear-sRGB/D65**, not assumed interchangeable with sensor-channel CA calibration. Raw-domain components and geometry across gain fail through the existing executor. No WB estimator, optical equation, noise generator or tier-based strength is introduced.
|
|
8
|
+
|
|
9
|
+
The strict `correction` contract requires exact generic profile/independently declared optical state, `coordinateFrame: "native-optical-linear-srgb-d65"`, selections/selection kind, resampler, positive finite clipping level, local `frameTimeSeconds`, support policy and unique public output state ID. Unknown/private fields fail. Profile/state match and committed focal length/aperture/finite focus/native output dimensions are checked. Infinity focus remains unsupported by the profile schema. Body/lens/version, acquisition mode/frame rate/stabilization and profile accuracy remain **producer declarations**, not independently established by the capture container or upgraded to calibration.
|
|
10
|
+
|
|
11
|
+
Metric rasters derive from committed physical bounds via the capture coordinate bridge; no caller-supplied pitch/center is accepted. All four orientation corner UVs map to native optical +X-right/+Y-up. Sample quarter-turn permutations reuse the existing raster point transform without extra interpolation. Profile output dimensions are **native optical output dimensions**, swapped relative to final oriented width/height for portrait capture. Square physical pixel pitch is required for source and destination (relative tolerance 1e-12); anisotropic lattices fail rather than stretch. Off-center capture/output retain optical-axis offsets.
|
|
12
|
+
|
|
13
|
+
Local frame time must fall within the exposure interval; capture scene-clock time is preserved separately. Focus-aware projection reuses the field-of-view calculator, whose child result is returned. Conventional active-capture focal equivalence and physical geometry are never rewritten by correction/output crop.
|
|
14
|
+
|
|
15
|
+
Source/destination are bounded to 65,536 sites each. Inline co-sited three-channel RGB is required after color/WB. No external loading/streaming/prefilter generation occurs. `source-prefiltered` remains a caller obligation, not verification of adequacy. Child sampling plans preserve native optical coordinates, full Jacobians, per-channel support, resampler identity and prefilter diagnostics. Top-level support uses the full **oriented output** lattice.
|
|
16
|
+
|
|
17
|
+
Support policy `reject` requires all requested output pixels. `joint-valid-crop` uses the existing largest all-valid rectangle after orientation; empty support fails. No missing channel is padded, mirrored or replaced with black. `outputView.rect` is within the declared oriented output raster; cropped samples/dimensions are a derived view, not a replacement capture plane or new physical capture. A later file adapter must deliberately map this view/crop metadata; the paired DNG/JPEG exporter is unchanged.
|
|
18
|
+
|
|
19
|
+
Original source/capture/noise IDs, source dynamic-range history and upstream saturation remain separate from optional color, correction and SDR child provenance. Aggregate provenance is approximation because corrections are generic-parametric. `illuminationClippingEventCount` counts channel/stage clipping events **before joint support/crop**, including repeated gain stages; it is not an output-pixel or capture-saturation count. SDR gamut diagnostics describe the retained view. Signed/headroom values survive until explicit gain clipping/SDR handling. Noise covariance/SNR is not regenerated or inferred.
|
|
20
|
+
|
|
21
|
+
Any existing digital correction history rejects a second invocation; staged recorrection needs a future explicit contract. The view must not be relabeled untreated RAW. Mandatory/automatic camera states and educational reference bypass remain distinct; bypass still honors committed output crop/resampling.
|
|
22
|
+
|
|
23
|
+
Compatibility: root API 0.100.0 → 0.101.0; adapter schema 0.1.0; package/POC/capture/production unchanged. Existing capture-SDR shares an internal source validator and preserves its behavior. Independently authored tests cover quarter turns/native-direction shifts, nonmutation/determinism, crop/support, history/clocks, clipping separation and unsupported boundaries. No runtime dependency, third-party implementation/data/calibration or new cost is added. Human science/provenance review and contribution-specific DCO are required before inclusion.
|
|
24
|
+
|
|
25
|
+
Remaining V1 work: authoritative sensor RAW producer, explicit production composition, corrected-view/file wiring, end-to-end production capture→RAW→processed-file acceptance and external Adobe/open RAW editor checks. None is marked complete by this bridge.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Capture export metadata foundation (#16B)
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.0 candidate / root API 0.116.0**. 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.md).
|
|
4
|
+
|
|
5
|
+
`createCaptureExportMetadataPair()` is a browser-safe, deterministic **semantic metadata projection**, not an image exporter or proof of RAW/JPEG pixel derivation. Both future writers consume its single shared object; each resource has a distinct caller-owned document UUID and saved-incarnation UUID. `imageDataPairing = "not-verified"` prevents metadata agreement being mistaken for image agreement.
|
|
6
|
+
|
|
7
|
+
The existing committed capture must already have a non-nil RFC-variant UUID CaptureID. Existing opaque-ID captures remain valid for all earlier APIs, but must be created with a UUID to enter this new export boundary; the exporter does not silently replace their identity. UUIDs normalize to lowercase. All five IDs (capture, two resources, two incarnations) must differ, including after case normalization. The engine neither creates randomness nor proves global uniqueness. Preserve document IDs across reserialization of a resource; give a new saved incarnation its own instance ID. Reuse the capture's ID for the same shutter event. New shutter events require caller-owned new capture IDs.
|
|
8
|
+
|
|
9
|
+
The input contains `capture`, `workflow`, `capturedAtUtc`, `raw: { documentId, instanceId }`, and `jpeg: { documentId, instanceId }`. The event time is a supplied valid canonical UTC timestamp with three millisecond digits, e.g. `2026-10-01T19:00:00.123Z`. Missing time is rejected: no wall-clock read occurs. The existing scene-clock seconds remain a separate semantic value; file-save/metadata-edit timestamps are not supplied or inferred here.
|
|
10
|
+
|
|
11
|
+
Only two explicit non-generative workflows are supported:
|
|
12
|
+
|
|
13
|
+
- `human-directed-non-generative` maps to the IPTC `digitalCreation` concept URI.
|
|
14
|
+
- `fully-procedural-non-generative` maps to `algorithmicMedia`.
|
|
15
|
+
|
|
16
|
+
Classification is caller-declared workflow metadata, not an independent investigation of upstream media. AI-generated, sampled-source, or composite workflows are outside this first policy and require reviewed expansion; do not silently label them with these choices. No `digitalCapture`, AI-specific fields or physical camera claims are emitted. IPTC is the primary semantic reference: [Digital Source Type vocabulary](https://cv.iptc.org/newscodes/digitalsourcetype/), [digitalCreation](https://cv.iptc.org/newscodes/digitalsourcetype/digitalCreation), [algorithmicMedia](https://cv.iptc.org/newscodes/digitalsourcetype/algorithmicMedia). These are references to concept identifiers, not incorporated third-party implementation or calibration data.
|
|
17
|
+
|
|
18
|
+
Known exposure settings, finite/infinity focus, active-area diagonal 35-mm focal equivalence, native/oriented/output geometry, scene-state identity/time, noise seed/model, resolved WB intent, and model provenance are projected from the parsed immutable capture. Models retain their existing scientific status and public evidence. No model is inferred to be a sensor/lens calibration profile simply because it appears in this list.
|
|
19
|
+
|
|
20
|
+
Software/creator-tool identity is `Photivra <captured engine API version>`, with explicit `engineApiVersion`; this is not an npm-distribution-version claim. Make/model are `Photivra` / `Photivra Virtual Camera`. Photivra is not automatically the human creator or rights holder. The result omits source bytes and float planes, private paths/hostnames/GPS/serials, invented lens identity, creator/rights, commercial IDs, RAW-data digests, simulation hashes, format calibration and false physical FileSource/SceneType claims.
|
|
21
|
+
|
|
22
|
+
Geometry is preserved semantically, not packed into EXIF orientation. DNG native samples versus an already-oriented JPEG require different format-specific orientation handling; writers must not rotate twice. This slice does not serialize timestamps, ISO rational/integer tags, focal equivalence rounding, XMP namespace packets, or EXIF identifier representations.
|
|
23
|
+
|
|
24
|
+
The result is copied/frozen without freezing caller-owned IDs. Repeated projection of identical capture/workflow/time/IDs is identical. It has no runtime dependencies, external I/O or mutable-clock/randomness dependency.
|
|
25
|
+
|
|
26
|
+
Historical foundation-only gates (current implementation/evidence and external
|
|
27
|
+
gates are mapped in [Export acceptance](EXPORT_ACCEPTANCE.md)): authoritative same-RAW reconstruction/pairing through #112, stable virtual-sensor DNG interpretation/model identity, canonical reproducibility representation + SHA-256, distinct RAW-data identity/digests, complete Photivra XMP 1.0 mapping, optional DNG/JPEG writers, independently decoded samples/metadata, external editor interoperability, and supported-resolution/memory evidence. C2PA #165 consumes the future complete metadata contract and remains post-V1.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Capture-to-SDR adapter
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.0 candidate / root API 0.116.0**. 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.md).
|
|
4
|
+
|
|
5
|
+
Current integration: [processed camera output](PROCESSED_OUTPUT.md) documents
|
|
6
|
+
the shared preview/export path and explicit plan 0.6.0 post-RAW activation.
|
|
7
|
+
The historical slice descriptions below retain their original scope.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
`calculateCaptureSdr()` connects the authoritative SimulatedCapture/color contracts to the existing SDR renderer. Adapter schema is `0.1.0`; root API advances to `0.98.0`. Existing capture/color/SDR schemas, production plan, package and POC versions are unchanged.
|
|
11
|
+
|
|
12
|
+
Choose `already-transformed` for an exact `linear-srgb-d65` profile/version, RGB channel order and D65 encoding white. Choose `transform` to delegate an explicitly selected XYZ/ideal-camera color and WB operation to `calculateCaptureColorTransform()`. Derived plane/state IDs must be new. No WB estimator runs. Intent-only WB is rejected; an already applied state cannot be transformed again. Applied RGB gains and adopted-white adaptation remain distinct; XYZ diagonal adaptation remains approximation, including the adapter envelope.
|
|
13
|
+
|
|
14
|
+
Input is an inline co-sited three-channel plane, no more than 262,144 samples. Its raster binding, dimensions, reference-white value and source identity are retained. External/oversized planes fail rather than being loaded, truncated, downsampled or silently tiled. The adapter performs no geometric resampling.
|
|
15
|
+
|
|
16
|
+
The result exposes optional color and SDR calculation envelopes separately, with original capture saturation, dynamic-range history and noise realization identity. Rendering exposure/tone/gamut clipping cannot rewrite physical capture. SDR's own saturation field remains `not-consumed`; original capture saturation is a separate upstream diagnostic, never an output-code inference. Display adaptation remains external/unknown.
|
|
17
|
+
|
|
18
|
+
This is #112B, not full #112 closure. It does not execute correction profiles or activate production stages. Corrected planes may retain their explicit upstream transform history; no correction is inferred. #117/#118 execution and #111 ordered production integration require their own bound handoff. #16 remains the serializer owner and must not invent color/WB/quantization semantics.
|
|
19
|
+
|
|
20
|
+
Implementation and fixtures are independently authored orchestration of existing Photivra APIs; no new equation, calibration, third-party material, dependency, service, IO or cost is introduced.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Developer guide
|
|
2
|
+
|
|
3
|
+
This is the entry point for **@photivra/engine 1.0.0 candidate**, root API contract **0.116.0**. The candidate becomes an installable 1.0.0 distribution only after the owner tags and publishes it. Repository `main` may later describe newer development; use a published release's packaged docs or its exact tag for the stable contract. [Release notes and migration](RELEASE_1_0.md) explain the version distinction.
|
|
4
|
+
|
|
5
|
+
Photivra is an Apache-2.0 ESM TypeScript calculation library with no runtime npm dependencies. It exposes explicit units, deterministic data, provenance and bounded scientific approximations. The package supplies no hosted API, renderer installation, UI, commercial camera calibration or automatic agent service. [Photivra's public site](https://photivra.com) is separate from the engine's license; public engine documentation is available here without an application account.
|
|
6
|
+
|
|
7
|
+
## Install and calculate
|
|
8
|
+
|
|
9
|
+
After publication, install `npm install @photivra/engine@1.0.0`. During candidate review, use the verified tarball described in [release preparation](RELEASE_1_0.md).
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { calculateFieldOfView, ENGINE_API_VERSION } from "@photivra/engine";
|
|
13
|
+
|
|
14
|
+
const horizontal = calculateFieldOfView({ focalLengthMm: 50, sensorDimensionMm: 36 });
|
|
15
|
+
console.log(ENGINE_API_VERSION); // 0.116.0: independent root contract identity
|
|
16
|
+
console.log(horizontal.value.degrees); // approximately 39.60, ideal infinity-focus geometry
|
|
17
|
+
console.log(horizontal.provenance); // read assumptions/status with the value
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The root is browser-safe. Supported Node execution/tooling is Node 22.13+ within the maintained 22 line and the maintained 24 line; prefer patched Node 24. The broad manifest minimum does not qualify Node Current/EOL lines. A browser backend must supply the documented ES APIs (including `structuredClone`, typed arrays and Web Crypto where used); a browser-safe import graph is not a promise about every browser version or rendering speed. See [runtime policy](../NODE_SUPPORT.md).
|
|
21
|
+
|
|
22
|
+
Primitive calculations normally return `CalculationResult<T>` with `value`, `provenance` and optional `quality`. Parsers return validated values; plans/snapshots return their independently versioned records; assessments return explicit blockers; paired export returns a Promise because hashing is asynchronous. Do not infer calibrated accuracy from successful parsing, a complete stage graph, a generic tier name or deterministic replay.
|
|
23
|
+
|
|
24
|
+
## Find the operation by scientific task
|
|
25
|
+
|
|
26
|
+
Every row applies to package 1.0.0/root 0.116.0. Direct calculations are synchronous/browser-safe unless the row says otherwise. A listed primitive is not automatically an app feature or supported in every production combination. The [API reference](API_REFERENCE.md) resolves all root exports and exact signatures; the linked guides own equations, inputs, defaults, errors and limits.
|
|
27
|
+
|
|
28
|
+
| Task | Start here / executable evidence | Qualified boundary |
|
|
29
|
+
| --- | --- | --- |
|
|
30
|
+
| FOV, focus, depth of field, subject size | [Usage: field of view](USAGE.md#field-of-view), [physics](PHYSICS_FOUNDATION.md), [quick start](examples/quick-start.mjs) | Ideal paraxial/thin-lens geometry; explicit mm/metres/axes |
|
|
31
|
+
| Aperture, diffraction, sampled PSF | [PSF foundation](PSF_FOUNDATION.md), [usage](USAGE.md#real-lens-psf-profiles-and-complex-pupil-reference) | Shape and throughput separate; explicit support; no inferred commercial calibration |
|
|
32
|
+
| Metering and exposure modes | [Usage: relative metering](USAGE.md#relative-pre-exposure-metering), [API conventions](API_STYLE.md) | Relative pre-exposure linear signal; compensated target before control; ISO does not create photons |
|
|
33
|
+
| Rigid/depth motion and stabilization | [Motion](MOTION_AND_SIGNAL.md), [stabilization](STABILIZATION.md) | Declared constant-motion/generic control models; visibility remains external |
|
|
34
|
+
| Continuous or discrete spectral measures | [Scene/illumination](SCENE_RADIANCE_AND_ILLUMINATION.md) | Continuous dλ in nm versus wavelength-integrated line fractions; `distribute*` preserves quantity domain |
|
|
35
|
+
| Sampling, response validity, photon/electron expectations | [Usage](USAGE.md#sensor-spectral-response), [temporal EQE](SENSOR_EQE_TEMPORAL_EXPOSURE.md) | Exact source-plane/area/profile/wavelength/time bindings; no implicit QE/collection area |
|
|
36
|
+
| Execute declared environment → production RAW → output | [Production envelope](PRODUCTION_ENVIRONMENT_CAPTURE.md), [complete packed example](examples/production-capture.mjs) | Node example loads owned data; engine callback is synchronous; 4,096 native sites / 100,000 provider evaluations |
|
|
37
|
+
| Preserve/reconstruct RAW and develop preview | [RAW envelope](RAW_FRAME_ENVELOPE.md), [processed output](PROCESSED_OUTPUT.md) | Signed shadows, absolute CFA phase, explicit sensor-channel color/WB; rendering does not redraw noise |
|
|
38
|
+
| Pair native CFA DNG with processed JPEG | [Photographic export](PHOTOGRAPHIC_EXPORT.md), [acceptance](EXPORT_ACCEPTANCE.md) | Async Web Crypto; registered Bayer reference; 1:1 output crop; caller saves bytes |
|
|
39
|
+
| Commit capture, ideal virtual-camera color, linear encoding | [Capture](SIMULATED_CAPTURE.md), [ideal color](CAPTURE_COLOR.md), [encoding](LINEAR_CAPTURE_ENCODING.md) | Ideal XYZ encoding differs from approximate sensor-channel development |
|
|
40
|
+
| Generic tiers and correction cost | [Presets](GENERIC_TIER_PRESETS.md), [tier acceptance](TIER_ACCEPTANCE.md), [correction](DIGITAL_OPTICS_FOUNDATION.md) | Versioned owned synthetic assets; no universal quality ranking |
|
|
41
|
+
| Reproduce conformance/performance | [Scientific suite](SCIENTIFIC_CONFORMANCE.md), [performance disposition](V1_PERFORMANCE_DISPOSITION.md) | CI science gates; Node measurements do not establish browser or megapixel performance |
|
|
42
|
+
| Optional local HTTP development transport | [Repository POC](POC_API.md) | Node-only checkout tooling, excluded from root/package; unauthenticated loopback |
|
|
43
|
+
|
|
44
|
+
## Complete packed examples
|
|
45
|
+
|
|
46
|
+
The package includes `docs/examples/quick-start.mjs` and `production-capture.mjs`. In a Node ESM consumer directory with the candidate installed, copy these files and `production-request.json` from `node_modules/@photivra/engine/docs/examples/` into that directory and run them. The quick start asserts independent geometry/exposure invariants. The production example executes the same owned 2×2 narrow-band synthetic fixture used in final conformance through all fourteen production stages and paired byte export, retaining the exact RAW codes and deterministic replay. It writes no files and installs no renderer.
|
|
47
|
+
|
|
48
|
+
The JSON data is explicitly synthetic: uniform angular radiance `1e-9 * (1 + 200t)` W/m²/sr/nm; 540–560 nm band; independently declared 800×600 µm sensitive aperture and package-incident EQE 0.4; registered opening-reference time; fixed seed and generic consumer profiles. This is a controlled regression laboratory, not a real scene, native camera pixel pitch, calibrated color/visibility, PSF transport proof or convergence bound. Production supports only the envelope linked above. The tiny DNG demonstrates byte serialization/lineage; external-reader acceptance uses separate larger fixtures.
|
|
49
|
+
|
|
50
|
+
The [Usage Guide](USAGE.md) includes both complete snippets and clearly marked composition fragments that require earlier validated bindings. The release checker typechecks and executes complete importing snippets against the packed artifact; it inventories fragment dependencies without pretending missing calibration data exists.
|
|
51
|
+
|
|
52
|
+
## Contracts and support
|
|
53
|
+
|
|
54
|
+
Use only `import ... from "@photivra/engine"`. Deep paths and repository transport/scripts/test helpers are unsupported. TypeScript declarations describe shape; parse untrusted JSON before scientific execution. Keep native +Y-down, optical +Y-up and half-open raster rectangles explicit. Preserve domain distinctions between radiance, irradiance, rates, expected counts, realized charge, RAW codes and processed SDR.
|
|
55
|
+
|
|
56
|
+
Malformed configurations/non-finite values throw the established domain errors. Scientifically incomplete but well-formed assessments/plans expose structured blockers. Trusted provider callback exceptions propagate; no silent fallback renderer runs. The exact return contract and independent model versions are visible in the reference and declarations.
|
|
57
|
+
|
|
58
|
+
See [provenance](PROVENANCE.md), [license](../LICENSE), [NOTICE](../NOTICE), [third-party inventory](../THIRD_PARTY.md), [contributing](../CONTRIBUTING.md) and [security reporting](../SECURITY.md). Engine code/docs do not license the commercial application or its private assets. Report reproducible engine defects through [public issues](https://github.com/Photivra/photivra/issues).
|
|
59
|
+
|
|
60
|
+
Website navigation/documentation hosting belongs to [the app-side discovery ticket #45](https://github.com/Photivra/photivra-apps/issues/45), with navigation #298 and environments #300. Handoff: link the public engine repository, this developer guide, the eventual verified npm 1.0.0 package and capability examples from the public site. No unpublished `/developers` destination is linked here. Website launch is not an engine release prerequisite; access to the site returned HTTP 403 during this audit, so its content/navigation was not verified.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Stray light and digital lens correction foundations
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.0 candidate / root API 0.116.0**. 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.md).
|
|
4
|
+
|
|
5
|
+
Issues #114, #118 and #117 add standalone browser-safe primitives. They do not enable a production-plan stage, change the POC, or supply a calibrated camera/lens preset. The public root API advances from 0.94.0 to 0.95.0; each new profile/prepared-map schema is 0.1.0. Package, POC, production-plan and PSF versions are unchanged. This branch incorporates merged polygon-diffraction PR #157 and reconciles the root API increment with that predecessor.
|
|
6
|
+
|
|
7
|
+
## Applicability and evidence
|
|
8
|
+
|
|
9
|
+
Stray-light and correction profiles bind an exact generic body/lens identity/version, focal length, aperture, finite focus distance, still/video mode, output dimensions, frame rate and stabilization mode. A mismatch fails; no interpolation or extrapolation is inferred. Still frameRateHz is zero; video is positive. Infinity focus, interpolated zoom/focus states and temporal crop trajectories require future schemas.
|
|
10
|
+
|
|
11
|
+
Only generic-parametric evidence is accepted. Its source records use the existing EvidenceProvenance parser, and its basis and residualNote must be explicit. Parameters can be independently authored synthetic approximations; source metadata does not establish measured accuracy. Calibrated profiles and invented quantified uncertainty are not accepted by these first parsers. No tier or manufacturer identity determines coefficients.
|
|
12
|
+
|
|
13
|
+
## Additive stray-light irradiance
|
|
14
|
+
|
|
15
|
+
calculateLensStrayLightIrradiance() evaluates one instant, image-plane point and exact air/vacuum wavelength slice. Source field angles use +X right, +Y up, in degrees; the declared domain is the Euclidean norm of these two field-angle coordinates, not a spherical great-circle angle. The image plane uses millimetres about the optical axis. Off-frame sources remain inputs even when their primary images lie outside the active crop.
|
|
16
|
+
|
|
17
|
+
Each source provides incident spectral power in W/nm integrated over the profile's declared reference entrance area. The caller must derive this power from source illumination and that area; it is neither pixel brightness nor W/m². admittedFraction is an explicit per-source/path admission result. A future physical hood/flag solver may provide it, but a global hood slider is not inferred.
|
|
18
|
+
|
|
19
|
+
Ghost and veil responses have separate identities and outputs. Both use independently parameterized, infinite-plane normalized Gaussian templates. Centroids are explicit affine responses to source field angles; sigma is in mm. A response's power fraction is F(0) × (1 + angularSlope × rho²), with rho equal to source coordinate norm divided by the declared maximum. Nonnegative fractions and total response fractions at both angular endpoints are validated. Since their sum is affine in rho², this bounds the whole envelope. This bounds stray paths only; the caller must budget primary transmission and stray power together when asserting whole-system energy conservation.
|
|
20
|
+
|
|
21
|
+
The normalized template density is exp(−distance²/(2 sigma²))/(2π sigma²), in 1/mm². Multiplying by 10⁶ converts to 1/m². Source power times admitted fraction times response fraction times this density gives W/m²/nm. A finite frame never renormalizes it. This does not trace lens surfaces or infer a branded ghost signature.
|
|
22
|
+
|
|
23
|
+
The returned totalSpectralIrradianceWPerM2PerNm is primary plus ghost plus veil, ready for the same downstream spectral/spatial/exposure integration as other incident light. Saturation and sensor noise occur after addition. The integration test uses the existing photon-energy, photoelectron and Poisson/read-noise primitives with declared exposure/area/QE; it does not establish radiometry-readiness for a real device. meterDomain explicitly selects primary-only or primary-plus-stray.
|
|
24
|
+
|
|
25
|
+
Disabled evaluation preserves the primary irradiance exactly. Profiles remain validated even when disabled. Diffraction, primary PSFs and contamination are excluded. A sensor-lens-reflections declaration binds the combined body/lens state explicitly. One static instant does not approximate an exposure average: callers must evaluate time and wavelength quadrature separately. No display/cosmetic flare mode is supplied.
|
|
26
|
+
|
|
27
|
+
## One mapping and honest sampling
|
|
28
|
+
|
|
29
|
+
prepareGeometricMapping() stores canonical transforms, a deterministic semantic key and contiguous image-domain groups. It clones parsed transform data. The returned record is serializable and is revalidated/reprepared on consumption, so callers cannot bypass validation by mutating a cache record.
|
|
30
|
+
|
|
31
|
+
Transforms are listed in destination-to-source order. Affine maps represent breathing, rotation, crop and digital stabilization with a full matrix and offset. Radial maps reuse the existing monotonic radial-distortion evaluator; for correction the destination ideal coordinate maps to physical distorted source data. A declared correction polynomial is independent from a physical optical polynomial and can intentionally leave residual distortion. No implicit correction strength or ideal-lens inversion is assumed.
|
|
32
|
+
|
|
33
|
+
Raw-channel, reconstructed-linear and processed-output domains are barriers. Compatible contiguous transforms can share a resampling pass; incompatible groups are retained by the prepared mapping but a fused pixel pass rejects them. Prepared maps are frame/time specific in seconds from exposure start; no trajectory averaging or full-video crop guarantee is implied.
|
|
34
|
+
|
|
35
|
+
calculateComposedGeometricMapping() emits each component's local Jacobian and the full product d(source mm)/d(destination mm), determinant, singular values and anisotropy. calculateForwardGeometricMapping() reverses the same authoritative mapping for focus, meter and overlay coordinates. No app should independently reverse-engineer the warp.
|
|
36
|
+
|
|
37
|
+
GeometricRaster describes square-pitch pixel centers on an optical plane: +X right, +Y up, row order down. Raster orientation/crop is an explicit affine transform rather than an implicit axis swap. The maximum raster is 65,536 samples, maximum composed transform count 32. This is a bounded foundation, not a megapixel production renderer.
|
|
38
|
+
|
|
39
|
+
calculateGeometricSamplingPlan() builds exact support at every destination pixel center for the declared nearest/bilinear filter. It preserves a mask and finds the largest all-valid axis-aligned pixel rectangle using one composed map, with deterministic row/stack tie-breaking. Opposing transforms therefore do not spend the crop margin twice. These claims concern this sampling lattice/filter; the mask does not certify continuous between-pixel support. Each component's intermediate source point and derivative remain available for feature-specific margin inspection; intermediate points are not separately cropped.
|
|
40
|
+
|
|
41
|
+
The plan reports physical captured edge FOV from the declared physical projection distance and source bounds. It separately reports the angular envelope of retained mapped pixel-center rays. That envelope is deliberately not a continuous retained edge FOV. Off-center capture is preserved.
|
|
42
|
+
|
|
43
|
+
Singular values multiplied by destination/source pixel pitch diagnose local sampling compression. Any value above one requires declared source-prefiltered data. With antialias=none the plan remains inspectable but cannot execute a compressing resample. The caller owns the prefilter and must provide data appropriate to the maximum footprint; this module does not implement or certify that prefilter. The filter/profile ID remains separate from mapping identity.
|
|
44
|
+
|
|
45
|
+
calculateGeometricResampling() performs one nearest or bilinear scalar pass, emits null for invalid support, and never extends/clones/mirrors edges. Exact boundary centers do not require nonexistent bilinear neighbors. It warps already-formed blur/bokeh and noise. Stretching cannot create optical detail or recalculate a better PSF. The full Jacobian explains local transformed blur and sampling density.
|
|
46
|
+
|
|
47
|
+
## Generic camera correction profiles
|
|
48
|
+
|
|
49
|
+
resolveLensCorrectionPlan() resolves each component independently in profile application order. It records toggled/default, mandatory, stabilization-required and component-dependency reasons. Dependencies refer only to earlier components, preventing cycles. Required components may override a dependent component's requested Off with an explicit component-dependency reason. Mandatory camera corrections cannot be turned Off through a camera setting; reference-bypass is a separately labeled educational comparison.
|
|
50
|
+
|
|
51
|
+
Each component declares its image domain, identity/version, residual limits, availability and dependencies. Supported families are geometry, lateral channel registration and scalar peripheral illumination. Color shading, longitudinal CA and diffraction/deconvolution restoration are distinct unsupported families. RAW-like output preserves metadata/intent without baking; processed output bakes supported downstream operations.
|
|
52
|
+
|
|
53
|
+
calculatePeripheralIlluminationCorrection() uses the existing positive bounded illumination profile and gain = throughput^(−strength), with strength in [0,1]. Its signal and variance gains are g and g²; variance is explicitly pre-clip. This does not restore photons or authoritative capture SNR. Clipping is reported. Residual gain strength does not change physical lens throughput.
|
|
54
|
+
|
|
55
|
+
calculateLensCorrectedCapture() is a bounded reconstructed-linear RGB executor. The capture carries its camera/lens/acquisition state and must match the profile binding. Capture ID, time and noise realization ID are retained; physical source arrays are not mutated. Common geometry and per-channel lateral CA are composed in inverse application order and sampled once per channel. All channel masks intersect before output, so a missing channel never fabricates a valid color. A joint crop is resolved over that intersection, with per-channel sampling/crop diagnostics also inspectable.
|
|
56
|
+
|
|
57
|
+
The executor supports geometry/CA followed by gain. It rejects geometry across an intervening gain, or raw/processed domains, instead of silently reordering stages. Other consumers must honor the resolved profile order through production #111/#112. Gain is defined on corrected output coordinates in this executor; it does not silently reuse an upstream physical field position. RAW-like metadata-only output preserves original capture geometry and samples. For processed output, Off/reference-bypass disables correction transforms and gains, while an explicit destination crop or sampling lattice still applies through the neutral geometric map. An identical source/destination lattice preserves samples without resampling; changed lattices expose filter/support/crop and prefilter diagnostics as usual. Output dimensions must match the exact profile binding. This revises the unmerged draft's earlier unconditional Off passthrough; no released API is changed.
|
|
58
|
+
|
|
59
|
+
## Verification and provenance
|
|
60
|
+
|
|
61
|
+
Tests independently check Gaussian power integration, source linearity/admission, off-frame response, sensor/noise primitive consumption, exact applicability, Jacobian centered differences, inverse/forward round trips, all quarter-turn orientations and off-center capture, anisotropy, linear-ramp interpolation, missing support, joint crop, prefilter gating, channel registration, RAW intent, mandatory/bypass/dependency resolution, residual gain/noise/clipping and already-blurred image stretch.
|
|
62
|
+
|
|
63
|
+
Implementation/test parameters and equations were independently authored. No third-party source code, calibration data, numerical tables or protected prose was incorporated. Factual research:
|
|
64
|
+
|
|
65
|
+
- [ZEISS, Taking care of the unwanted light](https://lenspire.zeiss.com/cine/en/article/taking-care-of-the-unwanted-light): reflection ghosts and unwanted light motivate separate stray-path ownership.
|
|
66
|
+
- [Canon EOS R5 Mark II manual, Lens Aberration Correction](https://cam.start.canon/en/C017/manual/html/UG-03_Shooting-1_0220.html): peripheral correction noise and distortion crop/resolution limitations motivate downstream cost reporting.
|
|
67
|
+
- [Sony ILCE-1M2 guide, Lens Compensation](https://helpguide.sony.net/ilc/2440/v1/en/contents/0414M_lens_comp.html): component controls, forced distortion and breathing angle/quality limitations motivate resolved states and explicit costs.
|
|
68
|
+
|
|
69
|
+
These references justify scope and distinctions, not the synthetic coefficients. AI-assisted drafts still require substantive human scientific/provenance review and contributor DCO certification under CONTRIBUTING.md and PROVENANCE.md before inclusion.
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Executed environment capture to native RAW
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.0 candidate / root API 0.116.0**. 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.md).
|
|
4
|
+
|
|
5
|
+
`calculateEnvironmentSensorPhotoSignal()` executes one destination site's
|
|
6
|
+
bounded environment exposure. `simulateEnvironmentSensorRawFrame()` applies that
|
|
7
|
+
path to a complete reference native frame and hands its photo/dark expectations
|
|
8
|
+
to the existing charge, capacity, seeded noise and ADC producer. Its resulting
|
|
9
|
+
RAW frame can be reconstructed and exported with the existing paired DNG/JPEG
|
|
10
|
+
API. These are additive execution APIs; they do not activate the general
|
|
11
|
+
production-plan capability registry or implement surface rendering.
|
|
12
|
+
|
|
13
|
+
## Execution and ownership
|
|
14
|
+
|
|
15
|
+
The caller supplies a synchronous `evaluateRadiance(request)` function that
|
|
16
|
+
returns `SceneRadianceEvaluationResult`. The engine generates each request,
|
|
17
|
+
invokes that function and validates the result. Invocation is established;
|
|
18
|
+
physical correctness of the provider's transport is not. The engine performs no
|
|
19
|
+
file/network access and installs no renderer or new runtime dependency.
|
|
20
|
+
|
|
21
|
+
For every local shutter midpoint, spectral midpoint and pre-AA/aperture support:
|
|
22
|
+
|
|
23
|
+
1. Resolve the optional sampled lens PSF at the destination/wavelength.
|
|
24
|
+
2. Enumerate its complete inverse support, including zero-weight taps, or use
|
|
25
|
+
the destination point when PSF is explicitly omitted.
|
|
26
|
+
3. Convert native +Y-down to image-plane +Y-up and reuse focus-aware ideal
|
|
27
|
+
projection plus analytic inverse camera rotation to derive each environment
|
|
28
|
+
look direction. Request propagation toward camera is its negative.
|
|
29
|
+
4. Invoke the provider separately at each source point, wavelength and time.
|
|
30
|
+
Validate identity, units, basis, evidence and scene/profile bindings.
|
|
31
|
+
5. Apply the existing paraxial radiance-to-irradiance bridge at that source point.
|
|
32
|
+
Optional normalized PSF shape redistributes those physical irradiances once.
|
|
33
|
+
6. Apply sensor response applicability/range and EQE separately at each instant,
|
|
34
|
+
then integrate with seconds-valued uniform midpoint measures.
|
|
35
|
+
7. Commit a temporal photo signal. Full-frame execution computes dark charge
|
|
36
|
+
for the exact same event and reuses the existing completeness, capacity,
|
|
37
|
+
Poisson, signed read-noise and ADC contracts.
|
|
38
|
+
|
|
39
|
+
The destination site's channel owns every source tap; source coordinates do not
|
|
40
|
+
reassign CFA phase. No crop clipping, missing-support renormalization, averaging
|
|
41
|
+
of scene light before response validation, duplicated area, exposure duration or
|
|
42
|
+
throughput is introduced. Source points outside active capture remain valid if
|
|
43
|
+
the declared optical/provider envelope covers them.
|
|
44
|
+
|
|
45
|
+
## Declared operating envelope
|
|
46
|
+
|
|
47
|
+
- Environment-only scene targets; no surface intersection or occlusion solver.
|
|
48
|
+
- Ideal rectilinear, focus-aware projection and constant-axis pure rotation in
|
|
49
|
+
exposure-start camera axes. The existing forward-reference-hemisphere limit
|
|
50
|
+
remains. Translation/parallax, world pose, breathing and distortion are absent.
|
|
51
|
+
- Wavelength-resolved radiance with explicit air/vacuum basis. Any air photon
|
|
52
|
+
energy context remains the existing sensor contract's responsibility.
|
|
53
|
+
- Explicit unity field throughput with evidence and a limitation. Spatial
|
|
54
|
+
vignetting is not silently synthesized. Existing lens transmission/front-filter
|
|
55
|
+
inputs remain upstream of normalized PSF shape.
|
|
56
|
+
- PSF is explicitly `not-applied` with evidence/limitation or `sampled-local`
|
|
57
|
+
with the existing evidence-backed wavelength basis and local spatial model.
|
|
58
|
+
Focal length, aperture and focus must match the optical bridge. The optional
|
|
59
|
+
PSF remains a destination-local shift-invariance approximation. Its separate
|
|
60
|
+
relative pupil throughput is reported by child diagnostics and remains
|
|
61
|
+
unapplied; no global energy-conservation proof is claimed.
|
|
62
|
+
- One-to-one native/color-site timing registration and 1..256 local midpoints.
|
|
63
|
+
No temporal stationarity declaration is inferred.
|
|
64
|
+
- At most 100,000 provider evaluations per site and per full frame, counted
|
|
65
|
+
before callbacks. The reference RAW producer's 4,096 native-site ceiling also
|
|
66
|
+
remains. This path does not claim 24/45/60 MP support.
|
|
67
|
+
|
|
68
|
+
## Frame commitment
|
|
69
|
+
|
|
70
|
+
`simulateEnvironmentSensorRawFrame()` requires full native row-major site order,
|
|
71
|
+
including sites outside an active/output crop. Each site's aperture geometry,
|
|
72
|
+
color profile, binding profile and complete shutter declaration must match the
|
|
73
|
+
committed frame. Physical focal length, aperture and focus must match too.
|
|
74
|
+
Scene/provider declarations, optical/filter state, motion, PSF selection and
|
|
75
|
+
field-throughput declarations must be shared across sites; a single frame cannot
|
|
76
|
+
silently combine different camera/scene models.
|
|
77
|
+
Evidence/profile comparisons use canonical field ordering; object property
|
|
78
|
+
insertion order does not change a binding.
|
|
79
|
+
|
|
80
|
+
`sceneBinding` explicitly relates the capture's `sceneStateId` to the provider's
|
|
81
|
+
`sceneId` with evidence. This first adapter supports committed `sceneTimeSeconds`
|
|
82
|
+
zero at the first opening boundary. It cannot silently add an arbitrary scene
|
|
83
|
+
clock offset. Every site's `temporalIntegrationId` must be distinct; generated
|
|
84
|
+
request IDs append temporal/node/tap identity and pass the public-ID parser.
|
|
85
|
+
|
|
86
|
+
The shared exposure schedule owns each site's actual start/end and duration.
|
|
87
|
+
Rolling openings/closings are not replaced by global midpoints or readout time.
|
|
88
|
+
Completeness and any additional charge declarations must already cover that exact
|
|
89
|
+
event; the composer does not rewrite them to make a mismatched declaration pass.
|
|
90
|
+
Readout regime and ISO remain separately declared through the existing producer.
|
|
91
|
+
|
|
92
|
+
## Provider contract and failure
|
|
93
|
+
|
|
94
|
+
Requests are owned, recursively frozen plain data. Their nested target cannot be
|
|
95
|
+
mutated to change geometry or identity. Caller input data is snapshotted before
|
|
96
|
+
execution; provider results are parsed into owned values immediately. The same
|
|
97
|
+
provider and seed produce the same output only if supplied provider code is
|
|
98
|
+
itself deterministic. The engine does not certify caller code determinism.
|
|
99
|
+
|
|
100
|
+
Promises, malformed results, stale IDs, negative radiance, incompatible basis,
|
|
101
|
+
provider exceptions and mutation attempts reject. No partial successful result
|
|
102
|
+
or RAW frame is returned. This is not a transaction over arbitrary callback side
|
|
103
|
+
effects: callbacks already invoked cannot be undone. Use pure local evaluators;
|
|
104
|
+
no remote calls, persistence or external side effects are provided by this API.
|
|
105
|
+
|
|
106
|
+
Geometric coverage, PSF evidence and aggregate work are preflighted before any
|
|
107
|
+
callback. Provider result, optical validity, response range and downstream
|
|
108
|
+
charge/readout validity are checked during execution. A late validation failure
|
|
109
|
+
can therefore follow earlier provider calls. The API does not claim that every
|
|
110
|
+
possible invalid input is rejected before supplied code runs.
|
|
111
|
+
|
|
112
|
+
Temporal illumination profile bindings are preserved when declared by the
|
|
113
|
+
provider. They describe source behavior; invocation and parsing do not establish
|
|
114
|
+
that supplied code obeys its own transport/source declaration.
|
|
115
|
+
|
|
116
|
+
## Paired export handoff
|
|
117
|
+
|
|
118
|
+
Use the actual produced frame as the reconstruction input. This complete helper
|
|
119
|
+
keeps reconstruction configuration explicit and feeds both outputs from the
|
|
120
|
+
same realized native RAW codes:
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
import {
|
|
124
|
+
simulateEnvironmentSensorRawFrame,
|
|
125
|
+
createPhotographicExportPair,
|
|
126
|
+
type SimulateEnvironmentSensorRawFrameInput,
|
|
127
|
+
type PhotographicExportInput,
|
|
128
|
+
type PhotographicExportPair
|
|
129
|
+
} from "@photivra/engine";
|
|
130
|
+
|
|
131
|
+
type OutputConfiguration = Omit<PhotographicExportInput, "reconstruction"> & {
|
|
132
|
+
reconstruction: Omit<PhotographicExportInput["reconstruction"], "rawFrame">;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
export async function captureEnvironmentPair(
|
|
136
|
+
input: SimulateEnvironmentSensorRawFrameInput,
|
|
137
|
+
output: OutputConfiguration
|
|
138
|
+
): Promise<PhotographicExportPair> {
|
|
139
|
+
const capture = simulateEnvironmentSensorRawFrame(input);
|
|
140
|
+
return createPhotographicExportPair({
|
|
141
|
+
...output,
|
|
142
|
+
reconstruction: {
|
|
143
|
+
...output.reconstruction,
|
|
144
|
+
rawFrame: capture.value.raw.value.frame
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Color development, WB, correction, rendering, output crop/orientation, metadata
|
|
151
|
+
and file encoding retain their existing explicit ownership. The RAW path does
|
|
152
|
+
not bake JPEG processing into sensor codes. The export's independent-reader/editor
|
|
153
|
+
acceptance remains unchanged.
|
|
154
|
+
|
|
155
|
+
## Evidence and verification
|
|
156
|
+
|
|
157
|
+
The tests use owned synthetic profiles and an explicitly declared illumination
|
|
158
|
+
ramp, not licensed commercial calibration or measured scene data. Independent SI
|
|
159
|
+
expectations check the optical factor, wavelength measures, geometric area,
|
|
160
|
+
photon energy, EQE and temporal integral. Angular gradients exercise distinct
|
|
161
|
+
rotated PSF rays and asymmetric kernel weighting. Global and rolling frame tests
|
|
162
|
+
exercise optional PSF through dark/noise/ADC and deterministic paired export;
|
|
163
|
+
decoded DNG strips equal the exact realized native codes.
|
|
164
|
+
|
|
165
|
+
Malformed preflight, aggregate budgets, stale provider returns, callback mutation,
|
|
166
|
+
Promise returns, provider errors and frame commitment drift fail closed. Existing
|
|
167
|
+
PSF regressions continue using the same fixture and shared inverse-support rule.
|
|
168
|
+
|
|
169
|
+
Results distinguish `providerCallbackExecuted` from `providerTransportVerified`.
|
|
170
|
+
Legacy child origin flags remain conservative because their older contracts do
|
|
171
|
+
not carry the new execution evidence. No calibrated accuracy, combined
|
|
172
|
+
uncertainty, quadrature/support convergence, general visibility, production-plan
|
|
173
|
+
activation or full-resolution/editor readiness is inferred.
|
|
174
|
+
|
|
175
|
+
Root engine API **0.114.0**, new model envelopes **0.1.0**. npm/POC/schema versions
|
|
176
|
+
remain independent. This is partial #16/#178 integration coordinated with #112;
|
|
177
|
+
V1 remains **25/32**. #131 final science conformance and #180 documentation/1.0
|
|
178
|
+
preparation remain separate closure work.
|
|
179
|
+
|
|
180
|
+
## Authoritative production consumer
|
|
181
|
+
|
|
182
|
+
Plan 0.7.0 can now invoke this existing adapter through an explicitly committed
|
|
183
|
+
`environmentCapture` declaration. See [production environment capture](PRODUCTION_ENVIRONMENT_CAPTURE.md).
|
|
184
|
+
The standalone adapter retains its conservative `productionPlanActivated: false`
|
|
185
|
+
field: it cannot know whether a parent composer called it. The parent plan's
|
|
186
|
+
actual stage results and executed lineage establish the bounded activation;
|
|
187
|
+
no child source-truth flag is overwritten.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Simulated Sensor RAW DNG / JPEG acceptance
|
|
2
|
+
|
|
3
|
+
Release context: **package 1.0.0 candidate / root API 0.116.0**. 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.md).
|
|
4
|
+
|
|
5
|
+
This record separates implemented export behavior, reproducible independent
|
|
6
|
+
checks and external application acceptance for #16. The files are synthetic
|
|
7
|
+
Photivra captures, never photographs from a physical commercial camera.
|
|
8
|
+
|
|
9
|
+
## Current implemented boundary
|
|
10
|
+
|
|
11
|
+
`simulateEnvironmentSensorRawFrame()` executes supplied analytic environment
|
|
12
|
+
queries through the existing optics, wavelength/EQE, local temporal exposure,
|
|
13
|
+
dark/charge/capacity, seeded shot/read noise and ADC pipeline. Its exact native
|
|
14
|
+
post-ADC CFA frame feeds `createPhotographicExportPair()` and the shared #112
|
|
15
|
+
processed path. The serializer does not reconstruct the sensor simulation.
|
|
16
|
+
Attached manual RAW fixtures remain valid low-level serializer inputs, but are
|
|
17
|
+
not the evidence used here for producer-origin acceptance.
|
|
18
|
+
|
|
19
|
+
Provider transport, visibility, calibration and complete production-stage
|
|
20
|
+
activation are explicitly unverified. Source evaluation and authoritative
|
|
21
|
+
sensor-code production are executed; these are different claims. Bounded production integration is now merged in #178; provider transport and unsupported combinations remain explicit limits, not properties established by a DNG file. Child diagnostics remain accessible in the engine result.
|
|
22
|
+
|
|
23
|
+
The public export API requires explicit profiles, WB/rendering policy, identity,
|
|
24
|
+
workflow and event time. It copies validated data before asynchronous hashing.
|
|
25
|
+
The commercial app and calling runtime own file downloads. There is no file IO,
|
|
26
|
+
wall-clock sampling, service, new runtime dependency, Adobe SDK or competing
|
|
27
|
+
writer in the engine.
|
|
28
|
+
|
|
29
|
+
## Reproduce the acceptance files
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
node scripts/generate-producer-export-acceptance.mjs OUTPUT_DIRECTORY
|
|
33
|
+
python scripts/verify-producer-export-acceptance.py OUTPUT_DIRECTORY
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The generator uses the existing repository dev compiler to compile only its
|
|
37
|
+
entry point and imported engine/owned fixture modules in a disposable directory.
|
|
38
|
+
It cleans that directory on success or failure. It is not an engine dependency
|
|
39
|
+
or package export. Run from a checkout with its normal dev dependencies installed.
|
|
40
|
+
The Python verifier requires independently installed Pillow, lxml and LibRaw.
|
|
41
|
+
Missing required independent tooling is a failure, not a passing skipped check.
|
|
42
|
+
|
|
43
|
+
Five 72×48 native pairs are committed in
|
|
44
|
+
`test/fixtures/producer-export-acceptance/`: landscape, both portrait directions,
|
|
45
|
+
inverted landscape and manual WB. Each represents an explicitly identified
|
|
46
|
+
shutter event with distinct artifact IDs; the controlled cases use the same seed
|
|
47
|
+
and physical/noise inputs, so orientation and metadata-WB variations preserve
|
|
48
|
+
all native codes and RAW-data identity. Portrait JPEGs are 48×72, upright JPEG
|
|
49
|
+
orientation is 1, and DNG retains native 72×48 pixels with its orientation tag.
|
|
50
|
+
|
|
51
|
+
These are explicit #130-derived camera/exposure/seed/units variants. The source
|
|
52
|
+
is an owned three-zone analytic angular environment at 400–500 nm, not the
|
|
53
|
+
canonical Lambertian target or a measured calibration. Optical transmission,
|
|
54
|
+
EQE, uniform aperture response, absent AA/PSF and direct noiseless source
|
|
55
|
+
radiance remain named approximations. Physical sampling uses square 500 µm
|
|
56
|
+
pitch, a declared 0.8×0.6-pitch sensitive aperture, one aperture midpoint and
|
|
57
|
+
one shutter midpoint, with two spectral nodes. Each capture executes 6,912
|
|
58
|
+
provider queries. This is bounded reference evidence, not native camera pixel
|
|
59
|
+
pitch, high-resolution output, measured accuracy or convergence evidence.
|
|
60
|
+
|
|
61
|
+
The actual generated samples include signed-noise shadows below BlackLevel 64,
|
|
62
|
+
physical clipping and ADC clipping at WhiteLevel 1023. Original RAW integers,
|
|
63
|
+
not an RGB screenshot or later tone curve, supply the DNG. The manual-WB case
|
|
64
|
+
changes AsShotNeutral and JPEG development, while preserving those RAW codes.
|
|
65
|
+
The manifest records exact file SHA-256, RAW-data identity, expected codes/RGB,
|
|
66
|
+
producer model/version/query count, clipping counts and bounded elapsed/heap
|
|
67
|
+
observations. Regeneration can change incidental measurement fields; image
|
|
68
|
+
samples/file hashes remain deterministic for the pinned engine/policy.
|
|
69
|
+
|
|
70
|
+
## Independent checks
|
|
71
|
+
|
|
72
|
+
The optional verifier uses Pillow's TIFF directory reader and independent strip
|
|
73
|
+
unpacking for exact RAW codes; Pillow decodes JPEG and standard EXIF. DOM/Expat
|
|
74
|
+
and lxml/libxml2 independently agree on XMP attributes. LibRaw's documented
|
|
75
|
+
opaque-handle C API opens, unpacks and renders every DNG, independently verifies
|
|
76
|
+
native dimensions/white code and reads camera-neutral WB gains. Its emitted
|
|
77
|
+
PPM is decoded by Pillow to verify all oriented output dimensions.
|
|
78
|
+
|
|
79
|
+
LibRaw API reference: https://www.libraw.org/docs/API-C.html. No LibRaw source,
|
|
80
|
+
private structure layout or version-dependent pointer offset is incorporated.
|
|
81
|
+
Its version is recorded in `independent-validation.json`. Different demosaic,
|
|
82
|
+
tone or display algorithms are not expected to produce pixel-identical images.
|
|
83
|
+
|
|
84
|
+
Standard capture metadata agree across DNG/JPEG; shared CaptureID/hash remain
|
|
85
|
+
separate from per-resource IDs and native RAW-data identity. Privacy checks
|
|
86
|
+
reject false camera/GPS/serial/host/creator/AI assertions through the existing
|
|
87
|
+
strict metadata contract and verify selected forbidden tags are absent in files.
|
|
88
|
+
Advanced noise hints, calibration matrices/signatures, rights fields and original
|
|
89
|
+
RAW-resource lineage are omitted when no justified mapping exists. See
|
|
90
|
+
[photographic export](PHOTOGRAPHIC_EXPORT.md) and
|
|
91
|
+
[capture metadata](CAPTURE_EXPORT_METADATA.md) for the existing field contract.
|
|
92
|
+
|
|
93
|
+
## Supported sizes and memory semantics
|
|
94
|
+
|
|
95
|
+
All existing stage limits remain unchanged: the reference producer,
|
|
96
|
+
reconstruction and full-native export path permit at most **4,096 native sites**.
|
|
97
|
+
The structural attachment ceiling alone does not authorize image execution.
|
|
98
|
+
No 24/45/60 MP export, streaming or resampling is claimed. A tiny output crop
|
|
99
|
+
cannot evade full-native counting. See [RAW frame envelope](RAW_FRAME_ENVELOPE.md)
|
|
100
|
+
and its complete-edge regression tests.
|
|
101
|
+
|
|
102
|
+
The generator also records 24/45/60 MP unsupported-size preflight requests with
|
|
103
|
+
an empty site payload. They reject before any provider invocation or large image
|
|
104
|
+
allocation. These are measured rejections with deliberately unsupported/missing
|
|
105
|
+
coverage, not typical-resolution memory/performance benchmarks. Before/after
|
|
106
|
+
heap is not peak memory; measured timings are informational. The explicit
|
|
107
|
+
bounded support declaration satisfies #16's supported-limit option without
|
|
108
|
+
claiming high-resolution processing or silently raising safety budgets.
|
|
109
|
+
|
|
110
|
+
## Closure map
|
|
111
|
+
|
|
112
|
+
| Requirement | Implementation / evidence | Status |
|
|
113
|
+
| --- | --- | --- |
|
|
114
|
+
| True native post-ADC CFA RAW; exact lossless codes; effective ADC/black/white consistency; no baked processing | `sensor-raw-producer.test.ts`, `raw-output-conformance.test.ts`, producer-derived files and independent verifier | Implemented / independently checked |
|
|
115
|
+
| RAW directly from simulated capture; ISO/gain upstream; same-capture standalone JPEG | `environment-raw-integration.test.ts`, `raw-output-conformance.test.ts`, generated producer pairs | Implemented / bounded origin evidence |
|
|
116
|
+
| Shared capture/provenance/hash; distinct resource/RAW IDs; truthful Photivra EXIF/XMP/IPTC | `capture-export-metadata.test.ts`, `photographic-export.test.ts`, independent file inspection | Implemented / checked |
|
|
117
|
+
| No generative-AI, real-camera, GPS/serial/host/path or fabricated creator/rights claims | Strict input projection and existing negative tests; generated file inspection | Implemented / checked |
|
|
118
|
+
| Native CFA phase, active/default crop, aspect and all orientations | `photographic-export.test.ts`, four generated orientations and LibRaw rendered dimensions | Implemented / checked |
|
|
119
|
+
| As-shot WB metadata does not rewrite RAW; virtual color interpretation is explicit | `photographic-export-correction.test.ts`, same-code manual-WB case and LibRaw neutral-gain interpretation | Implemented / approximate color basis |
|
|
120
|
+
| Deterministic fixture/code/critical metadata acceptance | Committed manifests, hashes and independent TIFF/JPEG/XML/LibRaw verification | Checked |
|
|
121
|
+
| Size/memory boundary and optional runtime/package surface | Existing 4,096-native-site envelope, unsupported-size records, browser/package gates | Explicit supported limits |
|
|
122
|
+
| Adobe RAW interpretation plus independent RAW reader | LibRaw all five pairs; owner Lightroom 9.6 screenshots cover four orientations/as-shot and usable exposure/WB | Reviewed bounded acceptance |
|
|
123
|
+
| JPEG independent decoder/editor/browser acceptance | Pillow all five pairs; owner Photoshop 2026/Chrome landscape screenshots | Reviewed bounded acceptance |
|
|
124
|
+
| Provenance/license review | Existing Apache/DNG notices, owned fixtures and no new dependency; AI-assisted contribution | Owner approved and signed PR #201 |
|
|
125
|
+
| Accurate simulated-RAW documentation | This record and existing metadata/export/frame documentation | Reviewed and merged; reconciled for 1.0 |
|
|
126
|
+
|
|
127
|
+
## Recorded owner external acceptance — 2026-10-02
|
|
128
|
+
|
|
129
|
+
[Reviewed PR #201](https://github.com/Photivra/photivra/pull/201) records owner-supplied screenshots: Lightroom 9.6 (build 20260923-1659-a32d844) opens landscape DNG at 72×48, both portraits at 48×72 and inverted landscape at 72×48. Exposure +2.34 brightens the landscape; WB at 6500 K/Tint −78 visibly changes the midtone band. The manual-WB thumbnail uses As Shot and shows a distinct warm band; Adobe's displayed 50,000 K/Tint +28 is its interpretation of synthetic gains, not measured color-temperature accuracy. Photoshop 2026 and Chrome render the landscape JPEG at 72×48.
|
|
130
|
+
|
|
131
|
+
Independent automated decoding covers all five pairs. User-Mac file hashes and exact Photoshop/Chrome builds were not supplied/reverified; editor/browser screenshots cover the landscape JPEG, not every JPEG variant. These limits are preserved. The committed independent report and `external-review.template.json` describe the earlier automated-only checkpoint; template booleans are not new acceptance evidence. PR #201 merged as `8f5259c4d6b40746173d7842554d416f0138ee27` after owner review/DCO and merge authorization, closing #16. The release audit does not regenerate scientific fixtures, claim additional editor tests or install/buy commercial tooling.
|
|
132
|
+
|
|
133
|
+
For a future export/model change, rerun the independent reader and relevant Adobe/editor/browser checks against that exact candidate and record hashes/builds. Runtime arithmetic/export schemas remain unchanged in this release preparation.
|