@photivra/engine 1.5.0 → 2.1.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 +414 -6
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +64 -12
- package/README.md +301 -182
- package/SECURITY.md +37 -28
- package/THIRD_PARTY.md +148 -4
- package/dist/camera/equivalent-focal-length.d.ts +13 -14
- package/dist/camera/equivalent-focal-length.js +15 -13
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +30 -19
- package/dist/camera/field-of-view.js +67 -18
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/lens-projection.d.ts +170 -0
- package/dist/camera/lens-projection.js +444 -0
- package/dist/camera/lens-projection.js.map +1 -0
- package/dist/camera/projected-object-size.d.ts +10 -11
- package/dist/camera/projected-object-size.js +12 -10
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +9 -10
- package/dist/capture/capture-export-metadata.js +8 -5
- package/dist/capture/capture-export-metadata.js.map +1 -1
- package/dist/capture/dng-import.d.ts +91 -0
- package/dist/capture/dng-import.js +343 -0
- package/dist/capture/dng-import.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +37 -17
- package/dist/capture/environment-raw-producer.js +43 -19
- package/dist/capture/environment-raw-producer.js.map +1 -1
- package/dist/capture/export-jpeg.d.ts +35 -4
- package/dist/capture/export-jpeg.js +133 -47
- package/dist/capture/export-jpeg.js.map +1 -1
- package/dist/capture/export-tiff.d.ts +48 -24
- package/dist/capture/export-tiff.js +91 -31
- package/dist/capture/export-tiff.js.map +1 -1
- package/dist/capture/focus-control.d.ts +42 -65
- package/dist/capture/focus-control.js +56 -75
- package/dist/capture/focus-control.js.map +1 -1
- package/dist/capture/host-yield-cadence.d.ts +25 -0
- package/dist/capture/host-yield-cadence.js +25 -0
- package/dist/capture/host-yield-cadence.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +14 -12
- package/dist/capture/linear-encoding.js +14 -13
- package/dist/capture/linear-encoding.js.map +1 -1
- package/dist/capture/lossless-jpeg.d.ts +27 -0
- package/dist/capture/lossless-jpeg.js +237 -0
- package/dist/capture/lossless-jpeg.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +227 -0
- package/dist/capture/native-environment-lean.js +974 -0
- package/dist/capture/native-environment-lean.js.map +1 -0
- package/dist/capture/native-environment-optical-stage.d.ts +97 -0
- package/dist/capture/native-environment-optical-stage.js +340 -0
- package/dist/capture/native-environment-optical-stage.js.map +1 -0
- package/dist/capture/native-environment-raw.d.ts +140 -6
- package/dist/capture/native-environment-raw.js +435 -34
- package/dist/capture/native-environment-raw.js.map +1 -1
- package/dist/capture/native-raw-development.d.ts +116 -9
- package/dist/capture/native-raw-development.js +221 -62
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/capture/native-raw-dng.d.ts +60 -0
- package/dist/capture/native-raw-dng.js +167 -0
- package/dist/capture/native-raw-dng.js.map +1 -0
- package/dist/capture/native-raw.d.ts +65 -12
- package/dist/capture/native-raw.js +81 -19
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/packed-sensor-raw.d.ts +160 -0
- package/dist/capture/packed-sensor-raw.js +221 -0
- package/dist/capture/packed-sensor-raw.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +58 -35
- package/dist/capture/photographic-export.js +177 -70
- package/dist/capture/photographic-export.js.map +1 -1
- package/dist/capture/raw-development-kernel.d.ts +52 -0
- package/dist/capture/raw-development-kernel.js +88 -0
- package/dist/capture/raw-development-kernel.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +7 -7
- package/dist/capture/raw-frame-limits.js +7 -6
- package/dist/capture/raw-frame-limits.js.map +1 -1
- package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
- package/dist/capture/raw-frame-reconstruction.js +9 -8
- package/dist/capture/raw-frame-reconstruction.js.map +1 -1
- package/dist/capture/raw-white-level.d.ts +55 -0
- package/dist/capture/raw-white-level.js +165 -0
- package/dist/capture/raw-white-level.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +5 -7
- package/dist/capture/release-sequence.js +15 -13
- package/dist/capture/release-sequence.js.map +1 -1
- package/dist/capture/sensor-raw-frame.d.ts +5 -6
- package/dist/capture/sensor-raw-frame.js +26 -9
- package/dist/capture/sensor-raw-frame.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +21 -13
- package/dist/capture/sensor-raw-producer.js +86 -25
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/capture/simulated-capture.d.ts +15 -16
- package/dist/capture/simulated-capture.js +22 -12
- package/dist/capture/simulated-capture.js.map +1 -1
- package/dist/color/camera-color-matrix.d.ts +69 -0
- package/dist/color/camera-color-matrix.js +132 -0
- package/dist/color/camera-color-matrix.js.map +1 -0
- package/dist/color/capture-color.d.ts +17 -10
- package/dist/color/capture-color.js +50 -17
- package/dist/color/capture-color.js.map +1 -1
- package/dist/color/chromatic-adaptation.d.ts +63 -0
- package/dist/color/chromatic-adaptation.js +91 -0
- package/dist/color/chromatic-adaptation.js.map +1 -0
- package/dist/color/color-difference.d.ts +104 -0
- package/dist/color/color-difference.js +205 -0
- package/dist/color/color-difference.js.map +1 -0
- package/dist/color/color-matching-functions.d.ts +168 -0
- package/dist/color/color-matching-functions.js +309 -0
- package/dist/color/color-matching-functions.js.map +1 -0
- package/dist/color/colorimetry-math.d.ts +52 -0
- package/dist/color/colorimetry-math.js +144 -0
- package/dist/color/colorimetry-math.js.map +1 -0
- package/dist/color/gamut-mapping.d.ts +54 -0
- package/dist/color/gamut-mapping.js +107 -0
- package/dist/color/gamut-mapping.js.map +1 -0
- package/dist/color/illuminants.d.ts +182 -0
- package/dist/color/illuminants.js +434 -0
- package/dist/color/illuminants.js.map +1 -0
- package/dist/color/rgb-color-spaces.d.ts +79 -0
- package/dist/color/rgb-color-spaces.js +115 -0
- package/dist/color/rgb-color-spaces.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +33 -11
- package/dist/color/sensor-color-development.js +104 -30
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/srgb-icc.d.ts +9 -2
- package/dist/color/srgb-icc.js +16 -5
- package/dist/color/srgb-icc.js.map +1 -1
- package/dist/color/srgb-transfer.d.ts +1 -2
- package/dist/color/srgb-transfer.js +1 -1
- package/dist/color/srgb-transfer.js.map +1 -1
- package/dist/color/white-balance.d.ts +68 -19
- package/dist/color/white-balance.js +168 -35
- package/dist/color/white-balance.js.map +1 -1
- package/dist/composition/image-formation-plan.d.ts +152 -128
- package/dist/composition/image-formation-plan.js +292 -138
- package/dist/composition/image-formation-plan.js.map +1 -1
- package/dist/composition/plan-consumer.d.ts +6 -7
- package/dist/composition/plan-consumer.js +14 -11
- package/dist/composition/plan-consumer.js.map +1 -1
- package/dist/core/calculation-result.d.ts +21 -14
- package/dist/core/calculation-result.js +209 -11
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +13 -8
- package/dist/core/canonical-json.js +34 -15
- package/dist/core/canonical-json.js.map +1 -1
- package/dist/core/configuration-error.d.ts +5 -4
- package/dist/core/configuration-error.js +5 -3
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +12 -12
- package/dist/core/evidence-provenance.js +10 -9
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +11 -10
- package/dist/core/image-formation.js +11 -9
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +9 -17
- package/dist/core/owned-data.js +9 -16
- package/dist/core/owned-data.js.map +1 -1
- package/dist/core/portable-math.d.ts +15 -0
- package/dist/core/portable-math.js +56 -0
- package/dist/core/portable-math.js.map +1 -0
- package/dist/core/record-validation.d.ts +48 -9
- package/dist/core/record-validation.js +93 -19
- package/dist/core/record-validation.js.map +1 -1
- package/dist/core/scientific-assurance.d.ts +16 -14
- package/dist/core/scientific-assurance.js +22 -18
- package/dist/core/scientific-assurance.js.map +1 -1
- package/dist/core/spectral-composition.d.ts +13 -14
- package/dist/core/spectral-composition.js +30 -27
- package/dist/core/spectral-composition.js.map +1 -1
- package/dist/core/spectral.d.ts +5 -6
- package/dist/core/spectral.js +9 -7
- package/dist/core/spectral.js.map +1 -1
- package/dist/core/validation.d.ts +3 -6
- package/dist/core/validation.js +3 -5
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +6 -6
- package/dist/core/version.js +6 -5
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/exposure-capabilities.d.ts +10 -10
- package/dist/equipment/exposure-capabilities.js +40 -30
- package/dist/equipment/exposure-capabilities.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +13 -6
- package/dist/equipment/generic-tier-assets.js +34 -15
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/generic-tier-presets.d.ts +5 -6
- package/dist/equipment/generic-tier-presets.js +15 -13
- package/dist/equipment/generic-tier-presets.js.map +1 -1
- package/dist/equipment/iso-capabilities.d.ts +21 -22
- package/dist/equipment/iso-capabilities.js +49 -44
- package/dist/equipment/iso-capabilities.js.map +1 -1
- package/dist/equipment/metering-capabilities.d.ts +5 -6
- package/dist/equipment/metering-capabilities.js +22 -19
- package/dist/equipment/metering-capabilities.js.map +1 -1
- package/dist/equipment/release-capabilities.d.ts +3 -4
- package/dist/equipment/release-capabilities.js +18 -14
- package/dist/equipment/release-capabilities.js.map +1 -1
- package/dist/exposure/exposure-duration-control.d.ts +19 -17
- package/dist/exposure/exposure-duration-control.js +27 -23
- package/dist/exposure/exposure-duration-control.js.map +1 -1
- package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
- package/dist/exposure/exposure-mode-resolver.js +127 -82
- package/dist/exposure/exposure-mode-resolver.js.map +1 -1
- package/dist/exposure/exposure.d.ts +17 -16
- package/dist/exposure/exposure.js +22 -15
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash-ttl.d.ts +135 -0
- package/dist/exposure/flash-ttl.js +193 -0
- package/dist/exposure/flash-ttl.js.map +1 -0
- package/dist/exposure/flash.d.ts +144 -36
- package/dist/exposure/flash.js +259 -59
- package/dist/exposure/flash.js.map +1 -1
- package/dist/exposure/metering-scene-radiance.d.ts +10 -10
- package/dist/exposure/metering-scene-radiance.js +42 -23
- package/dist/exposure/metering-scene-radiance.js.map +1 -1
- package/dist/exposure/metering-target.d.ts +8 -8
- package/dist/exposure/metering-target.js +30 -20
- package/dist/exposure/metering-target.js.map +1 -1
- package/dist/exposure/metering-temporal.d.ts +16 -15
- package/dist/exposure/metering-temporal.js +41 -19
- package/dist/exposure/metering-temporal.js.map +1 -1
- package/dist/exposure/metering.d.ts +64 -17
- package/dist/exposure/metering.js +159 -30
- package/dist/exposure/metering.js.map +1 -1
- package/dist/exposure/program-line.d.ts +5 -5
- package/dist/exposure/program-line.js +20 -13
- package/dist/exposure/program-line.js.map +1 -1
- package/dist/facade/camera-preset.d.ts +8 -0
- package/dist/facade/camera-preset.js +102 -0
- package/dist/facade/camera-preset.js.map +1 -0
- package/dist/facade/chart-radiance-batch.d.ts +57 -0
- package/dist/facade/chart-radiance-batch.js +121 -0
- package/dist/facade/chart-radiance-batch.js.map +1 -0
- package/dist/facade/chart-scenes.d.ts +177 -0
- package/dist/facade/chart-scenes.js +232 -0
- package/dist/facade/chart-scenes.js.map +1 -0
- package/dist/facade/diffraction-provider.d.ts +30 -0
- package/dist/facade/diffraction-provider.js +127 -0
- package/dist/facade/diffraction-provider.js.map +1 -0
- package/dist/facade/host-yield.d.ts +7 -0
- package/dist/facade/host-yield.js +19 -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 +363 -0
- package/dist/facade/simulate-capture.js +1281 -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 +91 -25
- package/dist/index.js +60 -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-psf-profile.d.ts +118 -0
- package/dist/optics/diffraction-psf-profile.js +252 -0
- package/dist/optics/diffraction-psf-profile.js.map +1 -0
- 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 +777 -2
- package/docs/QUICK_START.md +663 -0
- package/docs/USAGE.md +1719 -714
- package/docs/api/camera-equivalent-focal-length.md +6 -7
- package/docs/api/camera-field-of-view.md +16 -8
- package/docs/api/camera-lens-projection.md +246 -0
- package/docs/api/camera-projected-object-size.md +6 -5
- package/docs/api/capture-capture-export-metadata.md +10 -10
- package/docs/api/capture-dng-import.md +134 -0
- package/docs/api/capture-environment-raw-producer.md +17 -11
- package/docs/api/capture-export-jpeg.md +16 -0
- package/docs/api/capture-focus-control.md +25 -47
- package/docs/api/capture-linear-encoding.md +21 -12
- package/docs/api/capture-lossless-jpeg.md +49 -0
- package/docs/api/capture-native-environment-optical-stage.md +75 -0
- package/docs/api/capture-native-environment-raw.md +161 -4
- package/docs/api/capture-native-raw-development.md +69 -8
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +21 -10
- package/docs/api/capture-packed-sensor-raw.md +156 -0
- package/docs/api/capture-photographic-export.md +69 -31
- package/docs/api/capture-raw-frame-reconstruction.md +8 -8
- package/docs/api/capture-raw-white-level.md +37 -0
- package/docs/api/capture-release-sequence.md +6 -7
- package/docs/api/capture-sensor-raw-frame.md +6 -6
- package/docs/api/capture-sensor-raw-producer.md +17 -11
- package/docs/api/capture-simulated-capture.md +15 -15
- package/docs/api/color-camera-color-matrix.md +103 -0
- package/docs/api/color-capture-color.md +22 -11
- package/docs/api/color-chromatic-adaptation.md +82 -0
- package/docs/api/color-color-difference.md +134 -0
- package/docs/api/color-color-matching-functions.md +259 -0
- package/docs/api/color-colorimetry-math.md +54 -0
- package/docs/api/color-gamut-mapping.md +72 -0
- package/docs/api/color-illuminants.md +280 -0
- package/docs/api/color-rgb-color-spaces.md +151 -0
- package/docs/api/color-sensor-color-development.md +27 -0
- package/docs/api/color-srgb-icc.md +2 -4
- package/docs/api/color-white-balance.md +95 -19
- package/docs/api/composition-image-formation-plan.md +124 -95
- package/docs/api/composition-plan-consumer.md +7 -7
- package/docs/api/core-calculation-result.md +18 -14
- package/docs/api/core-configuration-error.md +1 -1
- package/docs/api/core-image-formation.md +7 -7
- package/docs/api/core-scientific-assurance.md +12 -10
- package/docs/api/core-spectral-composition.md +14 -14
- package/docs/api/core-spectral.md +6 -6
- package/docs/api/core-validation.md +3 -3
- package/docs/api/core-version.md +7 -6
- package/docs/api/equipment-exposure-capabilities.md +11 -10
- package/docs/api/equipment-generic-tier-assets.md +7 -2
- package/docs/api/equipment-generic-tier-presets.md +6 -6
- package/docs/api/equipment-iso-capabilities.md +18 -18
- package/docs/api/equipment-metering-capabilities.md +6 -6
- package/docs/api/equipment-release-capabilities.md +4 -4
- package/docs/api/exports.json +2253 -3
- 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 +397 -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-psf-profile.md +96 -0
- 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 -11
- package/AGENTS.md +0 -674
- package/CONTRIBUTING.md +0 -76
- package/DCO +0 -33
- package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
- package/dist/camera/field-of-view.d.ts.map +0 -1
- package/dist/camera/projected-object-size.d.ts.map +0 -1
- package/dist/capture/capture-export-metadata.d.ts.map +0 -1
- package/dist/capture/environment-raw-producer.d.ts.map +0 -1
- package/dist/capture/export-jpeg.d.ts.map +0 -1
- package/dist/capture/export-tiff.d.ts.map +0 -1
- package/dist/capture/focus-control.d.ts.map +0 -1
- package/dist/capture/linear-encoding.d.ts.map +0 -1
- package/dist/capture/native-environment-raw.d.ts.map +0 -1
- package/dist/capture/native-raw-development.d.ts.map +0 -1
- package/dist/capture/native-raw.d.ts.map +0 -1
- package/dist/capture/photographic-export.d.ts.map +0 -1
- package/dist/capture/raw-frame-limits.d.ts.map +0 -1
- package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
- package/dist/capture/release-sequence.d.ts.map +0 -1
- package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
- package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
- package/dist/capture/simulated-capture.d.ts.map +0 -1
- package/dist/color/capture-color.d.ts.map +0 -1
- package/dist/color/sensor-color-development.d.ts.map +0 -1
- package/dist/color/srgb-icc.d.ts.map +0 -1
- package/dist/color/srgb-transfer.d.ts.map +0 -1
- package/dist/color/white-balance.d.ts.map +0 -1
- package/dist/composition/image-formation-plan.d.ts.map +0 -1
- package/dist/composition/plan-consumer.d.ts.map +0 -1
- package/dist/core/calculation-result.d.ts.map +0 -1
- package/dist/core/canonical-json.d.ts.map +0 -1
- package/dist/core/configuration-error.d.ts.map +0 -1
- package/dist/core/evidence-provenance.d.ts.map +0 -1
- package/dist/core/image-formation.d.ts.map +0 -1
- package/dist/core/owned-data.d.ts.map +0 -1
- package/dist/core/record-validation.d.ts.map +0 -1
- package/dist/core/scientific-assurance.d.ts.map +0 -1
- package/dist/core/spectral-composition.d.ts.map +0 -1
- package/dist/core/spectral.d.ts.map +0 -1
- package/dist/core/validation.d.ts.map +0 -1
- package/dist/core/version.d.ts.map +0 -1
- package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
- package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
- package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
- package/dist/equipment/iso-capabilities.d.ts.map +0 -1
- package/dist/equipment/metering-capabilities.d.ts.map +0 -1
- package/dist/equipment/release-capabilities.d.ts.map +0 -1
- package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
- package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
- package/dist/exposure/exposure.d.ts.map +0 -1
- package/dist/exposure/flash.d.ts.map +0 -1
- package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
- package/dist/exposure/metering-target.d.ts.map +0 -1
- package/dist/exposure/metering-temporal.d.ts.map +0 -1
- package/dist/exposure/metering.d.ts.map +0 -1
- package/dist/exposure/program-line.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/motion/camera-rotation.d.ts.map +0 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/extended-object-projection.d.ts.map +0 -1
- package/dist/motion/projected-motion.d.ts.map +0 -1
- package/dist/optics/aperture.d.ts.map +0 -1
- package/dist/optics/circle-of-confusion.d.ts.map +0 -1
- package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
- package/dist/optics/depth-of-field.d.ts.map +0 -1
- package/dist/optics/diffraction.d.ts.map +0 -1
- package/dist/optics/focus-breathing.d.ts.map +0 -1
- package/dist/optics/focus-state.d.ts.map +0 -1
- package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
- package/dist/optics/illumination-vignetting.d.ts.map +0 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
- package/dist/optics/lens-psf-profile.d.ts.map +0 -1
- package/dist/optics/polygon-diffraction.d.ts.map +0 -1
- package/dist/optics/profile-contract.d.ts.map +0 -1
- package/dist/optics/psf-foundation.d.ts.map +0 -1
- package/dist/optics/radial-distortion.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
- package/dist/optics/sensor-environment-query.d.ts.map +0 -1
- package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-psf-support.d.ts.map +0 -1
- package/dist/optics/stray-light.d.ts.map +0 -1
- package/dist/optics/thin-lens.d.ts.map +0 -1
- package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
- package/dist/output/capture-geometry.d.ts.map +0 -1
- package/dist/output/capture-sdr.d.ts.map +0 -1
- package/dist/output/crop.d.ts.map +0 -1
- package/dist/output/geometric-transforms.d.ts.map +0 -1
- package/dist/output/lens-corrections.d.ts.map +0 -1
- package/dist/output/native-capture-sdr.d.ts.map +0 -1
- package/dist/output/print-contrast-reference.d.ts.map +0 -1
- package/dist/output/print-detail.d.ts.map +0 -1
- package/dist/output/print-jpeg.d.ts.map +0 -1
- package/dist/output/print-plan.d.ts.map +0 -1
- package/dist/output/print-region-statistics.d.ts.map +0 -1
- package/dist/output/sdr-rendering.d.ts.map +0 -1
- package/dist/output/subject-framing-crop.d.ts.map +0 -1
- package/dist/schema/camera.d.ts.map +0 -1
- package/dist/schema/camera.js +0 -3
- package/dist/schema/camera.js.map +0 -1
- package/dist/schema/illumination-spectral.d.ts.map +0 -1
- package/dist/schema/illumination-temporal.d.ts.map +0 -1
- package/dist/schema/illumination.d.ts.map +0 -1
- package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
- package/dist/schema/scene-radiance.d.ts.map +0 -1
- package/dist/schema/scene.d.ts.map +0 -1
- package/dist/schema/scene.js +0 -3
- package/dist/schema/scene.js.map +0 -1
- package/dist/schema/validation.d.ts.map +0 -1
- package/dist/sensor/accumulated-charge.d.ts.map +0 -1
- package/dist/sensor/architecture.d.ts.map +0 -1
- package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
- package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
- package/dist/sensor/capture-mode.d.ts.map +0 -1
- package/dist/sensor/color-sampling.d.ts.map +0 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
- package/dist/sensor/dark-current.d.ts.map +0 -1
- package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
- package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
- package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/exposure-window.d.ts.map +0 -1
- package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
- package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
- package/dist/sensor/optical-stack.d.ts.map +0 -1
- package/dist/sensor/photon-energy.d.ts.map +0 -1
- package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
- package/dist/sensor/pixel-pitch.d.ts.map +0 -1
- package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
- package/dist/sensor/raw-readout.d.ts.map +0 -1
- package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
- package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
- package/dist/sensor/readout-timing.d.ts.map +0 -1
- package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
- package/dist/sensor/response-operating-range.d.ts.map +0 -1
- package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
- package/dist/sensor/sampling-aperture.d.ts.map +0 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/sensor-geometry.d.ts.map +0 -1
- package/dist/sensor/signal-noise.d.ts.map +0 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
- package/dist/sensor/spectral-coverage.d.ts.map +0 -1
- package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
- package/dist/sensor/spectral-response.d.ts.map +0 -1
- package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
- package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
- package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
- package/dist/simulation/poc-simulation.d.ts.map +0 -1
- package/dist/stabilization/camera-shake.d.ts.map +0 -1
- package/dist/stabilization/system.d.ts.map +0 -1
- package/docs/API_STYLE.md +0 -235
- package/docs/ARCHITECTURE.md +0 -356
- package/docs/AUTOMATION_COORDINATION.md +0 -190
- package/docs/CAPTURE_COLOR.md +0 -25
- package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
- package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
- package/docs/CAPTURE_SDR.md +0 -22
- package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
- package/docs/DEVELOPERS.md +0 -68
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
- package/docs/EXPORT_ACCEPTANCE.md +0 -133
- package/docs/GENERIC_TIER_PRESETS.md +0 -269
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
- package/docs/IMAGE_FORMATION.md +0 -247
- package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
- package/docs/MOTION_AND_SIGNAL.md +0 -250
- package/docs/NATIVE_CAPTURE_SDR.md +0 -70
- package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
- package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
- package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
- package/docs/NUMERICAL_CORRECTNESS.md +0 -191
- package/docs/PERFORMANCE_BASELINE.md +0 -56
- package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
- package/docs/PHYSICS_FOUNDATION.md +0 -426
- package/docs/POC_API.md +0 -278
- package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
- package/docs/POC_PROJECTION_REUSE.md +0 -124
- package/docs/PRINT_195_196_REVIEW.md +0 -93
- package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
- package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
- package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
- package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
- package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
- package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
- package/docs/PRINT_PLANNING.md +0 -75
- package/docs/PRINT_REGION_STATISTICS.md +0 -38
- package/docs/PROCESSED_OUTPUT.md +0 -157
- package/docs/PRODUCTION_COMPOSITION.md +0 -373
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
- package/docs/PROVENANCE.md +0 -115
- package/docs/PSF_FOUNDATION.md +0 -165
- package/docs/RAW_FRAME_ENVELOPE.md +0 -56
- package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
- package/docs/RELEASE_1_0.md +0 -66
- package/docs/RELEASE_1_0_1.md +0 -61
- package/docs/RELEASE_1_1_0.md +0 -25
- package/docs/RELEASE_1_2_0.md +0 -51
- package/docs/RELEASE_1_3_0.md +0 -15
- package/docs/RELEASE_1_4_0.md +0 -23
- package/docs/RELEASE_1_5_0.md +0 -105
- package/docs/RELEASE_AUDIT.md +0 -39
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
- package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
- package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
- package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
- package/docs/SDR_RENDERING.md +0 -33
- package/docs/SENSOR_APERTURE_RAYS.md +0 -23
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
- package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
- package/docs/SENSOR_RAW_FRAME.md +0 -20
- package/docs/SENSOR_RAW_PRODUCER.md +0 -77
- package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
- package/docs/SIGNAL_CONFORMANCE.md +0 -23
- package/docs/SIMULATED_CAPTURE.md +0 -65
- package/docs/STABILIZATION.md +0 -234
- package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
- package/docs/TIER_ACCEPTANCE.md +0 -129
- package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
- package/docs/V1_COMPOSITION_MAP.md +0 -123
- package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
- package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
- package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
- package/docs/licenses/castleCSF-MIT.txt +0 -21
- package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
- package/docs/validation/documentation-fragments.json +0 -212
- package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
- package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
- package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
- package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
- package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
- package/docs/validation/print-196-candidate-capabilities.json +0 -28
- package/docs/validation/print-196-candidate-evidence.json +0 -356
- package/docs/validation/print-196-engine-acceptance.json +0 -81
- package/docs/validation/print-detail-capabilities.json +0 -103
- package/docs/validation/print-detail-jpeg-evidence.json +0 -116
- package/docs/validation/print-detail-sdr-evidence.json +0 -81
- package/docs/validation/release-audit-inventory.json +0 -1306
- package/docs/validation/tier-acceptance-report-v1.json +0 -2538
|
@@ -6,14 +6,19 @@ export declare const VIRTUAL_COLOR_CAMERA_PROFILE: Readonly<{
|
|
|
6
6
|
id: "photivra-colorimetric-rgb-d65";
|
|
7
7
|
version: "0.1.0";
|
|
8
8
|
}>;
|
|
9
|
-
/** Linear light
|
|
9
|
+
/** Linear light with sRGB primaries and a D65 white. No sRGB transfer curve is applied. */
|
|
10
10
|
export declare const LINEAR_CAPTURE_RGB_PROFILE: Readonly<{
|
|
11
11
|
id: "linear-srgb-d65";
|
|
12
12
|
version: "0.1.0";
|
|
13
13
|
}>;
|
|
14
14
|
type Vector = readonly [number, number, number];
|
|
15
15
|
type Matrix = readonly [Vector, Vector, Vector];
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Cone-space transform for adapting to the adopted white. If omitted, the original
|
|
18
|
+
* XYZ-diagonal scaling (model id `photivra-xyz-diagonal-adaptation`) is used unchanged.
|
|
19
|
+
*/
|
|
20
|
+
export type CaptureChromaticAdaptationTransform = "bradford" | "cat16";
|
|
21
|
+
/** One explicit colour interpretation. Gains and adaptation cannot both apply white balance by accident. */
|
|
17
22
|
export type CaptureColorWhiteBalance = {
|
|
18
23
|
kind: "preserve-intent";
|
|
19
24
|
} | {
|
|
@@ -21,8 +26,9 @@ export type CaptureColorWhiteBalance = {
|
|
|
21
26
|
channelBasis: CapturePublicProfileReference;
|
|
22
27
|
} | {
|
|
23
28
|
kind: "adopted-white-xyz-scaling";
|
|
29
|
+
transform?: CaptureChromaticAdaptationTransform;
|
|
24
30
|
};
|
|
25
|
-
/** IDs
|
|
31
|
+
/** IDs name a new derived plane. The source capture is never changed. */
|
|
26
32
|
export interface CaptureColorTransformInput {
|
|
27
33
|
capture: SimulatedCapture;
|
|
28
34
|
sourcePlaneId: string;
|
|
@@ -30,7 +36,7 @@ export interface CaptureColorTransformInput {
|
|
|
30
36
|
outputImageStateId: string;
|
|
31
37
|
whiteBalance: CaptureColorWhiteBalance;
|
|
32
38
|
}
|
|
33
|
-
/** Profile data
|
|
39
|
+
/** Profile data gives callers the complete row-major matrices and the conditions where they apply. */
|
|
34
40
|
export interface CaptureColorModel {
|
|
35
41
|
version: typeof CAPTURE_COLOR_MODEL_VERSION;
|
|
36
42
|
cameraProfile: CapturePublicProfileReference;
|
|
@@ -50,7 +56,7 @@ export interface CaptureColorModel {
|
|
|
50
56
|
}
|
|
51
57
|
/** Returns the versioned ideal camera basis, independent of rendering/serializer state. */
|
|
52
58
|
export declare function resolveCaptureColorModel(): CaptureColorModel;
|
|
53
|
-
/** Validates the
|
|
59
|
+
/** Validates the whole capture and its explicit transform policy, read from untrusted JSON. */
|
|
54
60
|
export declare function parseCaptureColorTransformInput(value: unknown): CaptureColorTransformInput;
|
|
55
61
|
export interface CaptureColorTransformResult {
|
|
56
62
|
plane: CaptureLinearPlane;
|
|
@@ -60,14 +66,15 @@ export interface CaptureColorTransformResult {
|
|
|
60
66
|
whiteBalance: CaptureColorWhiteBalance;
|
|
61
67
|
/** Matrix on CIE XYZ, identity when no adaptation; row-major, dimensionless. */
|
|
62
68
|
chromaticAdaptationMatrix: Matrix;
|
|
63
|
-
/** False: even adopted
|
|
69
|
+
/** False: under mixed lighting, even scaling to the adopted white is a choice the camera makes. */
|
|
64
70
|
claimsUniqueSceneWhite: false;
|
|
65
71
|
}
|
|
66
72
|
/**
|
|
67
|
-
* Converts a bounded inline XYZ
|
|
68
|
-
*
|
|
69
|
-
*
|
|
73
|
+
* Converts a bounded inline XYZ (ideal-camera) plane to unclamped linear sRGB.
|
|
74
|
+
* It reuses the resolved white-balance intent. It never estimates the lighting and never changes
|
|
75
|
+
* exposure or noise. Adapting to the adopted white (XYZ diagonal by default, or an explicit
|
|
76
|
+
* Bradford or CAT16 cone-space transform) is labelled an approximation, and
|
|
77
|
+
* is separate from RGB gains.
|
|
70
78
|
*/
|
|
71
79
|
export declare function calculateCaptureColorTransform(input: CaptureColorTransformInput): CalculationResult<CaptureColorTransformResult>;
|
|
72
80
|
export {};
|
|
73
|
-
//# sourceMappingURL=capture-color.d.ts.map
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* Colour for an ideal colorimetric capture: the versioned ideal camera basis, parsing of a capture
|
|
4
|
+
* and its colour transform policy from untrusted JSON, and conversion to linear sRGB.
|
|
5
|
+
*
|
|
6
|
+
* The basis does not depend on rendering or serializer state.
|
|
7
|
+
* @see docs/CAPTURE_COLOR.md for the equations, units, coordinate conventions, known blockers and
|
|
8
|
+
* support limits.
|
|
7
9
|
*/
|
|
8
10
|
import { requireAllowlistedRecord, requirePublicOpaqueId } from "../core/record-validation.js";
|
|
9
11
|
import { calculatedResult, approximationResult } from "../core/calculation-result.js";
|
|
10
12
|
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
11
13
|
import { InvalidScientificResultError } from "../core/validation.js";
|
|
14
|
+
import { chromaticAdaptationMatrix } from "./chromatic-adaptation.js";
|
|
12
15
|
import { parseSimulatedCapture } from "../capture/simulated-capture.js";
|
|
13
16
|
export const CAPTURE_COLOR_MODEL_VERSION = "0.1.0";
|
|
14
17
|
/** Explicit ideal colorimetric camera, not measured spectral sensor channels. */
|
|
15
18
|
export const VIRTUAL_COLOR_CAMERA_PROFILE = Object.freeze({ id: "photivra-colorimetric-rgb-d65", version: CAPTURE_COLOR_MODEL_VERSION });
|
|
16
|
-
/** Linear light
|
|
19
|
+
/** Linear light with sRGB primaries and a D65 white. No sRGB transfer curve is applied. */
|
|
17
20
|
export const LINEAR_CAPTURE_RGB_PROFILE = Object.freeze({ id: "linear-srgb-d65", version: CAPTURE_COLOR_MODEL_VERSION });
|
|
18
21
|
const D65 = Object.freeze({ x: .3127 / .3290, y: 1, z: (1 - .3127 - .3290) / .3290 });
|
|
19
22
|
const IDENTITY = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];
|
|
@@ -26,13 +29,14 @@ function inverse(m) {
|
|
|
26
29
|
return [[e * i - f * h, c * h - b * i, b * f - c * e], [f * g - d * i, a * i - c * g, c * d - a * f], [d * h - e * g, b * g - a * h, a * e - b * d]]
|
|
27
30
|
.map((r) => r.map((v) => v / determinant));
|
|
28
31
|
}
|
|
29
|
-
//
|
|
32
|
+
// Derive the basis independently from the published primary chromaticities, not from a copied matrix.
|
|
30
33
|
const primaries = [[.64, .33], [.30, .60], [.15, .06]];
|
|
31
34
|
const columns = primaries.map(([x, y]) => [x / y, 1, (1 - x - y) / y]);
|
|
32
35
|
const basis = [0, 1, 2].map((i) => columns.map((c) => c[i]));
|
|
33
36
|
const scales = multiply(inverse(basis), [D65.x, 1, D65.z]);
|
|
34
37
|
const RGB_TO_XYZ = basis.map((row) => row.map((v, i) => v * scales[i]));
|
|
35
38
|
const XYZ_TO_RGB = inverse(RGB_TO_XYZ);
|
|
39
|
+
const CAPTURE_ADAPTATION_TRANSFORMS = ["bradford", "cat16"];
|
|
36
40
|
/** Returns the versioned ideal camera basis, independent of rendering/serializer state. */
|
|
37
41
|
export function resolveCaptureColorModel() {
|
|
38
42
|
return { version: CAPTURE_COLOR_MODEL_VERSION, cameraProfile: { ...VIRTUAL_COLOR_CAMERA_PROFILE },
|
|
@@ -50,16 +54,22 @@ function record(v, keys) {
|
|
|
50
54
|
function publicId(v) {
|
|
51
55
|
return requirePublicOpaqueId(v, "Invalid public color ID.");
|
|
52
56
|
}
|
|
53
|
-
/** Validates the
|
|
57
|
+
/** Validates the whole capture and its explicit transform policy, read from untrusted JSON. */
|
|
54
58
|
export function parseCaptureColorTransformInput(value) {
|
|
55
59
|
const r = record(value, ["capture", "sourcePlaneId", "outputPlaneId", "outputImageStateId", "whiteBalance"]);
|
|
56
|
-
const w = record(r.whiteBalance, ["kind", "channelBasis"]);
|
|
60
|
+
const w = record(r.whiteBalance, ["kind", "channelBasis", "transform"]);
|
|
57
61
|
let whiteBalance;
|
|
58
|
-
if (w.kind === "apply-resolved-rgb-gains") {
|
|
62
|
+
if (w.kind === "apply-resolved-rgb-gains" && w.transform === undefined) {
|
|
59
63
|
const p = record(w.channelBasis, ["id", "version"]);
|
|
60
64
|
whiteBalance = { kind: w.kind, channelBasis: { id: publicId(p.id), version: publicId(p.version) } };
|
|
61
65
|
}
|
|
62
|
-
else if (
|
|
66
|
+
else if (w.kind === "adopted-white-xyz-scaling" && w.channelBasis === undefined && w.transform !== undefined) {
|
|
67
|
+
if (typeof w.transform !== "string" || !CAPTURE_ADAPTATION_TRANSFORMS.includes(w.transform)) {
|
|
68
|
+
throw new InvalidConfigurationError("Unsupported chromatic-adaptation transform.");
|
|
69
|
+
}
|
|
70
|
+
whiteBalance = { kind: w.kind, transform: w.transform };
|
|
71
|
+
}
|
|
72
|
+
else if ((w.kind === "preserve-intent" || w.kind === "adopted-white-xyz-scaling") && w.channelBasis === undefined && w.transform === undefined) {
|
|
63
73
|
whiteBalance = { kind: w.kind };
|
|
64
74
|
}
|
|
65
75
|
else
|
|
@@ -67,10 +77,17 @@ export function parseCaptureColorTransformInput(value) {
|
|
|
67
77
|
return { capture: parseSimulatedCapture(r.capture), sourcePlaneId: publicId(r.sourcePlaneId),
|
|
68
78
|
outputPlaneId: publicId(r.outputPlaneId), outputImageStateId: publicId(r.outputImageStateId), whiteBalance };
|
|
69
79
|
}
|
|
80
|
+
function adaptationProfileId(whiteBalance) {
|
|
81
|
+
return whiteBalance.kind === "adopted-white-xyz-scaling" && whiteBalance.transform !== undefined
|
|
82
|
+
? "photivra-" + whiteBalance.transform + "-adaptation"
|
|
83
|
+
: "photivra-xyz-diagonal-adaptation";
|
|
84
|
+
}
|
|
70
85
|
/**
|
|
71
|
-
* Converts a bounded inline XYZ
|
|
72
|
-
*
|
|
73
|
-
*
|
|
86
|
+
* Converts a bounded inline XYZ (ideal-camera) plane to unclamped linear sRGB.
|
|
87
|
+
* It reuses the resolved white-balance intent. It never estimates the lighting and never changes
|
|
88
|
+
* exposure or noise. Adapting to the adopted white (XYZ diagonal by default, or an explicit
|
|
89
|
+
* Bradford or CAT16 cone-space transform) is labelled an approximation, and
|
|
90
|
+
* is separate from RGB gains.
|
|
74
91
|
*/
|
|
75
92
|
export function calculateCaptureColorTransform(input) {
|
|
76
93
|
const { capture, sourcePlaneId, outputPlaneId, outputImageStateId, whiteBalance } = parseCaptureColorTransformInput(input);
|
|
@@ -107,7 +124,20 @@ export function calculateCaptureColorTransform(input) {
|
|
|
107
124
|
if (!Number.isFinite(x) || !Number.isFinite(z) || x < 1e-6 || x > 1e6 || z < 1e-6 || z > 1e6) {
|
|
108
125
|
throw new InvalidConfigurationError("Adopted-white scaling is outside the declared numerical domain.");
|
|
109
126
|
}
|
|
110
|
-
|
|
127
|
+
if (whiteBalance.transform === undefined)
|
|
128
|
+
adaptation = [[x, 0, 0], [0, 1, 0], [0, 0, z]];
|
|
129
|
+
else {
|
|
130
|
+
let m;
|
|
131
|
+
try {
|
|
132
|
+
m = chromaticAdaptationMatrix({ transform: whiteBalance.transform, sourceWhiteXyz: white, destinationWhiteXyz: D65 }).matrix;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
throw new InvalidConfigurationError("Adopted-white adaptation is outside the transform's numerical domain.");
|
|
136
|
+
}
|
|
137
|
+
if (m.flat().some((v) => Math.abs(v) > 1e6))
|
|
138
|
+
throw new InvalidConfigurationError("Adopted-white adaptation is outside the declared numerical domain.");
|
|
139
|
+
adaptation = m;
|
|
140
|
+
}
|
|
111
141
|
}
|
|
112
142
|
const samples = [], values = source.storage.samples;
|
|
113
143
|
for (let i = 0; i < values.length; i += 3) {
|
|
@@ -123,7 +153,7 @@ export function calculateCaptureColorTransform(input) {
|
|
|
123
153
|
}
|
|
124
154
|
const transforms = [...source.appliedTransforms];
|
|
125
155
|
if (adapt)
|
|
126
|
-
transforms.push({ profile: { id:
|
|
156
|
+
transforms.push({ profile: { id: adaptationProfileId(whiteBalance), version: CAPTURE_COLOR_MODEL_VERSION }, kind: "chromatic-adaptation" });
|
|
127
157
|
transforms.push({ profile: { ...LINEAR_CAPTURE_RGB_PROFILE }, kind: "linear-color" });
|
|
128
158
|
if (gains)
|
|
129
159
|
transforms.push({ profile: { id: capture.whiteBalanceIntent.stateId, version: CAPTURE_COLOR_MODEL_VERSION }, kind: "linear-color" });
|
|
@@ -132,14 +162,17 @@ export function calculateCaptureColorTransform(input) {
|
|
|
132
162
|
encodingReferenceWhiteXyz: { ...D65 }, appliedTransforms: transforms,
|
|
133
163
|
whiteBalanceApplication: gains ? "applied-rgb-gains" : adapt ? "applied-chromatic-adaptation" : capture.whiteBalanceIntent ? "intent-only" : "not-applicable",
|
|
134
164
|
storage: { kind: "inline-float64", samples } };
|
|
135
|
-
// Validation enforces capture-wide sample budget, identities and output
|
|
165
|
+
// Validation enforces the capture-wide sample budget, the identities and finite output.
|
|
136
166
|
const checked = parseSimulatedCapture({ ...capture, planes: [plane] }).planes[0];
|
|
137
167
|
const result = { plane: checked, colorModel: resolveCaptureColorModel(), sourcePlaneId,
|
|
138
168
|
sourceImageStateId: source.imageStateId, whiteBalance, chromaticAdaptationMatrix: adaptation.map((r) => [...r]),
|
|
139
169
|
claimsUniqueSceneWhite: false };
|
|
140
170
|
const assumptions = ["Ideal CIE colorimetric virtual camera only; no sensor calibration inferred", "Source exposure/noise/saturation history retained; float samples never clipped",
|
|
141
171
|
"WB intent, applied RGB gains and adopted-white adaptation are independent choices; no scene-white oracle"];
|
|
142
|
-
|
|
172
|
+
const transform = whiteBalance.kind === "adopted-white-xyz-scaling" ? whiteBalance.transform : undefined;
|
|
173
|
+
return adapt ? transform === undefined
|
|
174
|
+
? approximationResult(result, "capture-color-xyz-diagonal-adaptation", CAPTURE_COLOR_MODEL_VERSION, [...assumptions, "XYZ diagonal scaling is a limited chromatic-adaptation approximation, not Bradford or a color-appearance model"])
|
|
175
|
+
: approximationResult(result, "capture-color-" + transform + "-adaptation", CAPTURE_COLOR_MODEL_VERSION, [...assumptions, "Complete (D = 1) linear " + transform + " von Kries-type adaptation to D65; corresponding-colour prediction is approximate and no color-appearance model is applied"])
|
|
143
176
|
: calculatedResult(result, "capture-colorimetric-linear-rgb", CAPTURE_COLOR_MODEL_VERSION, assumptions);
|
|
144
177
|
}
|
|
145
178
|
//# sourceMappingURL=capture-color.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-color.js","sourceRoot":"","sources":["../../src/color/capture-color.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"capture-color.js","sourceRoot":"","sources":["../../src/color/capture-color.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Colour for an ideal colorimetric capture: the versioned ideal camera basis, parsing of a capture\n * and its colour transform policy from untrusted JSON, and conversion to linear sRGB.\n *\n * The basis does not depend on rendering or serializer state.\n * @see docs/CAPTURE_COLOR.md for the equations, units, coordinate conventions, known blockers and\n * support limits.\n */\n\nimport { requireAllowlistedRecord, requirePublicOpaqueId } from \"../core/record-validation.js\";\nimport { calculatedResult, approximationResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { InvalidScientificResultError } from \"../core/validation.js\";\nimport { chromaticAdaptationMatrix } from \"./chromatic-adaptation.js\";\nimport { parseSimulatedCapture, type SimulatedCapture, type CaptureLinearPlane, type CapturePublicProfileReference } from \"../capture/simulated-capture.js\";\n\nexport const CAPTURE_COLOR_MODEL_VERSION = \"0.1.0\" as const;\n/** Explicit ideal colorimetric camera, not measured spectral sensor channels. */\nexport const VIRTUAL_COLOR_CAMERA_PROFILE = Object.freeze({ id: \"photivra-colorimetric-rgb-d65\", version: CAPTURE_COLOR_MODEL_VERSION });\n/** Linear light with sRGB primaries and a D65 white. No sRGB transfer curve is applied. */\nexport const LINEAR_CAPTURE_RGB_PROFILE = Object.freeze({ id: \"linear-srgb-d65\", version: CAPTURE_COLOR_MODEL_VERSION });\nconst D65 = Object.freeze({ x: .3127/.3290, y: 1 as const, z: (1-.3127-.3290)/.3290 });\ntype Vector = readonly [number, number, number];\ntype Matrix = readonly [Vector, Vector, Vector];\nconst IDENTITY: Matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\nfunction multiply(m: Matrix, v: Vector): Vector {\n return m.map((r) => r[0]*v[0]+r[1]*v[1]+r[2]*v[2]) as unknown as Vector;\n}\nfunction inverse(m: Matrix): Matrix {\n const [[a, b, c], [d, e, f], [g, h, i]] = m;\n const determinant = a*(e*i-f*h)-b*(d*i-f*g)+c*(d*h-e*g);\n return [[e*i-f*h, c*h-b*i, b*f-c*e], [f*g-d*i, a*i-c*g, c*d-a*f], [d*h-e*g, b*g-a*h, a*e-b*d]]\n .map((r) => r.map((v) => v/determinant)) as unknown as Matrix;\n}\n// Derive the basis independently from the published primary chromaticities, not from a copied matrix.\nconst primaries: readonly (readonly [number, number])[] = [[.64, .33], [.30, .60], [.15, .06]];\nconst columns = primaries.map(([x, y]): Vector => [x/y, 1, (1-x-y)/y]);\nconst basis = [0, 1, 2].map((i) => columns.map((c) => c[i]!)) as unknown as Matrix;\nconst scales = multiply(inverse(basis), [D65.x, 1, D65.z]);\nconst RGB_TO_XYZ = basis.map((row) => row.map((v, i) => v*scales[i]!)) as unknown as Matrix;\nconst XYZ_TO_RGB = inverse(RGB_TO_XYZ);\n\n/**\n * Cone-space transform for adapting to the adopted white. If omitted, the original\n * XYZ-diagonal scaling (model id `photivra-xyz-diagonal-adaptation`) is used unchanged.\n */\nexport type CaptureChromaticAdaptationTransform = \"bradford\" | \"cat16\";\nconst CAPTURE_ADAPTATION_TRANSFORMS: readonly string[] = [\"bradford\", \"cat16\"];\n/** One explicit colour interpretation. Gains and adaptation cannot both apply white balance by accident. */\nexport type CaptureColorWhiteBalance =\n | { kind: \"preserve-intent\" }\n | { kind: \"apply-resolved-rgb-gains\"; channelBasis: CapturePublicProfileReference }\n | { kind: \"adopted-white-xyz-scaling\"; transform?: CaptureChromaticAdaptationTransform };\n/** IDs name a new derived plane. The source capture is never changed. */\nexport interface CaptureColorTransformInput {\n capture: SimulatedCapture;\n sourcePlaneId: string;\n outputPlaneId: string;\n outputImageStateId: string;\n whiteBalance: CaptureColorWhiteBalance;\n}\n/** Profile data gives callers the complete row-major matrices and the conditions where they apply. */\nexport interface CaptureColorModel {\n version: typeof CAPTURE_COLOR_MODEL_VERSION;\n cameraProfile: CapturePublicProfileReference;\n outputProfile: CapturePublicProfileReference;\n referenceIlluminant: \"D65\";\n observer: \"cie-1931-2-degree\";\n referenceWhiteXyz: { x: number; y: 1; z: number };\n cameraRgbToXyz: Matrix;\n xyzToCameraRgb: Matrix;\n scientificStatus: \"calculated\";\n validConditions: readonly string[];\n publicEvidenceIds: readonly string[];\n}\n/** Returns the versioned ideal camera basis, independent of rendering/serializer state. */\nexport function resolveCaptureColorModel(): CaptureColorModel {\n return { version: CAPTURE_COLOR_MODEL_VERSION, cameraProfile: { ...VIRTUAL_COLOR_CAMERA_PROFILE },\n outputProfile: { ...LINEAR_CAPTURE_RGB_PROFILE }, referenceIlluminant: \"D65\", observer: \"cie-1931-2-degree\",\n referenceWhiteXyz: { ...D65 }, cameraRgbToXyz: RGB_TO_XYZ.map((r) => [...r]) as unknown as Matrix,\n xyzToCameraRgb: XYZ_TO_RGB.map((r) => [...r]) as unknown as Matrix, scientificStatus: \"calculated\",\n validConditions: [\"Ideal colorimetric basis only; virtual RGB is an invertible encoding of CIE XYZ\",\n \"Not spectral channels, electrons, commercial-camera RGB or a sensor calibration\",\n \"Signed finite scene-linear values; co-sited RGB; no transfer curve, gamut mapping or clipping\"],\n publicEvidenceIds: [\"w3c:css-color-4:srgb-primaries-d65\"] };\n}\nfunction record(v: unknown, keys: readonly string[]): Record<string, unknown> {\n return requireAllowlistedRecord(v, keys, \"Invalid color-transform fields.\");\n}\nfunction publicId(v: unknown): string {\n return requirePublicOpaqueId(v, \"Invalid public color ID.\");\n}\n/** Validates the whole capture and its explicit transform policy, read from untrusted JSON. */\nexport function parseCaptureColorTransformInput(value: unknown): CaptureColorTransformInput {\n const r = record(value, [\"capture\", \"sourcePlaneId\", \"outputPlaneId\", \"outputImageStateId\", \"whiteBalance\"]);\n const w = record(r.whiteBalance, [\"kind\", \"channelBasis\", \"transform\"]);\n let whiteBalance: CaptureColorWhiteBalance;\n if (w.kind === \"apply-resolved-rgb-gains\" && w.transform === undefined) {\n const p = record(w.channelBasis, [\"id\", \"version\"]);\n whiteBalance = { kind: w.kind, channelBasis: { id: publicId(p.id), version: publicId(p.version) } };\n } else if (w.kind === \"adopted-white-xyz-scaling\" && w.channelBasis === undefined && w.transform !== undefined) {\n if (typeof w.transform !== \"string\" || !CAPTURE_ADAPTATION_TRANSFORMS.includes(w.transform)) {\n throw new InvalidConfigurationError(\"Unsupported chromatic-adaptation transform.\");\n }\n whiteBalance = { kind: w.kind, transform: w.transform as CaptureChromaticAdaptationTransform };\n } else if ((w.kind === \"preserve-intent\" || w.kind === \"adopted-white-xyz-scaling\") && w.channelBasis === undefined && w.transform === undefined) {\n whiteBalance = { kind: w.kind };\n } else throw new InvalidConfigurationError(\"Unsupported or contradictory color WB policy.\");\n return { capture: parseSimulatedCapture(r.capture), sourcePlaneId: publicId(r.sourcePlaneId),\n outputPlaneId: publicId(r.outputPlaneId), outputImageStateId: publicId(r.outputImageStateId), whiteBalance };\n}\nexport interface CaptureColorTransformResult {\n plane: CaptureLinearPlane;\n colorModel: CaptureColorModel;\n sourcePlaneId: string;\n sourceImageStateId: string;\n whiteBalance: CaptureColorWhiteBalance;\n /** Matrix on CIE XYZ, identity when no adaptation; row-major, dimensionless. */\n chromaticAdaptationMatrix: Matrix;\n /** False: under mixed lighting, even scaling to the adopted white is a choice the camera makes. */\n claimsUniqueSceneWhite: false;\n}\nfunction adaptationProfileId(whiteBalance: CaptureColorWhiteBalance): string {\n return whiteBalance.kind === \"adopted-white-xyz-scaling\" && whiteBalance.transform !== undefined\n ? \"photivra-\" + whiteBalance.transform + \"-adaptation\"\n : \"photivra-xyz-diagonal-adaptation\";\n}\n/**\n * Converts a bounded inline XYZ (ideal-camera) plane to unclamped linear sRGB.\n * It reuses the resolved white-balance intent. It never estimates the lighting and never changes\n * exposure or noise. Adapting to the adopted white (XYZ diagonal by default, or an explicit\n * Bradford or CAT16 cone-space transform) is labelled an approximation, and\n * is separate from RGB gains.\n */\nexport function calculateCaptureColorTransform(input: CaptureColorTransformInput): CalculationResult<CaptureColorTransformResult> {\n const { capture, sourcePlaneId, outputPlaneId, outputImageStateId, whiteBalance } = parseCaptureColorTransformInput(input);\n const source = capture.planes.find((p) => p.id === sourcePlaneId);\n if (!source || source.storage.kind !== \"inline-float64\" || source.imageState === \"color-transformed-linear-rgb\" ||\n source.whiteBalanceApplication === \"applied-rgb-gains\" || source.whiteBalanceApplication === \"applied-chromatic-adaptation\" ||\n source.appliedTransforms.some((t) => t.kind !== \"digital-lens-correction\")) {\n throw new InvalidConfigurationError(\"Color requires an untreated inline XYZ or supported virtual camera plane.\");\n }\n if (capture.planes.some((p) => p.id === outputPlaneId || p.imageStateId === outputImageStateId)) {\n throw new InvalidConfigurationError(\"Derived color plane/state IDs must be new.\");\n }\n const virtual = source.imageState === \"virtual-sensor-channels\";\n if (virtual && (source.colorProfile?.id !== VIRTUAL_COLOR_CAMERA_PROFILE.id || source.colorProfile.version !== CAPTURE_COLOR_MODEL_VERSION ||\n JSON.stringify(source.channelIds) !== JSON.stringify([\"red\", \"green\", \"blue\"]))) {\n throw new InvalidConfigurationError(\"Unresolved spectral/sensor RGB cannot use the ideal colorimetric transform.\");\n }\n const adapt = whiteBalance.kind === \"adopted-white-xyz-scaling\";\n const reference = source.encodingReferenceWhiteXyz;\n if (!virtual && !adapt && (reference!.x !== D65.x || reference!.z !== D65.z)) {\n throw new InvalidConfigurationError(\"A different XYZ reference white requires an explicit adaptation choice.\");\n }\n const gains = whiteBalance.kind === \"apply-resolved-rgb-gains\";\n if (gains && (!capture.whiteBalanceIntent || whiteBalance.channelBasis.id !== VIRTUAL_COLOR_CAMERA_PROFILE.id ||\n whiteBalance.channelBasis.version !== CAPTURE_COLOR_MODEL_VERSION)) {\n throw new InvalidConfigurationError(\"Resolved WB gains require an explicit matching camera channel-basis binding.\");\n }\n let adaptation: Matrix = IDENTITY;\n if (adapt) {\n const white = capture.adoptedWhiteXyz;\n if (!white) throw new InvalidConfigurationError(\"Adopted-white adaptation requires an explicit adopted XYZ white.\");\n const x = D65.x/white.x, z = D65.z/white.z;\n if (!Number.isFinite(x) || !Number.isFinite(z) || x < 1e-6 || x > 1e6 || z < 1e-6 || z > 1e6) {\n throw new InvalidConfigurationError(\"Adopted-white scaling is outside the declared numerical domain.\");\n }\n if (whiteBalance.transform === undefined) adaptation = [[x, 0, 0], [0, 1, 0], [0, 0, z]];\n else {\n let m: Matrix;\n try {\n m = chromaticAdaptationMatrix({ transform: whiteBalance.transform, sourceWhiteXyz: white, destinationWhiteXyz: D65 }).matrix;\n } catch {\n throw new InvalidConfigurationError(\"Adopted-white adaptation is outside the transform's numerical domain.\");\n }\n if (m.flat().some((v) => Math.abs(v) > 1e6)) throw new InvalidConfigurationError(\"Adopted-white adaptation is outside the declared numerical domain.\");\n adaptation = m;\n }\n }\n const samples: number[] = [], values = source.storage.samples;\n for (let i = 0; i < values.length; i += 3) {\n const v: Vector = [values[i]!, values[i+1]!, values[i+2]!];\n let rgb = virtual && !adapt ? v : multiply(XYZ_TO_RGB, multiply(adaptation, virtual ? multiply(RGB_TO_XYZ, v) : v));\n if (gains) {\n const g = capture.whiteBalanceIntent!.channelGains;\n rgb = [rgb[0]*g.red, rgb[1]*g.green, rgb[2]*g.blue];\n }\n if (rgb.some((v) => !Number.isFinite(v))) throw new InvalidScientificResultError(\"Color transform produced a non-finite sample.\");\n samples.push(...rgb.map((v) => Object.is(v, -0) ? 0 : v));\n }\n const transforms: CaptureLinearPlane[\"appliedTransforms\"][number][] = [...source.appliedTransforms];\n if (adapt) transforms.push({ profile: { id: adaptationProfileId(whiteBalance), version: CAPTURE_COLOR_MODEL_VERSION }, kind: \"chromatic-adaptation\" });\n transforms.push({ profile: { ...LINEAR_CAPTURE_RGB_PROFILE }, kind: \"linear-color\" });\n if (gains) transforms.push({ profile: { id: capture.whiteBalanceIntent!.stateId, version: CAPTURE_COLOR_MODEL_VERSION }, kind: \"linear-color\" });\n const plane: CaptureLinearPlane = { ...source, id: outputPlaneId, imageStateId: outputImageStateId,\n imageState: \"color-transformed-linear-rgb\", channelIds: [\"red\", \"green\", \"blue\"], colorProfile: { ...LINEAR_CAPTURE_RGB_PROFILE },\n encodingReferenceWhiteXyz: { ...D65 }, appliedTransforms: transforms,\n whiteBalanceApplication: gains ? \"applied-rgb-gains\" : adapt ? \"applied-chromatic-adaptation\" : capture.whiteBalanceIntent ? \"intent-only\" : \"not-applicable\",\n storage: { kind: \"inline-float64\", samples } };\n // Validation enforces the capture-wide sample budget, the identities and finite output.\n const checked = parseSimulatedCapture({ ...capture, planes: [plane] }).planes[0]!;\n const result: CaptureColorTransformResult = { plane: checked, colorModel: resolveCaptureColorModel(), sourcePlaneId,\n sourceImageStateId: source.imageStateId, whiteBalance, chromaticAdaptationMatrix: adaptation.map((r) => [...r]) as unknown as Matrix,\n claimsUniqueSceneWhite: false };\n const assumptions = [\"Ideal CIE colorimetric virtual camera only; no sensor calibration inferred\", \"Source exposure/noise/saturation history retained; float samples never clipped\",\n \"WB intent, applied RGB gains and adopted-white adaptation are independent choices; no scene-white oracle\"];\n const transform = whiteBalance.kind === \"adopted-white-xyz-scaling\" ? whiteBalance.transform : undefined;\n return adapt ? transform === undefined\n ? approximationResult(result, \"capture-color-xyz-diagonal-adaptation\", CAPTURE_COLOR_MODEL_VERSION,\n [...assumptions, \"XYZ diagonal scaling is a limited chromatic-adaptation approximation, not Bradford or a color-appearance model\"])\n : approximationResult(result, \"capture-color-\" + transform + \"-adaptation\", CAPTURE_COLOR_MODEL_VERSION,\n [...assumptions, \"Complete (D = 1) linear \" + transform + \" von Kries-type adaptation to D65; corresponding-colour prediction is approximate and no color-appearance model is applied\"])\n : calculatedResult(result, \"capture-colorimetric-linear-rgb\", CAPTURE_COLOR_MODEL_VERSION, assumptions);\n}\n"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Von Kries-type linear chromatic adaptation transforms (CATs) on CIE XYZ:
|
|
3
|
+
* M = C⁻¹ · diag(Dᵢ) · C, Dᵢ = D · (Y_s / Y_d) · (ρᵢ,d / ρᵢ,s) + 1 − D
|
|
4
|
+
* where C maps XYZ to a cone-like ("sharpened") space, ρ_s and ρ_d are the source and
|
|
5
|
+
* destination whites in that space, and D ∈ [0, 1] is the degree of adaptation. This is
|
|
6
|
+
* the one-step, two-illuminant form of Li et al. (2017) for CAT16; it is used for every
|
|
7
|
+
* transform here. With D = 1 and equal white luminance, the source white maps exactly to
|
|
8
|
+
* the destination white.
|
|
9
|
+
*
|
|
10
|
+
* Cone matrices (published factual constants):
|
|
11
|
+
* - Bradford (linearized): Lam (1985) thesis, University of Bradford; Luo & Rhodes
|
|
12
|
+
* (1999); as used in ICC.1:2010 Annex E. The original blue-channel non-linearity is
|
|
13
|
+
* omitted, as in common practice.
|
|
14
|
+
* - CAT16: Li, Li, Wang, Xu, Luo, Cui, Melgosa & Pointer (2016), "A Revision of CIECAM02
|
|
15
|
+
* and its CAT and UCS", IS&T CIC24, pp. 208–212, Eq. (15) (M16),
|
|
16
|
+
* doi:10.2352/ISSN.2169-2629.2017.32.208 (free from the IS&T library). Journal version:
|
|
17
|
+
* Li et al. (2017), "Comprehensive color solutions: CAM16, CAT16, and CAM16-UCS",
|
|
18
|
+
* Color Res. Appl. 42(6):703–718.
|
|
19
|
+
* - XYZ scaling: identity cone matrix (diagonal scaling in XYZ; the weakest model).
|
|
20
|
+
* The degree of adaptation D is supplied by the caller (default 1, complete adaptation).
|
|
21
|
+
* CAT02, the von Kries Hunt–Pointer–Estévez matrix and the CIECAM02 formula for D are not
|
|
22
|
+
* part of 2.0: no free source we could confirm prints them (owner decisions, 2026-10-17).
|
|
23
|
+
* @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.
|
|
24
|
+
*/
|
|
25
|
+
import { type CalculationResult } from "../core/calculation-result.js";
|
|
26
|
+
import { type CieXyzTristimulus, type ColorMatrix3x3 } from "./colorimetry-math.js";
|
|
27
|
+
/** Supported linear chromatic-adaptation transforms. */
|
|
28
|
+
export type ChromaticAdaptationTransform = "bradford" | "cat16" | "xyz-scaling";
|
|
29
|
+
export declare const CHROMATIC_ADAPTATION_TRANSFORMS: readonly ChromaticAdaptationTransform[];
|
|
30
|
+
/** Returns a copy of the XYZ → cone-space matrix of a transform. */
|
|
31
|
+
export declare function resolveChromaticAdaptationConeMatrix(transform: ChromaticAdaptationTransform): ColorMatrix3x3;
|
|
32
|
+
export interface CalculateChromaticAdaptationMatrixInput {
|
|
33
|
+
transform: ChromaticAdaptationTransform;
|
|
34
|
+
/** White of the source viewing/illumination condition (relative XYZ, Y > 0). */
|
|
35
|
+
sourceWhiteXyz: CieXyzTristimulus;
|
|
36
|
+
/** White of the destination condition (relative XYZ, Y > 0). */
|
|
37
|
+
destinationWhiteXyz: CieXyzTristimulus;
|
|
38
|
+
/** Degree of adaptation D in [0, 1]; defaults to 1 (complete adaptation). */
|
|
39
|
+
degreeOfAdaptation?: number;
|
|
40
|
+
}
|
|
41
|
+
export interface ChromaticAdaptationMatrix {
|
|
42
|
+
transform: ChromaticAdaptationTransform;
|
|
43
|
+
degreeOfAdaptation: number;
|
|
44
|
+
/** Row-major XYZ_source → XYZ_destination matrix. */
|
|
45
|
+
matrix: ColorMatrix3x3;
|
|
46
|
+
/** The per-channel cone-space gains Dᵢ. */
|
|
47
|
+
coneGains: readonly [number, number, number];
|
|
48
|
+
}
|
|
49
|
+
/** Internal: builds the adaptation matrix without an envelope. */
|
|
50
|
+
export declare function chromaticAdaptationMatrix(input: CalculateChromaticAdaptationMatrixInput): ChromaticAdaptationMatrix;
|
|
51
|
+
/**
|
|
52
|
+
* Calculates a linear chromatic-adaptation matrix between two whites. Linear CATs are
|
|
53
|
+
* standard models, but they predict corresponding colours only approximately. The matrix
|
|
54
|
+
* itself is calculated exactly from the declared transform.
|
|
55
|
+
*/
|
|
56
|
+
export declare function calculateChromaticAdaptationMatrix(input: CalculateChromaticAdaptationMatrixInput): CalculationResult<ChromaticAdaptationMatrix>;
|
|
57
|
+
/** Adapts one XYZ colour between whites with the selected transform. */
|
|
58
|
+
export declare function calculateChromaticallyAdaptedXyz(input: CalculateChromaticAdaptationMatrixInput & {
|
|
59
|
+
xyz: CieXyzTristimulus;
|
|
60
|
+
}): CalculationResult<{
|
|
61
|
+
xyz: CieXyzTristimulus;
|
|
62
|
+
matrix: ColorMatrix3x3;
|
|
63
|
+
}>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Von Kries-type linear chromatic adaptation transforms (CATs) on CIE XYZ:
|
|
4
|
+
* M = C⁻¹ · diag(Dᵢ) · C, Dᵢ = D · (Y_s / Y_d) · (ρᵢ,d / ρᵢ,s) + 1 − D
|
|
5
|
+
* where C maps XYZ to a cone-like ("sharpened") space, ρ_s and ρ_d are the source and
|
|
6
|
+
* destination whites in that space, and D ∈ [0, 1] is the degree of adaptation. This is
|
|
7
|
+
* the one-step, two-illuminant form of Li et al. (2017) for CAT16; it is used for every
|
|
8
|
+
* transform here. With D = 1 and equal white luminance, the source white maps exactly to
|
|
9
|
+
* the destination white.
|
|
10
|
+
*
|
|
11
|
+
* Cone matrices (published factual constants):
|
|
12
|
+
* - Bradford (linearized): Lam (1985) thesis, University of Bradford; Luo & Rhodes
|
|
13
|
+
* (1999); as used in ICC.1:2010 Annex E. The original blue-channel non-linearity is
|
|
14
|
+
* omitted, as in common practice.
|
|
15
|
+
* - CAT16: Li, Li, Wang, Xu, Luo, Cui, Melgosa & Pointer (2016), "A Revision of CIECAM02
|
|
16
|
+
* and its CAT and UCS", IS&T CIC24, pp. 208–212, Eq. (15) (M16),
|
|
17
|
+
* doi:10.2352/ISSN.2169-2629.2017.32.208 (free from the IS&T library). Journal version:
|
|
18
|
+
* Li et al. (2017), "Comprehensive color solutions: CAM16, CAT16, and CAM16-UCS",
|
|
19
|
+
* Color Res. Appl. 42(6):703–718.
|
|
20
|
+
* - XYZ scaling: identity cone matrix (diagonal scaling in XYZ; the weakest model).
|
|
21
|
+
* The degree of adaptation D is supplied by the caller (default 1, complete adaptation).
|
|
22
|
+
* CAT02, the von Kries Hunt–Pointer–Estévez matrix and the CIECAM02 formula for D are not
|
|
23
|
+
* part of 2.0: no free source we could confirm prints them (owner decisions, 2026-10-17).
|
|
24
|
+
* @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.
|
|
25
|
+
*/
|
|
26
|
+
import { calculatedResult } from "../core/calculation-result.js";
|
|
27
|
+
import { InvalidScientificInputError } from "../core/validation.js";
|
|
28
|
+
import { COLORIMETRY_MODEL_VERSION } from "./color-matching-functions.js";
|
|
29
|
+
import { copyMatrix, diagonalMatrix, invertMatrix3x3, multiplyMatrices, multiplyMatrixVector, parseWhiteXyz, parseXyz, requireFiniteResult, requireNonNegativeNumber, vectorToXyz, xyzToVector } from "./colorimetry-math.js";
|
|
30
|
+
import { requireInputKeys } from "../core/record-validation.js";
|
|
31
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
32
|
+
export const CHROMATIC_ADAPTATION_TRANSFORMS = Object.freeze(["bradford", "cat16", "xyz-scaling"]);
|
|
33
|
+
const CONE_MATRICES = Object.freeze({
|
|
34
|
+
bradford: [[0.8951, 0.2664, -0.1614], [-0.7502, 1.7135, 0.0367], [0.0389, -0.0685, 1.0296]],
|
|
35
|
+
cat16: [[0.401288, 0.650173, -0.051461], [-0.250268, 1.204414, 0.045854], [-0.002079, 0.048952, 0.953127]],
|
|
36
|
+
"xyz-scaling": [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
|
|
37
|
+
});
|
|
38
|
+
function requireTransform(value) {
|
|
39
|
+
if (typeof value !== "string" || !CHROMATIC_ADAPTATION_TRANSFORMS.includes(value)) {
|
|
40
|
+
throw new InvalidConfigurationError("transform must be one of: " + CHROMATIC_ADAPTATION_TRANSFORMS.join(", ") + ".");
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
/** Returns a copy of the XYZ → cone-space matrix of a transform. */
|
|
45
|
+
export function resolveChromaticAdaptationConeMatrix(transform) {
|
|
46
|
+
return copyMatrix(CONE_MATRICES[requireTransform(transform)]);
|
|
47
|
+
}
|
|
48
|
+
/** Internal: builds the adaptation matrix without an envelope. */
|
|
49
|
+
export function chromaticAdaptationMatrix(input) {
|
|
50
|
+
const transform = requireTransform(input.transform);
|
|
51
|
+
const source = parseWhiteXyz(input.sourceWhiteXyz, "sourceWhiteXyz");
|
|
52
|
+
const destination = parseWhiteXyz(input.destinationWhiteXyz, "destinationWhiteXyz");
|
|
53
|
+
const d = input.degreeOfAdaptation === undefined ? 1 : requireNonNegativeNumber(input.degreeOfAdaptation, "degreeOfAdaptation");
|
|
54
|
+
if (d > 1)
|
|
55
|
+
throw new InvalidScientificInputError("degreeOfAdaptation must lie in [0, 1].");
|
|
56
|
+
const cone = CONE_MATRICES[transform];
|
|
57
|
+
const rs = multiplyMatrixVector(cone, xyzToVector(source));
|
|
58
|
+
const rd = multiplyMatrixVector(cone, xyzToVector(destination));
|
|
59
|
+
if (rs.some((v) => !(v > 0)) || rd.some((v) => !(v > 0))) {
|
|
60
|
+
throw new InvalidScientificInputError("Both whites must have positive cone responses in the selected transform.");
|
|
61
|
+
}
|
|
62
|
+
const yRatio = source.y / destination.y;
|
|
63
|
+
const gains = [0, 1, 2].map((i) => d * yRatio * (rd[i] / rs[i]) + 1 - d);
|
|
64
|
+
const matrix = multiplyMatrices(multiplyMatrices(invertMatrix3x3(cone, "cone matrix"), diagonalMatrix(gains)), cone);
|
|
65
|
+
requireFiniteResult(matrix.flat(), "Chromatic adaptation");
|
|
66
|
+
return { transform, degreeOfAdaptation: d, matrix, coneGains: gains };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Calculates a linear chromatic-adaptation matrix between two whites. Linear CATs are
|
|
70
|
+
* standard models, but they predict corresponding colours only approximately. The matrix
|
|
71
|
+
* itself is calculated exactly from the declared transform.
|
|
72
|
+
*/
|
|
73
|
+
export function calculateChromaticAdaptationMatrix(input) {
|
|
74
|
+
requireInputKeys(input, "calculateChromaticAdaptationMatrix", ["transform", "sourceWhiteXyz", "destinationWhiteXyz", "degreeOfAdaptation"]);
|
|
75
|
+
const value = chromaticAdaptationMatrix(input);
|
|
76
|
+
return calculatedResult(value, "chromatic-adaptation-" + value.transform, COLORIMETRY_MODEL_VERSION, [
|
|
77
|
+
"Linear von Kries-type transform M = C⁻¹·diag(D·(Ys/Yd)·ρd/ρs + 1 − D)·C",
|
|
78
|
+
"A linear CAT predicts corresponding colours only approximately; no colour-appearance model is applied"
|
|
79
|
+
]);
|
|
80
|
+
}
|
|
81
|
+
/** Adapts one XYZ colour between whites with the selected transform. */
|
|
82
|
+
export function calculateChromaticallyAdaptedXyz(input) {
|
|
83
|
+
requireInputKeys(input, "calculateChromaticallyAdaptedXyz", ["transform", "sourceWhiteXyz", "destinationWhiteXyz", "degreeOfAdaptation", "xyz"]);
|
|
84
|
+
const adaptation = chromaticAdaptationMatrix(input);
|
|
85
|
+
const xyz = vectorToXyz(multiplyMatrixVector(adaptation.matrix, xyzToVector(parseXyz(input.xyz, "xyz"))));
|
|
86
|
+
requireFiniteResult([xyz.x, xyz.y, xyz.z], "Chromatic adaptation");
|
|
87
|
+
return calculatedResult({ xyz, matrix: adaptation.matrix }, "chromatic-adaptation-" + adaptation.transform, COLORIMETRY_MODEL_VERSION, [
|
|
88
|
+
"Linear von Kries-type transform; degree of adaptation " + adaptation.degreeOfAdaptation
|
|
89
|
+
]);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=chromatic-adaptation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chromatic-adaptation.js","sourceRoot":"","sources":["../../src/color/chromatic-adaptation.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,gBAAgB,EAA0B,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EACL,UAAU,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,QAAQ,EACR,mBAAmB,EACnB,wBAAwB,EACxB,WAAW,EACX,WAAW,EAGZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAK3E,MAAM,CAAC,MAAM,+BAA+B,GAA4C,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;AAE5I,MAAM,aAAa,GAAmE,MAAM,CAAC,MAAM,CAAC;IAClG,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3F,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1G,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CACjD,CAAC,CAAC;AAEH,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAE,+BAAqD,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzG,MAAM,IAAI,yBAAyB,CAAC,4BAA4B,GAAG,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,KAAqC,CAAC;AAC/C,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,oCAAoC,CAAC,SAAuC;IAC1F,OAAO,UAAU,CAAC,aAAa,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAqBD,kEAAkE;AAClE,MAAM,UAAU,yBAAyB,CAAC,KAA8C;IACtF,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;IACpF,MAAM,CAAC,GAAG,KAAK,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;IAChI,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,2BAA2B,CAAC,wCAAwC,CAAC,CAAC;IAC3F,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,2BAA2B,CAAC,0EAA0E,CAAC,CAAC;IACpH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAiD,CAAC;IAC3H,MAAM,MAAM,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACrH,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,sBAAsB,CAAC,CAAC;IAC3D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACxE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kCAAkC,CAAC,KAA8C;IAC/F,gBAAgB,CAAC,KAAK,EAAE,oCAAoC,EAAE,CAAC,WAAW,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC5I,MAAM,KAAK,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,gBAAgB,CAAC,KAAK,EAAE,uBAAuB,GAAG,KAAK,CAAC,SAAS,EAAE,yBAAyB,EAAE;QACnG,yEAAyE;QACzE,uGAAuG;KACxG,CAAC,CAAC;AACL,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,gCAAgC,CAAC,KAA2E;IAC1H,gBAAgB,CAAC,KAAK,EAAE,kCAAkC,EAAE,CAAC,WAAW,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAC,CAAC;IACjJ,MAAM,UAAU,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,WAAW,CAAC,oBAAoB,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1G,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;IACnE,OAAO,gBAAgB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,uBAAuB,GAAG,UAAU,CAAC,SAAS,EAAE,yBAAyB,EAAE;QACrI,wDAAwD,GAAG,UAAU,CAAC,kBAAkB;KACzF,CAAC,CAAC;AACL,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Von Kries-type linear chromatic adaptation transforms (CATs) on CIE XYZ:\n * M = C⁻¹ · diag(Dᵢ) · C, Dᵢ = D · (Y_s / Y_d) · (ρᵢ,d / ρᵢ,s) + 1 − D\n * where C maps XYZ to a cone-like (\"sharpened\") space, ρ_s and ρ_d are the source and\n * destination whites in that space, and D ∈ [0, 1] is the degree of adaptation. This is\n * the one-step, two-illuminant form of Li et al. (2017) for CAT16; it is used for every\n * transform here. With D = 1 and equal white luminance, the source white maps exactly to\n * the destination white.\n *\n * Cone matrices (published factual constants):\n * - Bradford (linearized): Lam (1985) thesis, University of Bradford; Luo & Rhodes\n * (1999); as used in ICC.1:2010 Annex E. The original blue-channel non-linearity is\n * omitted, as in common practice.\n * - CAT16: Li, Li, Wang, Xu, Luo, Cui, Melgosa & Pointer (2016), \"A Revision of CIECAM02\n * and its CAT and UCS\", IS&T CIC24, pp. 208–212, Eq. (15) (M16),\n * doi:10.2352/ISSN.2169-2629.2017.32.208 (free from the IS&T library). Journal version:\n * Li et al. (2017), \"Comprehensive color solutions: CAM16, CAT16, and CAM16-UCS\",\n * Color Res. Appl. 42(6):703–718.\n * - XYZ scaling: identity cone matrix (diagonal scaling in XYZ; the weakest model).\n * The degree of adaptation D is supplied by the caller (default 1, complete adaptation).\n * CAT02, the von Kries Hunt–Pointer–Estévez matrix and the CIECAM02 formula for D are not\n * part of 2.0: no free source we could confirm prints them (owner decisions, 2026-10-17).\n * @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.\n */\n\nimport { calculatedResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport { COLORIMETRY_MODEL_VERSION } from \"./color-matching-functions.js\";\nimport {\n copyMatrix,\n diagonalMatrix,\n invertMatrix3x3,\n multiplyMatrices,\n multiplyMatrixVector,\n parseWhiteXyz,\n parseXyz,\n requireFiniteResult,\n requireNonNegativeNumber,\n vectorToXyz,\n xyzToVector,\n type CieXyzTristimulus,\n type ColorMatrix3x3\n} from \"./colorimetry-math.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\n/** Supported linear chromatic-adaptation transforms. */\nexport type ChromaticAdaptationTransform = \"bradford\" | \"cat16\" | \"xyz-scaling\";\n\nexport const CHROMATIC_ADAPTATION_TRANSFORMS: readonly ChromaticAdaptationTransform[] = Object.freeze([\"bradford\", \"cat16\", \"xyz-scaling\"]);\n\nconst CONE_MATRICES: Readonly<Record<ChromaticAdaptationTransform, ColorMatrix3x3>> = Object.freeze({\n bradford: [[0.8951, 0.2664, -0.1614], [-0.7502, 1.7135, 0.0367], [0.0389, -0.0685, 1.0296]],\n cat16: [[0.401288, 0.650173, -0.051461], [-0.250268, 1.204414, 0.045854], [-0.002079, 0.048952, 0.953127]],\n \"xyz-scaling\": [[1, 0, 0], [0, 1, 0], [0, 0, 1]]\n});\n\nfunction requireTransform(value: unknown): ChromaticAdaptationTransform {\n if (typeof value !== \"string\" || !(CHROMATIC_ADAPTATION_TRANSFORMS as readonly string[]).includes(value)) {\n throw new InvalidConfigurationError(\"transform must be one of: \" + CHROMATIC_ADAPTATION_TRANSFORMS.join(\", \") + \".\");\n }\n return value as ChromaticAdaptationTransform;\n}\n\n/** Returns a copy of the XYZ → cone-space matrix of a transform. */\nexport function resolveChromaticAdaptationConeMatrix(transform: ChromaticAdaptationTransform): ColorMatrix3x3 {\n return copyMatrix(CONE_MATRICES[requireTransform(transform)]);\n}\n\nexport interface CalculateChromaticAdaptationMatrixInput {\n transform: ChromaticAdaptationTransform;\n /** White of the source viewing/illumination condition (relative XYZ, Y > 0). */\n sourceWhiteXyz: CieXyzTristimulus;\n /** White of the destination condition (relative XYZ, Y > 0). */\n destinationWhiteXyz: CieXyzTristimulus;\n /** Degree of adaptation D in [0, 1]; defaults to 1 (complete adaptation). */\n degreeOfAdaptation?: number;\n}\n\nexport interface ChromaticAdaptationMatrix {\n transform: ChromaticAdaptationTransform;\n degreeOfAdaptation: number;\n /** Row-major XYZ_source → XYZ_destination matrix. */\n matrix: ColorMatrix3x3;\n /** The per-channel cone-space gains Dᵢ. */\n coneGains: readonly [number, number, number];\n}\n\n/** Internal: builds the adaptation matrix without an envelope. */\nexport function chromaticAdaptationMatrix(input: CalculateChromaticAdaptationMatrixInput): ChromaticAdaptationMatrix {\n const transform = requireTransform(input.transform);\n const source = parseWhiteXyz(input.sourceWhiteXyz, \"sourceWhiteXyz\");\n const destination = parseWhiteXyz(input.destinationWhiteXyz, \"destinationWhiteXyz\");\n const d = input.degreeOfAdaptation === undefined ? 1 : requireNonNegativeNumber(input.degreeOfAdaptation, \"degreeOfAdaptation\");\n if (d > 1) throw new InvalidScientificInputError(\"degreeOfAdaptation must lie in [0, 1].\");\n const cone = CONE_MATRICES[transform];\n const rs = multiplyMatrixVector(cone, xyzToVector(source));\n const rd = multiplyMatrixVector(cone, xyzToVector(destination));\n if (rs.some((v) => !(v > 0)) || rd.some((v) => !(v > 0))) {\n throw new InvalidScientificInputError(\"Both whites must have positive cone responses in the selected transform.\");\n }\n const yRatio = source.y / destination.y;\n const gains = [0, 1, 2].map((i) => d * yRatio * (rd[i]! / rs[i]!) + 1 - d) as unknown as readonly [number, number, number];\n const matrix = multiplyMatrices(multiplyMatrices(invertMatrix3x3(cone, \"cone matrix\"), diagonalMatrix(gains)), cone);\n requireFiniteResult(matrix.flat(), \"Chromatic adaptation\");\n return { transform, degreeOfAdaptation: d, matrix, coneGains: gains };\n}\n\n/**\n * Calculates a linear chromatic-adaptation matrix between two whites. Linear CATs are\n * standard models, but they predict corresponding colours only approximately. The matrix\n * itself is calculated exactly from the declared transform.\n */\nexport function calculateChromaticAdaptationMatrix(input: CalculateChromaticAdaptationMatrixInput): CalculationResult<ChromaticAdaptationMatrix> {\n requireInputKeys(input, \"calculateChromaticAdaptationMatrix\", [\"transform\", \"sourceWhiteXyz\", \"destinationWhiteXyz\", \"degreeOfAdaptation\"]);\n const value = chromaticAdaptationMatrix(input);\n return calculatedResult(value, \"chromatic-adaptation-\" + value.transform, COLORIMETRY_MODEL_VERSION, [\n \"Linear von Kries-type transform M = C⁻¹·diag(D·(Ys/Yd)·ρd/ρs + 1 − D)·C\",\n \"A linear CAT predicts corresponding colours only approximately; no colour-appearance model is applied\"\n ]);\n}\n\n/** Adapts one XYZ colour between whites with the selected transform. */\nexport function calculateChromaticallyAdaptedXyz(input: CalculateChromaticAdaptationMatrixInput & { xyz: CieXyzTristimulus }): CalculationResult<{ xyz: CieXyzTristimulus; matrix: ColorMatrix3x3 }> {\n requireInputKeys(input, \"calculateChromaticallyAdaptedXyz\", [\"transform\", \"sourceWhiteXyz\", \"destinationWhiteXyz\", \"degreeOfAdaptation\", \"xyz\"]);\n const adaptation = chromaticAdaptationMatrix(input);\n const xyz = vectorToXyz(multiplyMatrixVector(adaptation.matrix, xyzToVector(parseXyz(input.xyz, \"xyz\"))));\n requireFiniteResult([xyz.x, xyz.y, xyz.z], \"Chromatic adaptation\");\n return calculatedResult({ xyz, matrix: adaptation.matrix }, \"chromatic-adaptation-\" + adaptation.transform, COLORIMETRY_MODEL_VERSION, [\n \"Linear von Kries-type transform; degree of adaptation \" + adaptation.degreeOfAdaptation\n ]);\n}\n"]}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CIELAB / CIELCh(ab) conversions and colour-difference formulae.
|
|
3
|
+
*
|
|
4
|
+
* - CIELAB (W3C CSS Color 4 Lab; also CIE 15:2018 §8.2.1) with the exact rational constants ε = (6/29)³ and
|
|
5
|
+
* κ = (29/3)³ in the linear segment.
|
|
6
|
+
* - ΔE*ab 1976: Euclidean CIELAB distance.
|
|
7
|
+
* - ΔE*94: asymmetric (first colour is the reference: S_L = 1, S_C = 1 + K₁C*₁, S_H = 1 + K₂C*₁). The
|
|
8
|
+
* default is the formula's published reference conditions (k_L = k_C = k_H = 1, K₁ = 0.045,
|
|
9
|
+
* K₂ = 0.015, often called "graphic arts"); callers may pass their own factors in `cie94Factors`.
|
|
10
|
+
* The engine ships no other preset. The primary source, CIE 116-1995, is not free. The tests check
|
|
11
|
+
* the closed forms for pure lightness, chroma and hue differences and the reference asymmetry.
|
|
12
|
+
* - CIEDE2000, implemented from the formula and implementation notes in Sharma, Wu & Dalal
|
|
13
|
+
* (2005), Color Res. Appl. 30(1):21–30 (paper free at
|
|
14
|
+
* https://hajim.rochester.edu/ece/sites/gsharma/ciede2000/; also CIE 142-2001, ISO/CIE 11664-6).
|
|
15
|
+
* This includes the hue-angle averaging and the handling of the hue discontinuity. The tests check
|
|
16
|
+
* its closed forms for pure lightness, chroma and hue differences (computed in the test), symmetry
|
|
17
|
+
* and identity; the published test pairs are not used (their data file has no licence).
|
|
18
|
+
* @see docs/COLORIMETRY.md for equations, coordinate/unit conventions and limits.
|
|
19
|
+
*/
|
|
20
|
+
import { type CalculationResult } from "../core/calculation-result.js";
|
|
21
|
+
import { type CieXyzTristimulus } from "./colorimetry-math.js";
|
|
22
|
+
/** CIE 1976 L*a*b* coordinates. */
|
|
23
|
+
export interface CielabColor {
|
|
24
|
+
lStar: number;
|
|
25
|
+
aStar: number;
|
|
26
|
+
bStar: number;
|
|
27
|
+
}
|
|
28
|
+
/** CIE 1976 L*C*h(ab) coordinates; hue in degrees [0, 360). */
|
|
29
|
+
export interface CielchColor {
|
|
30
|
+
lStar: number;
|
|
31
|
+
chromaStar: number;
|
|
32
|
+
hueDegrees: number;
|
|
33
|
+
}
|
|
34
|
+
/** Internal: XYZ → CIELAB with a validated white (no envelope). */
|
|
35
|
+
export declare function cielabOfXyz(xyz: CieXyzTristimulus, white: CieXyzTristimulus): CielabColor;
|
|
36
|
+
/** Internal: CIELAB → XYZ. */
|
|
37
|
+
export declare function xyzOfCielab(lab: CielabColor, white: CieXyzTristimulus): CieXyzTristimulus;
|
|
38
|
+
/** CIE XYZ → CIELAB relative to a reference white (same XYZ scale). */
|
|
39
|
+
export declare function calculateCielabFromXyz(input: {
|
|
40
|
+
xyz: CieXyzTristimulus;
|
|
41
|
+
referenceWhiteXyz: CieXyzTristimulus;
|
|
42
|
+
}): CalculationResult<CielabColor>;
|
|
43
|
+
/** CIELAB → CIE XYZ relative to a reference white. */
|
|
44
|
+
export declare function calculateXyzFromCielab(input: {
|
|
45
|
+
lab: CielabColor;
|
|
46
|
+
referenceWhiteXyz: CieXyzTristimulus;
|
|
47
|
+
}): CalculationResult<CieXyzTristimulus>;
|
|
48
|
+
/** Internal: CIELAB → LCh(ab). */
|
|
49
|
+
export declare function cielchOfCielab(lab: CielabColor): CielchColor;
|
|
50
|
+
/** Internal: LCh(ab) → CIELAB. */
|
|
51
|
+
export declare function cielabOfCielch(lch: CielchColor): CielabColor;
|
|
52
|
+
/** CIELAB → CIE LCh(ab): C*ab = √(a*² + b*²), h_ab = atan2(b*, a*) in degrees. */
|
|
53
|
+
export declare function calculateCielchFromCielab(input: {
|
|
54
|
+
lab: CielabColor;
|
|
55
|
+
}): CalculationResult<CielchColor>;
|
|
56
|
+
/** CIE LCh(ab) → CIELAB. */
|
|
57
|
+
export declare function calculateCielabFromCielch(input: {
|
|
58
|
+
lch: CielchColor;
|
|
59
|
+
}): CalculationResult<CielabColor>;
|
|
60
|
+
/** Colour-difference formula. */
|
|
61
|
+
export type ColorDifferenceFormula = "cie76" | "cie94" | "ciede2000";
|
|
62
|
+
/** CIEDE2000 parametric factors (default 1, 1, 1 for reference conditions). */
|
|
63
|
+
export interface Ciede2000ParametricFactors {
|
|
64
|
+
lightness: number;
|
|
65
|
+
chroma: number;
|
|
66
|
+
hue: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* CIE94 parametric factors k_L, k_C, k_H and weighting constants K₁, K₂ (S_C = 1 + K₁C*₁,
|
|
70
|
+
* S_H = 1 + K₂C*₁). The default is the reference conditions: 1, 1, 1, 0.045, 0.015.
|
|
71
|
+
*/
|
|
72
|
+
export interface Cie94ParametricFactors {
|
|
73
|
+
/** k_L, greater than zero. */
|
|
74
|
+
lightness: number;
|
|
75
|
+
/** k_C, greater than zero. */
|
|
76
|
+
chroma: number;
|
|
77
|
+
/** k_H, greater than zero. */
|
|
78
|
+
hue: number;
|
|
79
|
+
/** K₁ in S_C = 1 + K₁C*₁; finite and not negative. */
|
|
80
|
+
k1: number;
|
|
81
|
+
/** K₂ in S_H = 1 + K₂C*₁; finite and not negative. */
|
|
82
|
+
k2: number;
|
|
83
|
+
}
|
|
84
|
+
/** Internal: ΔE*ab 1976. */
|
|
85
|
+
export declare function deltaE76(a: CielabColor, b: CielabColor): number;
|
|
86
|
+
/** Internal: ΔE*94 with reference colour `reference`. */
|
|
87
|
+
export declare function deltaE94(reference: CielabColor, sample: CielabColor, factors?: Cie94ParametricFactors): number;
|
|
88
|
+
/** Internal: CIEDE2000 (Sharma, Wu & Dalal 2005 implementation notes). */
|
|
89
|
+
export declare function deltaE2000(lab1: CielabColor, lab2: CielabColor, k?: Ciede2000ParametricFactors): number;
|
|
90
|
+
export interface CalculateColorDifferenceInput {
|
|
91
|
+
/** Reference (standard) colour; ΔE94 is asymmetric in it. */
|
|
92
|
+
reference: CielabColor;
|
|
93
|
+
sample: CielabColor;
|
|
94
|
+
formula: ColorDifferenceFormula;
|
|
95
|
+
/** CIEDE2000 only; defaults to 1, 1, 1. */
|
|
96
|
+
parametricFactors?: Ciede2000ParametricFactors;
|
|
97
|
+
/** CIE94 only; all five fields are required when given. Defaults to the reference conditions 1, 1, 1, 0.045, 0.015. */
|
|
98
|
+
cie94Factors?: Cie94ParametricFactors;
|
|
99
|
+
}
|
|
100
|
+
/** Colour difference between two CIELAB colours with an explicit formula. */
|
|
101
|
+
export declare function calculateColorDifference(input: CalculateColorDifferenceInput): CalculationResult<{
|
|
102
|
+
deltaE: number;
|
|
103
|
+
formula: ColorDifferenceFormula;
|
|
104
|
+
}>;
|