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