@photivra/engine 1.5.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +393 -6
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +64 -12
- package/README.md +301 -182
- package/SECURITY.md +37 -28
- package/THIRD_PARTY.md +148 -4
- package/dist/camera/equivalent-focal-length.d.ts +13 -14
- package/dist/camera/equivalent-focal-length.js +15 -13
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +30 -19
- package/dist/camera/field-of-view.js +67 -18
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/lens-projection.d.ts +170 -0
- package/dist/camera/lens-projection.js +444 -0
- package/dist/camera/lens-projection.js.map +1 -0
- package/dist/camera/projected-object-size.d.ts +10 -11
- package/dist/camera/projected-object-size.js +12 -10
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +9 -10
- package/dist/capture/capture-export-metadata.js +8 -5
- package/dist/capture/capture-export-metadata.js.map +1 -1
- package/dist/capture/dng-import.d.ts +91 -0
- package/dist/capture/dng-import.js +343 -0
- package/dist/capture/dng-import.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +37 -17
- package/dist/capture/environment-raw-producer.js +43 -19
- package/dist/capture/environment-raw-producer.js.map +1 -1
- package/dist/capture/export-jpeg.d.ts +35 -4
- package/dist/capture/export-jpeg.js +133 -47
- package/dist/capture/export-jpeg.js.map +1 -1
- package/dist/capture/export-tiff.d.ts +48 -24
- package/dist/capture/export-tiff.js +91 -31
- package/dist/capture/export-tiff.js.map +1 -1
- package/dist/capture/focus-control.d.ts +42 -65
- package/dist/capture/focus-control.js +56 -75
- package/dist/capture/focus-control.js.map +1 -1
- package/dist/capture/host-yield-cadence.d.ts +25 -0
- package/dist/capture/host-yield-cadence.js +25 -0
- package/dist/capture/host-yield-cadence.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +14 -12
- package/dist/capture/linear-encoding.js +14 -13
- package/dist/capture/linear-encoding.js.map +1 -1
- package/dist/capture/lossless-jpeg.d.ts +27 -0
- package/dist/capture/lossless-jpeg.js +237 -0
- package/dist/capture/lossless-jpeg.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +227 -0
- package/dist/capture/native-environment-lean.js +974 -0
- package/dist/capture/native-environment-lean.js.map +1 -0
- package/dist/capture/native-environment-optical-stage.d.ts +97 -0
- package/dist/capture/native-environment-optical-stage.js +340 -0
- package/dist/capture/native-environment-optical-stage.js.map +1 -0
- package/dist/capture/native-environment-raw.d.ts +140 -6
- package/dist/capture/native-environment-raw.js +435 -34
- package/dist/capture/native-environment-raw.js.map +1 -1
- package/dist/capture/native-raw-development.d.ts +116 -9
- package/dist/capture/native-raw-development.js +221 -62
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/capture/native-raw-dng.d.ts +60 -0
- package/dist/capture/native-raw-dng.js +167 -0
- package/dist/capture/native-raw-dng.js.map +1 -0
- package/dist/capture/native-raw.d.ts +65 -12
- package/dist/capture/native-raw.js +81 -19
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/packed-sensor-raw.d.ts +160 -0
- package/dist/capture/packed-sensor-raw.js +221 -0
- package/dist/capture/packed-sensor-raw.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +58 -35
- package/dist/capture/photographic-export.js +177 -70
- package/dist/capture/photographic-export.js.map +1 -1
- package/dist/capture/raw-development-kernel.d.ts +52 -0
- package/dist/capture/raw-development-kernel.js +88 -0
- package/dist/capture/raw-development-kernel.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +7 -7
- package/dist/capture/raw-frame-limits.js +7 -6
- package/dist/capture/raw-frame-limits.js.map +1 -1
- package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
- package/dist/capture/raw-frame-reconstruction.js +9 -8
- package/dist/capture/raw-frame-reconstruction.js.map +1 -1
- package/dist/capture/raw-white-level.d.ts +55 -0
- package/dist/capture/raw-white-level.js +165 -0
- package/dist/capture/raw-white-level.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +5 -7
- package/dist/capture/release-sequence.js +15 -13
- package/dist/capture/release-sequence.js.map +1 -1
- package/dist/capture/sensor-raw-frame.d.ts +5 -6
- package/dist/capture/sensor-raw-frame.js +26 -9
- package/dist/capture/sensor-raw-frame.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +21 -13
- package/dist/capture/sensor-raw-producer.js +86 -25
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/capture/simulated-capture.d.ts +15 -16
- package/dist/capture/simulated-capture.js +22 -12
- package/dist/capture/simulated-capture.js.map +1 -1
- package/dist/color/camera-color-matrix.d.ts +69 -0
- package/dist/color/camera-color-matrix.js +132 -0
- package/dist/color/camera-color-matrix.js.map +1 -0
- package/dist/color/capture-color.d.ts +17 -10
- package/dist/color/capture-color.js +50 -17
- package/dist/color/capture-color.js.map +1 -1
- package/dist/color/chromatic-adaptation.d.ts +63 -0
- package/dist/color/chromatic-adaptation.js +91 -0
- package/dist/color/chromatic-adaptation.js.map +1 -0
- package/dist/color/color-difference.d.ts +104 -0
- package/dist/color/color-difference.js +205 -0
- package/dist/color/color-difference.js.map +1 -0
- package/dist/color/color-matching-functions.d.ts +168 -0
- package/dist/color/color-matching-functions.js +309 -0
- package/dist/color/color-matching-functions.js.map +1 -0
- package/dist/color/colorimetry-math.d.ts +52 -0
- package/dist/color/colorimetry-math.js +144 -0
- package/dist/color/colorimetry-math.js.map +1 -0
- package/dist/color/gamut-mapping.d.ts +54 -0
- package/dist/color/gamut-mapping.js +107 -0
- package/dist/color/gamut-mapping.js.map +1 -0
- package/dist/color/illuminants.d.ts +182 -0
- package/dist/color/illuminants.js +434 -0
- package/dist/color/illuminants.js.map +1 -0
- package/dist/color/rgb-color-spaces.d.ts +79 -0
- package/dist/color/rgb-color-spaces.js +115 -0
- package/dist/color/rgb-color-spaces.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +33 -11
- package/dist/color/sensor-color-development.js +104 -30
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/srgb-icc.d.ts +9 -2
- package/dist/color/srgb-icc.js +16 -5
- package/dist/color/srgb-icc.js.map +1 -1
- package/dist/color/srgb-transfer.d.ts +1 -2
- package/dist/color/srgb-transfer.js +1 -1
- package/dist/color/srgb-transfer.js.map +1 -1
- package/dist/color/white-balance.d.ts +68 -19
- package/dist/color/white-balance.js +168 -35
- package/dist/color/white-balance.js.map +1 -1
- package/dist/composition/image-formation-plan.d.ts +152 -128
- package/dist/composition/image-formation-plan.js +292 -138
- package/dist/composition/image-formation-plan.js.map +1 -1
- package/dist/composition/plan-consumer.d.ts +6 -7
- package/dist/composition/plan-consumer.js +14 -11
- package/dist/composition/plan-consumer.js.map +1 -1
- package/dist/core/calculation-result.d.ts +21 -14
- package/dist/core/calculation-result.js +209 -11
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +13 -8
- package/dist/core/canonical-json.js +34 -15
- package/dist/core/canonical-json.js.map +1 -1
- package/dist/core/configuration-error.d.ts +5 -4
- package/dist/core/configuration-error.js +5 -3
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +12 -12
- package/dist/core/evidence-provenance.js +10 -9
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +11 -10
- package/dist/core/image-formation.js +11 -9
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +9 -17
- package/dist/core/owned-data.js +9 -16
- package/dist/core/owned-data.js.map +1 -1
- package/dist/core/portable-math.d.ts +15 -0
- package/dist/core/portable-math.js +56 -0
- package/dist/core/portable-math.js.map +1 -0
- package/dist/core/record-validation.d.ts +48 -9
- package/dist/core/record-validation.js +93 -19
- package/dist/core/record-validation.js.map +1 -1
- package/dist/core/scientific-assurance.d.ts +16 -14
- package/dist/core/scientific-assurance.js +22 -18
- package/dist/core/scientific-assurance.js.map +1 -1
- package/dist/core/spectral-composition.d.ts +13 -14
- package/dist/core/spectral-composition.js +30 -27
- package/dist/core/spectral-composition.js.map +1 -1
- package/dist/core/spectral.d.ts +5 -6
- package/dist/core/spectral.js +9 -7
- package/dist/core/spectral.js.map +1 -1
- package/dist/core/validation.d.ts +3 -6
- package/dist/core/validation.js +3 -5
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +6 -6
- package/dist/core/version.js +6 -5
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/exposure-capabilities.d.ts +10 -10
- package/dist/equipment/exposure-capabilities.js +40 -30
- package/dist/equipment/exposure-capabilities.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +13 -6
- package/dist/equipment/generic-tier-assets.js +34 -15
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/generic-tier-presets.d.ts +5 -6
- package/dist/equipment/generic-tier-presets.js +15 -13
- package/dist/equipment/generic-tier-presets.js.map +1 -1
- package/dist/equipment/iso-capabilities.d.ts +21 -22
- package/dist/equipment/iso-capabilities.js +49 -44
- package/dist/equipment/iso-capabilities.js.map +1 -1
- package/dist/equipment/metering-capabilities.d.ts +5 -6
- package/dist/equipment/metering-capabilities.js +22 -19
- package/dist/equipment/metering-capabilities.js.map +1 -1
- package/dist/equipment/release-capabilities.d.ts +3 -4
- package/dist/equipment/release-capabilities.js +18 -14
- package/dist/equipment/release-capabilities.js.map +1 -1
- package/dist/exposure/exposure-duration-control.d.ts +19 -17
- package/dist/exposure/exposure-duration-control.js +27 -23
- package/dist/exposure/exposure-duration-control.js.map +1 -1
- package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
- package/dist/exposure/exposure-mode-resolver.js +127 -82
- package/dist/exposure/exposure-mode-resolver.js.map +1 -1
- package/dist/exposure/exposure.d.ts +17 -16
- package/dist/exposure/exposure.js +22 -15
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash-ttl.d.ts +135 -0
- package/dist/exposure/flash-ttl.js +193 -0
- package/dist/exposure/flash-ttl.js.map +1 -0
- package/dist/exposure/flash.d.ts +144 -36
- package/dist/exposure/flash.js +259 -59
- package/dist/exposure/flash.js.map +1 -1
- package/dist/exposure/metering-scene-radiance.d.ts +10 -10
- package/dist/exposure/metering-scene-radiance.js +42 -23
- package/dist/exposure/metering-scene-radiance.js.map +1 -1
- package/dist/exposure/metering-target.d.ts +8 -8
- package/dist/exposure/metering-target.js +30 -20
- package/dist/exposure/metering-target.js.map +1 -1
- package/dist/exposure/metering-temporal.d.ts +16 -15
- package/dist/exposure/metering-temporal.js +41 -19
- package/dist/exposure/metering-temporal.js.map +1 -1
- package/dist/exposure/metering.d.ts +64 -17
- package/dist/exposure/metering.js +159 -30
- package/dist/exposure/metering.js.map +1 -1
- package/dist/exposure/program-line.d.ts +5 -5
- package/dist/exposure/program-line.js +20 -13
- package/dist/exposure/program-line.js.map +1 -1
- package/dist/facade/camera-preset.d.ts +8 -0
- package/dist/facade/camera-preset.js +102 -0
- package/dist/facade/camera-preset.js.map +1 -0
- package/dist/facade/chart-radiance-batch.d.ts +57 -0
- package/dist/facade/chart-radiance-batch.js +121 -0
- package/dist/facade/chart-radiance-batch.js.map +1 -0
- package/dist/facade/chart-scenes.d.ts +177 -0
- package/dist/facade/chart-scenes.js +232 -0
- package/dist/facade/chart-scenes.js.map +1 -0
- package/dist/facade/host-yield.d.ts +7 -0
- package/dist/facade/host-yield.js +23 -0
- package/dist/facade/host-yield.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +117 -0
- package/dist/facade/scene-radiance.js +205 -0
- package/dist/facade/scene-radiance.js.map +1 -0
- package/dist/facade/simulate-capture.d.ts +284 -0
- package/dist/facade/simulate-capture.js +1026 -0
- package/dist/facade/simulate-capture.js.map +1 -0
- package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
- package/dist/gpu/chart-radiance-gpu.js +176 -0
- package/dist/gpu/chart-radiance-gpu.js.map +1 -0
- package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
- package/dist/gpu/image-kernel-accelerator.js +720 -0
- package/dist/gpu/image-kernel-accelerator.js.map +1 -0
- package/dist/gpu/image-kernel-execution.d.ts +92 -0
- package/dist/gpu/image-kernel-execution.js +84 -0
- package/dist/gpu/image-kernel-execution.js.map +1 -0
- package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
- package/dist/gpu/sensor-stage-gpu.js +317 -0
- package/dist/gpu/sensor-stage-gpu.js.map +1 -0
- package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
- package/dist/gpu/temporal-sum-gpu.js +150 -0
- package/dist/gpu/temporal-sum-gpu.js.map +1 -0
- package/dist/gpu/webgpu-runtime.d.ts +63 -0
- package/dist/gpu/webgpu-runtime.js +215 -0
- package/dist/gpu/webgpu-runtime.js.map +1 -0
- package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
- package/dist/gpu/wgsl-chart-kernel.js +165 -0
- package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
- package/dist/gpu/wgsl-kernels.d.ts +53 -0
- package/dist/gpu/wgsl-kernels.js +365 -0
- package/dist/gpu/wgsl-kernels.js.map +1 -0
- package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
- package/dist/gpu/wgsl-sensor-kernel.js +409 -0
- package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
- package/dist/index.d.ts +89 -25
- package/dist/index.js +59 -15
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +92 -40
- package/dist/motion/camera-rotation.js +84 -47
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
- package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
- package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
- package/dist/motion/capture-rotation-trajectory.js +36 -26
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
- package/dist/motion/extended-object-projection.d.ts +19 -16
- package/dist/motion/extended-object-projection.js +38 -18
- package/dist/motion/extended-object-projection.js.map +1 -1
- package/dist/motion/projected-motion.d.ts +18 -17
- package/dist/motion/projected-motion.js +25 -17
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/motion/temporal-exposure-sum.d.ts +55 -0
- package/dist/motion/temporal-exposure-sum.js +141 -0
- package/dist/motion/temporal-exposure-sum.js.map +1 -0
- package/dist/motion/video-sequence.d.ts +111 -0
- package/dist/motion/video-sequence.js +179 -0
- package/dist/motion/video-sequence.js.map +1 -0
- package/dist/optics/aperture.d.ts +14 -15
- package/dist/optics/aperture.js +13 -11
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/atmospheric-haze.d.ts +83 -0
- package/dist/optics/atmospheric-haze.js +113 -0
- package/dist/optics/atmospheric-haze.js.map +1 -0
- package/dist/optics/brown-conrady-distortion.d.ts +116 -0
- package/dist/optics/brown-conrady-distortion.js +291 -0
- package/dist/optics/brown-conrady-distortion.js.map +1 -0
- package/dist/optics/circle-of-confusion.d.ts +10 -10
- package/dist/optics/circle-of-confusion.js +15 -11
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +64 -33
- package/dist/optics/complex-pupil-psf.js +190 -98
- package/dist/optics/complex-pupil-psf.js.map +1 -1
- package/dist/optics/depth-of-field.d.ts +25 -15
- package/dist/optics/depth-of-field.js +67 -27
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction.d.ts +14 -13
- package/dist/optics/diffraction.js +14 -10
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +88 -27
- package/dist/optics/focus-breathing.js +114 -23
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +18 -18
- package/dist/optics/focus-state.js +21 -15
- package/dist/optics/focus-state.js.map +1 -1
- package/dist/optics/front-of-lens-filter.d.ts +45 -14
- package/dist/optics/front-of-lens-filter.js +259 -88
- package/dist/optics/front-of-lens-filter.js.map +1 -1
- package/dist/optics/illumination-vignetting.d.ts +16 -17
- package/dist/optics/illumination-vignetting.js +40 -17
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/irradiance-convolution.d.ts +59 -0
- package/dist/optics/irradiance-convolution.js +138 -0
- package/dist/optics/irradiance-convolution.js.map +1 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
- package/dist/optics/lateral-chromatic-aberration.js +33 -23
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-kernels.d.ts +89 -0
- package/dist/optics/lens-psf-kernels.js +175 -0
- package/dist/optics/lens-psf-kernels.js.map +1 -0
- package/dist/optics/lens-psf-profile.d.ts +78 -46
- package/dist/optics/lens-psf-profile.js +335 -124
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
- package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
- package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +80 -23
- package/dist/optics/polygon-diffraction.js +130 -25
- package/dist/optics/polygon-diffraction.js.map +1 -1
- package/dist/optics/profile-contract.d.ts +5 -6
- package/dist/optics/profile-contract.js +14 -11
- package/dist/optics/profile-contract.js.map +1 -1
- package/dist/optics/psf-foundation.d.ts +23 -23
- package/dist/optics/psf-foundation.js +24 -21
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/pupil-vignetting.d.ts +118 -0
- package/dist/optics/pupil-vignetting.js +264 -0
- package/dist/optics/pupil-vignetting.js.map +1 -0
- package/dist/optics/radial-distortion.d.ts +34 -33
- package/dist/optics/radial-distortion.js +37 -30
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
- package/dist/optics/scene-to-sensor-irradiance.js +73 -45
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
- package/dist/optics/scene-to-sensor-quadrature.js +16 -11
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
- package/dist/optics/sensor-aperture-rays.d.ts +20 -4
- package/dist/optics/sensor-aperture-rays.js +32 -14
- package/dist/optics/sensor-aperture-rays.js.map +1 -1
- package/dist/optics/sensor-environment-query.d.ts +81 -16
- package/dist/optics/sensor-environment-query.js +145 -12
- package/dist/optics/sensor-environment-query.js.map +1 -1
- package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
- package/dist/optics/sensor-psf-quadrature.js +18 -11
- package/dist/optics/sensor-psf-quadrature.js.map +1 -1
- package/dist/optics/sensor-psf-support.d.ts +8 -6
- package/dist/optics/sensor-psf-support.js +8 -5
- package/dist/optics/sensor-psf-support.js.map +1 -1
- package/dist/optics/stray-light.d.ts +22 -19
- package/dist/optics/stray-light.js +18 -12
- package/dist/optics/stray-light.js.map +1 -1
- package/dist/optics/thin-lens.d.ts +10 -9
- package/dist/optics/thin-lens.js +12 -8
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/optics/zernike-wavefront.d.ts +154 -0
- package/dist/optics/zernike-wavefront.js +352 -0
- package/dist/optics/zernike-wavefront.js.map +1 -0
- package/dist/output/capture-corrected-sdr.d.ts +16 -8
- package/dist/output/capture-corrected-sdr.js +16 -8
- package/dist/output/capture-corrected-sdr.js.map +1 -1
- package/dist/output/capture-geometry.d.ts +34 -36
- package/dist/output/capture-geometry.js +52 -32
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +7 -6
- package/dist/output/capture-sdr.js +11 -8
- package/dist/output/capture-sdr.js.map +1 -1
- package/dist/output/crop.d.ts +22 -6
- package/dist/output/crop.js +40 -6
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +60 -23
- package/dist/output/geometric-transforms.js +111 -24
- package/dist/output/geometric-transforms.js.map +1 -1
- package/dist/output/lens-corrections.d.ts +27 -19
- package/dist/output/lens-corrections.js +29 -13
- package/dist/output/lens-corrections.js.map +1 -1
- package/dist/output/native-capture-sdr.d.ts +71 -16
- package/dist/output/native-capture-sdr.js +190 -33
- package/dist/output/native-capture-sdr.js.map +1 -1
- package/dist/output/png-encoder.d.ts +65 -0
- package/dist/output/png-encoder.js +461 -0
- package/dist/output/png-encoder.js.map +1 -0
- package/dist/output/print-contrast-reference.d.ts +10 -9
- package/dist/output/print-contrast-reference.js +10 -8
- package/dist/output/print-contrast-reference.js.map +1 -1
- package/dist/output/print-detail.d.ts +18 -17
- package/dist/output/print-detail.js +12 -10
- package/dist/output/print-detail.js.map +1 -1
- package/dist/output/print-jpeg.d.ts +26 -5
- package/dist/output/print-jpeg.js +117 -50
- package/dist/output/print-jpeg.js.map +1 -1
- package/dist/output/print-plan.d.ts +19 -19
- package/dist/output/print-plan.js +11 -10
- package/dist/output/print-plan.js.map +1 -1
- package/dist/output/print-region-statistics.d.ts +14 -15
- package/dist/output/print-region-statistics.js +11 -11
- package/dist/output/print-region-statistics.js.map +1 -1
- package/dist/output/sdr-rendering.d.ts +48 -10
- package/dist/output/sdr-rendering.js +114 -25
- package/dist/output/sdr-rendering.js.map +1 -1
- package/dist/output/subject-framing-crop.d.ts +6 -10
- package/dist/output/subject-framing-crop.js +23 -13
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/processing/demosaic.d.ts +90 -0
- package/dist/processing/demosaic.js +275 -0
- package/dist/processing/demosaic.js.map +1 -0
- package/dist/processing/denoise.d.ts +68 -0
- package/dist/processing/denoise.js +214 -0
- package/dist/processing/denoise.js.map +1 -0
- package/dist/processing/focus-stacking.d.ts +17 -0
- package/dist/processing/focus-stacking.js +80 -0
- package/dist/processing/focus-stacking.js.map +1 -0
- package/dist/processing/hdr.d.ts +54 -0
- package/dist/processing/hdr.js +172 -0
- package/dist/processing/hdr.js.map +1 -0
- package/dist/processing/image-ops.d.ts +66 -0
- package/dist/processing/image-ops.js +192 -0
- package/dist/processing/image-ops.js.map +1 -0
- package/dist/processing/panorama.d.ts +51 -0
- package/dist/processing/panorama.js +305 -0
- package/dist/processing/panorama.js.map +1 -0
- package/dist/processing/processing-task.d.ts +85 -0
- package/dist/processing/processing-task.js +164 -0
- package/dist/processing/processing-task.js.map +1 -0
- package/dist/processing/tone-mapping.d.ts +69 -0
- package/dist/processing/tone-mapping.js +310 -0
- package/dist/processing/tone-mapping.js.map +1 -0
- package/dist/schema/camera.d.ts +5 -4
- package/dist/schema/illumination-spectral.d.ts +13 -19
- package/dist/schema/illumination-spectral.js +23 -19
- package/dist/schema/illumination-spectral.js.map +1 -1
- package/dist/schema/illumination-temporal.d.ts +12 -15
- package/dist/schema/illumination-temporal.js +43 -28
- package/dist/schema/illumination-temporal.js.map +1 -1
- package/dist/schema/illumination.d.ts +5 -4
- package/dist/schema/illumination.js +55 -20
- package/dist/schema/illumination.js.map +1 -1
- package/dist/schema/scene-radiance-temporal.d.ts +9 -11
- package/dist/schema/scene-radiance-temporal.js +26 -23
- package/dist/schema/scene-radiance-temporal.js.map +1 -1
- package/dist/schema/scene-radiance.d.ts +17 -17
- package/dist/schema/scene-radiance.js +56 -34
- package/dist/schema/scene-radiance.js.map +1 -1
- package/dist/schema/scene.d.ts +14 -13
- package/dist/schema/validation.d.ts +0 -1
- package/dist/schema/validation.js +17 -15
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +45 -64
- package/dist/sensor/accumulated-charge.js +41 -47
- package/dist/sensor/accumulated-charge.js.map +1 -1
- package/dist/sensor/architecture.d.ts +22 -25
- package/dist/sensor/architecture.js +17 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
- package/dist/sensor/camera-saturation-capacity.js +36 -34
- package/dist/sensor/camera-saturation-capacity.js.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
- package/dist/sensor/capture-color-sampling-binding.js +39 -41
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- package/dist/sensor/capture-mode-timing.d.ts +8 -9
- package/dist/sensor/capture-mode-timing.js +24 -21
- package/dist/sensor/capture-mode-timing.js.map +1 -1
- package/dist/sensor/capture-mode.d.ts +28 -30
- package/dist/sensor/capture-mode.js +33 -31
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts +30 -33
- package/dist/sensor/color-sampling.js +32 -37
- package/dist/sensor/color-sampling.js.map +1 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
- package/dist/sensor/constant-rate-temporal-integration.js +28 -26
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
- package/dist/sensor/dark-current.d.ts +53 -49
- package/dist/sensor/dark-current.js +87 -46
- package/dist/sensor/dark-current.js.map +1 -1
- package/dist/sensor/environment-photo-signal.d.ts +71 -30
- package/dist/sensor/environment-photo-signal.js +127 -46
- package/dist/sensor/environment-photo-signal.js.map +1 -1
- package/dist/sensor/eqe-electron-rate.d.ts +14 -13
- package/dist/sensor/eqe-electron-rate.js +34 -14
- package/dist/sensor/eqe-electron-rate.js.map +1 -1
- package/dist/sensor/eqe-local-exposure.d.ts +24 -24
- package/dist/sensor/eqe-local-exposure.js +15 -11
- package/dist/sensor/eqe-local-exposure.js.map +1 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
- package/dist/sensor/eqe-temporal-exposure.js +15 -10
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/exposure-window.d.ts +48 -34
- package/dist/sensor/exposure-window.js +77 -36
- package/dist/sensor/exposure-window.js.map +1 -1
- package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
- package/dist/sensor/fixed-pattern-noise.js +166 -0
- package/dist/sensor/fixed-pattern-noise.js.map +1 -0
- package/dist/sensor/iso-gain.d.ts +44 -0
- package/dist/sensor/iso-gain.js +119 -0
- package/dist/sensor/iso-gain.js.map +1 -0
- package/dist/sensor/iso-signal-chain.d.ts +25 -48
- package/dist/sensor/iso-signal-chain.js +52 -66
- package/dist/sensor/iso-signal-chain.js.map +1 -1
- package/dist/sensor/local-exposure-binding.d.ts +21 -21
- package/dist/sensor/local-exposure-binding.js +22 -18
- package/dist/sensor/local-exposure-binding.js.map +1 -1
- package/dist/sensor/optical-stack.d.ts +36 -40
- package/dist/sensor/optical-stack.js +34 -37
- package/dist/sensor/optical-stack.js.map +1 -1
- package/dist/sensor/photon-energy.d.ts +22 -28
- package/dist/sensor/photon-energy.js +42 -34
- package/dist/sensor/photon-energy.js.map +1 -1
- package/dist/sensor/physical-charge-capacity.d.ts +20 -30
- package/dist/sensor/physical-charge-capacity.js +35 -36
- package/dist/sensor/physical-charge-capacity.js.map +1 -1
- package/dist/sensor/pixel-pitch.d.ts +2 -3
- package/dist/sensor/pixel-pitch.js +4 -2
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +13 -15
- package/dist/sensor/radiometry-readiness.js +20 -17
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +173 -83
- package/dist/sensor/raw-readout.js +425 -160
- package/dist/sensor/raw-readout.js.map +1 -1
- package/dist/sensor/raw-reconstruction.d.ts +112 -44
- package/dist/sensor/raw-reconstruction.js +200 -47
- package/dist/sensor/raw-reconstruction.js.map +1 -1
- package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
- package/dist/sensor/readout-exposure-linkage.js +125 -27
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +43 -44
- package/dist/sensor/readout-timing.js +38 -30
- package/dist/sensor/readout-timing.js.map +1 -1
- package/dist/sensor/response-application-compatibility.d.ts +21 -28
- package/dist/sensor/response-application-compatibility.js +35 -34
- package/dist/sensor/response-application-compatibility.js.map +1 -1
- package/dist/sensor/response-operating-range.d.ts +26 -35
- package/dist/sensor/response-operating-range.js +40 -39
- package/dist/sensor/response-operating-range.js.map +1 -1
- package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
- package/dist/sensor/responsivity-photocurrent.js +57 -40
- package/dist/sensor/responsivity-photocurrent.js.map +1 -1
- package/dist/sensor/sampling-aperture.d.ts +21 -25
- package/dist/sensor/sampling-aperture.js +29 -28
- package/dist/sensor/sampling-aperture.js.map +1 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
- package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/sensor-geometry.d.ts +28 -32
- package/dist/sensor/sensor-geometry.js +35 -20
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +14 -16
- package/dist/sensor/signal-noise.js +15 -13
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
- package/dist/sensor/spatial-sample-reduction.js +39 -48
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
- package/dist/sensor/spatial-sampling-quadrature.js +31 -36
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
- package/dist/sensor/spatio-spectral-reduction.js +24 -29
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
- package/dist/sensor/spectral-coverage.d.ts +6 -9
- package/dist/sensor/spectral-coverage.js +9 -6
- package/dist/sensor/spectral-coverage.js.map +1 -1
- package/dist/sensor/spectral-quadrature.d.ts +46 -60
- package/dist/sensor/spectral-quadrature.js +38 -48
- package/dist/sensor/spectral-quadrature.js.map +1 -1
- package/dist/sensor/spectral-response.d.ts +53 -41
- package/dist/sensor/spectral-response.js +80 -47
- package/dist/sensor/spectral-response.js.map +1 -1
- package/dist/sensor/stochastic-seed.d.ts +50 -0
- package/dist/sensor/stochastic-seed.js +123 -0
- package/dist/sensor/stochastic-seed.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
- package/dist/sensor/temporal-eqe-sum.js +5 -6
- package/dist/sensor/temporal-eqe-sum.js.map +1 -1
- package/dist/sensor/temporal-photo-signal.d.ts +5 -6
- package/dist/sensor/temporal-photo-signal.js +11 -10
- package/dist/sensor/temporal-photo-signal.js.map +1 -1
- package/dist/sensor/temporal-sample-binding.d.ts +1 -2
- package/dist/sensor/temporal-sample-binding.js +3 -3
- package/dist/sensor/temporal-sample-binding.js.map +1 -1
- package/dist/simulation/poc-simulation.d.ts +16 -16
- package/dist/simulation/poc-simulation.js +20 -15
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +42 -18
- package/dist/stabilization/camera-shake.js +43 -20
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +44 -41
- package/dist/stabilization/system.js +196 -108
- package/dist/stabilization/system.js.map +1 -1
- package/docs/AGENT_GUIDE.md +183 -0
- package/docs/API_REFERENCE.md +761 -2
- package/docs/QUICK_START.md +495 -0
- package/docs/USAGE.md +1719 -714
- package/docs/api/camera-equivalent-focal-length.md +6 -7
- package/docs/api/camera-field-of-view.md +16 -8
- package/docs/api/camera-lens-projection.md +246 -0
- package/docs/api/camera-projected-object-size.md +6 -5
- package/docs/api/capture-capture-export-metadata.md +10 -10
- package/docs/api/capture-dng-import.md +134 -0
- package/docs/api/capture-environment-raw-producer.md +17 -11
- package/docs/api/capture-export-jpeg.md +16 -0
- package/docs/api/capture-focus-control.md +25 -47
- package/docs/api/capture-linear-encoding.md +21 -12
- package/docs/api/capture-lossless-jpeg.md +49 -0
- package/docs/api/capture-native-environment-optical-stage.md +75 -0
- package/docs/api/capture-native-environment-raw.md +161 -4
- package/docs/api/capture-native-raw-development.md +69 -8
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +21 -10
- package/docs/api/capture-packed-sensor-raw.md +156 -0
- package/docs/api/capture-photographic-export.md +69 -31
- package/docs/api/capture-raw-frame-reconstruction.md +8 -8
- package/docs/api/capture-raw-white-level.md +37 -0
- package/docs/api/capture-release-sequence.md +6 -7
- package/docs/api/capture-sensor-raw-frame.md +6 -6
- package/docs/api/capture-sensor-raw-producer.md +17 -11
- package/docs/api/capture-simulated-capture.md +15 -15
- package/docs/api/color-camera-color-matrix.md +103 -0
- package/docs/api/color-capture-color.md +22 -11
- package/docs/api/color-chromatic-adaptation.md +82 -0
- package/docs/api/color-color-difference.md +134 -0
- package/docs/api/color-color-matching-functions.md +259 -0
- package/docs/api/color-colorimetry-math.md +54 -0
- package/docs/api/color-gamut-mapping.md +72 -0
- package/docs/api/color-illuminants.md +280 -0
- package/docs/api/color-rgb-color-spaces.md +151 -0
- package/docs/api/color-sensor-color-development.md +27 -0
- package/docs/api/color-srgb-icc.md +2 -4
- package/docs/api/color-white-balance.md +95 -19
- package/docs/api/composition-image-formation-plan.md +124 -95
- package/docs/api/composition-plan-consumer.md +7 -7
- package/docs/api/core-calculation-result.md +18 -14
- package/docs/api/core-configuration-error.md +1 -1
- package/docs/api/core-image-formation.md +7 -7
- package/docs/api/core-scientific-assurance.md +12 -10
- package/docs/api/core-spectral-composition.md +14 -14
- package/docs/api/core-spectral.md +6 -6
- package/docs/api/core-validation.md +3 -3
- package/docs/api/core-version.md +7 -6
- package/docs/api/equipment-exposure-capabilities.md +11 -10
- package/docs/api/equipment-generic-tier-assets.md +7 -2
- package/docs/api/equipment-generic-tier-presets.md +6 -6
- package/docs/api/equipment-iso-capabilities.md +18 -18
- package/docs/api/equipment-metering-capabilities.md +6 -6
- package/docs/api/equipment-release-capabilities.md +4 -4
- package/docs/api/exports.json +2213 -8
- package/docs/api/exposure-exposure-duration-control.md +9 -9
- package/docs/api/exposure-exposure-mode-resolver.md +35 -31
- package/docs/api/exposure-exposure.md +10 -10
- package/docs/api/exposure-flash-ttl.md +182 -0
- package/docs/api/exposure-flash.md +183 -28
- package/docs/api/exposure-metering-scene-radiance.md +11 -10
- package/docs/api/exposure-metering-target.md +9 -8
- package/docs/api/exposure-metering-temporal.md +8 -8
- package/docs/api/exposure-metering.md +69 -9
- package/docs/api/exposure-program-line.md +6 -5
- package/docs/api/facade-chart-radiance-batch.md +96 -0
- package/docs/api/facade-chart-scenes.md +240 -0
- package/docs/api/facade-scene-radiance.md +122 -0
- package/docs/api/facade-simulate-capture.md +324 -0
- package/docs/api/gpu-image-kernel-accelerator.md +157 -0
- package/docs/api/gpu-image-kernel-execution.md +152 -0
- package/docs/api/motion-camera-rotation.md +43 -26
- package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
- package/docs/api/motion-capture-rotation-trajectory.md +15 -15
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
- package/docs/api/motion-extended-object-projection.md +10 -8
- package/docs/api/motion-projected-motion.md +8 -8
- package/docs/api/motion-temporal-exposure-sum.md +98 -0
- package/docs/api/motion-video-sequence.md +159 -0
- package/docs/api/optics-aperture.md +8 -8
- package/docs/api/optics-atmospheric-haze.md +104 -0
- package/docs/api/optics-brown-conrady-distortion.md +123 -0
- package/docs/api/optics-circle-of-confusion.md +5 -4
- package/docs/api/optics-complex-pupil-psf.md +57 -16
- package/docs/api/optics-depth-of-field.md +12 -6
- package/docs/api/optics-diffraction.md +8 -7
- package/docs/api/optics-focus-breathing.md +104 -16
- package/docs/api/optics-focus-state.md +9 -10
- package/docs/api/optics-front-of-lens-filter.md +72 -14
- package/docs/api/optics-illumination-vignetting.md +10 -10
- package/docs/api/optics-irradiance-convolution.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
- package/docs/api/optics-lens-psf-kernels.md +72 -0
- package/docs/api/optics-lens-psf-profile.md +48 -26
- package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
- package/docs/api/optics-polygon-diffraction.md +78 -13
- package/docs/api/optics-profile-contract.md +4 -4
- package/docs/api/optics-psf-foundation.md +12 -12
- package/docs/api/optics-pupil-vignetting.md +132 -0
- package/docs/api/optics-radial-distortion.md +12 -12
- package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
- package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
- package/docs/api/optics-sensor-aperture-rays.md +3 -2
- package/docs/api/optics-sensor-environment-query.md +52 -9
- package/docs/api/optics-sensor-psf-quadrature.md +13 -10
- package/docs/api/optics-stray-light.md +12 -11
- package/docs/api/optics-thin-lens.md +4 -3
- package/docs/api/optics-zernike-wavefront.md +229 -0
- package/docs/api/output-capture-corrected-sdr.md +10 -7
- package/docs/api/output-capture-geometry.md +35 -36
- package/docs/api/output-capture-sdr.md +4 -4
- package/docs/api/output-crop.md +7 -4
- package/docs/api/output-geometric-transforms.md +65 -19
- package/docs/api/output-lens-corrections.md +17 -15
- package/docs/api/output-native-capture-sdr.md +26 -13
- package/docs/api/output-png-encoder.md +105 -0
- package/docs/api/output-print-contrast-reference.md +8 -8
- package/docs/api/output-print-detail.md +14 -14
- package/docs/api/output-print-jpeg.md +22 -5
- package/docs/api/output-print-plan.md +18 -18
- package/docs/api/output-print-region-statistics.md +14 -14
- package/docs/api/output-sdr-rendering.md +52 -10
- package/docs/api/output-subject-framing-crop.md +5 -6
- package/docs/api/processing-demosaic.md +120 -0
- package/docs/api/processing-denoise.md +148 -0
- package/docs/api/processing-focus-stacking.md +41 -0
- package/docs/api/processing-hdr.md +113 -0
- package/docs/api/processing-panorama.md +82 -0
- package/docs/api/processing-processing-task.md +107 -0
- package/docs/api/processing-tone-mapping.md +142 -0
- package/docs/api/schema-camera.md +6 -4
- package/docs/api/schema-illumination-spectral.md +10 -11
- package/docs/api/schema-illumination-temporal.md +13 -15
- package/docs/api/schema-illumination.md +4 -4
- package/docs/api/schema-scene-radiance-temporal.md +10 -11
- package/docs/api/schema-scene-radiance.md +18 -17
- package/docs/api/schema-scene.md +9 -9
- package/docs/api/schema-validation.md +1 -1
- package/docs/api/sensor-accumulated-charge.md +12 -20
- package/docs/api/sensor-architecture.md +15 -16
- package/docs/api/sensor-camera-saturation-capacity.md +9 -11
- package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
- package/docs/api/sensor-capture-mode-timing.md +9 -9
- package/docs/api/sensor-capture-mode.md +29 -30
- package/docs/api/sensor-color-sampling.md +31 -33
- package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
- package/docs/api/sensor-dark-current.md +30 -14
- package/docs/api/sensor-environment-photo-signal.md +13 -6
- package/docs/api/sensor-eqe-electron-rate.md +9 -8
- package/docs/api/sensor-eqe-local-exposure.md +18 -17
- package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
- package/docs/api/sensor-exposure-window.md +24 -24
- package/docs/api/sensor-fixed-pattern-noise.md +104 -0
- package/docs/api/sensor-iso-gain.md +63 -0
- package/docs/api/sensor-iso-signal-chain.md +13 -22
- package/docs/api/sensor-local-exposure-binding.md +12 -13
- package/docs/api/sensor-optical-stack.md +37 -40
- package/docs/api/sensor-photon-energy.md +10 -11
- package/docs/api/sensor-physical-charge-capacity.md +8 -13
- package/docs/api/sensor-pixel-pitch.md +1 -1
- package/docs/api/sensor-radiometry-readiness.md +9 -9
- package/docs/api/sensor-raw-readout.md +118 -52
- package/docs/api/sensor-raw-reconstruction.md +97 -20
- package/docs/api/sensor-readout-exposure-linkage.md +120 -24
- package/docs/api/sensor-readout-timing.md +33 -35
- package/docs/api/sensor-response-application-compatibility.md +9 -11
- package/docs/api/sensor-response-operating-range.md +14 -18
- package/docs/api/sensor-responsivity-photocurrent.md +9 -12
- package/docs/api/sensor-sampling-aperture.md +22 -25
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
- package/docs/api/sensor-sensor-geometry.md +23 -24
- package/docs/api/sensor-signal-noise.md +10 -10
- package/docs/api/sensor-spatial-sample-reduction.md +27 -30
- package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
- package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
- package/docs/api/sensor-spectral-coverage.md +5 -5
- package/docs/api/sensor-spectral-quadrature.md +33 -35
- package/docs/api/sensor-spectral-response.md +28 -16
- package/docs/api/sensor-temporal-photo-signal.md +6 -6
- package/docs/api/simulation-poc-simulation.md +17 -16
- package/docs/api/stabilization-camera-shake.md +29 -10
- package/docs/api/stabilization-system.md +25 -21
- package/docs/examples/production-request.json +3821 -2157
- package/docs/examples/simulate-capture.mjs +14 -0
- package/llms.txt +35 -0
- package/package.json +32 -12
- package/AGENTS.md +0 -674
- package/CONTRIBUTING.md +0 -76
- package/DCO +0 -33
- package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
- package/dist/camera/field-of-view.d.ts.map +0 -1
- package/dist/camera/projected-object-size.d.ts.map +0 -1
- package/dist/capture/capture-export-metadata.d.ts.map +0 -1
- package/dist/capture/environment-raw-producer.d.ts.map +0 -1
- package/dist/capture/export-jpeg.d.ts.map +0 -1
- package/dist/capture/export-tiff.d.ts.map +0 -1
- package/dist/capture/focus-control.d.ts.map +0 -1
- package/dist/capture/linear-encoding.d.ts.map +0 -1
- package/dist/capture/native-environment-raw.d.ts.map +0 -1
- package/dist/capture/native-raw-development.d.ts.map +0 -1
- package/dist/capture/native-raw.d.ts.map +0 -1
- package/dist/capture/photographic-export.d.ts.map +0 -1
- package/dist/capture/raw-frame-limits.d.ts.map +0 -1
- package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
- package/dist/capture/release-sequence.d.ts.map +0 -1
- package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
- package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
- package/dist/capture/simulated-capture.d.ts.map +0 -1
- package/dist/color/capture-color.d.ts.map +0 -1
- package/dist/color/sensor-color-development.d.ts.map +0 -1
- package/dist/color/srgb-icc.d.ts.map +0 -1
- package/dist/color/srgb-transfer.d.ts.map +0 -1
- package/dist/color/white-balance.d.ts.map +0 -1
- package/dist/composition/image-formation-plan.d.ts.map +0 -1
- package/dist/composition/plan-consumer.d.ts.map +0 -1
- package/dist/core/calculation-result.d.ts.map +0 -1
- package/dist/core/canonical-json.d.ts.map +0 -1
- package/dist/core/configuration-error.d.ts.map +0 -1
- package/dist/core/evidence-provenance.d.ts.map +0 -1
- package/dist/core/image-formation.d.ts.map +0 -1
- package/dist/core/owned-data.d.ts.map +0 -1
- package/dist/core/record-validation.d.ts.map +0 -1
- package/dist/core/scientific-assurance.d.ts.map +0 -1
- package/dist/core/spectral-composition.d.ts.map +0 -1
- package/dist/core/spectral.d.ts.map +0 -1
- package/dist/core/validation.d.ts.map +0 -1
- package/dist/core/version.d.ts.map +0 -1
- package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
- package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
- package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
- package/dist/equipment/iso-capabilities.d.ts.map +0 -1
- package/dist/equipment/metering-capabilities.d.ts.map +0 -1
- package/dist/equipment/release-capabilities.d.ts.map +0 -1
- package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
- package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
- package/dist/exposure/exposure.d.ts.map +0 -1
- package/dist/exposure/flash.d.ts.map +0 -1
- package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
- package/dist/exposure/metering-target.d.ts.map +0 -1
- package/dist/exposure/metering-temporal.d.ts.map +0 -1
- package/dist/exposure/metering.d.ts.map +0 -1
- package/dist/exposure/program-line.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/motion/camera-rotation.d.ts.map +0 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/extended-object-projection.d.ts.map +0 -1
- package/dist/motion/projected-motion.d.ts.map +0 -1
- package/dist/optics/aperture.d.ts.map +0 -1
- package/dist/optics/circle-of-confusion.d.ts.map +0 -1
- package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
- package/dist/optics/depth-of-field.d.ts.map +0 -1
- package/dist/optics/diffraction.d.ts.map +0 -1
- package/dist/optics/focus-breathing.d.ts.map +0 -1
- package/dist/optics/focus-state.d.ts.map +0 -1
- package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
- package/dist/optics/illumination-vignetting.d.ts.map +0 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
- package/dist/optics/lens-psf-profile.d.ts.map +0 -1
- package/dist/optics/polygon-diffraction.d.ts.map +0 -1
- package/dist/optics/profile-contract.d.ts.map +0 -1
- package/dist/optics/psf-foundation.d.ts.map +0 -1
- package/dist/optics/radial-distortion.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
- package/dist/optics/sensor-environment-query.d.ts.map +0 -1
- package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-psf-support.d.ts.map +0 -1
- package/dist/optics/stray-light.d.ts.map +0 -1
- package/dist/optics/thin-lens.d.ts.map +0 -1
- package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
- package/dist/output/capture-geometry.d.ts.map +0 -1
- package/dist/output/capture-sdr.d.ts.map +0 -1
- package/dist/output/crop.d.ts.map +0 -1
- package/dist/output/geometric-transforms.d.ts.map +0 -1
- package/dist/output/lens-corrections.d.ts.map +0 -1
- package/dist/output/native-capture-sdr.d.ts.map +0 -1
- package/dist/output/print-contrast-reference.d.ts.map +0 -1
- package/dist/output/print-detail.d.ts.map +0 -1
- package/dist/output/print-jpeg.d.ts.map +0 -1
- package/dist/output/print-plan.d.ts.map +0 -1
- package/dist/output/print-region-statistics.d.ts.map +0 -1
- package/dist/output/sdr-rendering.d.ts.map +0 -1
- package/dist/output/subject-framing-crop.d.ts.map +0 -1
- package/dist/schema/camera.d.ts.map +0 -1
- package/dist/schema/camera.js +0 -3
- package/dist/schema/camera.js.map +0 -1
- package/dist/schema/illumination-spectral.d.ts.map +0 -1
- package/dist/schema/illumination-temporal.d.ts.map +0 -1
- package/dist/schema/illumination.d.ts.map +0 -1
- package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
- package/dist/schema/scene-radiance.d.ts.map +0 -1
- package/dist/schema/scene.d.ts.map +0 -1
- package/dist/schema/scene.js +0 -3
- package/dist/schema/scene.js.map +0 -1
- package/dist/schema/validation.d.ts.map +0 -1
- package/dist/sensor/accumulated-charge.d.ts.map +0 -1
- package/dist/sensor/architecture.d.ts.map +0 -1
- package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
- package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
- package/dist/sensor/capture-mode.d.ts.map +0 -1
- package/dist/sensor/color-sampling.d.ts.map +0 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
- package/dist/sensor/dark-current.d.ts.map +0 -1
- package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
- package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
- package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/exposure-window.d.ts.map +0 -1
- package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
- package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
- package/dist/sensor/optical-stack.d.ts.map +0 -1
- package/dist/sensor/photon-energy.d.ts.map +0 -1
- package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
- package/dist/sensor/pixel-pitch.d.ts.map +0 -1
- package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
- package/dist/sensor/raw-readout.d.ts.map +0 -1
- package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
- package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
- package/dist/sensor/readout-timing.d.ts.map +0 -1
- package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
- package/dist/sensor/response-operating-range.d.ts.map +0 -1
- package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
- package/dist/sensor/sampling-aperture.d.ts.map +0 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/sensor-geometry.d.ts.map +0 -1
- package/dist/sensor/signal-noise.d.ts.map +0 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
- package/dist/sensor/spectral-coverage.d.ts.map +0 -1
- package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
- package/dist/sensor/spectral-response.d.ts.map +0 -1
- package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
- package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
- package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
- package/dist/simulation/poc-simulation.d.ts.map +0 -1
- package/dist/stabilization/camera-shake.d.ts.map +0 -1
- package/dist/stabilization/system.d.ts.map +0 -1
- package/docs/API_STYLE.md +0 -235
- package/docs/ARCHITECTURE.md +0 -356
- package/docs/AUTOMATION_COORDINATION.md +0 -190
- package/docs/CAPTURE_COLOR.md +0 -25
- package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
- package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
- package/docs/CAPTURE_SDR.md +0 -22
- package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
- package/docs/DEVELOPERS.md +0 -68
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
- package/docs/EXPORT_ACCEPTANCE.md +0 -133
- package/docs/GENERIC_TIER_PRESETS.md +0 -269
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
- package/docs/IMAGE_FORMATION.md +0 -247
- package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
- package/docs/MOTION_AND_SIGNAL.md +0 -250
- package/docs/NATIVE_CAPTURE_SDR.md +0 -70
- package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
- package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
- package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
- package/docs/NUMERICAL_CORRECTNESS.md +0 -191
- package/docs/PERFORMANCE_BASELINE.md +0 -56
- package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
- package/docs/PHYSICS_FOUNDATION.md +0 -426
- package/docs/POC_API.md +0 -278
- package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
- package/docs/POC_PROJECTION_REUSE.md +0 -124
- package/docs/PRINT_195_196_REVIEW.md +0 -93
- package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
- package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
- package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
- package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
- package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
- package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
- package/docs/PRINT_PLANNING.md +0 -75
- package/docs/PRINT_REGION_STATISTICS.md +0 -38
- package/docs/PROCESSED_OUTPUT.md +0 -157
- package/docs/PRODUCTION_COMPOSITION.md +0 -373
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
- package/docs/PROVENANCE.md +0 -115
- package/docs/PSF_FOUNDATION.md +0 -165
- package/docs/RAW_FRAME_ENVELOPE.md +0 -56
- package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
- package/docs/RELEASE_1_0.md +0 -66
- package/docs/RELEASE_1_0_1.md +0 -61
- package/docs/RELEASE_1_1_0.md +0 -25
- package/docs/RELEASE_1_2_0.md +0 -51
- package/docs/RELEASE_1_3_0.md +0 -15
- package/docs/RELEASE_1_4_0.md +0 -23
- package/docs/RELEASE_1_5_0.md +0 -105
- package/docs/RELEASE_AUDIT.md +0 -39
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
- package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
- package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
- package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
- package/docs/SDR_RENDERING.md +0 -33
- package/docs/SENSOR_APERTURE_RAYS.md +0 -23
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
- package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
- package/docs/SENSOR_RAW_FRAME.md +0 -20
- package/docs/SENSOR_RAW_PRODUCER.md +0 -77
- package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
- package/docs/SIGNAL_CONFORMANCE.md +0 -23
- package/docs/SIMULATED_CAPTURE.md +0 -65
- package/docs/STABILIZATION.md +0 -234
- package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
- package/docs/TIER_ACCEPTANCE.md +0 -129
- package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
- package/docs/V1_COMPOSITION_MAP.md +0 -123
- package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
- package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
- package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
- package/docs/licenses/castleCSF-MIT.txt +0 -21
- package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
- package/docs/validation/documentation-fragments.json +0 -212
- package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
- package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
- package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
- package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
- package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
- package/docs/validation/print-196-candidate-capabilities.json +0 -28
- package/docs/validation/print-196-candidate-evidence.json +0 -356
- package/docs/validation/print-196-engine-acceptance.json +0 -81
- package/docs/validation/print-detail-capabilities.json +0 -103
- package/docs/validation/print-detail-jpeg-evidence.json +0 -116
- package/docs/validation/print-detail-sdr-evidence.json +0 -81
- package/docs/validation/release-audit-inventory.json +0 -1306
- package/docs/validation/tier-acceptance-report-v1.json +0 -2538
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { type EvidenceProvenance } from "../core/evidence-provenance.js";
|
|
2
|
+
import { type RawHighlightMode } from "../color/sensor-color-development.js";
|
|
3
|
+
import type { RawHighlightDiagnostics } from "./native-raw-development.js";
|
|
2
4
|
import { type SdrRenderingProfile, type SdrRenderingResult } from "../output/sdr-rendering.js";
|
|
3
5
|
import { type RasterRect } from "../output/capture-geometry.js";
|
|
4
6
|
import { type RawFrameReconstructionInput, type RawFrameReconstruction } from "./raw-frame-reconstruction.js";
|
|
@@ -7,8 +9,18 @@ import { type CaptureCorrectedSdrInput, type CaptureCorrectedSdrResult } from ".
|
|
|
7
9
|
import { type ResolvedLensCorrectionPlan } from "../output/lens-corrections.js";
|
|
8
10
|
import { type CalculationResult } from "../core/calculation-result.js";
|
|
9
11
|
export declare const PHOTOGRAPHIC_EXPORT_SCHEMA_VERSION: "0.1.0";
|
|
12
|
+
/**
|
|
13
|
+
* Version of the RAW and processed pipeline, recorded in XMP.
|
|
14
|
+
*
|
|
15
|
+
* 0.2.0: development scales to the effective white level, handles saturation, and fixes WB for colour
|
|
16
|
+
* matrices that are not white-normalized. DNG output fixes WhiteLevel, AsShotNeutral and BlackLevel/CFA
|
|
17
|
+
* phase, and adds the DNG 1.4 tags ForwardMatrix1, BaselineExposure, NoiseProfile and AnalogBalance.
|
|
18
|
+
*/
|
|
19
|
+
export declare const PHOTOGRAPHIC_EXPORT_PIPELINE_VERSION: "0.2.0";
|
|
20
|
+
/** Version of the `processed-sensor-raw-sdr` model (0.2.0: scaling to effective white, saturation and WB fixes). */
|
|
21
|
+
export declare const PROCESSED_SENSOR_RAW_MODEL_VERSION: "0.2.0";
|
|
10
22
|
type Matrix = readonly (readonly number[])[];
|
|
11
|
-
/** Explicit
|
|
23
|
+
/** Explicit, approximate conversion from normalized camera channels to scene XYZ (D65). Never guessed from RGB or CFA channel names. */
|
|
12
24
|
export interface ExportSensorColorProfile {
|
|
13
25
|
schemaVersion: "0.1.0";
|
|
14
26
|
profileId: string;
|
|
@@ -21,32 +33,40 @@ export interface ExportSensorColorProfile {
|
|
|
21
33
|
evidence: readonly EvidenceProvenance[];
|
|
22
34
|
limitations: readonly string[];
|
|
23
35
|
}
|
|
24
|
-
/** Optional
|
|
36
|
+
/** Optional export settings. The engine uses no files, clocks, randomness, network or external encoder. */
|
|
25
37
|
export interface PhotographicExportInput {
|
|
26
38
|
reconstruction: RawFrameReconstructionInput;
|
|
27
39
|
colorProfile: ExportSensorColorProfile;
|
|
28
40
|
whiteBalance: "not-required" | "apply-resolved-sensor-gains";
|
|
29
41
|
rendering: SdrRenderingProfile;
|
|
30
42
|
metadata: Omit<CaptureExportMetadataInput, "capture">;
|
|
31
|
-
/**
|
|
43
|
+
/** Public scene ID and version declared by the caller. They must match the committed scene state. */
|
|
32
44
|
sceneProfile: {
|
|
33
45
|
id: string;
|
|
34
46
|
version: string;
|
|
35
47
|
sceneStateId: string;
|
|
36
48
|
};
|
|
37
|
-
/** JPEG constant quantization step 1..255
|
|
49
|
+
/** JPEG constant quantization step, 1..255. It is not an imitation of a manufacturer's "quality" scale. */
|
|
38
50
|
jpegQuantizationStep: number;
|
|
39
|
-
/** Optional native
|
|
51
|
+
/** Optional lens correction in native optical coordinates, applied after colour. JPEG only; the RAW records it as information. */
|
|
40
52
|
correction?: CaptureCorrectedSdrInput["correction"];
|
|
53
|
+
/** How RAW highlights are handled before WB; default `clip`. See `prepareSensorColorDevelopment`. */
|
|
54
|
+
highlightMode?: RawHighlightMode;
|
|
41
55
|
}
|
|
42
|
-
/**
|
|
43
|
-
export
|
|
56
|
+
/** Options for {@link createPhotographicExportPair}. */
|
|
57
|
+
export interface PhotographicExportOptions {
|
|
58
|
+
/** Aborting rejects with a domain error at the next step. No partial pair is returned. */
|
|
59
|
+
signal?: AbortSignal;
|
|
60
|
+
}
|
|
61
|
+
/** Explicit RAW development settings (after the ADC), shared by the preview and the file output. */
|
|
62
|
+
export type ProcessedSensorRawInput = Pick<PhotographicExportInput, "reconstruction" | "colorProfile" | "whiteBalance" | "rendering" | "correction" | "highlightMode">;
|
|
44
63
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
64
|
+
* Processing record for the preview and JPEG, derived from the exact attached native RAW.
|
|
65
|
+
*
|
|
66
|
+
* Each step (reconstruction, colour, WB, correction, rendering) reports its input and output domains and
|
|
67
|
+
* its own clipping and cost diagnostics. The output view is oriented and cropped SDR. The native default
|
|
68
|
+
* crop and the physical capture history are unchanged. The returned arrays are the pixels before file
|
|
69
|
+
* encoding, not a decoded (lossy) JPEG.
|
|
50
70
|
*/
|
|
51
71
|
export interface ProcessedSensorRawResult {
|
|
52
72
|
inputDomain: "post-adc-native-sensor-raw";
|
|
@@ -62,8 +82,10 @@ export interface ProcessedSensorRawResult {
|
|
|
62
82
|
processedOutputView: PhotographicExportPair["processedOutputView"];
|
|
63
83
|
correction: CalculationResult<CaptureCorrectedSdrResult> | null;
|
|
64
84
|
rawCorrectionIntent: CalculationResult<ResolvedLensCorrectionPlan> | null;
|
|
85
|
+
/** RAW saturation handled before WB, over the developed image. */
|
|
86
|
+
highlight: RawHighlightDiagnostics;
|
|
65
87
|
}
|
|
66
|
-
/**
|
|
88
|
+
/** The byte arrays belong to the caller and can be changed. IDs and hashes refer to the exact bytes as first returned. */
|
|
67
89
|
export interface PhotographicExportPair {
|
|
68
90
|
schemaVersion: typeof PHOTOGRAPHIC_EXPORT_SCHEMA_VERSION;
|
|
69
91
|
metadata: CaptureExportMetadataPair;
|
|
@@ -74,7 +96,7 @@ export interface PhotographicExportPair {
|
|
|
74
96
|
source: CalculationResult<RawFrameReconstruction>;
|
|
75
97
|
rendering: CalculationResult<SdrRenderingResult>;
|
|
76
98
|
nativeDefaultCrop: RasterRect;
|
|
77
|
-
/**
|
|
99
|
+
/** The JPEG's rectangle in the oriented output. It never replaces the RAW's default crop. */
|
|
78
100
|
processedOutputView: {
|
|
79
101
|
rect: RasterRect;
|
|
80
102
|
pixelWidth: number;
|
|
@@ -82,6 +104,8 @@ export interface PhotographicExportPair {
|
|
|
82
104
|
};
|
|
83
105
|
correction: CalculationResult<CaptureCorrectedSdrResult> | null;
|
|
84
106
|
rawCorrectionIntent: CalculationResult<ResolvedLensCorrectionPlan> | null;
|
|
107
|
+
/** RAW saturation handled before WB in the JPEG development. */
|
|
108
|
+
highlight: RawHighlightDiagnostics;
|
|
85
109
|
imageDataPairing: "jpeg-generated-from-exact-attached-raw";
|
|
86
110
|
dng: {
|
|
87
111
|
mediaType: "image/dng";
|
|
@@ -95,9 +119,9 @@ export interface PhotographicExportPair {
|
|
|
95
119
|
};
|
|
96
120
|
interoperability: "independent-decode-required-editor-validation-pending";
|
|
97
121
|
}
|
|
98
|
-
/** Validates
|
|
122
|
+
/** Validates the separately supplied numeric colour-profile evidence, and ties the approximate profile to the exact CFA profile. */
|
|
99
123
|
export declare function parseExportSensorColorProfile(value: unknown): ExportSensorColorProfile;
|
|
100
|
-
/**
|
|
124
|
+
/** Quick geometry and layout checks, run after the RAW is revalidated and before any pixel work. */
|
|
101
125
|
export declare function validateProcessedSensorRawEnvelope(reconstruction: Pick<RawFrameReconstructionInput, "region"> & {
|
|
102
126
|
rawFrame: Pick<RawFrameReconstructionInput["rawFrame"], "capture">;
|
|
103
127
|
}, corrected: boolean): {
|
|
@@ -105,31 +129,30 @@ export declare function validateProcessedSensorRawEnvelope(reconstruction: Pick<
|
|
|
105
129
|
nativeDefaultCrop: RasterRect;
|
|
106
130
|
};
|
|
107
131
|
/**
|
|
108
|
-
* Revalidates one attached RAW snapshot and explicit processing
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
* correction support or
|
|
112
|
-
*
|
|
132
|
+
* Revalidates one attached RAW snapshot and the explicit processing settings.
|
|
133
|
+
*
|
|
134
|
+
* Crop sampling and reconstruction coverage problems fail here, before per-pixel work. Passing this
|
|
135
|
+
* check does not prove kernel support at the edges, correction support or that the file can be encoded;
|
|
136
|
+
* those are still checked during execution. The input is copied. No file or display code runs.
|
|
113
137
|
*/
|
|
114
138
|
export declare function parseProcessedSensorRawInput(value: unknown): ProcessedSensorRawInput;
|
|
115
|
-
/** Adds file metadata
|
|
139
|
+
/** Adds file metadata and encoding checks to the shared RAW processing settings. */
|
|
116
140
|
export declare function parsePhotographicExportInput(value: unknown): PhotographicExportInput;
|
|
117
|
-
/**
|
|
141
|
+
/** Reconstructs the exact attached RAW, develops colour and WB once, corrects, orients and crops, and encodes SDR. No file or display I/O. */
|
|
118
142
|
export declare function calculateProcessedSensorRaw(input: ProcessedSensorRawInput): CalculationResult<ProcessedSensorRawResult>;
|
|
119
143
|
/**
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
144
|
+
* Writes one RAW capture as a lossless, uncompressed CFA DNG and a separately encoded baseline JPEG.
|
|
145
|
+
* Shared metadata comes from the committed capture. Orientation, WB and rendering never rewrite the
|
|
146
|
+
* native RAW codes.
|
|
123
147
|
*
|
|
124
|
-
*
|
|
125
|
-
* frame through explicit reconstruction, approximate sensor-channel
|
|
126
|
-
* File identity and RAW data identity are
|
|
127
|
-
* before the first await.
|
|
128
|
-
* @param input -
|
|
129
|
-
* @returns
|
|
148
|
+
* The DNG keeps one revalidated native RAW frame (after the ADC) unchanged. The JPEG develops that same
|
|
149
|
+
* frame through explicit reconstruction, an approximate sensor-channel colour and WB conversion, and SDR
|
|
150
|
+
* rendering. File identity and RAW data identity are separate. Hashing is asynchronous; input data is
|
|
151
|
+
* copied before the first await. The full sensor is limited to 4096 sites.
|
|
152
|
+
* @param input - The RAW reconstruction input, colour profile, white-balance mode, SDR rendering profile, file metadata and JPEG settings.
|
|
153
|
+
* @returns The DNG and JPEG pair with their processing records. Success does not imply calibration.
|
|
130
154
|
*
|
|
131
|
-
* @see docs/API_REFERENCE.md for the
|
|
155
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
132
156
|
*/
|
|
133
|
-
export declare function createPhotographicExportPair(input: PhotographicExportInput): Promise<PhotographicExportPair>;
|
|
157
|
+
export declare function createPhotographicExportPair(input: PhotographicExportInput, options?: PhotographicExportOptions): Promise<PhotographicExportPair>;
|
|
134
158
|
export {};
|
|
135
|
-
//# sourceMappingURL=photographic-export.d.ts.map
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* Paired photographic export: writes one simulated RAW capture as a lossless DNG and, from the same RAW,
|
|
4
|
+
* develops and writes a baseline JPEG.
|
|
5
|
+
*
|
|
6
|
+
* The JPEG path reconstructs colour from the CFA (colour filter array) mosaic, applies an approximate
|
|
7
|
+
* camera colour profile and white balance (WB), optional lens correction, orientation and crop, and SDR
|
|
8
|
+
* rendering. The DNG keeps the native RAW codes unchanged.
|
|
7
9
|
* @see docs/PHOTOGRAPHIC_EXPORT.md for equations, coordinate/unit conventions, blockers and support
|
|
8
10
|
* limits.
|
|
9
11
|
*/
|
|
@@ -12,26 +14,39 @@ import { requireAllowlistedRecord, requirePublicOpaqueId } from "../core/record-
|
|
|
12
14
|
import { stringifyCanonicalJson } from "../core/canonical-json.js";
|
|
13
15
|
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
14
16
|
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
15
|
-
import { LINEAR_CAPTURE_RGB_PROFILE } from "../color/capture-color.js";
|
|
17
|
+
import { LINEAR_CAPTURE_RGB_PROFILE, resolveCaptureColorModel } from "../color/capture-color.js";
|
|
16
18
|
import { invertSensorColorMatrix, prepareSensorColorDevelopment, sensorColorReferenceWhite } from "../color/sensor-color-development.js";
|
|
19
|
+
import { ICC_D50_WHITE_XYZ } from "../color/srgb-icc.js";
|
|
20
|
+
import { chromaticAdaptationMatrix } from "../color/chromatic-adaptation.js";
|
|
21
|
+
import { createRawPixelDeveloper } from "./raw-development-kernel.js";
|
|
17
22
|
import { calculateSdrRendering, parseSdrRenderingProfile } from "../output/sdr-rendering.js";
|
|
18
23
|
import { transformOrientedRasterPointToNative, transformOrientedRasterRectToNative } from "../output/capture-geometry.js";
|
|
19
24
|
import { resolveRawFrameReconstruction, parseRawFrameReconstructionInput } from "./raw-frame-reconstruction.js";
|
|
20
25
|
import { createCaptureExportMetadataPair } from "./capture-export-metadata.js";
|
|
21
26
|
import { encodeExportJpeg } from "./export-jpeg.js";
|
|
22
|
-
import { packExportTiff, exportTiffAscii as ascii, exportTiffNumbers as numbers, exportTiffRationals as rationals, exportTiffBytes as rawBytes } from "./export-tiff.js";
|
|
27
|
+
import { packExportTiff, exportTiffAscii as ascii, exportTiffNumbers as numbers, exportTiffRationals as rationals, exportTiffBytes as rawBytes, exportTiffDoubles as doubles, packExportJpegExif } from "./export-tiff.js";
|
|
23
28
|
import { calculateCaptureCorrectedSdr, parseCaptureCorrectionChoice } from "../output/capture-corrected-sdr.js";
|
|
24
29
|
import { resolveLensCorrectionPlan } from "../output/lens-corrections.js";
|
|
25
30
|
import { parseSimulatedCapture } from "./simulated-capture.js";
|
|
26
31
|
import { approximationResult } from "../core/calculation-result.js";
|
|
27
32
|
export const PHOTOGRAPHIC_EXPORT_SCHEMA_VERSION = "0.1.0";
|
|
33
|
+
/**
|
|
34
|
+
* Version of the RAW and processed pipeline, recorded in XMP.
|
|
35
|
+
*
|
|
36
|
+
* 0.2.0: development scales to the effective white level, handles saturation, and fixes WB for colour
|
|
37
|
+
* matrices that are not white-normalized. DNG output fixes WhiteLevel, AsShotNeutral and BlackLevel/CFA
|
|
38
|
+
* phase, and adds the DNG 1.4 tags ForwardMatrix1, BaselineExposure, NoiseProfile and AnalogBalance.
|
|
39
|
+
*/
|
|
40
|
+
export const PHOTOGRAPHIC_EXPORT_PIPELINE_VERSION = "0.2.0";
|
|
41
|
+
/** Version of the `processed-sensor-raw-sdr` model (0.2.0: scaling to effective white, saturation and WB fixes). */
|
|
42
|
+
export const PROCESSED_SENSOR_RAW_MODEL_VERSION = "0.2.0";
|
|
28
43
|
function object(value, keys) {
|
|
29
44
|
return requireAllowlistedRecord(value, keys, "Invalid photographic export fields.");
|
|
30
45
|
}
|
|
31
46
|
function id(value) {
|
|
32
47
|
return requirePublicOpaqueId(value, "Invalid public export profile identity.");
|
|
33
48
|
}
|
|
34
|
-
/** Validates
|
|
49
|
+
/** Validates the separately supplied numeric colour-profile evidence, and ties the approximate profile to the exact CFA profile. */
|
|
35
50
|
export function parseExportSensorColorProfile(value) {
|
|
36
51
|
const r = object(value, ["schemaVersion", "profileId", "profileVersion", "colorSamplingProfileId", "channelIds", "scientificStatus", "referenceIlluminant", "normalizedCameraChannelsToXyz", "evidence", "limitations"]);
|
|
37
52
|
const m = r.normalizedCameraChannelsToXyz;
|
|
@@ -47,7 +62,7 @@ export function parseExportSensorColorProfile(value) {
|
|
|
47
62
|
return { schemaVersion: "0.1.0", profileId: id(r.profileId), profileVersion: id(r.profileVersion), colorSamplingProfileId: id(r.colorSamplingProfileId),
|
|
48
63
|
channelIds: ["red", "green", "blue"], scientificStatus: "approximation", referenceIlluminant: "D65", normalizedCameraChannelsToXyz: matrix, evidence, limitations: [...r.limitations] };
|
|
49
64
|
}
|
|
50
|
-
/**
|
|
65
|
+
/** Quick geometry and layout checks, run after the RAW is revalidated and before any pixel work. */
|
|
51
66
|
export function validateProcessedSensorRawEnvelope(reconstruction, corrected) {
|
|
52
67
|
const frame = reconstruction.rawFrame, capture = frame.capture, g = capture.resolvedGeometry, active = g.activeCapture.nativeRect, crop = g.output.cropRect, raster = g.output.raster, region = reconstruction.region;
|
|
53
68
|
if (raster.pixelWidth !== crop.width || raster.pixelHeight !== crop.height)
|
|
@@ -70,14 +85,16 @@ function requireDngTopology(frame) {
|
|
|
70
85
|
throw new InvalidConfigurationError("Initial DNG profile supports explicitly registered 2x2 RGB Bayer topology only.");
|
|
71
86
|
}
|
|
72
87
|
/**
|
|
73
|
-
* Revalidates one attached RAW snapshot and explicit processing
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* correction support or
|
|
77
|
-
*
|
|
88
|
+
* Revalidates one attached RAW snapshot and the explicit processing settings.
|
|
89
|
+
*
|
|
90
|
+
* Crop sampling and reconstruction coverage problems fail here, before per-pixel work. Passing this
|
|
91
|
+
* check does not prove kernel support at the edges, correction support or that the file can be encoded;
|
|
92
|
+
* those are still checked during execution. The input is copied. No file or display code runs.
|
|
78
93
|
*/
|
|
79
94
|
export function parseProcessedSensorRawInput(value) {
|
|
80
|
-
const r = object(value, ["reconstruction", "colorProfile", "whiteBalance", "rendering", "correction"]);
|
|
95
|
+
const r = object(value, ["reconstruction", "colorProfile", "whiteBalance", "rendering", "correction", "highlightMode"]);
|
|
96
|
+
if (r.highlightMode !== undefined && r.highlightMode !== "clip" && r.highlightMode !== "reconstruct")
|
|
97
|
+
throw new InvalidConfigurationError("Unsupported RAW highlight mode.");
|
|
81
98
|
const reconstruction = parseRawFrameReconstructionInput(r.reconstruction), colorProfile = parseExportSensorColorProfile(r.colorProfile), rendering = parseSdrRenderingProfile(r.rendering);
|
|
82
99
|
const intent = reconstruction.rawFrame.capture.whiteBalanceIntent;
|
|
83
100
|
if (colorProfile.colorSamplingProfileId !== reconstruction.rawFrame.colorSamplingProfile.profileId ||
|
|
@@ -90,13 +107,14 @@ export function parseProcessedSensorRawInput(value) {
|
|
|
90
107
|
throw new InvalidConfigurationError("RAW-derived processing has no source prefilter; prefiltered declarations are unsupported.");
|
|
91
108
|
}
|
|
92
109
|
validateProcessedSensorRawEnvelope(reconstruction, correction !== undefined);
|
|
93
|
-
return { reconstruction, colorProfile, whiteBalance: r.whiteBalance, rendering, ...(correction === undefined ? {} : { correction })
|
|
110
|
+
return { reconstruction, colorProfile, whiteBalance: r.whiteBalance, rendering, ...(correction === undefined ? {} : { correction }),
|
|
111
|
+
...(r.highlightMode === undefined ? {} : { highlightMode: r.highlightMode }) };
|
|
94
112
|
}
|
|
95
|
-
/** Adds file metadata
|
|
113
|
+
/** Adds file metadata and encoding checks to the shared RAW processing settings. */
|
|
96
114
|
export function parsePhotographicExportInput(value) {
|
|
97
|
-
const r = object(value, ["reconstruction", "colorProfile", "whiteBalance", "rendering", "metadata", "sceneProfile", "jpegQuantizationStep", "correction"]);
|
|
115
|
+
const r = object(value, ["reconstruction", "colorProfile", "whiteBalance", "rendering", "metadata", "sceneProfile", "jpegQuantizationStep", "correction", "highlightMode"]);
|
|
98
116
|
const processed = parseProcessedSensorRawInput({ reconstruction: r.reconstruction, colorProfile: r.colorProfile, whiteBalance: r.whiteBalance, rendering: r.rendering,
|
|
99
|
-
...(r.correction === undefined ? {} : { correction: r.correction }) });
|
|
117
|
+
...(r.correction === undefined ? {} : { correction: r.correction }), ...(r.highlightMode === undefined ? {} : { highlightMode: r.highlightMode }) });
|
|
100
118
|
requireDngTopology(processed.reconstruction.rawFrame);
|
|
101
119
|
if (processed.rendering.bitDepth !== 8)
|
|
102
120
|
throw new InvalidConfigurationError("Initial JPEG export requires 8-bit SDR.");
|
|
@@ -117,9 +135,12 @@ function canonical(value) {
|
|
|
117
135
|
unsupportedValueMessage: "Export hash requires finite canonical JSON."
|
|
118
136
|
});
|
|
119
137
|
}
|
|
120
|
-
|
|
138
|
+
function requireWebCrypto() {
|
|
121
139
|
if (!globalThis.crypto?.subtle)
|
|
122
|
-
throw new InvalidConfigurationError("Paired export requires Web Crypto SHA-256 in
|
|
140
|
+
throw new InvalidConfigurationError("Paired export requires Web Crypto SHA-256 (crypto.subtle). Browsers expose it only in secure contexts (HTTPS or localhost); Node.js 22+ provides it globally.");
|
|
141
|
+
}
|
|
142
|
+
async function hash(value) {
|
|
143
|
+
requireWebCrypto();
|
|
123
144
|
const data = typeof value === "string" ? new TextEncoder().encode(value) : new Uint8Array(value);
|
|
124
145
|
const result = await globalThis.crypto.subtle.digest("SHA-256", data);
|
|
125
146
|
return Array.from(new Uint8Array(result), (v) => v.toString(16).padStart(2, "0")).join("");
|
|
@@ -129,7 +150,7 @@ function xmp(pair, role, simulationHash, color, mode, scene, corrected) {
|
|
|
129
150
|
const values = { "xmp:CreatorTool": s.creatorTool, "xmpMM:DocumentID": "uuid:" + artifact.documentId, "xmpMM:InstanceID": "uuid:" + artifact.instanceId,
|
|
130
151
|
"Iptc4xmpExt:DigitalImageGUID": "urn:uuid:" + artifact.documentId, "Iptc4xmpExt:DigitalSourceType": s.digitalSourceTypeUri,
|
|
131
152
|
"photivra:SchemaVersion": "1.0", "photivra:SimulatedCapture": "True", "photivra:CaptureID": s.captureId, "photivra:OutputRole": role,
|
|
132
|
-
"photivra:EngineVersion": s.engineApiVersion, "photivra:CaptureContractVersion": s.captureContractVersion, "photivra:RawPipelineVersion":
|
|
153
|
+
"photivra:EngineVersion": s.engineApiVersion, "photivra:CaptureContractVersion": s.captureContractVersion, "photivra:RawPipelineVersion": PHOTOGRAPHIC_EXPORT_PIPELINE_VERSION,
|
|
133
154
|
"photivra:SceneID": scene.id, "photivra:SceneVersion": scene.version, "photivra:SensorProfileID": color.profileId, "photivra:CaptureMode": mode, "photivra:RawSampleModel": "post_adc_pre_demosaic",
|
|
134
155
|
"photivra:DeterministicSeed": String(s.noise.seedUint32), "photivra:SimulationHashAlgorithm": "sha-256", "photivra:SimulationHash": simulationHash,
|
|
135
156
|
"photivra:SceneTime": String(s.sceneTimeSeconds) };
|
|
@@ -143,7 +164,7 @@ function xmp(pair, role, simulationHash, color, mode, scene, corrected) {
|
|
|
143
164
|
values["photivra:ProcessedIlluminationClippingEvents"] = String(corrected.clippingEvents);
|
|
144
165
|
}
|
|
145
166
|
if (role === "jpeg")
|
|
146
|
-
values["photivra:ProcessedPipelineVersion"] =
|
|
167
|
+
values["photivra:ProcessedPipelineVersion"] = PHOTOGRAPHIC_EXPORT_PIPELINE_VERSION;
|
|
147
168
|
if (s.focus.kind === "finite")
|
|
148
169
|
values["photivra:FocusDistanceMeters"] = String(s.focus.distanceM);
|
|
149
170
|
const escape = (v) => v.replaceAll("&", "&").replaceAll('"', """).replaceAll("<", "<").replaceAll(">", ">");
|
|
@@ -164,25 +185,47 @@ function commonExif(pair, role, width, height) {
|
|
|
164
185
|
function identity(pair, orientation) {
|
|
165
186
|
return [ascii(271, pair.shared.make), ascii(272, pair.shared.model), ascii(305, pair.shared.software), numbers(274, 3, [orientation])];
|
|
166
187
|
}
|
|
167
|
-
|
|
188
|
+
function developmentFor(color, intent, highlightMode) {
|
|
189
|
+
return prepareSensorColorDevelopment(color.normalizedCameraChannelsToXyz, intent ? [intent.channelGains.red, intent.channelGains.green, intent.channelGains.blue] : null, highlightMode);
|
|
190
|
+
}
|
|
191
|
+
/** Typed-array view of a bounded attached RAW frame. The frame parser guarantees one white level per CFA phase. */
|
|
192
|
+
function frameDevelopmentSource(frame) {
|
|
193
|
+
const layout = frame.colorSamplingProfile.layout;
|
|
194
|
+
if (layout.kind !== "periodic-mosaic")
|
|
195
|
+
throw new InvalidConfigurationError("Development requires periodic CFA.");
|
|
196
|
+
const n = frame.samples.length, codes = new Uint16Array(n), blacks = new Uint16Array(n), flags = new Uint8Array(n), white = new Uint16Array(layout.repeatWidthSites * layout.repeatHeightSites);
|
|
197
|
+
frame.samples.forEach((s, i) => {
|
|
198
|
+
const x = i % frame.nativePixelWidth, y = Math.floor(i / frame.nativePixelWidth);
|
|
199
|
+
codes[i] = s.rawCode;
|
|
200
|
+
blacks[i] = s.blackLevelCode;
|
|
201
|
+
flags[i] = Number(s.physicalScalarSaturationApplied) | Number(s.digitalSaturationApplied) << 2;
|
|
202
|
+
white[(y % layout.repeatHeightSites) * layout.repeatWidthSites + x % layout.repeatWidthSites] = s.effectiveSaturationCode;
|
|
203
|
+
});
|
|
204
|
+
return { nativeWidth: frame.nativePixelWidth, repeatWidth: layout.repeatWidthSites, repeatHeight: layout.repeatHeightSites, codes, blackLevels: blacks, saturationFlags: flags, whiteByPhase: white };
|
|
205
|
+
}
|
|
206
|
+
/** Reconstructs the exact attached RAW, develops colour and WB once, corrects, orients and crops, and encodes SDR. No file or display I/O. */
|
|
168
207
|
export function calculateProcessedSensorRaw(input) {
|
|
169
208
|
const v = structuredClone(parseProcessedSensorRawInput(input));
|
|
170
209
|
const source = resolveRawFrameReconstruction(v.reconstruction), frame = source.value.rawFrame, capture = frame.capture, g = capture.resolvedGeometry, active = g.activeCapture.nativeRect, crop = g.output.cropRect, raster = g.output.raster, region = source.value.region;
|
|
171
210
|
const { nativeDefaultCrop } = validateProcessedSensorRawEnvelope(v.reconstruction, v.correction !== undefined);
|
|
172
|
-
const
|
|
173
|
-
const development =
|
|
174
|
-
if (cameraWhite.some((x) => x <= 0 || !Number.isFinite(x)))
|
|
175
|
-
throw new InvalidConfigurationError("DNG reference white must map to positive camera-neutral coordinates.");
|
|
211
|
+
const intent = capture.whiteBalanceIntent, highlightMode = v.highlightMode ?? "clip";
|
|
212
|
+
const development = developmentFor(v.colorProfile, intent, highlightMode), white = development.referenceWhiteXyz;
|
|
176
213
|
const developedRaster = v.correction ? g.orientedCapture.raster : raster, developedRect = v.correction ? { x: 0, y: 0, width: developedRaster.pixelWidth, height: developedRaster.pixelHeight } : crop;
|
|
177
|
-
|
|
214
|
+
// The attached RAW codes go through the shared typed kernel: effective white per phase, saturation handled before WB.
|
|
215
|
+
// Reconstruction (above) already validated every kernel halo for the region, which covers this raster.
|
|
216
|
+
const developer = createRawPixelDeveloper(frameDevelopmentSource(frame), source.value.phaseProfiles, development);
|
|
217
|
+
const rgb = new Array(developedRaster.pixelWidth * developedRaster.pixelHeight * 3).fill(0);
|
|
178
218
|
for (let y = 0; y < developedRaster.pixelHeight; y++)
|
|
179
219
|
for (let x = 0; x < developedRaster.pixelWidth; x++) {
|
|
180
220
|
const p = transformOrientedRasterPointToNative({ point: { x: developedRect.x + x + .5, y: developedRect.y + y + .5 }, nativeRaster: g.activeCapture.raster, orientation: capture.geometry.orientation });
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
-
|
|
221
|
+
const nx = Math.floor(p.x) + active.x, ny = Math.floor(p.y) + active.y;
|
|
222
|
+
if (nx < region.x || ny < region.y || nx >= region.x + region.width || ny >= region.y + region.height)
|
|
223
|
+
throw new InvalidConfigurationError("Reconstruction does not cover the developed raster.");
|
|
224
|
+
developer.developAt(nx, ny, rgb, (y * developedRaster.pixelWidth + x) * 3);
|
|
184
225
|
}
|
|
185
|
-
|
|
226
|
+
const highlight = { mode: highlightMode, saturatedPixelCount: developer.counts.saturatedPixelCount,
|
|
227
|
+
whiteBalanceClippedSampleCount: developer.counts.whiteBalanceClippedSampleCount, reconstructedPixelCount: developer.counts.reconstructedPixelCount };
|
|
228
|
+
// This private processing plane comes only from reconstructing the exact attached RAW. The original float planes are dropped.
|
|
186
229
|
const correction = v.correction ? calculateCaptureCorrectedSdr({ capture: parseSimulatedCapture({ ...capture, planes: [{
|
|
187
230
|
id: "photivra-export-linear", imageStateId: "photivra-export-developed", imageState: "color-transformed-linear-rgb",
|
|
188
231
|
rasterBinding: "oriented-active-capture", pixelWidth: developedRaster.pixelWidth, pixelHeight: developedRaster.pixelHeight,
|
|
@@ -199,75 +242,139 @@ export function calculateProcessedSensorRaw(input) {
|
|
|
199
242
|
const rendering = correction?.value.rendering ?? calculateSdrRendering({ sourceImageStateId: frame.frameId + ":developed", inputImageState: "color-transformed-linear-rgb", inputColorSpace: "linear-srgb-d65",
|
|
200
243
|
whiteBalanceHandling: intent ? "already-applied-upstream" : "not-required", pixelWidth: raster.pixelWidth, pixelHeight: raster.pixelHeight, referenceWhiteValue: 1, samples: rgb, profile: v.rendering });
|
|
201
244
|
return approximationResult({ inputDomain: "post-adc-native-sensor-raw", colorProfile: v.colorProfile, whiteBalancePolicy: v.whiteBalance, outputDomain: "output-referred-srgb-d65-sdr", physicalCaptureModified: false,
|
|
202
|
-
displayAdaptationApplied: false, whiteBalance: intent ? "applied-here" : "not-required", source, rendering, nativeDefaultCrop, processedOutputView, correction, rawCorrectionIntent }, "processed-sensor-raw-sdr",
|
|
203
|
-
"Exact attached RAW
|
|
245
|
+
displayAdaptationApplied: false, whiteBalance: intent ? "applied-here" : "not-required", source, rendering, nativeDefaultCrop, processedOutputView, correction, rawCorrectionIntent, highlight }, "processed-sensor-raw-sdr", PROCESSED_SENSOR_RAW_MODEL_VERSION, [
|
|
246
|
+
"Exact attached RAW codes are normalized to each CFA phase's effective white level, clipped and saturation-consumed before WB, then developed through explicit approximate sensor color; WB is applied once before correction and SDR.",
|
|
204
247
|
"Output is encoded sRGB/D65 SDR; platform viewing adaptation and HDR encoding are not applied.",
|
|
205
248
|
"Bounded reference reconstruction, correction support and 1:1 output crop remain explicit; physical capture is unchanged."
|
|
206
249
|
]);
|
|
207
250
|
}
|
|
208
251
|
/**
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
252
|
+
* Writes one RAW capture as a lossless, uncompressed CFA DNG and a separately encoded baseline JPEG.
|
|
253
|
+
* Shared metadata comes from the committed capture. Orientation, WB and rendering never rewrite the
|
|
254
|
+
* native RAW codes.
|
|
212
255
|
*
|
|
213
|
-
*
|
|
214
|
-
* frame through explicit reconstruction, approximate sensor-channel
|
|
215
|
-
* File identity and RAW data identity are
|
|
216
|
-
* before the first await.
|
|
217
|
-
* @param input -
|
|
218
|
-
* @returns
|
|
256
|
+
* The DNG keeps one revalidated native RAW frame (after the ADC) unchanged. The JPEG develops that same
|
|
257
|
+
* frame through explicit reconstruction, an approximate sensor-channel colour and WB conversion, and SDR
|
|
258
|
+
* rendering. File identity and RAW data identity are separate. Hashing is asynchronous; input data is
|
|
259
|
+
* copied before the first await. The full sensor is limited to 4096 sites.
|
|
260
|
+
* @param input - The RAW reconstruction input, colour profile, white-balance mode, SDR rendering profile, file metadata and JPEG settings.
|
|
261
|
+
* @returns The DNG and JPEG pair with their processing records. Success does not imply calibration.
|
|
219
262
|
*
|
|
220
|
-
* @see docs/API_REFERENCE.md for the
|
|
263
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
221
264
|
*/
|
|
222
|
-
export async function createPhotographicExportPair(input) {
|
|
223
|
-
|
|
265
|
+
export async function createPhotographicExportPair(input, options = {}) {
|
|
266
|
+
const opts = object(options, ["signal"]), signal = opts.signal;
|
|
267
|
+
if (signal !== undefined && (typeof signal !== "object" || signal === null || typeof signal.aborted !== "boolean"))
|
|
268
|
+
throw new InvalidConfigurationError("Export signal must be an AbortSignal.");
|
|
269
|
+
const active = () => { if (signal?.aborted)
|
|
270
|
+
throw new InvalidConfigurationError("Photographic export aborted."); };
|
|
271
|
+
// Fail before any work when the context cannot hash (browsers expose crypto.subtle only in secure contexts).
|
|
272
|
+
requireWebCrypto();
|
|
273
|
+
active();
|
|
274
|
+
// Copy the validated inputs into private values before the first await, so later caller changes cannot affect hashing or encoding.
|
|
224
275
|
const v = JSON.parse(JSON.stringify(parsePhotographicExportInput(input)));
|
|
276
|
+
const highlightMode = v.highlightMode ?? "clip";
|
|
225
277
|
const processed = calculateProcessedSensorRaw({ reconstruction: v.reconstruction, colorProfile: v.colorProfile, whiteBalance: v.whiteBalance, rendering: v.rendering,
|
|
226
|
-
...(v.correction === undefined ? {} : { correction: v.correction }) }).value;
|
|
227
|
-
const { source, rendering, nativeDefaultCrop, processedOutputView, correction, rawCorrectionIntent } = processed;
|
|
228
|
-
const frame = source.value.rawFrame, capture = frame.capture, g = capture.resolvedGeometry,
|
|
278
|
+
...(v.correction === undefined ? {} : { correction: v.correction }), highlightMode }).value;
|
|
279
|
+
const { source, rendering, nativeDefaultCrop, processedOutputView, correction, rawCorrectionIntent, highlight } = processed;
|
|
280
|
+
const frame = source.value.rawFrame, capture = frame.capture, g = capture.resolvedGeometry, activeRect = g.activeCapture.nativeRect, region = source.value.region;
|
|
229
281
|
const metadata = createCaptureExportMetadataPair({ ...v.metadata, capture });
|
|
230
282
|
const { local } = validateProcessedSensorRawEnvelope(v.reconstruction, v.correction !== undefined);
|
|
231
|
-
const colorMatrix = invertSensorColorMatrix(v.colorProfile.normalizedCameraChannelsToXyz),
|
|
232
|
-
const
|
|
233
|
-
const neutral = cameraWhite.map((x, i) => x / gains[i]), scale = neutral[1];
|
|
283
|
+
const colorMatrix = invertSensorColorMatrix(v.colorProfile.normalizedCameraChannelsToXyz), intent = capture.whiteBalanceIntent;
|
|
284
|
+
const development = developmentFor(v.colorProfile, intent, highlightMode);
|
|
234
285
|
const correctedMetadata = v.correction && correction ? { choice: v.correction, rect: processedOutputView.rect,
|
|
235
286
|
clippingEvents: correction.value.correction.value.illuminationClippingEventCount } : undefined;
|
|
236
287
|
const layout = frame.colorSamplingProfile.layout;
|
|
237
288
|
if (layout.kind !== "periodic-mosaic")
|
|
238
289
|
throw new InvalidConfigurationError("Initial DNG profile supports explicitly registered 2x2 RGB Bayer topology only.");
|
|
239
|
-
const
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
const found = frame.samples.filter((s) => s.colorSamplingSite.x % 2 === px && s.colorSamplingSite.y % 2 === py), first = found[0];
|
|
243
|
-
if (!first || found.some((s) => s.blackLevelCode !== first.blackLevelCode || s.digitalSaturationCode !== whiteLevel))
|
|
244
|
-
throw new InvalidConfigurationError("DNG requires a fixed repeating black tile and one common WhiteLevel.");
|
|
245
|
-
black.push(first.blackLevelCode);
|
|
246
|
-
}
|
|
247
|
-
const simulationHash = await hash(canonical({ schema: PHOTOGRAPHIC_EXPORT_SCHEMA_VERSION, rawFrame: frame, phaseProfiles: source.value.phaseProfiles, region,
|
|
248
|
-
colorProfile: v.colorProfile, sceneProfile: v.sceneProfile, whiteBalance: v.whiteBalance, rendering: v.rendering, jpegQuantizationStep: v.jpegQuantizationStep,
|
|
290
|
+
const dng = dngLevels(frame, activeRect);
|
|
291
|
+
const simulationHash = await hash(canonical({ schema: PHOTOGRAPHIC_EXPORT_SCHEMA_VERSION, pipeline: PHOTOGRAPHIC_EXPORT_PIPELINE_VERSION, rawFrame: frame, phaseProfiles: source.value.phaseProfiles, region,
|
|
292
|
+
colorProfile: v.colorProfile, sceneProfile: v.sceneProfile, whiteBalance: v.whiteBalance, rendering: v.rendering, jpegQuantizationStep: v.jpegQuantizationStep, highlightMode,
|
|
249
293
|
...(v.correction ? { correction: v.correction } : {}) }));
|
|
294
|
+
active();
|
|
250
295
|
const rawHash = await hash(canonical({ schema: "photivra-raw-data-id-0.1", width: frame.nativePixelWidth, height: frame.nativePixelHeight,
|
|
251
296
|
cfa: layout, containerBitDepth: 16, codes: frame.samples.map((s) => s.rawCode) })), rawDataUniqueId = rawHash.slice(0, 32);
|
|
297
|
+
active();
|
|
252
298
|
const colorHash = await hash(canonical(v.colorProfile)), uniqueCameraModel = "Photivra Virtual Camera " + v.colorProfile.profileId + " " + v.colorProfile.profileVersion + " " + colorHash;
|
|
299
|
+
active();
|
|
253
300
|
const orientation = { landscape: 1, "portrait-clockwise": 6, "landscape-inverted": 3, "portrait-counter-clockwise": 8 }[capture.geometry.orientation];
|
|
254
301
|
const pixels = new Uint8Array(frame.samples.length * 2), view = new DataView(pixels.buffer);
|
|
255
302
|
frame.samples.forEach((s, i) => view.setUint16(i * 2, s.rawCode, true));
|
|
256
303
|
const strip = { ...numbers(273, 4, [0]), pointer: "pixels" };
|
|
304
|
+
// ForwardMatrix1 maps white-balanced camera values to XYZ(D50) with [1,1,1] -> D50 white:
|
|
305
|
+
// FM = Bradford(D65->D50) * M * diag(w), w = M^-1 * XYZ(D65) (unnormalized camera white).
|
|
306
|
+
const cameraWhite = sensorColorReferenceWhite(colorMatrix), m = v.colorProfile.normalizedCameraChannelsToXyz, chad = chromaticAdaptationMatrix({ transform: "bradford", sourceWhiteXyz: resolveCaptureColorModel().referenceWhiteXyz, destinationWhiteXyz: { x: ICC_D50_WHITE_XYZ[0], y: 1, z: ICC_D50_WHITE_XYZ[2] } }).matrix;
|
|
307
|
+
const forward = chad.map((row) => [0, 1, 2].map((j) => row.reduce((sum, x, k) => sum + x * m[k][j] * cameraWhite[j], 0)));
|
|
257
308
|
const dngBytes = packExportTiff([...identity(metadata, orientation), numbers(254, 4, [0]), numbers(256, 4, [frame.nativePixelWidth]), numbers(257, 4, [frame.nativePixelHeight]),
|
|
258
309
|
numbers(258, 3, [16]), numbers(259, 3, [1]), numbers(262, 3, [32803]), strip, numbers(277, 3, [1]), numbers(278, 4, [frame.nativePixelHeight]), numbers(279, 4, [pixels.length]),
|
|
259
|
-
numbers(284, 3, [1]), numbers(339, 3, [1]), numbers(33421, 3, [2, 2]), numbers(33422, 1,
|
|
260
|
-
numbers(50706, 1, [1,
|
|
261
|
-
rationals(50714, false, black), numbers(50717, 4, [whiteLevel]), numbers(50719, 4, [local.x, local.y]), numbers(50720, 4, [local.width, local.height]),
|
|
262
|
-
rationals(50721, true, colorMatrix.flat()), rationals(
|
|
263
|
-
|
|
310
|
+
numbers(284, 3, [1]), numbers(339, 3, [1]), numbers(33421, 3, [2, 2]), numbers(33422, 1, dng.cfaPattern),
|
|
311
|
+
numbers(50706, 1, [1, 4, 0, 0]), numbers(50707, 1, [1, 1, 0, 0]), ascii(50708, uniqueCameraModel), numbers(50710, 1, [0, 1, 2]), numbers(50711, 3, [1]), numbers(50713, 3, [2, 2]),
|
|
312
|
+
rationals(50714, false, dng.black), numbers(50717, 4, [dng.whiteLevel]), numbers(50719, 4, [local.x, local.y]), numbers(50720, 4, [local.width, local.height]),
|
|
313
|
+
rationals(50721, true, colorMatrix.flat()), rationals(50727, false, [1, 1, 1]), rationals(50728, false, [...development.asShotNeutral]),
|
|
314
|
+
rationals(50730, true, [v.rendering.renderingExposureEv]), numbers(50778, 3, [21]),
|
|
315
|
+
rawBytes(50781, 1, Uint8Array.from(rawDataUniqueId.match(/../g).map((s) => parseInt(s, 16)))), numbers(50829, 4, [activeRect.y, activeRect.x, activeRect.y + activeRect.height, activeRect.x + activeRect.width]),
|
|
316
|
+
rationals(50964, true, forward.flat()), ...(dng.noiseProfile ? [doubles(51041, dng.noiseProfile)] : []),
|
|
264
317
|
rawBytes(700, 1, xmp(metadata, "raw", simulationHash, v.colorProfile, frame.modeId, v.sceneProfile, correctedMetadata))], commonExif(metadata, "raw", local.width, local.height), pixels);
|
|
265
|
-
|
|
318
|
+
// Exif 2.32 mandatory tags for a compressed primary image (resolution 72 dpi = unknown, YCbCrPositioning, FlashpixVersion, ComponentsConfiguration).
|
|
319
|
+
const jpegExif = packExportJpegExif(identity(metadata, 1), commonExif(metadata, "jpeg", processedOutputView.pixelWidth, processedOutputView.pixelHeight), { pixelWidth: processedOutputView.pixelWidth, pixelHeight: processedOutputView.pixelHeight });
|
|
266
320
|
const jpegBytes = encodeExportJpeg({ width: processedOutputView.pixelWidth, height: processedOutputView.pixelHeight, samples: rendering.value.integerSamples,
|
|
267
321
|
quantizationStep: v.jpegQuantizationStep, exif: jpegExif, xmp: xmp(metadata, "jpeg", simulationHash, v.colorProfile, frame.modeId, v.sceneProfile, correctedMetadata) });
|
|
322
|
+
active();
|
|
323
|
+
const dngHash = await hash(dngBytes);
|
|
324
|
+
active();
|
|
325
|
+
const jpegHash = await hash(jpegBytes);
|
|
326
|
+
active();
|
|
268
327
|
return { schemaVersion: PHOTOGRAPHIC_EXPORT_SCHEMA_VERSION, metadata, simulationHashAlgorithm: "sha-256", simulationHash, rawDataUniqueId, uniqueCameraModel, source, rendering, nativeDefaultCrop, processedOutputView, correction, rawCorrectionIntent,
|
|
269
|
-
imageDataPairing: "jpeg-generated-from-exact-attached-raw",
|
|
270
|
-
dng: { mediaType: "image/dng", bytes: dngBytes, sha256:
|
|
328
|
+
highlight, imageDataPairing: "jpeg-generated-from-exact-attached-raw",
|
|
329
|
+
dng: { mediaType: "image/dng", bytes: dngBytes, sha256: dngHash }, jpeg: { mediaType: "image/jpeg", bytes: jpegBytes, sha256: jpegHash },
|
|
271
330
|
interoperability: "independent-decode-required-editor-validation-pending" };
|
|
272
331
|
}
|
|
332
|
+
/**
|
|
333
|
+
* DNG level tags for a 2×2 CFA frame.
|
|
334
|
+
*
|
|
335
|
+
* DNG 1.7 applies BlackLevelRepeatDim and CFAPattern to the image after the ActiveArea crop (stage 2), so
|
|
336
|
+
* phases are measured from the ActiveArea origin. WhiteLevel (one value, because SamplesPerPixel is 1) is
|
|
337
|
+
* the smallest per-phase effective white code, so no channel is reported as unsaturated above its own
|
|
338
|
+
* saturation point.
|
|
339
|
+
*
|
|
340
|
+
* NoiseProfile (tag 51041) is written per CFAPlaneColor plane, only when every phase of a channel has the
|
|
341
|
+
* same gain, read noise and black level. With x = (code − black)/(WhiteLevel − black):
|
|
342
|
+
* var(x) = S·x + O, S = 1/(G·span), O = (σ²/G² + 1/12)/span². The model covers Poisson photo and dark shot
|
|
343
|
+
* noise, Gaussian read noise and uniform ADC quantization. PRNU (photo-response non-uniformity), DSNU
|
|
344
|
+
* (dark-signal non-uniformity) and other fixed-pattern noise are not modelled and not included.
|
|
345
|
+
*/
|
|
346
|
+
function dngLevels(frame, activeRect) {
|
|
347
|
+
const layout = frame.colorSamplingProfile.layout;
|
|
348
|
+
if (layout.kind !== "periodic-mosaic")
|
|
349
|
+
throw new InvalidConfigurationError("Initial DNG profile supports explicitly registered 2x2 RGB Bayer topology only.");
|
|
350
|
+
const black = [], cfaPattern = [], whites = [], perChannel = new Map();
|
|
351
|
+
for (let py = 0; py < 2; py++)
|
|
352
|
+
for (let px = 0; px < 2; px++) {
|
|
353
|
+
// Absolute native phase of active-relative phase (px, py).
|
|
354
|
+
const ax = (activeRect.x + px) % 2, ay = (activeRect.y + py) % 2;
|
|
355
|
+
const found = frame.samples.filter((s) => s.colorSamplingSite.x % 2 === ax && s.colorSamplingSite.y % 2 === ay), first = found[0];
|
|
356
|
+
if (!first || found.some((s) => s.blackLevelCode !== first.blackLevelCode))
|
|
357
|
+
throw new InvalidConfigurationError("DNG requires a fixed repeating black tile.");
|
|
358
|
+
black.push(first.blackLevelCode);
|
|
359
|
+
whites.push(first.effectiveSaturationCode);
|
|
360
|
+
cfaPattern.push(["red", "green", "blue"].indexOf(layout.siteChannelIds[ay * 2 + ax]));
|
|
361
|
+
const list = perChannel.get(first.channelId) ?? [];
|
|
362
|
+
list.push({ gain: first.systemConversionGainElectronsPerCode, readNoise: first.readNoiseRmsElectrons, black: first.blackLevelCode });
|
|
363
|
+
perChannel.set(first.channelId, list);
|
|
364
|
+
}
|
|
365
|
+
const whiteLevel = Math.min(...whites);
|
|
366
|
+
if (black.some((b) => b >= whiteLevel))
|
|
367
|
+
throw new InvalidConfigurationError("DNG black level must be below the effective WhiteLevel.");
|
|
368
|
+
let noiseProfile = [];
|
|
369
|
+
for (const channel of ["red", "green", "blue"]) {
|
|
370
|
+
const list = perChannel.get(channel), f = list?.[0];
|
|
371
|
+
if (!list || !f || list.some((e) => e.gain !== f.gain || e.readNoise !== f.readNoise || e.black !== f.black)) {
|
|
372
|
+
noiseProfile = null;
|
|
373
|
+
break;
|
|
374
|
+
}
|
|
375
|
+
const span = whiteLevel - f.black;
|
|
376
|
+
noiseProfile.push(1 / (f.gain * span), (f.readNoise * f.readNoise / (f.gain * f.gain) + 1 / 12) / (span * span));
|
|
377
|
+
}
|
|
378
|
+
return { black, cfaPattern, whiteLevel, noiseProfile };
|
|
379
|
+
}
|
|
273
380
|
//# sourceMappingURL=photographic-export.js.map
|