@photivra/engine 1.4.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 +401 -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 +118 -5
- package/dist/capture/native-raw-development.js +224 -59
- 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 +67 -10
- package/dist/capture/native-raw.js +90 -24
- 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 -4
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +23 -8
- 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/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 -47
- 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_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/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/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
|
@@ -3,7 +3,7 @@ import { type ResolvedWhiteBalanceState, type WhiteBalanceChannelGains } from ".
|
|
|
3
3
|
import { type FocusPlane } from "../optics/focus-state.js";
|
|
4
4
|
import { type ResolveCaptureGeometryInput, type ResolvedCaptureGeometry } from "../output/capture-geometry.js";
|
|
5
5
|
export declare const SIMULATED_CAPTURE_SCHEMA_VERSION: "0.2.0";
|
|
6
|
-
/**
|
|
6
|
+
/** Which kind of linear data a plane holds. These are different domains, not one interchangeable "linear" flag. */
|
|
7
7
|
export type CaptureLinearImageState = "scene-referred-xyz" | "virtual-sensor-channels" | "color-transformed-linear-rgb";
|
|
8
8
|
export interface CapturePublicProfileReference {
|
|
9
9
|
id: string;
|
|
@@ -15,7 +15,7 @@ export interface CaptureWhiteXyz {
|
|
|
15
15
|
y: 1;
|
|
16
16
|
z: number;
|
|
17
17
|
}
|
|
18
|
-
/** A resolved
|
|
18
|
+
/** A resolved white-balance state (ResolvedWhiteBalanceState), cleaned for public metadata. No WB estimator is rerun. */
|
|
19
19
|
export interface CaptureWhiteBalanceIntent {
|
|
20
20
|
stateId: string;
|
|
21
21
|
source: ResolvedWhiteBalanceState["source"];
|
|
@@ -23,7 +23,7 @@ export interface CaptureWhiteBalanceIntent {
|
|
|
23
23
|
channelGains: WhiteBalanceChannelGains;
|
|
24
24
|
sourceProfile: CapturePublicProfileReference | null;
|
|
25
25
|
}
|
|
26
|
-
/** External bytes
|
|
26
|
+
/** External bytes belong to the caller. The engine never reads a path or URL. */
|
|
27
27
|
export type CaptureFloatStorage = {
|
|
28
28
|
kind: "inline-float64";
|
|
29
29
|
samples: readonly number[];
|
|
@@ -34,7 +34,7 @@ export type CaptureFloatStorage = {
|
|
|
34
34
|
sha256: string;
|
|
35
35
|
sampleCount: number;
|
|
36
36
|
};
|
|
37
|
-
/** Linear float plane
|
|
37
|
+
/** Linear float plane. All channels are sampled at the same positions and interleaved in row-major order. */
|
|
38
38
|
export interface CaptureLinearPlane {
|
|
39
39
|
id: string;
|
|
40
40
|
imageStateId: string;
|
|
@@ -44,9 +44,9 @@ export interface CaptureLinearPlane {
|
|
|
44
44
|
pixelHeight: number;
|
|
45
45
|
channelIds: readonly string[];
|
|
46
46
|
colorProfile: CapturePublicProfileReference | null;
|
|
47
|
-
/**
|
|
47
|
+
/** Set for colorimetric (RGB) encodings; null for raw sensor channels with no colour meaning yet. */
|
|
48
48
|
encodingReferenceWhiteXyz: CaptureWhiteXyz | null;
|
|
49
|
-
/**
|
|
49
|
+
/** How values are normalized. Independent of capture saturation and of any later integer white level. */
|
|
50
50
|
referenceWhiteValue: number;
|
|
51
51
|
whiteBalanceApplication: "intent-only" | "applied-rgb-gains" | "applied-chromatic-adaptation" | "not-applicable";
|
|
52
52
|
captureSaturation: {
|
|
@@ -62,7 +62,7 @@ export interface CaptureLinearPlane {
|
|
|
62
62
|
}[];
|
|
63
63
|
storage: CaptureFloatStorage;
|
|
64
64
|
}
|
|
65
|
-
/**
|
|
65
|
+
/** Input from an upstream master or capture provider, independent of file format. Not a preview image. */
|
|
66
66
|
export interface SimulatedCaptureInput {
|
|
67
67
|
captureId: string;
|
|
68
68
|
sceneStateId: string;
|
|
@@ -88,7 +88,7 @@ export interface SimulatedCaptureInput {
|
|
|
88
88
|
dynamicRangeHistory: "unknown" | "no-loss-declared" | "upstream-clipped";
|
|
89
89
|
};
|
|
90
90
|
whiteBalanceIntent: CaptureWhiteBalanceIntent | null;
|
|
91
|
-
/**
|
|
91
|
+
/** The adopted (WB) white is a camera choice. It is not automatically the encoding white. */
|
|
92
92
|
adoptedWhiteXyz: CaptureWhiteXyz | null;
|
|
93
93
|
models: readonly {
|
|
94
94
|
profile: CapturePublicProfileReference;
|
|
@@ -97,37 +97,36 @@ export interface SimulatedCaptureInput {
|
|
|
97
97
|
}[];
|
|
98
98
|
planes: readonly CaptureLinearPlane[];
|
|
99
99
|
}
|
|
100
|
-
/**
|
|
100
|
+
/** The immutable committed capture. Geometry and equivalent focal length are computed, never taken from the caller. */
|
|
101
101
|
export interface SimulatedCapture extends SimulatedCaptureInput {
|
|
102
102
|
schemaVersion: typeof SIMULATED_CAPTURE_SCHEMA_VERSION;
|
|
103
103
|
engineApiVersion: string;
|
|
104
104
|
resolvedGeometry: ResolvedCaptureGeometry;
|
|
105
105
|
equivalentFocalLength35Mm: number;
|
|
106
106
|
}
|
|
107
|
-
/** Converts validated shooting WB
|
|
107
|
+
/** Converts the validated shooting WB to the allowed public metadata fields, dropping private extras. */
|
|
108
108
|
export declare function createCaptureWhiteBalanceIntent(input: {
|
|
109
109
|
state: ResolvedWhiteBalanceState;
|
|
110
110
|
}): CaptureWhiteBalanceIntent;
|
|
111
|
-
/**
|
|
111
|
+
/** Identifies a procedural or physical source, without making up a linear master plane. */
|
|
112
112
|
export type CaptureExposureSource = SimulatedCaptureInput["source"] | (Omit<SimulatedCaptureInput["source"], "kind"> & {
|
|
113
113
|
kind: "scene-radiance-source";
|
|
114
114
|
});
|
|
115
|
-
/** Internal shared exposure metadata
|
|
115
|
+
/** Internal: shared parser for exposure metadata. It does not commit or make up float planes. */
|
|
116
116
|
export declare function normalizeCaptureExposureMetadata(value: unknown, apiVersion: string, allowRadianceSource?: boolean): Omit<SimulatedCapture, "schemaVersion" | "planes" | "source"> & {
|
|
117
117
|
source: CaptureExposureSource;
|
|
118
118
|
};
|
|
119
|
-
/** Commits a
|
|
119
|
+
/** Commits a capture with a manifest of float master planes. No radiance generation, clipping, WB or file encoding. */
|
|
120
120
|
export declare function createSimulatedCapture(input: SimulatedCaptureInput): CalculationResult<SimulatedCapture>;
|
|
121
121
|
/** Parses an archived capture, recomputing and checking all derived geometry/focal metadata. */
|
|
122
122
|
export declare function parseSimulatedCapture(value: unknown): SimulatedCapture;
|
|
123
|
-
/** Canonical
|
|
123
|
+
/** Canonical JSON of the allowed fields, including sample values and IDs. Excludes private caches and file layout. */
|
|
124
124
|
export declare function serializeSimulatedCapture(input: {
|
|
125
125
|
capture: SimulatedCapture;
|
|
126
126
|
}): string;
|
|
127
|
-
/** Requires
|
|
127
|
+
/** Requires the exact image state of the plane. Callers cannot substitute another kind of "linear". */
|
|
128
128
|
export declare function resolveSimulatedCapturePlane(input: {
|
|
129
129
|
capture: SimulatedCapture;
|
|
130
130
|
planeId: string;
|
|
131
131
|
requiredImageState: CaptureLinearImageState;
|
|
132
132
|
}): CaptureLinearPlane;
|
|
133
|
-
//# sourceMappingURL=simulated-capture.d.ts.map
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* Simulated captures: the committed record of one exposure, with its settings, geometry, white-balance
|
|
4
|
+
* (WB) choice and a manifest of linear float image planes, independent of any file format.
|
|
5
|
+
*
|
|
6
|
+
* Committing a capture does not generate radiance, clip, apply WB or encode a file.
|
|
7
7
|
* @see docs/SIMULATED_CAPTURE.md for equations, coordinate/unit conventions, blockers and support
|
|
8
8
|
* limits.
|
|
9
9
|
*/
|
|
10
|
-
import { requireAllowlistedRecord, requirePublicOpaqueId } from "../core/record-validation.js";
|
|
10
|
+
import { requireAllowlistedRecord, requirePublicOpaqueId, requireInputKeys } from "../core/record-validation.js";
|
|
11
11
|
import { stringifyCanonicalJson } from "../core/canonical-json.js";
|
|
12
12
|
import { freezeOwnedData } from "../core/owned-data.js";
|
|
13
|
+
import { equalWithinUlps } from "../core/portable-math.js";
|
|
13
14
|
import { calculatedResult } from "../core/calculation-result.js";
|
|
14
15
|
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
15
16
|
import { ENGINE_API_VERSION } from "../core/version.js";
|
|
@@ -70,12 +71,13 @@ function wb(value) {
|
|
|
70
71
|
const g = object(r.channelGains, ["red", "green", "blue"]);
|
|
71
72
|
if (typeof r.locked !== "boolean")
|
|
72
73
|
throw new InvalidConfigurationError("WB lock must be boolean.");
|
|
73
|
-
return { stateId: id(r.stateId), source: enumValue(r.source, ["preset", "manual-gains", "custom-measurement", "auto-white-balance"]),
|
|
74
|
+
return { stateId: id(r.stateId), source: enumValue(r.source, ["preset", "manual-gains", "custom-measurement", "auto-white-balance", "color-temperature"]),
|
|
74
75
|
locked: r.locked, channelGains: { red: number(g.red, true), green: number(g.green, true), blue: number(g.blue, true) },
|
|
75
76
|
sourceProfile: r.sourceProfile === null ? null : profile(r.sourceProfile) };
|
|
76
77
|
}
|
|
77
|
-
/** Converts validated shooting WB
|
|
78
|
+
/** Converts the validated shooting WB to the allowed public metadata fields, dropping private extras. */
|
|
78
79
|
export function createCaptureWhiteBalanceIntent(input) {
|
|
80
|
+
requireInputKeys(input, "createCaptureWhiteBalanceIntent", ["state"]);
|
|
79
81
|
const state = parseResolvedWhiteBalanceState(input.state);
|
|
80
82
|
return wb({ stateId: state.stateId, source: state.source, locked: state.locked, channelGains: state.channelGains,
|
|
81
83
|
sourceProfile: state.sourceProfile ? { id: state.sourceProfile.profileId, version: state.sourceProfile.profileVersion } : null });
|
|
@@ -164,7 +166,7 @@ function plane(value, resolved, intent) {
|
|
|
164
166
|
channelIds: channels, colorProfile, encodingReferenceWhiteXyz: referenceWhite, referenceWhiteValue: number(r.referenceWhiteValue, true),
|
|
165
167
|
whiteBalanceApplication: application, captureSaturation, appliedTransforms: transforms, storage };
|
|
166
168
|
}
|
|
167
|
-
/** Internal shared exposure metadata
|
|
169
|
+
/** Internal: shared parser for exposure metadata. It does not commit or make up float planes. */
|
|
168
170
|
export function normalizeCaptureExposureMetadata(value, apiVersion, allowRadianceSource = false) {
|
|
169
171
|
const r = object(value, ["captureId", "sceneStateId", "sceneTimeSeconds", "geometry", "exposure", "focus", "noise", "source",
|
|
170
172
|
"whiteBalanceIntent", "adoptedWhiteXyz", "models"]);
|
|
@@ -214,10 +216,12 @@ function normalize(value, apiVersion) {
|
|
|
214
216
|
}
|
|
215
217
|
return freezeOwnedData({ ...metadata, source: metadata.source, schemaVersion: SIMULATED_CAPTURE_SCHEMA_VERSION, planes });
|
|
216
218
|
}
|
|
217
|
-
/** Commits a
|
|
219
|
+
/** Commits a capture with a manifest of float master planes. No radiance generation, clipping, WB or file encoding. */
|
|
218
220
|
export function createSimulatedCapture(input) {
|
|
219
221
|
return calculatedResult(normalize(input, ENGINE_API_VERSION), "authoritative-linear-capture-container", "0.1.0", ["Structural commitment only; upstream scientific statuses remain independent", "Master/source declarations do not prove source fidelity", "No tone mapping, recovered headroom, physical sensor calibration or serializer inferred"]);
|
|
220
222
|
}
|
|
223
|
+
/** Tolerance, in ULPs (units in the last place), when re-checking an archived 35 mm-equivalent focal length (see NUMERICAL_CORRECTNESS.md). */
|
|
224
|
+
const DERIVED_FOCAL_LENGTH_ULPS = 8;
|
|
221
225
|
/** Parses an archived capture, recomputing and checking all derived geometry/focal metadata. */
|
|
222
226
|
export function parseSimulatedCapture(value) {
|
|
223
227
|
const r = object(value, ["schemaVersion", "engineApiVersion", "captureId", "sceneStateId", "sceneTimeSeconds", "geometry", "resolvedGeometry",
|
|
@@ -229,7 +233,11 @@ export function parseSimulatedCapture(value) {
|
|
|
229
233
|
}
|
|
230
234
|
const { schemaVersion: _schemaVersion, engineApiVersion, resolvedGeometry, equivalentFocalLength35Mm, ...input } = r;
|
|
231
235
|
const result = normalize(input, id(engineApiVersion));
|
|
232
|
-
|
|
236
|
+
// The equivalent focal length is recomputed. An archived value within a few ULPs is accepted, so records
|
|
237
|
+
// written by another JavaScript engine or by releases before 2.0.0 (which used Math.hypot) still parse.
|
|
238
|
+
if (canonical(resolvedGeometry) !== canonical(result.resolvedGeometry) ||
|
|
239
|
+
typeof equivalentFocalLength35Mm !== "number" ||
|
|
240
|
+
!equalWithinUlps(equivalentFocalLength35Mm, result.equivalentFocalLength35Mm, DERIVED_FOCAL_LENGTH_ULPS)) {
|
|
233
241
|
throw new InvalidConfigurationError("Archived derived capture metadata is inconsistent.");
|
|
234
242
|
}
|
|
235
243
|
// _schemaVersion is already checked, not copied as an unchecked discriminator.
|
|
@@ -243,12 +251,14 @@ function canonical(value) {
|
|
|
243
251
|
unsupportedValueMessage: "Derived capture metadata must be finite JSON."
|
|
244
252
|
});
|
|
245
253
|
}
|
|
246
|
-
/** Canonical
|
|
254
|
+
/** Canonical JSON of the allowed fields, including sample values and IDs. Excludes private caches and file layout. */
|
|
247
255
|
export function serializeSimulatedCapture(input) {
|
|
256
|
+
requireInputKeys(input, "serializeSimulatedCapture", ["capture"]);
|
|
248
257
|
return JSON.stringify(parseSimulatedCapture(input.capture));
|
|
249
258
|
}
|
|
250
|
-
/** Requires
|
|
259
|
+
/** Requires the exact image state of the plane. Callers cannot substitute another kind of "linear". */
|
|
251
260
|
export function resolveSimulatedCapturePlane(input) {
|
|
261
|
+
requireInputKeys(input, "resolveSimulatedCapturePlane", ["capture", "planeId", "requiredImageState"]);
|
|
252
262
|
const capture = parseSimulatedCapture(input.capture);
|
|
253
263
|
const state = enumValue(input.requiredImageState, ["scene-referred-xyz", "virtual-sensor-channels", "color-transformed-linear-rgb"]);
|
|
254
264
|
const result = capture.planes.find((p) => p.id === id(input.planeId));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simulated-capture.js","sourceRoot":"","sources":["../../src/capture/simulated-capture.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"simulated-capture.js","sourceRoot":"","sources":["../../src/capture/simulated-capture.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;GAOG;AAEH,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACjH,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAA+C,MAAM,+BAA+B,CAAC;AAC9G,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,8BAA8B,EAAiE,MAAM,2BAA2B,CAAC;AAC1I,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAmB,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAkE,MAAM,+BAA+B,CAAC;AAEvI,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAgB,CAAC;AAqEjE,SAAS,MAAM,CAAC,KAAc,EAAE,IAAuB;IACrD,OAAO,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,8CAA8C,CAAC,CAAC;AAC/F,CAAC;AACD,SAAS,SAAS,CAAmB,KAAc,EAAE,MAAoB;IACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAU,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,CAAC,CAAC;IAChG,OAAO,KAAU,CAAC;AACpB,CAAC;AACD,SAAS,MAAM,CAAC,KAAc,EAAE,QAAQ,GAAG,KAAK;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,gDAAgD,CAAC,CAAC;IAC5K,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1C,CAAC;AACD,SAAS,OAAO,CAAC,KAAc,EAAE,OAAO,GAAG,CAAC;IAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO;QAAE,MAAM,IAAI,yBAAyB,CAAC,0BAA0B,CAAC,CAAC;IAC7G,OAAO,CAAC,CAAC;AACX,CAAC;AACD,SAAS,KAAK,CAAC,KAAc,EAAE,OAAe;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,yCAAyC,CAAC,CAAC;IAC/J,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,EAAE,CAAC,KAAc;IACxB,OAAO,qBAAqB,CAAC,KAAK,EAAE,iDAAiD,CAAC,CAAC;AACzF,CAAC;AACD,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,sCAAsC,CAAC,CAAC;IAC5I,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,OAAO,CAAC,KAAc;IAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;AAC9F,CAAC;AACD,SAAS,KAAK,CAAC,KAAc;IAC3B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,yBAAyB,CAAC,CAAC;IAC9E,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;AAC9D,CAAC;AACD,SAAS,EAAE,CAAC,KAAc;IACxB,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;IAC1F,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,yBAAyB,CAAC,0BAA0B,CAAC,CAAC;IACnG,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;QACvJ,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;QACtH,aAAa,EAAE,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;AAChF,CAAC;AACD,yGAAyG;AACzG,MAAM,UAAU,+BAA+B,CAAC,KAA2C;IACzF,gBAAgB,CAAC,KAAK,EAAE,iCAAiC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,8BAA8B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1D,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY;QAC9G,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAE,CAAC;AACvI,CAAC;AACD,SAAS,QAAQ,CAAC,KAAc;IAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/H,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IAC5H,MAAM,IAAI,GAAG,CAAC,KAAc,EAA2D,EAAE;QACvF,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QACvD,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACxG,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IAChH,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE;QAClG,YAAY,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;QAClG,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,4BAA4B,CAAC,CAAC;QAC9H,GAAG,CAAC,CAAC,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC9F,GAAG,CAAC,CAAC,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC9I,CAAC;AACD,SAAS,KAAK,CAAC,KAAc,EAAE,QAAiC,EAAE,MAAwC;IACxG,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc;QACrI,2BAA2B,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC,CAAC;IACvI,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,8BAA8B,CAAC,CAAC,CAAC;IACzH,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClF,MAAM,UAAU,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC;IACnG,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjH,MAAM,KAAK,GAAG,KAAK,GAAC,MAAM,GAAC,QAAQ,CAAC,MAAM,CAAC;IAC3C,IAAI,KAAK,KAAK,UAAU,CAAC,UAAU,IAAI,MAAM,KAAK,UAAU,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,MAAM;QACxF,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,yCAAyC,CAAC,CAAC;IAC/J,MAAM,gBAAgB,GAAG,KAAK,KAAK,oBAAoB,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,8BAA8B,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvJ,IAAI,gBAAgB,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,oCAAoC,CAAC,CAAC;IACjK,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;IACnI,IAAI,KAAK,KAAK,yBAAyB,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC9I,MAAM,IAAI,yBAAyB,CAAC,4CAA4C,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,KAAK,KAAK,oBAAoB,IAAI,CAAC,YAAa,CAAC,EAAE,KAAK,uBAAuB,IAAI,YAAa,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;QAC1H,MAAM,IAAI,yBAAyB,CAAC,6DAA6D,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC,aAAa,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACjJ,IAAI,CAAC,CAAC,WAAW,KAAK,aAAa,IAAI,WAAW,KAAK,mBAAmB,CAAC,IAAI,MAAM,KAAK,IAAI,CAAC;QAC3F,CAAC,WAAW,KAAK,mBAAmB,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACnH,MAAM,IAAI,yBAAyB,CAAC,gEAAgE,CAAC,CAAC;IACxG,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;IACrG,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC3F,IAAI,OAA4B,CAAC;IACjC,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS;YAAE,MAAM,IAAI,yBAAyB,CAAC,sDAAsD,CAAC,CAAC;QAClN,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;YAAE,MAAM,IAAI,yBAAyB,CAAC,8BAA8B,CAAC,CAAC;QAClG,OAAO,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,KAAK;YAAE,MAAM,IAAI,yBAAyB,CAAC,8CAA8C,CAAC,CAAC;QACrJ,OAAO,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACvJ,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,4BAA4B,CAAC,CAAC,CAAC;IACrG,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAC7F,IAAI,iBAA0D,CAAC;IAC/D,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;QACrC,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,0BAA0B,KAAK,SAAS;YAAE,MAAM,IAAI,yBAAyB,CAAC,mDAAmD,CAAC,CAAC;QACzL,iBAAiB,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;QAClE,IAAI,OAAO,GAAG,KAAK;YAAE,MAAM,IAAI,yBAAyB,CAAC,+BAA+B,CAAC,CAAC;QAC1F,iBAAiB,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,0BAA0B,EAAE,OAAO,EAAE,CAAC;IACrI,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAmD,EAAE;QAC/G,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7C,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,cAAc,EAAE,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,EAAE,CAAC;IACvI,CAAC,CAAC,CAAC;IACH,IAAI,KAAK,KAAK,8BAA8B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,4DAA4D,CAAC,CAAC;IACtM,IAAI,WAAW,KAAK,8BAA8B,IAAI,CAAC,KAAK,KAAK,8BAA8B;QAC3F,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,qEAAqE,CAAC,CAAC;IAC5K,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM;QACxI,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,yBAAyB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,mBAAmB,EAAE,IAAI,CAAC;QACvI,uBAAuB,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACtG,CAAC;AAGD,iGAAiG;AACjG,MAAM,UAAU,gCAAgC,CAAC,KAAc,EAAE,UAAkB,EAAE,mBAAmB,GAAC,KAAK;IAC5G,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ;QAC1H,oBAAoB,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3E,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC;QACjG,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;IAC7E,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC7G,IAAI,IAAI,GAAG,UAAU;QAAE,MAAM,IAAI,yBAAyB,CAAC,4BAA4B,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACzF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC3E,IAAI,IAAI,GAAG,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,iCAAiC,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAsC,EAAE;QACpF,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM;YAAE,MAAM,IAAI,yBAAyB,CAAC,8CAA8C,CAAC,CAAC;QACxJ,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC;IACnL,CAAC,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QACtF,MAAM,IAAI,yBAAyB,CAAC,uCAAuC,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,eAAe,CAAC,EAAE,gBAAgB,EAAE,EAAE,CAAC,UAAU,CAAC;QACvD,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,gBAAgB,EAAE,QAAQ;QAC7H,QAAQ,EAAE,yBAAyB,EAAE,kCAAkC,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,iBAAiB,EAAE,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,yBAAyB;QACzM,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACvG,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,iCAAiC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,iCAAiC,CAAC,CAAC;YAC9P,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,mBAAmB,EAAE,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,EAAE;QACrL,kBAAkB,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;AACzE,CAAC;AACD,SAAS,SAAS,CAAC,KAAc,EAAE,UAAkB;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ;QAC1H,oBAAoB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,aAAa,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,gCAAgC,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/G,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,KAAK,8BAA8B,CAAC,IAAI,QAAQ,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;QACxH,MAAM,IAAI,yBAAyB,CAAC,+CAA+C,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;QACvE,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;QACjH,MAAM,IAAI,yBAAyB,CAAC,+EAA+E,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,eAAe,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAC,QAAQ,CAAC,MAAoC,EAAE,aAAa,EAAE,gCAAgC,EAAE,MAAM,EAAE,CAAC,CAAC;AACzJ,CAAC;AACD,uHAAuH;AACvH,MAAM,UAAU,sBAAsB,CAAC,KAA4B;IACjE,OAAO,gBAAgB,CAAC,SAAS,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAAE,wCAAwC,EAAE,OAAO,EAC7G,CAAC,6EAA6E,EAAE,yDAAyD,EAAE,yFAAyF,CAAC,CAAC,CAAC;AAC3O,CAAC;AACD,+IAA+I;AAC/I,MAAM,yBAAyB,GAAG,CAAC,CAAC;AACpC,gGAAgG;AAChG,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB;QAC3I,2BAA2B,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrI,IAAI,CAAC,CAAC,aAAa,KAAK,gCAAgC,IAAI,CAAC,CAAC,aAAa,KAAK,OAAO;QAAE,MAAM,IAAI,yBAAyB,CAAC,6BAA6B,CAAC,CAAC;IAC5J,IAAI,CAAC,CAAC,aAAa,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,uBAAuB,KAAK,8BAA8B,CAAC,EAAE,CAAC;QACtK,MAAM,IAAI,yBAAyB,CAAC,gEAAgE,CAAC,CAAC;IACxG,CAAC;IACD,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;IACrH,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACtD,yGAAyG;IACzG,wGAAwG;IACxG,IAAI,SAAS,CAAC,gBAAgB,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAClE,OAAO,yBAAyB,KAAK,QAAQ;QAC7C,CAAC,eAAe,CAAC,yBAAyB,EAAE,MAAM,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,EAAE,CAAC;QAC7G,MAAM,IAAI,yBAAyB,CAAC,oDAAoD,CAAC,CAAC;IAC5F,CAAC;IACD,+EAA+E;IAC/E,KAAK,cAAc,CAAC;IACpB,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,sBAAsB,CAAC,KAAK,EAAE;QACnC,yBAAyB,EAAE,QAAQ;QACnC,sBAAsB,EAAE,gDAAgD;QACxE,uBAAuB,EAAE,+CAA+C;KACzE,CAAC,CAAC;AACL,CAAC;AAED,sHAAsH;AACtH,MAAM,UAAU,yBAAyB,CAAC,KAAoC;IAC5E,gBAAgB,CAAC,KAAK,EAAE,2BAA2B,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9D,CAAC;AACD,uGAAuG;AACvG,MAAM,UAAU,4BAA4B,CAAC,KAE5C;IACC,gBAAgB,CAAC,KAAK,EAAE,8BAA8B,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACtG,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,8BAA8B,CAAC,CAAC,CAAC;IACrI,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK;QAAE,MAAM,IAAI,yBAAyB,CAAC,oDAAoD,CAAC,CAAC;IACtI,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Simulated captures: the committed record of one exposure, with its settings, geometry, white-balance\n * (WB) choice and a manifest of linear float image planes, independent of any file format.\n *\n * Committing a capture does not generate radiance, clip, apply WB or encode a file.\n * @see docs/SIMULATED_CAPTURE.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport { requireAllowlistedRecord, requirePublicOpaqueId, requireInputKeys } from \"../core/record-validation.js\";\nimport { stringifyCanonicalJson } from \"../core/canonical-json.js\";\nimport { freezeOwnedData } from \"../core/owned-data.js\";\nimport { equalWithinUlps } from \"../core/portable-math.js\";\nimport { calculatedResult, type CalculationResult, type ProvenanceKind } from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { ENGINE_API_VERSION } from \"../core/version.js\";\nimport { parseResolvedWhiteBalanceState, type ResolvedWhiteBalanceState, type WhiteBalanceChannelGains } from \"../color/white-balance.js\";\nimport { calculateEquivalentFocalLength35Mm } from \"../camera/equivalent-focal-length.js\";\nimport { parseFocusPlane, type FocusPlane } from \"../optics/focus-state.js\";\nimport { resolveCaptureGeometry, type ResolveCaptureGeometryInput, type ResolvedCaptureGeometry } from \"../output/capture-geometry.js\";\n\nexport const SIMULATED_CAPTURE_SCHEMA_VERSION = \"0.2.0\" as const;\n/** Which kind of linear data a plane holds. These are different domains, not one interchangeable \"linear\" flag. */\nexport type CaptureLinearImageState = \"scene-referred-xyz\" | \"virtual-sensor-channels\" | \"color-transformed-linear-rgb\";\nexport interface CapturePublicProfileReference { id: string; version: string }\n/** Normalized tristimulus white; Y=1. This is not a spectrum or Kelvin value. */\nexport interface CaptureWhiteXyz { x: number; y: 1; z: number }\n/** A resolved white-balance state (ResolvedWhiteBalanceState), cleaned for public metadata. No WB estimator is rerun. */\nexport interface CaptureWhiteBalanceIntent {\n stateId: string;\n source: ResolvedWhiteBalanceState[\"source\"];\n locked: boolean;\n channelGains: WhiteBalanceChannelGains;\n sourceProfile: CapturePublicProfileReference | null;\n}\n/** External bytes belong to the caller. The engine never reads a path or URL. */\nexport type CaptureFloatStorage =\n | { kind: \"inline-float64\"; samples: readonly number[] }\n | { kind: \"external-float32\" | \"external-float64\"; byteOrder: \"little-endian\"; artifactId: string; sha256: string; sampleCount: number };\n/** Linear float plane. All channels are sampled at the same positions and interleaved in row-major order. */\nexport interface CaptureLinearPlane {\n id: string;\n imageStateId: string;\n imageState: CaptureLinearImageState;\n rasterBinding: \"oriented-active-capture\" | \"output\";\n pixelWidth: number;\n pixelHeight: number;\n channelIds: readonly string[];\n colorProfile: CapturePublicProfileReference | null;\n /** Set for colorimetric (RGB) encodings; null for raw sensor channels with no colour meaning yet. */\n encodingReferenceWhiteXyz: CaptureWhiteXyz | null;\n /** How values are normalized. Independent of capture saturation and of any later integer white level. */\n referenceWhiteValue: number;\n whiteBalanceApplication: \"intent-only\" | \"applied-rgb-gains\" | \"applied-chromatic-adaptation\" | \"not-applicable\";\n captureSaturation:\n | { kind: \"not-modeled\" }\n | { kind: \"declared-virtual-white\"; whiteLevel: number; upstreamClippedSampleCount: number };\n appliedTransforms: readonly { profile: CapturePublicProfileReference; kind: \"linear-color\" | \"chromatic-adaptation\" | \"digital-lens-correction\" }[];\n storage: CaptureFloatStorage;\n}\n/** Input from an upstream master or capture provider, independent of file format. Not a preview image. */\nexport interface SimulatedCaptureInput {\n captureId: string;\n sceneStateId: string;\n /** Seconds on the declared scene clock, not an embedded wall-clock timestamp. */\n sceneTimeSeconds: number;\n geometry: ResolveCaptureGeometryInput;\n exposure: { focalLengthMm: number; aperture: number; shutterSeconds: number; iso: number };\n focus: FocusPlane;\n noise: { seedUint32: number; realizationId: string; model: CapturePublicProfileReference };\n source: {\n kind: \"scene-linear-master\" | \"sensor-derived-linear\" | \"color-transformed-linear-master\";\n artifactId: string;\n sha256: string;\n dynamicRangeHistory: \"unknown\" | \"no-loss-declared\" | \"upstream-clipped\";\n };\n whiteBalanceIntent: CaptureWhiteBalanceIntent | null;\n /** The adopted (WB) white is a camera choice. It is not automatically the encoding white. */\n adoptedWhiteXyz: CaptureWhiteXyz | null;\n models: readonly { profile: CapturePublicProfileReference; scientificStatus: ProvenanceKind; publicEvidenceIds: readonly string[] }[];\n planes: readonly CaptureLinearPlane[];\n}\n/** The immutable committed capture. Geometry and equivalent focal length are computed, never taken from the caller. */\nexport interface SimulatedCapture extends SimulatedCaptureInput {\n schemaVersion: typeof SIMULATED_CAPTURE_SCHEMA_VERSION;\n engineApiVersion: string;\n resolvedGeometry: ResolvedCaptureGeometry;\n equivalentFocalLength35Mm: number;\n}\n\nfunction object(value: unknown, keys: readonly string[]): Record<string, unknown> {\n return requireAllowlistedRecord(value, keys, \"Invalid or non-allowlisted capture metadata.\");\n}\nfunction enumValue<T extends string>(value: unknown, values: readonly T[]): T {\n if (!values.includes(value as T)) throw new InvalidConfigurationError(\"Unknown capture state.\");\n return value as T;\n}\nfunction number(value: unknown, positive = false): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || (positive && value <= 0)) throw new InvalidConfigurationError(\"Capture number must be finite with valid sign.\");\n return Object.is(value, -0) ? 0 : value;\n}\nfunction integer(value: unknown, minimum = 1): number {\n const n = number(value);\n if (!Number.isSafeInteger(n) || n < minimum) throw new InvalidConfigurationError(\"Invalid capture integer.\");\n return n;\n}\nfunction array(value: unknown, maximum: number): unknown[] {\n if (!Array.isArray(value) || value.length > maximum ||\n Array.from({ length: value.length }, (_, i) => i in value).includes(false)) throw new InvalidConfigurationError(\"Expected a bounded dense capture array.\");\n return value;\n}\nfunction id(value: unknown): string {\n return requirePublicOpaqueId(value, \"Expected a public opaque ID, not a path or URL.\");\n}\nfunction digest(value: unknown): string {\n if (typeof value !== \"string\" || !/^[a-f0-9]{64}$/.test(value)) throw new InvalidConfigurationError(\"Expected a lowercase SHA-256 digest.\");\n return value;\n}\nfunction profile(value: unknown): CapturePublicProfileReference {\n const r = object(value, [\"id\", \"version\"]); return { id: id(r.id), version: id(r.version) };\n}\nfunction white(value: unknown): CaptureWhiteXyz | null {\n if (value === null) return null;\n const r = object(value, [\"x\", \"y\", \"z\"]);\n if (r.y !== 1) throw new InvalidConfigurationError(\"White XYZ requires Y=1.\");\n return { x: number(r.x, true), y: 1, z: number(r.z, true) };\n}\nfunction wb(value: unknown): CaptureWhiteBalanceIntent | null {\n if (value === null) return null;\n const r = object(value, [\"stateId\", \"source\", \"locked\", \"channelGains\", \"sourceProfile\"]);\n const g = object(r.channelGains, [\"red\", \"green\", \"blue\"]);\n if (typeof r.locked !== \"boolean\") throw new InvalidConfigurationError(\"WB lock must be boolean.\");\n return { stateId: id(r.stateId), source: enumValue(r.source, [\"preset\", \"manual-gains\", \"custom-measurement\", \"auto-white-balance\", \"color-temperature\"]),\n locked: r.locked, channelGains: { red: number(g.red, true), green: number(g.green, true), blue: number(g.blue, true) },\n sourceProfile: r.sourceProfile === null ? null : profile(r.sourceProfile) };\n}\n/** Converts the validated shooting WB to the allowed public metadata fields, dropping private extras. */\nexport function createCaptureWhiteBalanceIntent(input: { state: ResolvedWhiteBalanceState }): CaptureWhiteBalanceIntent {\n requireInputKeys(input, \"createCaptureWhiteBalanceIntent\", [\"state\"]);\n const state = parseResolvedWhiteBalanceState(input.state);\n return wb({ stateId: state.stateId, source: state.source, locked: state.locked, channelGains: state.channelGains,\n sourceProfile: state.sourceProfile ? { id: state.sourceProfile.profileId, version: state.sourceProfile.profileVersion } : null })!;\n}\nfunction geometry(value: unknown): ResolveCaptureGeometryInput {\n const r = object(value, [\"imagingArea\", \"nativeRaster\", \"orientation\", \"activeCaptureRect\", \"outputCropRect\", \"outputRaster\"]);\n const area = object(r.imagingArea, [\"widthMm\", \"heightMm\"]), native = object(r.nativeRaster, [\"pixelWidth\", \"pixelHeight\"]);\n const rect = (value: unknown): { x: number; y: number; width: number; height: number } => {\n const p = object(value, [\"x\", \"y\", \"width\", \"height\"]);\n return { x: integer(p.x, 0), y: integer(p.y, 0), width: integer(p.width), height: integer(p.height) };\n };\n const output = r.outputRaster === undefined ? undefined : object(r.outputRaster, [\"pixelWidth\", \"pixelHeight\"]);\n return { imagingArea: { widthMm: number(area.widthMm, true), heightMm: number(area.heightMm, true) },\n nativeRaster: { pixelWidth: integer(native.pixelWidth), pixelHeight: integer(native.pixelHeight) },\n orientation: enumValue(r.orientation, [\"landscape\", \"portrait-clockwise\", \"landscape-inverted\", \"portrait-counter-clockwise\"]),\n ...(r.activeCaptureRect === undefined ? {} : { activeCaptureRect: rect(r.activeCaptureRect) }),\n ...(r.outputCropRect === undefined ? {} : { outputCropRect: rect(r.outputCropRect) }),\n ...(output === undefined ? {} : { outputRaster: { pixelWidth: integer(output.pixelWidth), pixelHeight: integer(output.pixelHeight) } }) };\n}\nfunction plane(value: unknown, resolved: ResolvedCaptureGeometry, intent: CaptureWhiteBalanceIntent | null): CaptureLinearPlane {\n const r = object(value, [\"id\", \"imageStateId\", \"imageState\", \"rasterBinding\", \"pixelWidth\", \"pixelHeight\", \"channelIds\", \"colorProfile\",\n \"encodingReferenceWhiteXyz\", \"referenceWhiteValue\", \"whiteBalanceApplication\", \"captureSaturation\", \"appliedTransforms\", \"storage\"]);\n const state = enumValue(r.imageState, [\"scene-referred-xyz\", \"virtual-sensor-channels\", \"color-transformed-linear-rgb\"]);\n const binding = enumValue(r.rasterBinding, [\"oriented-active-capture\", \"output\"]);\n const dimensions = binding === \"output\" ? resolved.output.raster : resolved.orientedCapture.raster;\n const width = integer(r.pixelWidth), height = integer(r.pixelHeight), channels = array(r.channelIds, 32).map(id);\n const count = width*height*channels.length;\n if (width !== dimensions.pixelWidth || height !== dimensions.pixelHeight || !channels.length ||\n new Set(channels).size !== channels.length || !Number.isSafeInteger(count)) throw new InvalidConfigurationError(\"Plane raster/channel identity mismatch.\");\n const requiredChannels = state === \"scene-referred-xyz\" ? [\"X\", \"Y\", \"Z\"] : state === \"color-transformed-linear-rgb\" ? [\"red\", \"green\", \"blue\"] : null;\n if (requiredChannels && JSON.stringify(channels) !== JSON.stringify(requiredChannels)) throw new InvalidConfigurationError(\"Channels do not match image state.\");\n const colorProfile = r.colorProfile === null ? null : profile(r.colorProfile), referenceWhite = white(r.encodingReferenceWhiteXyz);\n if (state === \"virtual-sensor-channels\" ? referenceWhite !== null || colorProfile === null : referenceWhite === null || colorProfile === null) {\n throw new InvalidConfigurationError(\"Color metadata does not match image state.\");\n }\n if (state === \"scene-referred-xyz\" && (colorProfile!.id !== \"cie-1931-2-degree-xyz\" || colorProfile!.version !== \"1.0.0\")) {\n throw new InvalidConfigurationError(\"XYZ planes require the explicit CIE 1931 2-degree identity.\");\n }\n const application = enumValue(r.whiteBalanceApplication, [\"intent-only\", \"applied-rgb-gains\", \"applied-chromatic-adaptation\", \"not-applicable\"]);\n if (((application === \"intent-only\" || application === \"applied-rgb-gains\") && intent === null) ||\n (application === \"applied-rgb-gains\" && JSON.stringify(channels) !== JSON.stringify([\"red\", \"green\", \"blue\"]))) {\n throw new InvalidConfigurationError(\"WB application must refer to a resolved compatible RGB intent.\");\n }\n const s = object(r.storage, [\"kind\", \"samples\", \"artifactId\", \"sha256\", \"sampleCount\", \"byteOrder\"]);\n const kind = enumValue(s.kind, [\"inline-float64\", \"external-float32\", \"external-float64\"]);\n let storage: CaptureFloatStorage;\n if (kind === \"inline-float64\") {\n if (s.artifactId !== undefined || s.sha256 !== undefined || s.sampleCount !== undefined || s.byteOrder !== undefined) throw new InvalidConfigurationError(\"Inline plane cannot contain external storage fields.\");\n const samples = array(s.samples, 1_000_000).map((v) => number(v));\n if (samples.length !== count) throw new InvalidConfigurationError(\"Plane sample count mismatch.\");\n storage = { kind, samples };\n } else {\n if (s.samples !== undefined || integer(s.sampleCount) !== count) throw new InvalidConfigurationError(\"External plane sample count/fields mismatch.\");\n storage = { kind, byteOrder: enumValue(s.byteOrder, [\"little-endian\"]), artifactId: id(s.artifactId), sha256: digest(s.sha256), sampleCount: count };\n }\n const saturation = object(r.captureSaturation, [\"kind\", \"whiteLevel\", \"upstreamClippedSampleCount\"]);\n const saturationKind = enumValue(saturation.kind, [\"not-modeled\", \"declared-virtual-white\"]);\n let captureSaturation: CaptureLinearPlane[\"captureSaturation\"];\n if (saturationKind === \"not-modeled\") {\n if (saturation.whiteLevel !== undefined || saturation.upstreamClippedSampleCount !== undefined) throw new InvalidConfigurationError(\"Unmodeled saturation cannot assert a white level.\");\n captureSaturation = { kind: saturationKind };\n } else {\n const clipped = integer(saturation.upstreamClippedSampleCount, 0);\n if (clipped > count) throw new InvalidConfigurationError(\"Invalid clipped sample count.\");\n captureSaturation = { kind: saturationKind, whiteLevel: number(saturation.whiteLevel, true), upstreamClippedSampleCount: clipped };\n }\n const transforms = array(r.appliedTransforms, 64).map((value): CaptureLinearPlane[\"appliedTransforms\"][number] => {\n const t = object(value, [\"profile\", \"kind\"]);\n return { profile: profile(t.profile), kind: enumValue(t.kind, [\"linear-color\", \"chromatic-adaptation\", \"digital-lens-correction\"]) };\n });\n if (state === \"color-transformed-linear-rgb\" && !transforms.some((t) => t.kind === \"linear-color\")) throw new InvalidConfigurationError(\"Transformed RGB requires explicit color-transform history.\");\n if (application === \"applied-chromatic-adaptation\" && (state !== \"color-transformed-linear-rgb\" ||\n !transforms.some((t) => t.kind === \"chromatic-adaptation\"))) throw new InvalidConfigurationError(\"Applied adaptation requires transformed RGB and adaptation history.\");\n return { id: id(r.id), imageStateId: id(r.imageStateId), imageState: state, rasterBinding: binding, pixelWidth: width, pixelHeight: height,\n channelIds: channels, colorProfile, encodingReferenceWhiteXyz: referenceWhite, referenceWhiteValue: number(r.referenceWhiteValue, true),\n whiteBalanceApplication: application, captureSaturation, appliedTransforms: transforms, storage };\n}\n/** Identifies a procedural or physical source, without making up a linear master plane. */\nexport type CaptureExposureSource = SimulatedCaptureInput[\"source\"] | (Omit<SimulatedCaptureInput[\"source\"], \"kind\"> & {kind:\"scene-radiance-source\"});\n/** Internal: shared parser for exposure metadata. It does not commit or make up float planes. */\nexport function normalizeCaptureExposureMetadata(value: unknown, apiVersion: string, allowRadianceSource=false): Omit<SimulatedCapture, \"schemaVersion\" | \"planes\" | \"source\"> & {source:CaptureExposureSource} {\n const r = object(value, [\"captureId\", \"sceneStateId\", \"sceneTimeSeconds\", \"geometry\", \"exposure\", \"focus\", \"noise\", \"source\",\n \"whiteBalanceIntent\", \"adoptedWhiteXyz\", \"models\"]);\n const g = geometry(r.geometry), resolved = resolveCaptureGeometry(g).value;\n const e = object(r.exposure, [\"focalLengthMm\", \"aperture\", \"shutterSeconds\", \"iso\"]);\n const exposure = { focalLengthMm: number(e.focalLengthMm, true), aperture: number(e.aperture, true),\n shutterSeconds: number(e.shutterSeconds, true), iso: number(e.iso, true) };\n const f = object(r.focus, [\"kind\", \"distanceM\"]), focus = parseFocusPlane(f);\n const noise = object(r.noise, [\"seedUint32\", \"realizationId\", \"model\"]), seed = integer(noise.seedUint32, 0);\n if (seed > 0xffffffff) throw new InvalidConfigurationError(\"Noise seed must be uint32.\");\n const source = object(r.source, [\"kind\", \"artifactId\", \"sha256\", \"dynamicRangeHistory\"]);\n const time = number(r.sceneTimeSeconds), intent = wb(r.whiteBalanceIntent);\n if (time < 0) throw new InvalidConfigurationError(\"Scene time must be nonnegative.\");\n const models = array(r.models, 128).map((value): SimulatedCapture[\"models\"][number] => {\n const m = object(value, [\"profile\", \"scientificStatus\", \"publicEvidenceIds\"]), evidence = array(m.publicEvidenceIds, 128).map(id);\n if (!evidence.length || new Set(evidence).size !== evidence.length) throw new InvalidConfigurationError(\"Public evidence IDs must be nonempty/unique.\");\n return { profile: profile(m.profile), scientificStatus: enumValue(m.scientificStatus, [\"calculated\", \"calibrated\", \"estimated\", \"approximation\"]), publicEvidenceIds: evidence };\n });\n const adoptedWhite = white(r.adoptedWhiteXyz);\n if (!models.length || new Set(models.map((m) => m.profile.id)).size !== models.length) {\n throw new InvalidConfigurationError(\"Capture needs unique nonempty models.\");\n }\n return freezeOwnedData({ engineApiVersion: id(apiVersion),\n captureId: id(r.captureId), sceneStateId: id(r.sceneStateId), sceneTimeSeconds: time, geometry: g, resolvedGeometry: resolved,\n exposure, equivalentFocalLength35Mm: calculateEquivalentFocalLength35Mm({ focalLengthMm: exposure.focalLengthMm, activeImagingArea: resolved.activeCapture.imagingArea }).value.equivalentFocalLength35Mm,\n focus, noise: { seedUint32: seed, realizationId: id(noise.realizationId), model: profile(noise.model) },\n source: { kind: enumValue(source.kind, allowRadianceSource ? [\"scene-linear-master\", \"sensor-derived-linear\", \"color-transformed-linear-master\", \"scene-radiance-source\"] : [\"scene-linear-master\", \"sensor-derived-linear\", \"color-transformed-linear-master\"]),\n artifactId: id(source.artifactId), sha256: digest(source.sha256), dynamicRangeHistory: enumValue(source.dynamicRangeHistory, [\"unknown\", \"no-loss-declared\", \"upstream-clipped\"]) },\n whiteBalanceIntent: intent, adoptedWhiteXyz: adoptedWhite, models });\n}\nfunction normalize(value: unknown, apiVersion: string): SimulatedCapture {\n const r = object(value, [\"captureId\", \"sceneStateId\", \"sceneTimeSeconds\", \"geometry\", \"exposure\", \"focus\", \"noise\", \"source\",\n \"whiteBalanceIntent\", \"adoptedWhiteXyz\", \"models\", \"planes\"]);\n const { planes: rawPlanes, ...metadataInput } = r;\n const metadata = normalizeCaptureExposureMetadata(metadataInput, apiVersion);\n const planes = array(rawPlanes, 32).map(p => plane(p, metadata.resolvedGeometry, metadata.whiteBalanceIntent));\n if (planes.some(p => p.whiteBalanceApplication === \"applied-chromatic-adaptation\") && metadata.adoptedWhiteXyz === null) {\n throw new InvalidConfigurationError(\"Applied adaptation requires an adopted white.\");\n }\n if (!planes.length || new Set(planes.map(p => p.id)).size !== planes.length ||\n new Set(planes.map(p => p.imageStateId)).size !== planes.length ||\n planes.reduce((n,p) => n+(p.storage.kind === \"inline-float64\" ? p.storage.samples.length : 0),0) > 1_000_000) {\n throw new InvalidConfigurationError(\"Capture needs unique models/planes/states and a bounded inline sample budget.\");\n }\n return freezeOwnedData({ ...metadata, source:metadata.source as SimulatedCapture[\"source\"], schemaVersion: SIMULATED_CAPTURE_SCHEMA_VERSION, planes });\n}\n/** Commits a capture with a manifest of float master planes. No radiance generation, clipping, WB or file encoding. */\nexport function createSimulatedCapture(input: SimulatedCaptureInput): CalculationResult<SimulatedCapture> {\n return calculatedResult(normalize(input, ENGINE_API_VERSION), \"authoritative-linear-capture-container\", \"0.1.0\",\n [\"Structural commitment only; upstream scientific statuses remain independent\", \"Master/source declarations do not prove source fidelity\", \"No tone mapping, recovered headroom, physical sensor calibration or serializer inferred\"]);\n}\n/** Tolerance, in ULPs (units in the last place), when re-checking an archived 35 mm-equivalent focal length (see NUMERICAL_CORRECTNESS.md). */\nconst DERIVED_FOCAL_LENGTH_ULPS = 8;\n/** Parses an archived capture, recomputing and checking all derived geometry/focal metadata. */\nexport function parseSimulatedCapture(value: unknown): SimulatedCapture {\n const r = object(value, [\"schemaVersion\", \"engineApiVersion\", \"captureId\", \"sceneStateId\", \"sceneTimeSeconds\", \"geometry\", \"resolvedGeometry\",\n \"equivalentFocalLength35Mm\", \"exposure\", \"focus\", \"noise\", \"source\", \"whiteBalanceIntent\", \"adoptedWhiteXyz\", \"models\", \"planes\"]);\n if (r.schemaVersion !== SIMULATED_CAPTURE_SCHEMA_VERSION && r.schemaVersion !== \"0.1.0\") throw new InvalidConfigurationError(\"Unsupported capture schema.\");\n if (r.schemaVersion === \"0.1.0\" && Array.isArray(r.planes) && r.planes.some((p: CaptureLinearPlane) => p?.whiteBalanceApplication === \"applied-chromatic-adaptation\")) {\n throw new InvalidConfigurationError(\"Legacy capture schema cannot declare the new adaptation state.\");\n }\n const { schemaVersion: _schemaVersion, engineApiVersion, resolvedGeometry, equivalentFocalLength35Mm, ...input } = r;\n const result = normalize(input, id(engineApiVersion));\n // The equivalent focal length is recomputed. An archived value within a few ULPs is accepted, so records\n // written by another JavaScript engine or by releases before 2.0.0 (which used Math.hypot) still parse.\n if (canonical(resolvedGeometry) !== canonical(result.resolvedGeometry) ||\n typeof equivalentFocalLength35Mm !== \"number\" ||\n !equalWithinUlps(equivalentFocalLength35Mm, result.equivalentFocalLength35Mm, DERIVED_FOCAL_LENGTH_ULPS)) {\n throw new InvalidConfigurationError(\"Archived derived capture metadata is inconsistent.\");\n }\n // _schemaVersion is already checked, not copied as an unchecked discriminator.\n void _schemaVersion;\n return result;\n}\nfunction canonical(value: unknown): string {\n return stringifyCanonicalJson(value, {\n undefinedObjectProperties: \"reject\",\n nonFiniteNumberMessage: \"Capture number must be finite with valid sign.\",\n unsupportedValueMessage: \"Derived capture metadata must be finite JSON.\"\n });\n}\n\n/** Canonical JSON of the allowed fields, including sample values and IDs. Excludes private caches and file layout. */\nexport function serializeSimulatedCapture(input: { capture: SimulatedCapture }): string {\n requireInputKeys(input, \"serializeSimulatedCapture\", [\"capture\"]);\n return JSON.stringify(parseSimulatedCapture(input.capture));\n}\n/** Requires the exact image state of the plane. Callers cannot substitute another kind of \"linear\". */\nexport function resolveSimulatedCapturePlane(input: {\n capture: SimulatedCapture; planeId: string; requiredImageState: CaptureLinearImageState;\n}): CaptureLinearPlane {\n requireInputKeys(input, \"resolveSimulatedCapturePlane\", [\"capture\", \"planeId\", \"requiredImageState\"]);\n const capture = parseSimulatedCapture(input.capture);\n const state = enumValue(input.requiredImageState, [\"scene-referred-xyz\", \"virtual-sensor-channels\", \"color-transformed-linear-rgb\"]);\n const result = capture.planes.find((p) => p.id === id(input.planeId));\n if (!result || result.imageState !== state) throw new InvalidConfigurationError(\"Capture plane missing or incompatible image state.\");\n return result;\n}\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fits a 3×3 camera-RGB → CIE XYZ matrix from caller-supplied spectral data.
|
|
3
|
+
*
|
|
4
|
+
* For each training reflectance R_j under illuminant S:
|
|
5
|
+
* camera ρ_j,c = k_c Σ S(λ) R_j(λ) s_c(λ) Δλ, target X_j = k Σ S(λ) R_j(λ) x̄(λ) Δλ
|
|
6
|
+
* k is chosen so the perfect diffuser has Y = 1. k_c (the same for all channels) is chosen so
|
|
7
|
+
* the camera's response to the perfect diffuser has green = 1.
|
|
8
|
+
*
|
|
9
|
+
* Two fits are available:
|
|
10
|
+
* - Ordinary least squares: M minimizes Σ_j ‖M ρ_j − X_j‖², so M = X Pᵀ (P Pᵀ)⁻¹.
|
|
11
|
+
* - White-point-preserving least squares: the same, subject to M ρ_white = X_white exactly
|
|
12
|
+
* (Finlayson & Drew 1997, "White-point preserving color correction", IS&T/SID CIC5). It is
|
|
13
|
+
* solved in closed form with one Lagrange multiplier per row.
|
|
14
|
+
*
|
|
15
|
+
* Residual errors are reported per patch as CIEDE2000, with CIELAB relative to the illuminant
|
|
16
|
+
* white (no chromatic adaptation). A 3×3 matrix is exact only if the camera meets the
|
|
17
|
+
* Luther–Ives condition. Otherwise the result is an estimate, and its error depends on the
|
|
18
|
+
* training set. No camera, reflectance or ColorChecker data is bundled. Reflectance tables with an
|
|
19
|
+
* unclear licence must come from the caller.
|
|
20
|
+
* @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.
|
|
21
|
+
*/
|
|
22
|
+
import { type CalculationResult } from "../core/calculation-result.js";
|
|
23
|
+
import { type ColorMatchingFunctionsSource, type ColorimetricQuadratureNode, type ColorimetricSpectrum } from "./color-matching-functions.js";
|
|
24
|
+
import { type CieXyzTristimulus, type ColorMatrix3x3, type ColorVector3 } from "./colorimetry-math.js";
|
|
25
|
+
export declare const MAX_CAMERA_MATRIX_TRAINING_PATCHES = 10000;
|
|
26
|
+
export interface CameraSpectralSensitivities {
|
|
27
|
+
red: ColorimetricSpectrum;
|
|
28
|
+
green: ColorimetricSpectrum;
|
|
29
|
+
blue: ColorimetricSpectrum;
|
|
30
|
+
}
|
|
31
|
+
export interface CameraMatrixTrainingPatch {
|
|
32
|
+
patchId: string;
|
|
33
|
+
reflectance: ColorimetricSpectrum;
|
|
34
|
+
}
|
|
35
|
+
export type CameraMatrixFitConstraint = "least-squares" | "white-point-preserving-least-squares";
|
|
36
|
+
export interface EstimateCameraColorMatrixInput {
|
|
37
|
+
quadratureNodes: readonly ColorimetricQuadratureNode[];
|
|
38
|
+
illuminant: ColorimetricSpectrum;
|
|
39
|
+
cameraSpectralSensitivities: CameraSpectralSensitivities;
|
|
40
|
+
patches: readonly CameraMatrixTrainingPatch[];
|
|
41
|
+
colorMatchingFunctions: ColorMatchingFunctionsSource;
|
|
42
|
+
constraint: CameraMatrixFitConstraint;
|
|
43
|
+
}
|
|
44
|
+
export interface CameraMatrixPatchReport {
|
|
45
|
+
patchId: string;
|
|
46
|
+
cameraRgb: ColorVector3;
|
|
47
|
+
targetXyz: CieXyzTristimulus;
|
|
48
|
+
predictedXyz: CieXyzTristimulus;
|
|
49
|
+
deltaE2000: number;
|
|
50
|
+
}
|
|
51
|
+
export interface CameraColorMatrixFit {
|
|
52
|
+
constraint: CameraMatrixFitConstraint;
|
|
53
|
+
/** Row-major camera RGB → XYZ (XYZ white Y = 1; camera white green = 1). */
|
|
54
|
+
cameraRgbToXyz: ColorMatrix3x3;
|
|
55
|
+
xyzToCameraRgb: ColorMatrix3x3;
|
|
56
|
+
illuminantWhiteXyz: CieXyzTristimulus;
|
|
57
|
+
/** Camera response to the perfect diffuser (green = 1); its reciprocal gives neutral WB gains. */
|
|
58
|
+
cameraWhiteRgb: ColorVector3;
|
|
59
|
+
patches: readonly CameraMatrixPatchReport[];
|
|
60
|
+
meanDeltaE2000: number;
|
|
61
|
+
maximumDeltaE2000: number;
|
|
62
|
+
/** Root-mean-square XYZ residual over all patches and components. */
|
|
63
|
+
rmsXyzResidual: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Fits a camera-RGB → XYZ matrix from spectral sensitivities, training reflectances,
|
|
67
|
+
* an illuminant and CMFs, and reports the per-patch CIEDE2000 residual.
|
|
68
|
+
*/
|
|
69
|
+
export declare function estimateCameraColorMatrix(input: EstimateCameraColorMatrixInput): CalculationResult<CameraColorMatrixFit>;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Fits a 3×3 camera-RGB → CIE XYZ matrix from caller-supplied spectral data.
|
|
4
|
+
*
|
|
5
|
+
* For each training reflectance R_j under illuminant S:
|
|
6
|
+
* camera ρ_j,c = k_c Σ S(λ) R_j(λ) s_c(λ) Δλ, target X_j = k Σ S(λ) R_j(λ) x̄(λ) Δλ
|
|
7
|
+
* k is chosen so the perfect diffuser has Y = 1. k_c (the same for all channels) is chosen so
|
|
8
|
+
* the camera's response to the perfect diffuser has green = 1.
|
|
9
|
+
*
|
|
10
|
+
* Two fits are available:
|
|
11
|
+
* - Ordinary least squares: M minimizes Σ_j ‖M ρ_j − X_j‖², so M = X Pᵀ (P Pᵀ)⁻¹.
|
|
12
|
+
* - White-point-preserving least squares: the same, subject to M ρ_white = X_white exactly
|
|
13
|
+
* (Finlayson & Drew 1997, "White-point preserving color correction", IS&T/SID CIC5). It is
|
|
14
|
+
* solved in closed form with one Lagrange multiplier per row.
|
|
15
|
+
*
|
|
16
|
+
* Residual errors are reported per patch as CIEDE2000, with CIELAB relative to the illuminant
|
|
17
|
+
* white (no chromatic adaptation). A 3×3 matrix is exact only if the camera meets the
|
|
18
|
+
* Luther–Ives condition. Otherwise the result is an estimate, and its error depends on the
|
|
19
|
+
* training set. No camera, reflectance or ColorChecker data is bundled. Reflectance tables with an
|
|
20
|
+
* unclear licence must come from the caller.
|
|
21
|
+
* @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.
|
|
22
|
+
*/
|
|
23
|
+
import { estimatedResult } from "../core/calculation-result.js";
|
|
24
|
+
import { InvalidScientificInputError } from "../core/validation.js";
|
|
25
|
+
import { COLORIMETRY_MODEL_VERSION, integrateSampledXyz, prepareColorMatchingFunctions, prepareColorimetricSpectrum, sampleColorimetricBasis, sampleFactor } from "./color-matching-functions.js";
|
|
26
|
+
import { cielabOfXyz, deltaE2000 } from "./color-difference.js";
|
|
27
|
+
import { invertMatrix3x3, multiplyMatrixVector, requireFiniteResult, vectorToXyz, xyzToVector } from "./colorimetry-math.js";
|
|
28
|
+
import { requireInputKeys } from "../core/record-validation.js";
|
|
29
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
30
|
+
export const MAX_CAMERA_MATRIX_TRAINING_PATCHES = 10_000;
|
|
31
|
+
function solveRow(aInv, rhs, white, whiteTarget) {
|
|
32
|
+
// Unconstrained normal equations: m = A⁻¹ b with A = P Pᵀ, b = P xᵀ.
|
|
33
|
+
const m = multiplyMatrixVector(aInv, rhs);
|
|
34
|
+
if (white === undefined)
|
|
35
|
+
return m;
|
|
36
|
+
const aInvW = multiplyMatrixVector(aInv, white);
|
|
37
|
+
const wAw = white[0] * aInvW[0] + white[1] * aInvW[1] + white[2] * aInvW[2];
|
|
38
|
+
const residual = whiteTarget - (m[0] * white[0] + m[1] * white[1] + m[2] * white[2]);
|
|
39
|
+
return [m[0] + (aInvW[0] * residual) / wAw, m[1] + (aInvW[1] * residual) / wAw, m[2] + (aInvW[2] * residual) / wAw];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Fits a camera-RGB → XYZ matrix from spectral sensitivities, training reflectances,
|
|
43
|
+
* an illuminant and CMFs, and reports the per-patch CIEDE2000 residual.
|
|
44
|
+
*/
|
|
45
|
+
export function estimateCameraColorMatrix(input) {
|
|
46
|
+
requireInputKeys(input, "estimateCameraColorMatrix", ["quadratureNodes", "illuminant", "cameraSpectralSensitivities", "patches", "colorMatchingFunctions", "constraint"]);
|
|
47
|
+
if (input.constraint !== "least-squares" && input.constraint !== "white-point-preserving-least-squares") {
|
|
48
|
+
throw new InvalidConfigurationError("constraint is not supported.");
|
|
49
|
+
}
|
|
50
|
+
if (!Array.isArray(input.patches) || input.patches.length < 3 || input.patches.length > MAX_CAMERA_MATRIX_TRAINING_PATCHES) {
|
|
51
|
+
throw new InvalidScientificInputError("patches must contain between 3 and " + MAX_CAMERA_MATRIX_TRAINING_PATCHES + " entries.");
|
|
52
|
+
}
|
|
53
|
+
const cmf = prepareColorMatchingFunctions(input.colorMatchingFunctions);
|
|
54
|
+
const illuminant = prepareColorimetricSpectrum(input.illuminant, "illuminant");
|
|
55
|
+
const basis = sampleColorimetricBasis(input.quadratureNodes, illuminant, cmf);
|
|
56
|
+
const sens = input.cameraSpectralSensitivities;
|
|
57
|
+
if (typeof sens !== "object" || sens === null)
|
|
58
|
+
throw new InvalidConfigurationError("cameraSpectralSensitivities must be an object.");
|
|
59
|
+
const channel = ["red", "green", "blue"].map((c) => sampleFactor(basis, prepareColorimetricSpectrum(sens[c], "cameraSpectralSensitivities." + c)));
|
|
60
|
+
const ids = new Set();
|
|
61
|
+
const n = basis.nodes.length;
|
|
62
|
+
const cameraOf = (factor) => {
|
|
63
|
+
const out = [0, 0, 0];
|
|
64
|
+
for (let i = 0; i < n; i++) {
|
|
65
|
+
const w = basis.weights[i] * factor[i];
|
|
66
|
+
for (let c = 0; c < 3; c++)
|
|
67
|
+
out[c] += w * channel[c][i];
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
};
|
|
71
|
+
const ones = sampleFactor(basis, undefined);
|
|
72
|
+
const rawWhiteXyz = integrateSampledXyz(basis, ones);
|
|
73
|
+
const rawWhiteRgb = cameraOf(ones);
|
|
74
|
+
if (!(rawWhiteXyz.y > 0) || !(rawWhiteRgb[1] > 0))
|
|
75
|
+
throw new InvalidScientificInputError("The illuminant must give positive Y and positive camera green for the perfect diffuser.");
|
|
76
|
+
const kXyz = 1 / rawWhiteXyz.y, kRgb = 1 / rawWhiteRgb[1];
|
|
77
|
+
const scale = (v, k) => [v[0] * k, v[1] * k, v[2] * k];
|
|
78
|
+
const whiteXyz = scale(xyzToVector(rawWhiteXyz), kXyz);
|
|
79
|
+
const whiteRgb = scale(rawWhiteRgb, kRgb);
|
|
80
|
+
const rows = input.patches.map((patch, j) => {
|
|
81
|
+
if (typeof patch !== "object" || patch === null || typeof patch.patchId !== "string" || patch.patchId.trim().length === 0) {
|
|
82
|
+
throw new InvalidConfigurationError("patches[" + j + "].patchId must be a non-empty string.");
|
|
83
|
+
}
|
|
84
|
+
if (ids.has(patch.patchId))
|
|
85
|
+
throw new InvalidScientificInputError("patches must not repeat patchId.");
|
|
86
|
+
ids.add(patch.patchId);
|
|
87
|
+
const factor = sampleFactor(basis, prepareColorimetricSpectrum(patch.reflectance, "patches[" + j + "].reflectance"));
|
|
88
|
+
return { patchId: patch.patchId, rgb: scale(cameraOf(factor), kRgb), xyz: scale(xyzToVector(integrateSampledXyz(basis, factor)), kXyz) };
|
|
89
|
+
});
|
|
90
|
+
const a = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
|
|
91
|
+
const b = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; // b[outputRow][cameraChannel]
|
|
92
|
+
for (const r of rows) {
|
|
93
|
+
for (let p = 0; p < 3; p++) {
|
|
94
|
+
for (let q = 0; q < 3; q++)
|
|
95
|
+
a[p][q] += r.rgb[p] * r.rgb[q];
|
|
96
|
+
for (let o = 0; o < 3; o++)
|
|
97
|
+
b[o][p] += r.xyz[o] * r.rgb[p];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const aMatrix = a;
|
|
101
|
+
const aInv = invertMatrix3x3(aMatrix, "Camera training Gram matrix (patches must span three independent camera responses)");
|
|
102
|
+
const constrained = input.constraint === "white-point-preserving-least-squares";
|
|
103
|
+
const m = [0, 1, 2].map((o) => solveRow(aInv, b[o], constrained ? whiteRgb : undefined, whiteXyz[o]));
|
|
104
|
+
requireFiniteResult(m.flat(), "Camera matrix fit");
|
|
105
|
+
const whiteXyzRecord = vectorToXyz(whiteXyz);
|
|
106
|
+
let sumDe = 0, maxDe = 0, sumSq = 0;
|
|
107
|
+
const patches = rows.map((r) => {
|
|
108
|
+
const predicted = multiplyMatrixVector(m, r.rgb);
|
|
109
|
+
const de = deltaE2000(cielabOfXyz(vectorToXyz(r.xyz), whiteXyzRecord), cielabOfXyz(vectorToXyz(predicted), whiteXyzRecord));
|
|
110
|
+
sumDe += de;
|
|
111
|
+
maxDe = Math.max(maxDe, de);
|
|
112
|
+
for (let o = 0; o < 3; o++)
|
|
113
|
+
sumSq += (predicted[o] - r.xyz[o]) ** 2;
|
|
114
|
+
return { patchId: r.patchId, cameraRgb: r.rgb, targetXyz: vectorToXyz(r.xyz), predictedXyz: vectorToXyz(predicted), deltaE2000: de };
|
|
115
|
+
});
|
|
116
|
+
const value = {
|
|
117
|
+
constraint: input.constraint, cameraRgbToXyz: m, xyzToCameraRgb: invertMatrix3x3(m, "Fitted camera matrix"),
|
|
118
|
+
illuminantWhiteXyz: whiteXyzRecord, cameraWhiteRgb: whiteRgb, patches,
|
|
119
|
+
meanDeltaE2000: sumDe / rows.length, maximumDeltaE2000: maxDe, rmsXyzResidual: Math.sqrt(sumSq / (3 * rows.length))
|
|
120
|
+
};
|
|
121
|
+
requireFiniteResult([value.meanDeltaE2000, value.maximumDeltaE2000, value.rmsXyzResidual], "Camera matrix report");
|
|
122
|
+
return estimatedResult(value, "camera-color-matrix-least-squares", COLORIMETRY_MODEL_VERSION, [
|
|
123
|
+
"Linear 3×3 model fitted to caller training reflectances under one illuminant; exact only under the Luther–Ives condition",
|
|
124
|
+
"ΔE2000 uses CIELAB relative to the illuminant white without chromatic adaptation",
|
|
125
|
+
"CMF source: " + cmf.datasetId
|
|
126
|
+
], {
|
|
127
|
+
notes: [
|
|
128
|
+
"Training-set residuals are reported per patch in value.patches (CIEDE2000) and value.rmsXyzResidual; they do not bound the error for spectra outside the training set."
|
|
129
|
+
]
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=camera-color-matrix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camera-color-matrix.js","sourceRoot":"","sources":["../../src/color/camera-color-matrix.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Fits a 3×3 camera-RGB → CIE XYZ matrix from caller-supplied spectral data.\n *\n * For each training reflectance R_j under illuminant S:\n * camera ρ_j,c = k_c Σ S(λ) R_j(λ) s_c(λ) Δλ, target X_j = k Σ S(λ) R_j(λ) x̄(λ) Δλ\n * k is chosen so the perfect diffuser has Y = 1. k_c (the same for all channels) is chosen so\n * the camera's response to the perfect diffuser has green = 1.\n *\n * Two fits are available:\n * - Ordinary least squares: M minimizes Σ_j ‖M ρ_j − X_j‖², so M = X Pᵀ (P Pᵀ)⁻¹.\n * - White-point-preserving least squares: the same, subject to M ρ_white = X_white exactly\n * (Finlayson & Drew 1997, \"White-point preserving color correction\", IS&T/SID CIC5). It is\n * solved in closed form with one Lagrange multiplier per row.\n *\n * Residual errors are reported per patch as CIEDE2000, with CIELAB relative to the illuminant\n * white (no chromatic adaptation). A 3×3 matrix is exact only if the camera meets the\n * Luther–Ives condition. Otherwise the result is an estimate, and its error depends on the\n * training set. No camera, reflectance or ColorChecker data is bundled. Reflectance tables with an\n * unclear licence must come from the caller.\n * @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.\n */\n\nimport { estimatedResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport {\n COLORIMETRY_MODEL_VERSION,\n integrateSampledXyz,\n prepareColorMatchingFunctions,\n prepareColorimetricSpectrum,\n sampleColorimetricBasis,\n sampleFactor,\n type ColorMatchingFunctionsSource,\n type ColorimetricQuadratureNode,\n type ColorimetricSpectrum,\n type SampledColorimetricBasis\n} from \"./color-matching-functions.js\";\nimport { cielabOfXyz, deltaE2000 } from \"./color-difference.js\";\nimport {\n invertMatrix3x3,\n multiplyMatrixVector,\n requireFiniteResult,\n vectorToXyz,\n xyzToVector,\n type CieXyzTristimulus,\n type ColorMatrix3x3,\n type ColorVector3\n} from \"./colorimetry-math.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nexport const MAX_CAMERA_MATRIX_TRAINING_PATCHES = 10_000;\n\nexport interface CameraSpectralSensitivities {\n red: ColorimetricSpectrum;\n green: ColorimetricSpectrum;\n blue: ColorimetricSpectrum;\n}\n\nexport interface CameraMatrixTrainingPatch {\n patchId: string;\n reflectance: ColorimetricSpectrum;\n}\n\nexport type CameraMatrixFitConstraint = \"least-squares\" | \"white-point-preserving-least-squares\";\n\nexport interface EstimateCameraColorMatrixInput {\n quadratureNodes: readonly ColorimetricQuadratureNode[];\n illuminant: ColorimetricSpectrum;\n cameraSpectralSensitivities: CameraSpectralSensitivities;\n patches: readonly CameraMatrixTrainingPatch[];\n colorMatchingFunctions: ColorMatchingFunctionsSource;\n constraint: CameraMatrixFitConstraint;\n}\n\nexport interface CameraMatrixPatchReport {\n patchId: string;\n cameraRgb: ColorVector3;\n targetXyz: CieXyzTristimulus;\n predictedXyz: CieXyzTristimulus;\n deltaE2000: number;\n}\n\nexport interface CameraColorMatrixFit {\n constraint: CameraMatrixFitConstraint;\n /** Row-major camera RGB → XYZ (XYZ white Y = 1; camera white green = 1). */\n cameraRgbToXyz: ColorMatrix3x3;\n xyzToCameraRgb: ColorMatrix3x3;\n illuminantWhiteXyz: CieXyzTristimulus;\n /** Camera response to the perfect diffuser (green = 1); its reciprocal gives neutral WB gains. */\n cameraWhiteRgb: ColorVector3;\n patches: readonly CameraMatrixPatchReport[];\n meanDeltaE2000: number;\n maximumDeltaE2000: number;\n /** Root-mean-square XYZ residual over all patches and components. */\n rmsXyzResidual: number;\n}\n\ntype Matrix = number[][];\n\nfunction solveRow(aInv: ColorMatrix3x3, rhs: ColorVector3, white: ColorVector3 | undefined, whiteTarget: number): ColorVector3 {\n // Unconstrained normal equations: m = A⁻¹ b with A = P Pᵀ, b = P xᵀ.\n const m = multiplyMatrixVector(aInv, rhs);\n if (white === undefined) return m;\n const aInvW = multiplyMatrixVector(aInv, white);\n const wAw = white[0] * aInvW[0] + white[1] * aInvW[1] + white[2] * aInvW[2];\n const residual = whiteTarget - (m[0] * white[0] + m[1] * white[1] + m[2] * white[2]);\n return [m[0] + (aInvW[0] * residual) / wAw, m[1] + (aInvW[1] * residual) / wAw, m[2] + (aInvW[2] * residual) / wAw];\n}\n\n/**\n * Fits a camera-RGB → XYZ matrix from spectral sensitivities, training reflectances,\n * an illuminant and CMFs, and reports the per-patch CIEDE2000 residual.\n */\nexport function estimateCameraColorMatrix(input: EstimateCameraColorMatrixInput): CalculationResult<CameraColorMatrixFit> {\n requireInputKeys(input, \"estimateCameraColorMatrix\", [\"quadratureNodes\", \"illuminant\", \"cameraSpectralSensitivities\", \"patches\", \"colorMatchingFunctions\", \"constraint\"]);\n if (input.constraint !== \"least-squares\" && input.constraint !== \"white-point-preserving-least-squares\") {\n throw new InvalidConfigurationError(\"constraint is not supported.\");\n }\n if (!Array.isArray(input.patches) || input.patches.length < 3 || input.patches.length > MAX_CAMERA_MATRIX_TRAINING_PATCHES) {\n throw new InvalidScientificInputError(\"patches must contain between 3 and \" + MAX_CAMERA_MATRIX_TRAINING_PATCHES + \" entries.\");\n }\n const cmf = prepareColorMatchingFunctions(input.colorMatchingFunctions);\n const illuminant = prepareColorimetricSpectrum(input.illuminant, \"illuminant\");\n const basis: SampledColorimetricBasis = sampleColorimetricBasis(input.quadratureNodes, illuminant, cmf);\n const sens = input.cameraSpectralSensitivities;\n if (typeof sens !== \"object\" || sens === null) throw new InvalidConfigurationError(\"cameraSpectralSensitivities must be an object.\");\n const channel = ([\"red\", \"green\", \"blue\"] as const).map((c) => sampleFactor(basis, prepareColorimetricSpectrum(sens[c], \"cameraSpectralSensitivities.\" + c)));\n const ids = new Set<string>();\n const n = basis.nodes.length;\n const cameraOf = (factor: Float64Array): ColorVector3 => {\n const out = [0, 0, 0];\n for (let i = 0; i < n; i++) {\n const w = basis.weights[i]! * factor[i]!;\n for (let c = 0; c < 3; c++) out[c]! += w * channel[c]![i]!;\n }\n return out as unknown as ColorVector3;\n };\n const ones = sampleFactor(basis, undefined);\n const rawWhiteXyz = integrateSampledXyz(basis, ones);\n const rawWhiteRgb = cameraOf(ones);\n if (!(rawWhiteXyz.y > 0) || !(rawWhiteRgb[1] > 0)) throw new InvalidScientificInputError(\"The illuminant must give positive Y and positive camera green for the perfect diffuser.\");\n const kXyz = 1 / rawWhiteXyz.y, kRgb = 1 / rawWhiteRgb[1];\n const scale = (v: ColorVector3, k: number): ColorVector3 => [v[0] * k, v[1] * k, v[2] * k];\n const whiteXyz = scale(xyzToVector(rawWhiteXyz), kXyz);\n const whiteRgb = scale(rawWhiteRgb, kRgb);\n\n const rows = input.patches.map((patch, j) => {\n if (typeof patch !== \"object\" || patch === null || typeof patch.patchId !== \"string\" || patch.patchId.trim().length === 0) {\n throw new InvalidConfigurationError(\"patches[\" + j + \"].patchId must be a non-empty string.\");\n }\n if (ids.has(patch.patchId)) throw new InvalidScientificInputError(\"patches must not repeat patchId.\");\n ids.add(patch.patchId);\n const factor = sampleFactor(basis, prepareColorimetricSpectrum(patch.reflectance, \"patches[\" + j + \"].reflectance\"));\n return { patchId: patch.patchId, rgb: scale(cameraOf(factor), kRgb), xyz: scale(xyzToVector(integrateSampledXyz(basis, factor)), kXyz) };\n });\n\n const a: Matrix = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];\n const b: Matrix = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; // b[outputRow][cameraChannel]\n for (const r of rows) {\n for (let p = 0; p < 3; p++) {\n for (let q = 0; q < 3; q++) a[p]![q]! += r.rgb[p]! * r.rgb[q]!;\n for (let o = 0; o < 3; o++) b[o]![p]! += r.xyz[o]! * r.rgb[p]!;\n }\n }\n const aMatrix = a as unknown as ColorMatrix3x3;\n const aInv = invertMatrix3x3(aMatrix, \"Camera training Gram matrix (patches must span three independent camera responses)\");\n const constrained = input.constraint === \"white-point-preserving-least-squares\";\n const m = [0, 1, 2].map((o) => solveRow(aInv, b[o] as unknown as ColorVector3, constrained ? whiteRgb : undefined, whiteXyz[o]!)) as unknown as ColorMatrix3x3;\n requireFiniteResult(m.flat(), \"Camera matrix fit\");\n\n const whiteXyzRecord = vectorToXyz(whiteXyz);\n let sumDe = 0, maxDe = 0, sumSq = 0;\n const patches: CameraMatrixPatchReport[] = rows.map((r) => {\n const predicted = multiplyMatrixVector(m, r.rgb);\n const de = deltaE2000(cielabOfXyz(vectorToXyz(r.xyz), whiteXyzRecord), cielabOfXyz(vectorToXyz(predicted), whiteXyzRecord));\n sumDe += de; maxDe = Math.max(maxDe, de);\n for (let o = 0; o < 3; o++) sumSq += (predicted[o]! - r.xyz[o]!) ** 2;\n return { patchId: r.patchId, cameraRgb: r.rgb, targetXyz: vectorToXyz(r.xyz), predictedXyz: vectorToXyz(predicted), deltaE2000: de };\n });\n const value: CameraColorMatrixFit = {\n constraint: input.constraint, cameraRgbToXyz: m, xyzToCameraRgb: invertMatrix3x3(m, \"Fitted camera matrix\"),\n illuminantWhiteXyz: whiteXyzRecord, cameraWhiteRgb: whiteRgb, patches,\n meanDeltaE2000: sumDe / rows.length, maximumDeltaE2000: maxDe, rmsXyzResidual: Math.sqrt(sumSq / (3 * rows.length))\n };\n requireFiniteResult([value.meanDeltaE2000, value.maximumDeltaE2000, value.rmsXyzResidual], \"Camera matrix report\");\n return estimatedResult(value, \"camera-color-matrix-least-squares\", COLORIMETRY_MODEL_VERSION, [\n \"Linear 3×3 model fitted to caller training reflectances under one illuminant; exact only under the Luther–Ives condition\",\n \"ΔE2000 uses CIELAB relative to the illuminant white without chromatic adaptation\",\n \"CMF source: \" + cmf.datasetId\n ], {\n notes: [\n \"Training-set residuals are reported per patch in value.patches (CIEDE2000) and value.rmsXyzResidual; they do not bound the error for spectra outside the training set.\"\n ]\n });\n}\n"]}
|