@photivra/engine 1.4.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +401 -6
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +64 -12
- package/README.md +301 -182
- package/SECURITY.md +37 -28
- package/THIRD_PARTY.md +148 -4
- package/dist/camera/equivalent-focal-length.d.ts +13 -14
- package/dist/camera/equivalent-focal-length.js +15 -13
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +30 -19
- package/dist/camera/field-of-view.js +67 -18
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/lens-projection.d.ts +170 -0
- package/dist/camera/lens-projection.js +444 -0
- package/dist/camera/lens-projection.js.map +1 -0
- package/dist/camera/projected-object-size.d.ts +10 -11
- package/dist/camera/projected-object-size.js +12 -10
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +9 -10
- package/dist/capture/capture-export-metadata.js +8 -5
- package/dist/capture/capture-export-metadata.js.map +1 -1
- package/dist/capture/dng-import.d.ts +91 -0
- package/dist/capture/dng-import.js +343 -0
- package/dist/capture/dng-import.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +37 -17
- package/dist/capture/environment-raw-producer.js +43 -19
- package/dist/capture/environment-raw-producer.js.map +1 -1
- package/dist/capture/export-jpeg.d.ts +35 -4
- package/dist/capture/export-jpeg.js +133 -47
- package/dist/capture/export-jpeg.js.map +1 -1
- package/dist/capture/export-tiff.d.ts +48 -24
- package/dist/capture/export-tiff.js +91 -31
- package/dist/capture/export-tiff.js.map +1 -1
- package/dist/capture/focus-control.d.ts +42 -65
- package/dist/capture/focus-control.js +56 -75
- package/dist/capture/focus-control.js.map +1 -1
- package/dist/capture/host-yield-cadence.d.ts +25 -0
- package/dist/capture/host-yield-cadence.js +25 -0
- package/dist/capture/host-yield-cadence.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +14 -12
- package/dist/capture/linear-encoding.js +14 -13
- package/dist/capture/linear-encoding.js.map +1 -1
- package/dist/capture/lossless-jpeg.d.ts +27 -0
- package/dist/capture/lossless-jpeg.js +237 -0
- package/dist/capture/lossless-jpeg.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +227 -0
- package/dist/capture/native-environment-lean.js +974 -0
- package/dist/capture/native-environment-lean.js.map +1 -0
- package/dist/capture/native-environment-optical-stage.d.ts +97 -0
- package/dist/capture/native-environment-optical-stage.js +340 -0
- package/dist/capture/native-environment-optical-stage.js.map +1 -0
- package/dist/capture/native-environment-raw.d.ts +140 -6
- package/dist/capture/native-environment-raw.js +435 -34
- package/dist/capture/native-environment-raw.js.map +1 -1
- package/dist/capture/native-raw-development.d.ts +118 -5
- package/dist/capture/native-raw-development.js +224 -59
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/capture/native-raw-dng.d.ts +60 -0
- package/dist/capture/native-raw-dng.js +167 -0
- package/dist/capture/native-raw-dng.js.map +1 -0
- package/dist/capture/native-raw.d.ts +67 -10
- package/dist/capture/native-raw.js +90 -24
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/packed-sensor-raw.d.ts +160 -0
- package/dist/capture/packed-sensor-raw.js +221 -0
- package/dist/capture/packed-sensor-raw.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +58 -35
- package/dist/capture/photographic-export.js +177 -70
- package/dist/capture/photographic-export.js.map +1 -1
- package/dist/capture/raw-development-kernel.d.ts +52 -0
- package/dist/capture/raw-development-kernel.js +88 -0
- package/dist/capture/raw-development-kernel.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +7 -7
- package/dist/capture/raw-frame-limits.js +7 -6
- package/dist/capture/raw-frame-limits.js.map +1 -1
- package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
- package/dist/capture/raw-frame-reconstruction.js +9 -8
- package/dist/capture/raw-frame-reconstruction.js.map +1 -1
- package/dist/capture/raw-white-level.d.ts +55 -0
- package/dist/capture/raw-white-level.js +165 -0
- package/dist/capture/raw-white-level.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +5 -7
- package/dist/capture/release-sequence.js +15 -13
- package/dist/capture/release-sequence.js.map +1 -1
- package/dist/capture/sensor-raw-frame.d.ts +5 -6
- package/dist/capture/sensor-raw-frame.js +26 -9
- package/dist/capture/sensor-raw-frame.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +21 -13
- package/dist/capture/sensor-raw-producer.js +86 -25
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/capture/simulated-capture.d.ts +15 -16
- package/dist/capture/simulated-capture.js +22 -12
- package/dist/capture/simulated-capture.js.map +1 -1
- package/dist/color/camera-color-matrix.d.ts +69 -0
- package/dist/color/camera-color-matrix.js +132 -0
- package/dist/color/camera-color-matrix.js.map +1 -0
- package/dist/color/capture-color.d.ts +17 -10
- package/dist/color/capture-color.js +50 -17
- package/dist/color/capture-color.js.map +1 -1
- package/dist/color/chromatic-adaptation.d.ts +63 -0
- package/dist/color/chromatic-adaptation.js +91 -0
- package/dist/color/chromatic-adaptation.js.map +1 -0
- package/dist/color/color-difference.d.ts +104 -0
- package/dist/color/color-difference.js +205 -0
- package/dist/color/color-difference.js.map +1 -0
- package/dist/color/color-matching-functions.d.ts +168 -0
- package/dist/color/color-matching-functions.js +309 -0
- package/dist/color/color-matching-functions.js.map +1 -0
- package/dist/color/colorimetry-math.d.ts +52 -0
- package/dist/color/colorimetry-math.js +144 -0
- package/dist/color/colorimetry-math.js.map +1 -0
- package/dist/color/gamut-mapping.d.ts +54 -0
- package/dist/color/gamut-mapping.js +107 -0
- package/dist/color/gamut-mapping.js.map +1 -0
- package/dist/color/illuminants.d.ts +182 -0
- package/dist/color/illuminants.js +434 -0
- package/dist/color/illuminants.js.map +1 -0
- package/dist/color/rgb-color-spaces.d.ts +79 -0
- package/dist/color/rgb-color-spaces.js +115 -0
- package/dist/color/rgb-color-spaces.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +33 -11
- package/dist/color/sensor-color-development.js +104 -30
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/srgb-icc.d.ts +9 -2
- package/dist/color/srgb-icc.js +16 -5
- package/dist/color/srgb-icc.js.map +1 -1
- package/dist/color/srgb-transfer.d.ts +1 -2
- package/dist/color/srgb-transfer.js +1 -1
- package/dist/color/srgb-transfer.js.map +1 -1
- package/dist/color/white-balance.d.ts +68 -19
- package/dist/color/white-balance.js +168 -35
- package/dist/color/white-balance.js.map +1 -1
- package/dist/composition/image-formation-plan.d.ts +152 -128
- package/dist/composition/image-formation-plan.js +292 -138
- package/dist/composition/image-formation-plan.js.map +1 -1
- package/dist/composition/plan-consumer.d.ts +6 -7
- package/dist/composition/plan-consumer.js +14 -11
- package/dist/composition/plan-consumer.js.map +1 -1
- package/dist/core/calculation-result.d.ts +21 -14
- package/dist/core/calculation-result.js +209 -11
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +13 -8
- package/dist/core/canonical-json.js +34 -15
- package/dist/core/canonical-json.js.map +1 -1
- package/dist/core/configuration-error.d.ts +5 -4
- package/dist/core/configuration-error.js +5 -3
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +12 -12
- package/dist/core/evidence-provenance.js +10 -9
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +11 -10
- package/dist/core/image-formation.js +11 -9
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +9 -17
- package/dist/core/owned-data.js +9 -16
- package/dist/core/owned-data.js.map +1 -1
- package/dist/core/portable-math.d.ts +15 -0
- package/dist/core/portable-math.js +56 -0
- package/dist/core/portable-math.js.map +1 -0
- package/dist/core/record-validation.d.ts +48 -9
- package/dist/core/record-validation.js +93 -19
- package/dist/core/record-validation.js.map +1 -1
- package/dist/core/scientific-assurance.d.ts +16 -14
- package/dist/core/scientific-assurance.js +22 -18
- package/dist/core/scientific-assurance.js.map +1 -1
- package/dist/core/spectral-composition.d.ts +13 -14
- package/dist/core/spectral-composition.js +30 -27
- package/dist/core/spectral-composition.js.map +1 -1
- package/dist/core/spectral.d.ts +5 -6
- package/dist/core/spectral.js +9 -7
- package/dist/core/spectral.js.map +1 -1
- package/dist/core/validation.d.ts +3 -6
- package/dist/core/validation.js +3 -5
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +6 -6
- package/dist/core/version.js +6 -5
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/exposure-capabilities.d.ts +10 -10
- package/dist/equipment/exposure-capabilities.js +40 -30
- package/dist/equipment/exposure-capabilities.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +13 -6
- package/dist/equipment/generic-tier-assets.js +34 -15
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/generic-tier-presets.d.ts +5 -6
- package/dist/equipment/generic-tier-presets.js +15 -13
- package/dist/equipment/generic-tier-presets.js.map +1 -1
- package/dist/equipment/iso-capabilities.d.ts +21 -22
- package/dist/equipment/iso-capabilities.js +49 -44
- package/dist/equipment/iso-capabilities.js.map +1 -1
- package/dist/equipment/metering-capabilities.d.ts +5 -6
- package/dist/equipment/metering-capabilities.js +22 -19
- package/dist/equipment/metering-capabilities.js.map +1 -1
- package/dist/equipment/release-capabilities.d.ts +3 -4
- package/dist/equipment/release-capabilities.js +18 -14
- package/dist/equipment/release-capabilities.js.map +1 -1
- package/dist/exposure/exposure-duration-control.d.ts +19 -17
- package/dist/exposure/exposure-duration-control.js +27 -23
- package/dist/exposure/exposure-duration-control.js.map +1 -1
- package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
- package/dist/exposure/exposure-mode-resolver.js +127 -82
- package/dist/exposure/exposure-mode-resolver.js.map +1 -1
- package/dist/exposure/exposure.d.ts +17 -16
- package/dist/exposure/exposure.js +22 -15
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash-ttl.d.ts +135 -0
- package/dist/exposure/flash-ttl.js +193 -0
- package/dist/exposure/flash-ttl.js.map +1 -0
- package/dist/exposure/flash.d.ts +144 -36
- package/dist/exposure/flash.js +259 -59
- package/dist/exposure/flash.js.map +1 -1
- package/dist/exposure/metering-scene-radiance.d.ts +10 -10
- package/dist/exposure/metering-scene-radiance.js +42 -23
- package/dist/exposure/metering-scene-radiance.js.map +1 -1
- package/dist/exposure/metering-target.d.ts +8 -8
- package/dist/exposure/metering-target.js +30 -20
- package/dist/exposure/metering-target.js.map +1 -1
- package/dist/exposure/metering-temporal.d.ts +16 -15
- package/dist/exposure/metering-temporal.js +41 -19
- package/dist/exposure/metering-temporal.js.map +1 -1
- package/dist/exposure/metering.d.ts +64 -17
- package/dist/exposure/metering.js +159 -30
- package/dist/exposure/metering.js.map +1 -1
- package/dist/exposure/program-line.d.ts +5 -5
- package/dist/exposure/program-line.js +20 -13
- package/dist/exposure/program-line.js.map +1 -1
- package/dist/facade/camera-preset.d.ts +8 -0
- package/dist/facade/camera-preset.js +102 -0
- package/dist/facade/camera-preset.js.map +1 -0
- package/dist/facade/chart-radiance-batch.d.ts +57 -0
- package/dist/facade/chart-radiance-batch.js +121 -0
- package/dist/facade/chart-radiance-batch.js.map +1 -0
- package/dist/facade/chart-scenes.d.ts +177 -0
- package/dist/facade/chart-scenes.js +232 -0
- package/dist/facade/chart-scenes.js.map +1 -0
- package/dist/facade/host-yield.d.ts +7 -0
- package/dist/facade/host-yield.js +23 -0
- package/dist/facade/host-yield.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +117 -0
- package/dist/facade/scene-radiance.js +205 -0
- package/dist/facade/scene-radiance.js.map +1 -0
- package/dist/facade/simulate-capture.d.ts +284 -0
- package/dist/facade/simulate-capture.js +1026 -0
- package/dist/facade/simulate-capture.js.map +1 -0
- package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
- package/dist/gpu/chart-radiance-gpu.js +176 -0
- package/dist/gpu/chart-radiance-gpu.js.map +1 -0
- package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
- package/dist/gpu/image-kernel-accelerator.js +720 -0
- package/dist/gpu/image-kernel-accelerator.js.map +1 -0
- package/dist/gpu/image-kernel-execution.d.ts +92 -0
- package/dist/gpu/image-kernel-execution.js +84 -0
- package/dist/gpu/image-kernel-execution.js.map +1 -0
- package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
- package/dist/gpu/sensor-stage-gpu.js +317 -0
- package/dist/gpu/sensor-stage-gpu.js.map +1 -0
- package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
- package/dist/gpu/temporal-sum-gpu.js +150 -0
- package/dist/gpu/temporal-sum-gpu.js.map +1 -0
- package/dist/gpu/webgpu-runtime.d.ts +63 -0
- package/dist/gpu/webgpu-runtime.js +215 -0
- package/dist/gpu/webgpu-runtime.js.map +1 -0
- package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
- package/dist/gpu/wgsl-chart-kernel.js +165 -0
- package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
- package/dist/gpu/wgsl-kernels.d.ts +53 -0
- package/dist/gpu/wgsl-kernels.js +365 -0
- package/dist/gpu/wgsl-kernels.js.map +1 -0
- package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
- package/dist/gpu/wgsl-sensor-kernel.js +409 -0
- package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
- package/dist/index.d.ts +89 -25
- package/dist/index.js +59 -15
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +92 -40
- package/dist/motion/camera-rotation.js +84 -47
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
- package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
- package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
- package/dist/motion/capture-rotation-trajectory.js +36 -26
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
- package/dist/motion/extended-object-projection.d.ts +19 -16
- package/dist/motion/extended-object-projection.js +38 -18
- package/dist/motion/extended-object-projection.js.map +1 -1
- package/dist/motion/projected-motion.d.ts +18 -17
- package/dist/motion/projected-motion.js +25 -17
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/motion/temporal-exposure-sum.d.ts +55 -0
- package/dist/motion/temporal-exposure-sum.js +141 -0
- package/dist/motion/temporal-exposure-sum.js.map +1 -0
- package/dist/motion/video-sequence.d.ts +111 -0
- package/dist/motion/video-sequence.js +179 -0
- package/dist/motion/video-sequence.js.map +1 -0
- package/dist/optics/aperture.d.ts +14 -15
- package/dist/optics/aperture.js +13 -11
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/atmospheric-haze.d.ts +83 -0
- package/dist/optics/atmospheric-haze.js +113 -0
- package/dist/optics/atmospheric-haze.js.map +1 -0
- package/dist/optics/brown-conrady-distortion.d.ts +116 -0
- package/dist/optics/brown-conrady-distortion.js +291 -0
- package/dist/optics/brown-conrady-distortion.js.map +1 -0
- package/dist/optics/circle-of-confusion.d.ts +10 -10
- package/dist/optics/circle-of-confusion.js +15 -11
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +64 -33
- package/dist/optics/complex-pupil-psf.js +190 -98
- package/dist/optics/complex-pupil-psf.js.map +1 -1
- package/dist/optics/depth-of-field.d.ts +25 -15
- package/dist/optics/depth-of-field.js +67 -27
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction.d.ts +14 -13
- package/dist/optics/diffraction.js +14 -10
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +88 -27
- package/dist/optics/focus-breathing.js +114 -23
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +18 -18
- package/dist/optics/focus-state.js +21 -15
- package/dist/optics/focus-state.js.map +1 -1
- package/dist/optics/front-of-lens-filter.d.ts +45 -14
- package/dist/optics/front-of-lens-filter.js +259 -88
- package/dist/optics/front-of-lens-filter.js.map +1 -1
- package/dist/optics/illumination-vignetting.d.ts +16 -17
- package/dist/optics/illumination-vignetting.js +40 -17
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/irradiance-convolution.d.ts +59 -0
- package/dist/optics/irradiance-convolution.js +138 -0
- package/dist/optics/irradiance-convolution.js.map +1 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
- package/dist/optics/lateral-chromatic-aberration.js +33 -23
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-kernels.d.ts +89 -0
- package/dist/optics/lens-psf-kernels.js +175 -0
- package/dist/optics/lens-psf-kernels.js.map +1 -0
- package/dist/optics/lens-psf-profile.d.ts +78 -46
- package/dist/optics/lens-psf-profile.js +335 -124
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
- package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
- package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +80 -23
- package/dist/optics/polygon-diffraction.js +130 -25
- package/dist/optics/polygon-diffraction.js.map +1 -1
- package/dist/optics/profile-contract.d.ts +5 -6
- package/dist/optics/profile-contract.js +14 -11
- package/dist/optics/profile-contract.js.map +1 -1
- package/dist/optics/psf-foundation.d.ts +23 -23
- package/dist/optics/psf-foundation.js +24 -21
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/pupil-vignetting.d.ts +118 -0
- package/dist/optics/pupil-vignetting.js +264 -0
- package/dist/optics/pupil-vignetting.js.map +1 -0
- package/dist/optics/radial-distortion.d.ts +34 -33
- package/dist/optics/radial-distortion.js +37 -30
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
- package/dist/optics/scene-to-sensor-irradiance.js +73 -45
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
- package/dist/optics/scene-to-sensor-quadrature.js +16 -11
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
- package/dist/optics/sensor-aperture-rays.d.ts +20 -4
- package/dist/optics/sensor-aperture-rays.js +32 -14
- package/dist/optics/sensor-aperture-rays.js.map +1 -1
- package/dist/optics/sensor-environment-query.d.ts +81 -16
- package/dist/optics/sensor-environment-query.js +145 -12
- package/dist/optics/sensor-environment-query.js.map +1 -1
- package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
- package/dist/optics/sensor-psf-quadrature.js +18 -11
- package/dist/optics/sensor-psf-quadrature.js.map +1 -1
- package/dist/optics/sensor-psf-support.d.ts +8 -6
- package/dist/optics/sensor-psf-support.js +8 -5
- package/dist/optics/sensor-psf-support.js.map +1 -1
- package/dist/optics/stray-light.d.ts +22 -19
- package/dist/optics/stray-light.js +18 -12
- package/dist/optics/stray-light.js.map +1 -1
- package/dist/optics/thin-lens.d.ts +10 -9
- package/dist/optics/thin-lens.js +12 -8
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/optics/zernike-wavefront.d.ts +154 -0
- package/dist/optics/zernike-wavefront.js +352 -0
- package/dist/optics/zernike-wavefront.js.map +1 -0
- package/dist/output/capture-corrected-sdr.d.ts +16 -8
- package/dist/output/capture-corrected-sdr.js +16 -8
- package/dist/output/capture-corrected-sdr.js.map +1 -1
- package/dist/output/capture-geometry.d.ts +34 -36
- package/dist/output/capture-geometry.js +52 -32
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +7 -6
- package/dist/output/capture-sdr.js +11 -8
- package/dist/output/capture-sdr.js.map +1 -1
- package/dist/output/crop.d.ts +22 -6
- package/dist/output/crop.js +40 -6
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +60 -23
- package/dist/output/geometric-transforms.js +111 -24
- package/dist/output/geometric-transforms.js.map +1 -1
- package/dist/output/lens-corrections.d.ts +27 -19
- package/dist/output/lens-corrections.js +29 -13
- package/dist/output/lens-corrections.js.map +1 -1
- package/dist/output/native-capture-sdr.d.ts +71 -16
- package/dist/output/native-capture-sdr.js +190 -33
- package/dist/output/native-capture-sdr.js.map +1 -1
- package/dist/output/png-encoder.d.ts +65 -0
- package/dist/output/png-encoder.js +461 -0
- package/dist/output/png-encoder.js.map +1 -0
- package/dist/output/print-contrast-reference.d.ts +10 -9
- package/dist/output/print-contrast-reference.js +10 -8
- package/dist/output/print-contrast-reference.js.map +1 -1
- package/dist/output/print-detail.d.ts +18 -17
- package/dist/output/print-detail.js +12 -10
- package/dist/output/print-detail.js.map +1 -1
- package/dist/output/print-jpeg.d.ts +26 -5
- package/dist/output/print-jpeg.js +117 -50
- package/dist/output/print-jpeg.js.map +1 -1
- package/dist/output/print-plan.d.ts +19 -19
- package/dist/output/print-plan.js +11 -10
- package/dist/output/print-plan.js.map +1 -1
- package/dist/output/print-region-statistics.d.ts +14 -15
- package/dist/output/print-region-statistics.js +11 -11
- package/dist/output/print-region-statistics.js.map +1 -1
- package/dist/output/sdr-rendering.d.ts +48 -10
- package/dist/output/sdr-rendering.js +114 -25
- package/dist/output/sdr-rendering.js.map +1 -1
- package/dist/output/subject-framing-crop.d.ts +6 -10
- package/dist/output/subject-framing-crop.js +23 -13
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/processing/demosaic.d.ts +90 -0
- package/dist/processing/demosaic.js +275 -0
- package/dist/processing/demosaic.js.map +1 -0
- package/dist/processing/denoise.d.ts +68 -0
- package/dist/processing/denoise.js +214 -0
- package/dist/processing/denoise.js.map +1 -0
- package/dist/processing/focus-stacking.d.ts +17 -0
- package/dist/processing/focus-stacking.js +80 -0
- package/dist/processing/focus-stacking.js.map +1 -0
- package/dist/processing/hdr.d.ts +54 -0
- package/dist/processing/hdr.js +172 -0
- package/dist/processing/hdr.js.map +1 -0
- package/dist/processing/image-ops.d.ts +66 -0
- package/dist/processing/image-ops.js +192 -0
- package/dist/processing/image-ops.js.map +1 -0
- package/dist/processing/panorama.d.ts +51 -0
- package/dist/processing/panorama.js +305 -0
- package/dist/processing/panorama.js.map +1 -0
- package/dist/processing/processing-task.d.ts +85 -0
- package/dist/processing/processing-task.js +164 -0
- package/dist/processing/processing-task.js.map +1 -0
- package/dist/processing/tone-mapping.d.ts +69 -0
- package/dist/processing/tone-mapping.js +310 -0
- package/dist/processing/tone-mapping.js.map +1 -0
- package/dist/schema/camera.d.ts +5 -4
- package/dist/schema/illumination-spectral.d.ts +13 -19
- package/dist/schema/illumination-spectral.js +23 -19
- package/dist/schema/illumination-spectral.js.map +1 -1
- package/dist/schema/illumination-temporal.d.ts +12 -15
- package/dist/schema/illumination-temporal.js +43 -28
- package/dist/schema/illumination-temporal.js.map +1 -1
- package/dist/schema/illumination.d.ts +5 -4
- package/dist/schema/illumination.js +55 -20
- package/dist/schema/illumination.js.map +1 -1
- package/dist/schema/scene-radiance-temporal.d.ts +9 -11
- package/dist/schema/scene-radiance-temporal.js +26 -23
- package/dist/schema/scene-radiance-temporal.js.map +1 -1
- package/dist/schema/scene-radiance.d.ts +17 -17
- package/dist/schema/scene-radiance.js +56 -34
- package/dist/schema/scene-radiance.js.map +1 -1
- package/dist/schema/scene.d.ts +14 -13
- package/dist/schema/validation.d.ts +0 -1
- package/dist/schema/validation.js +17 -15
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +45 -64
- package/dist/sensor/accumulated-charge.js +41 -47
- package/dist/sensor/accumulated-charge.js.map +1 -1
- package/dist/sensor/architecture.d.ts +22 -25
- package/dist/sensor/architecture.js +17 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
- package/dist/sensor/camera-saturation-capacity.js +36 -34
- package/dist/sensor/camera-saturation-capacity.js.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
- package/dist/sensor/capture-color-sampling-binding.js +39 -41
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- package/dist/sensor/capture-mode-timing.d.ts +8 -9
- package/dist/sensor/capture-mode-timing.js +24 -21
- package/dist/sensor/capture-mode-timing.js.map +1 -1
- package/dist/sensor/capture-mode.d.ts +28 -30
- package/dist/sensor/capture-mode.js +33 -31
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts +30 -33
- package/dist/sensor/color-sampling.js +32 -37
- package/dist/sensor/color-sampling.js.map +1 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
- package/dist/sensor/constant-rate-temporal-integration.js +28 -26
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
- package/dist/sensor/dark-current.d.ts +53 -49
- package/dist/sensor/dark-current.js +87 -46
- package/dist/sensor/dark-current.js.map +1 -1
- package/dist/sensor/environment-photo-signal.d.ts +71 -30
- package/dist/sensor/environment-photo-signal.js +127 -46
- package/dist/sensor/environment-photo-signal.js.map +1 -1
- package/dist/sensor/eqe-electron-rate.d.ts +14 -13
- package/dist/sensor/eqe-electron-rate.js +34 -14
- package/dist/sensor/eqe-electron-rate.js.map +1 -1
- package/dist/sensor/eqe-local-exposure.d.ts +24 -24
- package/dist/sensor/eqe-local-exposure.js +15 -11
- package/dist/sensor/eqe-local-exposure.js.map +1 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
- package/dist/sensor/eqe-temporal-exposure.js +15 -10
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/exposure-window.d.ts +48 -34
- package/dist/sensor/exposure-window.js +77 -36
- package/dist/sensor/exposure-window.js.map +1 -1
- package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
- package/dist/sensor/fixed-pattern-noise.js +166 -0
- package/dist/sensor/fixed-pattern-noise.js.map +1 -0
- package/dist/sensor/iso-gain.d.ts +44 -0
- package/dist/sensor/iso-gain.js +119 -0
- package/dist/sensor/iso-gain.js.map +1 -0
- package/dist/sensor/iso-signal-chain.d.ts +25 -48
- package/dist/sensor/iso-signal-chain.js +52 -66
- package/dist/sensor/iso-signal-chain.js.map +1 -1
- package/dist/sensor/local-exposure-binding.d.ts +21 -21
- package/dist/sensor/local-exposure-binding.js +22 -18
- package/dist/sensor/local-exposure-binding.js.map +1 -1
- package/dist/sensor/optical-stack.d.ts +36 -40
- package/dist/sensor/optical-stack.js +34 -37
- package/dist/sensor/optical-stack.js.map +1 -1
- package/dist/sensor/photon-energy.d.ts +22 -28
- package/dist/sensor/photon-energy.js +42 -34
- package/dist/sensor/photon-energy.js.map +1 -1
- package/dist/sensor/physical-charge-capacity.d.ts +20 -30
- package/dist/sensor/physical-charge-capacity.js +35 -36
- package/dist/sensor/physical-charge-capacity.js.map +1 -1
- package/dist/sensor/pixel-pitch.d.ts +2 -3
- package/dist/sensor/pixel-pitch.js +4 -2
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +13 -15
- package/dist/sensor/radiometry-readiness.js +20 -17
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +173 -83
- package/dist/sensor/raw-readout.js +425 -160
- package/dist/sensor/raw-readout.js.map +1 -1
- package/dist/sensor/raw-reconstruction.d.ts +112 -44
- package/dist/sensor/raw-reconstruction.js +200 -47
- package/dist/sensor/raw-reconstruction.js.map +1 -1
- package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
- package/dist/sensor/readout-exposure-linkage.js +125 -27
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +43 -44
- package/dist/sensor/readout-timing.js +38 -30
- package/dist/sensor/readout-timing.js.map +1 -1
- package/dist/sensor/response-application-compatibility.d.ts +21 -28
- package/dist/sensor/response-application-compatibility.js +35 -34
- package/dist/sensor/response-application-compatibility.js.map +1 -1
- package/dist/sensor/response-operating-range.d.ts +26 -35
- package/dist/sensor/response-operating-range.js +40 -39
- package/dist/sensor/response-operating-range.js.map +1 -1
- package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
- package/dist/sensor/responsivity-photocurrent.js +57 -40
- package/dist/sensor/responsivity-photocurrent.js.map +1 -1
- package/dist/sensor/sampling-aperture.d.ts +21 -25
- package/dist/sensor/sampling-aperture.js +29 -28
- package/dist/sensor/sampling-aperture.js.map +1 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
- package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/sensor-geometry.d.ts +28 -32
- package/dist/sensor/sensor-geometry.js +35 -20
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +14 -16
- package/dist/sensor/signal-noise.js +15 -13
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
- package/dist/sensor/spatial-sample-reduction.js +39 -48
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
- package/dist/sensor/spatial-sampling-quadrature.js +31 -36
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
- package/dist/sensor/spatio-spectral-reduction.js +24 -29
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
- package/dist/sensor/spectral-coverage.d.ts +6 -9
- package/dist/sensor/spectral-coverage.js +9 -6
- package/dist/sensor/spectral-coverage.js.map +1 -1
- package/dist/sensor/spectral-quadrature.d.ts +46 -60
- package/dist/sensor/spectral-quadrature.js +38 -48
- package/dist/sensor/spectral-quadrature.js.map +1 -1
- package/dist/sensor/spectral-response.d.ts +53 -41
- package/dist/sensor/spectral-response.js +80 -47
- package/dist/sensor/spectral-response.js.map +1 -1
- package/dist/sensor/stochastic-seed.d.ts +50 -0
- package/dist/sensor/stochastic-seed.js +123 -0
- package/dist/sensor/stochastic-seed.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
- package/dist/sensor/temporal-eqe-sum.js +5 -6
- package/dist/sensor/temporal-eqe-sum.js.map +1 -1
- package/dist/sensor/temporal-photo-signal.d.ts +5 -6
- package/dist/sensor/temporal-photo-signal.js +11 -10
- package/dist/sensor/temporal-photo-signal.js.map +1 -1
- package/dist/sensor/temporal-sample-binding.d.ts +1 -2
- package/dist/sensor/temporal-sample-binding.js +3 -3
- package/dist/sensor/temporal-sample-binding.js.map +1 -1
- package/dist/simulation/poc-simulation.d.ts +16 -16
- package/dist/simulation/poc-simulation.js +20 -15
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +42 -18
- package/dist/stabilization/camera-shake.js +43 -20
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +44 -41
- package/dist/stabilization/system.js +196 -108
- package/dist/stabilization/system.js.map +1 -1
- package/docs/AGENT_GUIDE.md +183 -0
- package/docs/API_REFERENCE.md +761 -2
- package/docs/QUICK_START.md +495 -0
- package/docs/USAGE.md +1719 -714
- package/docs/api/camera-equivalent-focal-length.md +6 -7
- package/docs/api/camera-field-of-view.md +16 -8
- package/docs/api/camera-lens-projection.md +246 -0
- package/docs/api/camera-projected-object-size.md +6 -5
- package/docs/api/capture-capture-export-metadata.md +10 -10
- package/docs/api/capture-dng-import.md +134 -0
- package/docs/api/capture-environment-raw-producer.md +17 -11
- package/docs/api/capture-export-jpeg.md +16 -0
- package/docs/api/capture-focus-control.md +25 -47
- package/docs/api/capture-linear-encoding.md +21 -12
- package/docs/api/capture-lossless-jpeg.md +49 -0
- package/docs/api/capture-native-environment-optical-stage.md +75 -0
- package/docs/api/capture-native-environment-raw.md +161 -4
- package/docs/api/capture-native-raw-development.md +69 -4
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +23 -8
- package/docs/api/capture-packed-sensor-raw.md +156 -0
- package/docs/api/capture-photographic-export.md +69 -31
- package/docs/api/capture-raw-frame-reconstruction.md +8 -8
- package/docs/api/capture-raw-white-level.md +37 -0
- package/docs/api/capture-release-sequence.md +6 -7
- package/docs/api/capture-sensor-raw-frame.md +6 -6
- package/docs/api/capture-sensor-raw-producer.md +17 -11
- package/docs/api/capture-simulated-capture.md +15 -15
- package/docs/api/color-camera-color-matrix.md +103 -0
- package/docs/api/color-capture-color.md +22 -11
- package/docs/api/color-chromatic-adaptation.md +82 -0
- package/docs/api/color-color-difference.md +134 -0
- package/docs/api/color-color-matching-functions.md +259 -0
- package/docs/api/color-colorimetry-math.md +54 -0
- package/docs/api/color-gamut-mapping.md +72 -0
- package/docs/api/color-illuminants.md +280 -0
- package/docs/api/color-rgb-color-spaces.md +151 -0
- package/docs/api/color-sensor-color-development.md +27 -0
- package/docs/api/color-srgb-icc.md +2 -4
- package/docs/api/color-white-balance.md +95 -19
- package/docs/api/composition-image-formation-plan.md +124 -95
- package/docs/api/composition-plan-consumer.md +7 -7
- package/docs/api/core-calculation-result.md +18 -14
- package/docs/api/core-configuration-error.md +1 -1
- package/docs/api/core-image-formation.md +7 -7
- package/docs/api/core-scientific-assurance.md +12 -10
- package/docs/api/core-spectral-composition.md +14 -14
- package/docs/api/core-spectral.md +6 -6
- package/docs/api/core-validation.md +3 -3
- package/docs/api/core-version.md +7 -6
- package/docs/api/equipment-exposure-capabilities.md +11 -10
- package/docs/api/equipment-generic-tier-assets.md +7 -2
- package/docs/api/equipment-generic-tier-presets.md +6 -6
- package/docs/api/equipment-iso-capabilities.md +18 -18
- package/docs/api/equipment-metering-capabilities.md +6 -6
- package/docs/api/equipment-release-capabilities.md +4 -4
- package/docs/api/exports.json +2213 -8
- package/docs/api/exposure-exposure-duration-control.md +9 -9
- package/docs/api/exposure-exposure-mode-resolver.md +35 -31
- package/docs/api/exposure-exposure.md +10 -10
- package/docs/api/exposure-flash-ttl.md +182 -0
- package/docs/api/exposure-flash.md +183 -28
- package/docs/api/exposure-metering-scene-radiance.md +11 -10
- package/docs/api/exposure-metering-target.md +9 -8
- package/docs/api/exposure-metering-temporal.md +8 -8
- package/docs/api/exposure-metering.md +69 -9
- package/docs/api/exposure-program-line.md +6 -5
- package/docs/api/facade-chart-radiance-batch.md +96 -0
- package/docs/api/facade-chart-scenes.md +240 -0
- package/docs/api/facade-scene-radiance.md +122 -0
- package/docs/api/facade-simulate-capture.md +324 -0
- package/docs/api/gpu-image-kernel-accelerator.md +157 -0
- package/docs/api/gpu-image-kernel-execution.md +152 -0
- package/docs/api/motion-camera-rotation.md +43 -26
- package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
- package/docs/api/motion-capture-rotation-trajectory.md +15 -15
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
- package/docs/api/motion-extended-object-projection.md +10 -8
- package/docs/api/motion-projected-motion.md +8 -8
- package/docs/api/motion-temporal-exposure-sum.md +98 -0
- package/docs/api/motion-video-sequence.md +159 -0
- package/docs/api/optics-aperture.md +8 -8
- package/docs/api/optics-atmospheric-haze.md +104 -0
- package/docs/api/optics-brown-conrady-distortion.md +123 -0
- package/docs/api/optics-circle-of-confusion.md +5 -4
- package/docs/api/optics-complex-pupil-psf.md +57 -16
- package/docs/api/optics-depth-of-field.md +12 -6
- package/docs/api/optics-diffraction.md +8 -7
- package/docs/api/optics-focus-breathing.md +104 -16
- package/docs/api/optics-focus-state.md +9 -10
- package/docs/api/optics-front-of-lens-filter.md +72 -14
- package/docs/api/optics-illumination-vignetting.md +10 -10
- package/docs/api/optics-irradiance-convolution.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
- package/docs/api/optics-lens-psf-kernels.md +72 -0
- package/docs/api/optics-lens-psf-profile.md +48 -26
- package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
- package/docs/api/optics-polygon-diffraction.md +78 -13
- package/docs/api/optics-profile-contract.md +4 -4
- package/docs/api/optics-psf-foundation.md +12 -12
- package/docs/api/optics-pupil-vignetting.md +132 -0
- package/docs/api/optics-radial-distortion.md +12 -12
- package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
- package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
- package/docs/api/optics-sensor-aperture-rays.md +3 -2
- package/docs/api/optics-sensor-environment-query.md +52 -9
- package/docs/api/optics-sensor-psf-quadrature.md +13 -10
- package/docs/api/optics-stray-light.md +12 -11
- package/docs/api/optics-thin-lens.md +4 -3
- package/docs/api/optics-zernike-wavefront.md +229 -0
- package/docs/api/output-capture-corrected-sdr.md +10 -7
- package/docs/api/output-capture-geometry.md +35 -36
- package/docs/api/output-capture-sdr.md +4 -4
- package/docs/api/output-crop.md +7 -4
- package/docs/api/output-geometric-transforms.md +65 -19
- package/docs/api/output-lens-corrections.md +17 -15
- package/docs/api/output-native-capture-sdr.md +26 -13
- package/docs/api/output-png-encoder.md +105 -0
- package/docs/api/output-print-contrast-reference.md +8 -8
- package/docs/api/output-print-detail.md +14 -14
- package/docs/api/output-print-jpeg.md +22 -5
- package/docs/api/output-print-plan.md +18 -18
- package/docs/api/output-print-region-statistics.md +14 -14
- package/docs/api/output-sdr-rendering.md +52 -10
- package/docs/api/output-subject-framing-crop.md +5 -6
- package/docs/api/processing-demosaic.md +120 -0
- package/docs/api/processing-denoise.md +148 -0
- package/docs/api/processing-focus-stacking.md +41 -0
- package/docs/api/processing-hdr.md +113 -0
- package/docs/api/processing-panorama.md +82 -0
- package/docs/api/processing-processing-task.md +107 -0
- package/docs/api/processing-tone-mapping.md +142 -0
- package/docs/api/schema-camera.md +6 -4
- package/docs/api/schema-illumination-spectral.md +10 -11
- package/docs/api/schema-illumination-temporal.md +13 -15
- package/docs/api/schema-illumination.md +4 -4
- package/docs/api/schema-scene-radiance-temporal.md +10 -11
- package/docs/api/schema-scene-radiance.md +18 -17
- package/docs/api/schema-scene.md +9 -9
- package/docs/api/schema-validation.md +1 -1
- package/docs/api/sensor-accumulated-charge.md +12 -20
- package/docs/api/sensor-architecture.md +15 -16
- package/docs/api/sensor-camera-saturation-capacity.md +9 -11
- package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
- package/docs/api/sensor-capture-mode-timing.md +9 -9
- package/docs/api/sensor-capture-mode.md +29 -30
- package/docs/api/sensor-color-sampling.md +31 -33
- package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
- package/docs/api/sensor-dark-current.md +30 -14
- package/docs/api/sensor-environment-photo-signal.md +13 -6
- package/docs/api/sensor-eqe-electron-rate.md +9 -8
- package/docs/api/sensor-eqe-local-exposure.md +18 -17
- package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
- package/docs/api/sensor-exposure-window.md +24 -24
- package/docs/api/sensor-fixed-pattern-noise.md +104 -0
- package/docs/api/sensor-iso-gain.md +63 -0
- package/docs/api/sensor-iso-signal-chain.md +13 -22
- package/docs/api/sensor-local-exposure-binding.md +12 -13
- package/docs/api/sensor-optical-stack.md +37 -40
- package/docs/api/sensor-photon-energy.md +10 -11
- package/docs/api/sensor-physical-charge-capacity.md +8 -13
- package/docs/api/sensor-pixel-pitch.md +1 -1
- package/docs/api/sensor-radiometry-readiness.md +9 -9
- package/docs/api/sensor-raw-readout.md +118 -52
- package/docs/api/sensor-raw-reconstruction.md +97 -20
- package/docs/api/sensor-readout-exposure-linkage.md +120 -24
- package/docs/api/sensor-readout-timing.md +33 -35
- package/docs/api/sensor-response-application-compatibility.md +9 -11
- package/docs/api/sensor-response-operating-range.md +14 -18
- package/docs/api/sensor-responsivity-photocurrent.md +9 -12
- package/docs/api/sensor-sampling-aperture.md +22 -25
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
- package/docs/api/sensor-sensor-geometry.md +23 -24
- package/docs/api/sensor-signal-noise.md +10 -10
- package/docs/api/sensor-spatial-sample-reduction.md +27 -30
- package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
- package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
- package/docs/api/sensor-spectral-coverage.md +5 -5
- package/docs/api/sensor-spectral-quadrature.md +33 -35
- package/docs/api/sensor-spectral-response.md +28 -16
- package/docs/api/sensor-temporal-photo-signal.md +6 -6
- package/docs/api/simulation-poc-simulation.md +17 -16
- package/docs/api/stabilization-camera-shake.md +29 -10
- package/docs/api/stabilization-system.md +25 -21
- package/docs/examples/production-request.json +3821 -2157
- package/docs/examples/simulate-capture.mjs +14 -0
- package/llms.txt +35 -0
- package/package.json +32 -12
- package/AGENTS.md +0 -674
- package/CONTRIBUTING.md +0 -76
- package/DCO +0 -33
- package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
- package/dist/camera/field-of-view.d.ts.map +0 -1
- package/dist/camera/projected-object-size.d.ts.map +0 -1
- package/dist/capture/capture-export-metadata.d.ts.map +0 -1
- package/dist/capture/environment-raw-producer.d.ts.map +0 -1
- package/dist/capture/export-jpeg.d.ts.map +0 -1
- package/dist/capture/export-tiff.d.ts.map +0 -1
- package/dist/capture/focus-control.d.ts.map +0 -1
- package/dist/capture/linear-encoding.d.ts.map +0 -1
- package/dist/capture/native-environment-raw.d.ts.map +0 -1
- package/dist/capture/native-raw-development.d.ts.map +0 -1
- package/dist/capture/native-raw.d.ts.map +0 -1
- package/dist/capture/photographic-export.d.ts.map +0 -1
- package/dist/capture/raw-frame-limits.d.ts.map +0 -1
- package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
- package/dist/capture/release-sequence.d.ts.map +0 -1
- package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
- package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
- package/dist/capture/simulated-capture.d.ts.map +0 -1
- package/dist/color/capture-color.d.ts.map +0 -1
- package/dist/color/sensor-color-development.d.ts.map +0 -1
- package/dist/color/srgb-icc.d.ts.map +0 -1
- package/dist/color/srgb-transfer.d.ts.map +0 -1
- package/dist/color/white-balance.d.ts.map +0 -1
- package/dist/composition/image-formation-plan.d.ts.map +0 -1
- package/dist/composition/plan-consumer.d.ts.map +0 -1
- package/dist/core/calculation-result.d.ts.map +0 -1
- package/dist/core/canonical-json.d.ts.map +0 -1
- package/dist/core/configuration-error.d.ts.map +0 -1
- package/dist/core/evidence-provenance.d.ts.map +0 -1
- package/dist/core/image-formation.d.ts.map +0 -1
- package/dist/core/owned-data.d.ts.map +0 -1
- package/dist/core/record-validation.d.ts.map +0 -1
- package/dist/core/scientific-assurance.d.ts.map +0 -1
- package/dist/core/spectral-composition.d.ts.map +0 -1
- package/dist/core/spectral.d.ts.map +0 -1
- package/dist/core/validation.d.ts.map +0 -1
- package/dist/core/version.d.ts.map +0 -1
- package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
- package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
- package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
- package/dist/equipment/iso-capabilities.d.ts.map +0 -1
- package/dist/equipment/metering-capabilities.d.ts.map +0 -1
- package/dist/equipment/release-capabilities.d.ts.map +0 -1
- package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
- package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
- package/dist/exposure/exposure.d.ts.map +0 -1
- package/dist/exposure/flash.d.ts.map +0 -1
- package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
- package/dist/exposure/metering-target.d.ts.map +0 -1
- package/dist/exposure/metering-temporal.d.ts.map +0 -1
- package/dist/exposure/metering.d.ts.map +0 -1
- package/dist/exposure/program-line.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/motion/camera-rotation.d.ts.map +0 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/extended-object-projection.d.ts.map +0 -1
- package/dist/motion/projected-motion.d.ts.map +0 -1
- package/dist/optics/aperture.d.ts.map +0 -1
- package/dist/optics/circle-of-confusion.d.ts.map +0 -1
- package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
- package/dist/optics/depth-of-field.d.ts.map +0 -1
- package/dist/optics/diffraction.d.ts.map +0 -1
- package/dist/optics/focus-breathing.d.ts.map +0 -1
- package/dist/optics/focus-state.d.ts.map +0 -1
- package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
- package/dist/optics/illumination-vignetting.d.ts.map +0 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
- package/dist/optics/lens-psf-profile.d.ts.map +0 -1
- package/dist/optics/polygon-diffraction.d.ts.map +0 -1
- package/dist/optics/profile-contract.d.ts.map +0 -1
- package/dist/optics/psf-foundation.d.ts.map +0 -1
- package/dist/optics/radial-distortion.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
- package/dist/optics/sensor-environment-query.d.ts.map +0 -1
- package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-psf-support.d.ts.map +0 -1
- package/dist/optics/stray-light.d.ts.map +0 -1
- package/dist/optics/thin-lens.d.ts.map +0 -1
- package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
- package/dist/output/capture-geometry.d.ts.map +0 -1
- package/dist/output/capture-sdr.d.ts.map +0 -1
- package/dist/output/crop.d.ts.map +0 -1
- package/dist/output/geometric-transforms.d.ts.map +0 -1
- package/dist/output/lens-corrections.d.ts.map +0 -1
- package/dist/output/native-capture-sdr.d.ts.map +0 -1
- package/dist/output/print-contrast-reference.d.ts.map +0 -1
- package/dist/output/print-detail.d.ts.map +0 -1
- package/dist/output/print-jpeg.d.ts.map +0 -1
- package/dist/output/print-plan.d.ts.map +0 -1
- package/dist/output/print-region-statistics.d.ts.map +0 -1
- package/dist/output/sdr-rendering.d.ts.map +0 -1
- package/dist/output/subject-framing-crop.d.ts.map +0 -1
- package/dist/schema/camera.d.ts.map +0 -1
- package/dist/schema/camera.js +0 -3
- package/dist/schema/camera.js.map +0 -1
- package/dist/schema/illumination-spectral.d.ts.map +0 -1
- package/dist/schema/illumination-temporal.d.ts.map +0 -1
- package/dist/schema/illumination.d.ts.map +0 -1
- package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
- package/dist/schema/scene-radiance.d.ts.map +0 -1
- package/dist/schema/scene.d.ts.map +0 -1
- package/dist/schema/scene.js +0 -3
- package/dist/schema/scene.js.map +0 -1
- package/dist/schema/validation.d.ts.map +0 -1
- package/dist/sensor/accumulated-charge.d.ts.map +0 -1
- package/dist/sensor/architecture.d.ts.map +0 -1
- package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
- package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
- package/dist/sensor/capture-mode.d.ts.map +0 -1
- package/dist/sensor/color-sampling.d.ts.map +0 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
- package/dist/sensor/dark-current.d.ts.map +0 -1
- package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
- package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
- package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/exposure-window.d.ts.map +0 -1
- package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
- package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
- package/dist/sensor/optical-stack.d.ts.map +0 -1
- package/dist/sensor/photon-energy.d.ts.map +0 -1
- package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
- package/dist/sensor/pixel-pitch.d.ts.map +0 -1
- package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
- package/dist/sensor/raw-readout.d.ts.map +0 -1
- package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
- package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
- package/dist/sensor/readout-timing.d.ts.map +0 -1
- package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
- package/dist/sensor/response-operating-range.d.ts.map +0 -1
- package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
- package/dist/sensor/sampling-aperture.d.ts.map +0 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/sensor-geometry.d.ts.map +0 -1
- package/dist/sensor/signal-noise.d.ts.map +0 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
- package/dist/sensor/spectral-coverage.d.ts.map +0 -1
- package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
- package/dist/sensor/spectral-response.d.ts.map +0 -1
- package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
- package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
- package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
- package/dist/simulation/poc-simulation.d.ts.map +0 -1
- package/dist/stabilization/camera-shake.d.ts.map +0 -1
- package/dist/stabilization/system.d.ts.map +0 -1
- package/docs/API_STYLE.md +0 -235
- package/docs/ARCHITECTURE.md +0 -356
- package/docs/AUTOMATION_COORDINATION.md +0 -190
- package/docs/CAPTURE_COLOR.md +0 -25
- package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
- package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
- package/docs/CAPTURE_SDR.md +0 -22
- package/docs/DEVELOPERS.md +0 -68
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
- package/docs/EXPORT_ACCEPTANCE.md +0 -133
- package/docs/GENERIC_TIER_PRESETS.md +0 -269
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
- package/docs/IMAGE_FORMATION.md +0 -247
- package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
- package/docs/MOTION_AND_SIGNAL.md +0 -250
- package/docs/NATIVE_CAPTURE_SDR.md +0 -70
- package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
- package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
- package/docs/NATIVE_RAW_AND_PRINT.md +0 -47
- package/docs/NUMERICAL_CORRECTNESS.md +0 -191
- package/docs/PERFORMANCE_BASELINE.md +0 -56
- package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
- package/docs/PHYSICS_FOUNDATION.md +0 -426
- package/docs/POC_API.md +0 -278
- package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
- package/docs/POC_PROJECTION_REUSE.md +0 -124
- package/docs/PRINT_195_196_REVIEW.md +0 -93
- package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
- package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
- package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
- package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
- package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
- package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
- package/docs/PRINT_PLANNING.md +0 -75
- package/docs/PRINT_REGION_STATISTICS.md +0 -38
- package/docs/PROCESSED_OUTPUT.md +0 -157
- package/docs/PRODUCTION_COMPOSITION.md +0 -373
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
- package/docs/PROVENANCE.md +0 -115
- package/docs/PSF_FOUNDATION.md +0 -165
- package/docs/RAW_FRAME_ENVELOPE.md +0 -56
- package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
- package/docs/RELEASE_1_0.md +0 -66
- package/docs/RELEASE_1_0_1.md +0 -61
- package/docs/RELEASE_1_1_0.md +0 -25
- package/docs/RELEASE_1_2_0.md +0 -51
- package/docs/RELEASE_1_3_0.md +0 -15
- package/docs/RELEASE_1_4_0.md +0 -23
- package/docs/RELEASE_AUDIT.md +0 -39
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
- package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
- package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
- package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
- package/docs/SDR_RENDERING.md +0 -33
- package/docs/SENSOR_APERTURE_RAYS.md +0 -23
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
- package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
- package/docs/SENSOR_RAW_FRAME.md +0 -20
- package/docs/SENSOR_RAW_PRODUCER.md +0 -77
- package/docs/SIGNAL_CONFORMANCE.md +0 -23
- package/docs/SIMULATED_CAPTURE.md +0 -65
- package/docs/STABILIZATION.md +0 -234
- package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
- package/docs/TIER_ACCEPTANCE.md +0 -129
- package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
- package/docs/V1_COMPOSITION_MAP.md +0 -123
- package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
- package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
- package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
- package/docs/licenses/castleCSF-MIT.txt +0 -21
- package/docs/validation/documentation-fragments.json +0 -212
- package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
- package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
- package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
- package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
- package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
- package/docs/validation/print-196-candidate-capabilities.json +0 -28
- package/docs/validation/print-196-candidate-evidence.json +0 -356
- package/docs/validation/print-196-engine-acceptance.json +0 -81
- package/docs/validation/print-detail-capabilities.json +0 -103
- package/docs/validation/print-detail-jpeg-evidence.json +0 -116
- package/docs/validation/print-detail-sdr-evidence.json +0 -81
- package/docs/validation/release-audit-inventory.json +0 -1306
- package/docs/validation/tier-acceptance-report-v1.json +0 -2538
|
@@ -1,39 +1,119 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* The SDR (standard dynamic range) reference renderer: linear sRGB → rendering exposure → tone
|
|
4
|
+
* curve → gamut handling → sRGB transfer → integer codes.
|
|
5
|
+
*
|
|
6
|
+
* It takes linear RGB that already has colour and white balance (WB) applied. Unknown HDR or
|
|
7
|
+
* display modes are rejected.
|
|
6
8
|
* @see docs/SDR_RENDERING.md for equations, coordinate/unit conventions, blockers and support limits.
|
|
7
9
|
*/
|
|
8
10
|
import { encodeSrgbComponent } from "../color/srgb-transfer.js";
|
|
11
|
+
import { resolveCaptureColorModel } from "../color/capture-color.js";
|
|
9
12
|
import { requireAllowlistedRecord, requirePublicOpaqueId } from "../core/record-validation.js";
|
|
10
13
|
import { calculatedResult } from "../core/calculation-result.js";
|
|
11
14
|
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
12
15
|
import { InvalidScientificResultError } from "../core/validation.js";
|
|
13
16
|
export const SDR_RENDERING_SCHEMA_VERSION = "0.1.0";
|
|
17
|
+
/**
|
|
18
|
+
* Version of the `generic-sdr-rendering-reference` model. 0.2.0 added luminance tone curves and fixed
|
|
19
|
+
* round-to-nearest, ties up (`Math.round`; the old `Math.floor(x+.5)` rounded 0.49999999999999994 up).
|
|
20
|
+
*/
|
|
21
|
+
export const SDR_RENDERING_MODEL_VERSION = "0.2.0";
|
|
14
22
|
function object(v, keys) {
|
|
15
23
|
return requireAllowlistedRecord(v, keys, "Invalid SDR fields.");
|
|
16
24
|
}
|
|
17
25
|
function publicId(v) {
|
|
18
26
|
return requirePublicOpaqueId(v, "Invalid public SDR identity.");
|
|
19
27
|
}
|
|
20
|
-
|
|
28
|
+
function bounded(value, minimumExclusive, maximum) {
|
|
29
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= minimumExclusive || value > maximum) {
|
|
30
|
+
throw new InvalidConfigurationError("Unsupported SDR tone-curve parameters.");
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
function parseToneCurveParameters(curve, value) {
|
|
35
|
+
if (curve === "identity" || curve === "positive-reinhard-per-channel") {
|
|
36
|
+
if (value !== undefined)
|
|
37
|
+
throw new InvalidConfigurationError("Per-channel tone curves take no parameters.");
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
if (curve === "extended-reinhard-luminance") {
|
|
41
|
+
const p = requireAllowlistedRecord(value, ["whiteLuminance"], "Invalid SDR tone-curve parameters.");
|
|
42
|
+
return { whiteLuminance: bounded(p.whiteLuminance, 0, 65536) };
|
|
43
|
+
}
|
|
44
|
+
if (curve === "naka-rushton-luminance") {
|
|
45
|
+
const p = requireAllowlistedRecord(value, ["exponent", "semiSaturation", "whiteLuminance"], "Invalid SDR tone-curve parameters.");
|
|
46
|
+
const exponent = bounded(p.exponent, 0, 4);
|
|
47
|
+
if (exponent < .25)
|
|
48
|
+
throw new InvalidConfigurationError("Unsupported SDR tone-curve parameters.");
|
|
49
|
+
return { exponent, semiSaturation: bounded(p.semiSaturation, 0, 64), whiteLuminance: bounded(p.whiteLuminance, 0, 65536) };
|
|
50
|
+
}
|
|
51
|
+
throw new InvalidConfigurationError("Unsupported SDR rendering profile.");
|
|
52
|
+
}
|
|
53
|
+
/** Linear-sRGB/D65 relative-luminance weights: the Y row of the engine's sRGB to XYZ matrix (W3C CSS Color 4 sRGB; also IEC 61966-2-1). */
|
|
54
|
+
const LUMINANCE = resolveCaptureColorModel().cameraRgbToXyz[1];
|
|
55
|
+
/**
|
|
56
|
+
* Internal shared tone operator. The reference renderer, the native SDR kernel and RAW development all
|
|
57
|
+
* call this one function, so every path uses the same per-pixel operation order. Not exported from the package.
|
|
58
|
+
*/
|
|
59
|
+
export function prepareSdrPixelTone(profile) {
|
|
60
|
+
const curve = profile.toneCurve, p = profile.toneCurveParameters;
|
|
61
|
+
if (curve === "identity")
|
|
62
|
+
return (r, g, b, out) => { out[0] = r; out[1] = g; out[2] = b; };
|
|
63
|
+
if (curve === "positive-reinhard-per-channel")
|
|
64
|
+
return (r, g, b, out) => {
|
|
65
|
+
out[0] = r > 0 ? r / (1 + r) : r;
|
|
66
|
+
out[1] = g > 0 ? g / (1 + g) : g;
|
|
67
|
+
out[2] = b > 0 ? b / (1 + b) : b;
|
|
68
|
+
};
|
|
69
|
+
let map;
|
|
70
|
+
if (curve === "extended-reinhard-luminance" && p && !("exponent" in p)) {
|
|
71
|
+
const white2 = p.whiteLuminance * p.whiteLuminance;
|
|
72
|
+
// Written as L/(1+L)·(1+L/Lw²) so a very large finite L cannot overflow an intermediate product.
|
|
73
|
+
map = (l) => l / (1 + l) * (1 + l / white2);
|
|
74
|
+
}
|
|
75
|
+
else if (curve === "naka-rushton-luminance" && p && "exponent" in p) {
|
|
76
|
+
// g(L) = Lⁿ/(Lⁿ+σⁿ) = 1/(1+(σ/L)ⁿ): no overflow for large L.
|
|
77
|
+
const q = p;
|
|
78
|
+
const n = q.exponent, sigma = q.semiSaturation, g = (l) => 1 / (1 + (sigma / l) ** n), white = g(q.whiteLuminance);
|
|
79
|
+
map = (l) => g(l) / white;
|
|
80
|
+
}
|
|
81
|
+
else
|
|
82
|
+
throw new InvalidConfigurationError("Unsupported SDR rendering profile.");
|
|
83
|
+
const kr = LUMINANCE[0], kg = LUMINANCE[1], kb = LUMINANCE[2];
|
|
84
|
+
return (r, g, b, out) => {
|
|
85
|
+
const l = kr * r + kg * g + kb * b;
|
|
86
|
+
if (!(l > 0)) {
|
|
87
|
+
out[0] = r;
|
|
88
|
+
out[1] = g;
|
|
89
|
+
out[2] = b;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const ratio = map(l) / l, mr = r * ratio, mg = g * ratio, mb = b * ratio;
|
|
93
|
+
if (!Number.isFinite(mr) || !Number.isFinite(mg) || !Number.isFinite(mb))
|
|
94
|
+
throw new InvalidScientificResultError("Tone mapping produced a non-finite sample.");
|
|
95
|
+
out[0] = mr;
|
|
96
|
+
out[1] = mg;
|
|
97
|
+
out[2] = mb;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** Validates a rendering and encoding profile. Unknown HDR or display modes are rejected. */
|
|
21
101
|
export function parseSdrRenderingProfile(value) {
|
|
22
|
-
const r = object(value, ["schemaVersion", "profileId", "profileVersion", "renderingExposureEv", "toneCurve", "gamutHandling",
|
|
102
|
+
const r = object(value, ["schemaVersion", "profileId", "profileVersion", "renderingExposureEv", "toneCurve", "toneCurveParameters", "gamutHandling",
|
|
23
103
|
"outputDynamicRange", "transferFunction", "bitDepth", "rounding", "dither"]);
|
|
104
|
+
const toneCurveParameters = parseToneCurveParameters(r.toneCurve, r.toneCurveParameters);
|
|
24
105
|
if (r.schemaVersion !== SDR_RENDERING_SCHEMA_VERSION || typeof r.renderingExposureEv !== "number" ||
|
|
25
106
|
!Number.isFinite(r.renderingExposureEv) || Math.abs(r.renderingExposureEv) > 32 ||
|
|
26
|
-
(r.toneCurve !== "identity" && r.toneCurve !== "positive-reinhard-per-channel") ||
|
|
27
107
|
(r.gamutHandling !== "clip-components" && r.gamutHandling !== "reject-out-of-range") ||
|
|
28
108
|
r.outputDynamicRange !== "sdr" || r.transferFunction !== "srgb" || (r.bitDepth !== 8 && r.bitDepth !== 16) ||
|
|
29
109
|
r.rounding !== "nearest-ties-up" || r.dither !== "none")
|
|
30
110
|
throw new InvalidConfigurationError("Unsupported SDR rendering profile.");
|
|
31
111
|
return { schemaVersion: SDR_RENDERING_SCHEMA_VERSION, profileId: publicId(r.profileId), profileVersion: publicId(r.profileVersion),
|
|
32
112
|
renderingExposureEv: Object.is(r.renderingExposureEv, -0) ? 0 : r.renderingExposureEv, toneCurve: r.toneCurve,
|
|
33
|
-
gamutHandling: r.gamutHandling, outputDynamicRange: r.outputDynamicRange, transferFunction: r.transferFunction,
|
|
113
|
+
...(toneCurveParameters === undefined ? {} : { toneCurveParameters }), gamutHandling: r.gamutHandling, outputDynamicRange: r.outputDynamicRange, transferFunction: r.transferFunction,
|
|
34
114
|
bitDepth: r.bitDepth, rounding: r.rounding, dither: r.dither };
|
|
35
115
|
}
|
|
36
|
-
/** Validates declared image state and a bounded finite inline
|
|
116
|
+
/** Validates the declared image state and a bounded, finite, inline image. It never applies white balance or colour conversion. */
|
|
37
117
|
export function parseSdrRenderingInput(value) {
|
|
38
118
|
const r = object(value, ["sourceImageStateId", "inputImageState", "inputColorSpace", "whiteBalanceHandling",
|
|
39
119
|
"pixelWidth", "pixelHeight", "referenceWhiteValue", "samples", "profile"]);
|
|
@@ -54,7 +134,8 @@ export function parseSdrRenderingInput(value) {
|
|
|
54
134
|
}
|
|
55
135
|
/**
|
|
56
136
|
* Standalone SDR rendering: rendering exposure → tone → gamut → sRGB transfer → quantization.
|
|
57
|
-
* No physical capture, metering,
|
|
137
|
+
* No physical capture, metering, white balance, colour conversion, lens correction or display
|
|
138
|
+
* adaptation runs.
|
|
58
139
|
*/
|
|
59
140
|
export function calculateSdrRendering(input) {
|
|
60
141
|
const value = parseSdrRenderingInput(input), p = value.profile;
|
|
@@ -62,19 +143,26 @@ export function calculateSdrRendering(input) {
|
|
|
62
143
|
if (!Number.isFinite(scale) || scale <= 0)
|
|
63
144
|
throw new InvalidScientificResultError("Rendering scale is non-finite/unrepresentable.");
|
|
64
145
|
let negative = 0, above = 0, changed = 0, low = 0, high = 0;
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
146
|
+
const toneOf = prepareSdrPixelTone(p), exposed = [0, 0, 0], mapped = [0, 0, 0], tone = [];
|
|
147
|
+
for (let i = 0; i < value.samples.length; i += 3) {
|
|
148
|
+
for (let c = 0; c < 3; c++) {
|
|
149
|
+
const e = value.samples[i + c] * scale;
|
|
150
|
+
if (!Number.isFinite(e))
|
|
151
|
+
throw new InvalidScientificResultError("Rendering exposure produced a non-finite sample.");
|
|
152
|
+
if (e < 0)
|
|
153
|
+
negative++;
|
|
154
|
+
if (e > 1)
|
|
155
|
+
above++;
|
|
156
|
+
exposed[c] = e;
|
|
157
|
+
}
|
|
158
|
+
toneOf(exposed[0], exposed[1], exposed[2], mapped);
|
|
159
|
+
for (let c = 0; c < 3; c++) {
|
|
160
|
+
const m = mapped[c];
|
|
161
|
+
if (m !== exposed[c])
|
|
162
|
+
changed++;
|
|
163
|
+
tone.push(m === 0 ? 0 : m);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
78
166
|
const linear = tone.map((sample) => {
|
|
79
167
|
if (sample < 0 || sample > 1) {
|
|
80
168
|
if (p.gamutHandling === "reject-out-of-range")
|
|
@@ -90,7 +178,8 @@ export function calculateSdrRendering(input) {
|
|
|
90
178
|
});
|
|
91
179
|
const encoded = linear.map(encodeSrgbComponent);
|
|
92
180
|
const maximum = 2 ** p.bitDepth - 1;
|
|
93
|
-
|
|
181
|
+
// Nearest, ties up: encoded samples are in [0,1], where Math.round is exact ties-up rounding.
|
|
182
|
+
const codes = encoded.map((sample) => Math.round(sample * maximum));
|
|
94
183
|
return calculatedResult({ schemaVersion: SDR_RENDERING_SCHEMA_VERSION, sourceImageStateId: value.sourceImageStateId,
|
|
95
184
|
profile: p, pixelWidth: value.pixelWidth, pixelHeight: value.pixelHeight, channelOrder: ["red", "green", "blue"],
|
|
96
185
|
whiteBalanceHandling: value.whiteBalanceHandling, toneMappedLinearSamples: tone, outputLinearSamples: linear,
|
|
@@ -99,8 +188,8 @@ export function calculateSdrRendering(input) {
|
|
|
99
188
|
whitePointXy: [.3127, .3290], referenceWhiteLuminanceCdM2: 80, codeMinimum: 0, codeMaximum: maximum },
|
|
100
189
|
diagnostics: { renderingNegativeSampleCount: negative, renderingAboveReferenceSampleCount: above,
|
|
101
190
|
toneChangedSampleCount: changed, gamutClippedLowSampleCount: low, gamutClippedHighSampleCount: high, captureSaturation: "not-consumed" },
|
|
102
|
-
displayAdaptation: { kind: "external-platform", applied: false, displayCapabilities: "unknown" } }, "generic-sdr-rendering-reference",
|
|
103
|
-
"Per-channel positive Reinhard can change chromaticity; component clipping is not perceptual gamut mapping",
|
|
191
|
+
displayAdaptation: { kind: "external-platform", applied: false, displayCapabilities: "unknown" } }, "generic-sdr-rendering-reference", SDR_RENDERING_MODEL_VERSION, ["Deterministic first-party rendering choice, not a calibrated camera look or scene-light model",
|
|
192
|
+
"Per-channel positive Reinhard can change chromaticity; luminance curves preserve chromaticity until component clipping, which is not perceptual gamut mapping",
|
|
104
193
|
"Input WB/color completion is a producer declaration; capture/correction adapter and production activation remain pending",
|
|
105
194
|
"sRGB reference encoding assumptions do not establish actual display luminance, saturation or viewing conditions"]);
|
|
106
195
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdr-rendering.js","sourceRoot":"","sources":["../../src/output/sdr-rendering.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sdr-rendering.js","sourceRoot":"","sources":["../../src/output/sdr-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * The SDR (standard dynamic range) reference renderer: linear sRGB → rendering exposure → tone\n * curve → gamut handling → sRGB transfer → integer codes.\n *\n * It takes linear RGB that already has colour and white balance (WB) applied. Unknown HDR or\n * display modes are rejected.\n * @see docs/SDR_RENDERING.md for equations, coordinate/unit conventions, blockers and support limits.\n */\n\nimport { encodeSrgbComponent } from \"../color/srgb-transfer.js\";\nimport { resolveCaptureColorModel } from \"../color/capture-color.js\";\nimport { requireAllowlistedRecord, requirePublicOpaqueId } from \"../core/record-validation.js\";\nimport { calculatedResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { InvalidScientificResultError } from \"../core/validation.js\";\n\nexport const SDR_RENDERING_SCHEMA_VERSION = \"0.1.0\" as const;\n/**\n * Version of the `generic-sdr-rendering-reference` model. 0.2.0 added luminance tone curves and fixed\n * round-to-nearest, ties up (`Math.round`; the old `Math.floor(x+.5)` rounded 0.49999999999999994 up).\n */\nexport const SDR_RENDERING_MODEL_VERSION = \"0.2.0\" as const;\n/**\n * Tone curves. A per-channel curve acts on each exposed component separately. A luminance curve\n * scales all three components of a pixel by f(L)/L, where L is the linear-sRGB/D65 relative\n * luminance, so the colour (chromaticity) is kept before gamut handling.\n * - `identity`: f(x)=x.\n * - `positive-reinhard-per-channel`: f(x)=x/(1+x) for x>0 (Reinhard et al. 2002, eq. 3), per channel.\n * - `extended-reinhard-luminance`: f(L)=L(1+L/Lw²)/(1+L) (Reinhard et al. 2002, eq. 4); L=Lw maps to 1.\n * - `naka-rushton-luminance`: f(L)=g(L)/g(Lw), g(L)=Lⁿ/(Lⁿ+σⁿ) (Naka & Rushton 1966; Reinhard & Devlin\n * 2005): a sigmoid in log luminance with contrast n and mid-response σ, i.e. a film-like S-curve.\n */\nexport type SdrToneCurve = \"identity\" | \"positive-reinhard-per-channel\" | \"extended-reinhard-luminance\" | \"naka-rushton-luminance\";\n/** Required only by luminance curves; all values are relative linear luminance after rendering exposure. */\nexport type SdrToneCurveParameters =\n | { whiteLuminance: number }\n | { exponent: number; semiSaturation: number; whiteLuminance: number };\n/** Rendering choices made by the engine user. They are independent of physical exposure and display calibration. */\nexport interface SdrRenderingProfile {\n schemaVersion: typeof SDR_RENDERING_SCHEMA_VERSION;\n profileId: string;\n profileVersion: string;\n renderingExposureEv: number;\n toneCurve: SdrToneCurve;\n /** Present exactly for `extended-reinhard-luminance` ({whiteLuminance}) and `naka-rushton-luminance`. */\n toneCurveParameters?: SdrToneCurveParameters;\n gamutHandling: \"clip-components\" | \"reject-out-of-range\";\n outputDynamicRange: \"sdr\";\n transferFunction: \"srgb\";\n bitDepth: 8 | 16;\n rounding: \"nearest-ties-up\";\n dither: \"none\";\n}\n/** Only linear-sRGB/D65 data that has been explicitly colour-transformed, with all three channels at each pixel, is accepted. */\nexport interface SdrRenderingInput {\n sourceImageStateId: string;\n inputImageState: \"color-transformed-linear-rgb\";\n inputColorSpace: \"linear-srgb-d65\";\n whiteBalanceHandling: \"already-applied-upstream\" | \"not-required\";\n pixelWidth: number;\n pixelHeight: number;\n referenceWhiteValue: number;\n /** Relative linear RGB, row-major tightly interleaved red/green/blue. */\n samples: readonly number[];\n profile: SdrRenderingProfile;\n}\nfunction object(v: unknown, keys: readonly string[]): Record<string, unknown> {\n return requireAllowlistedRecord(v, keys, \"Invalid SDR fields.\");\n}\nfunction publicId(v: unknown): string {\n return requirePublicOpaqueId(v, \"Invalid public SDR identity.\");\n}\nfunction bounded(value: unknown, minimumExclusive: number, maximum: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= minimumExclusive || value > maximum) {\n throw new InvalidConfigurationError(\"Unsupported SDR tone-curve parameters.\");\n }\n return value;\n}\nfunction parseToneCurveParameters(curve: unknown, value: unknown): SdrToneCurveParameters | undefined {\n if (curve === \"identity\" || curve === \"positive-reinhard-per-channel\") {\n if (value !== undefined) throw new InvalidConfigurationError(\"Per-channel tone curves take no parameters.\");\n return undefined;\n }\n if (curve === \"extended-reinhard-luminance\") {\n const p = requireAllowlistedRecord(value, [\"whiteLuminance\"], \"Invalid SDR tone-curve parameters.\");\n return { whiteLuminance: bounded(p.whiteLuminance, 0, 65536) };\n }\n if (curve === \"naka-rushton-luminance\") {\n const p = requireAllowlistedRecord(value, [\"exponent\", \"semiSaturation\", \"whiteLuminance\"], \"Invalid SDR tone-curve parameters.\");\n const exponent = bounded(p.exponent, 0, 4);\n if (exponent < .25) throw new InvalidConfigurationError(\"Unsupported SDR tone-curve parameters.\");\n return { exponent, semiSaturation: bounded(p.semiSaturation, 0, 64), whiteLuminance: bounded(p.whiteLuminance, 0, 65536) };\n }\n throw new InvalidConfigurationError(\"Unsupported SDR rendering profile.\");\n}\n/** Linear-sRGB/D65 relative-luminance weights: the Y row of the engine's sRGB to XYZ matrix (W3C CSS Color 4 sRGB; also IEC 61966-2-1). */\nconst LUMINANCE = resolveCaptureColorModel().cameraRgbToXyz[1]! as readonly number[];\n/** Writes the three tone-mapped samples of one exposed pixel. Exposed values are finite. */\nexport type SdrPixelTone = (red: number, green: number, blue: number, out: Float64Array | number[]) => void;\n/**\n * Internal shared tone operator. The reference renderer, the native SDR kernel and RAW development all\n * call this one function, so every path uses the same per-pixel operation order. Not exported from the package.\n */\nexport function prepareSdrPixelTone(profile: Pick<SdrRenderingProfile, \"toneCurve\" | \"toneCurveParameters\">): SdrPixelTone {\n const curve = profile.toneCurve, p = profile.toneCurveParameters;\n if (curve === \"identity\") return (r, g, b, out) => { out[0] = r; out[1] = g; out[2] = b; };\n if (curve === \"positive-reinhard-per-channel\") return (r, g, b, out) => {\n out[0] = r > 0 ? r/(1+r) : r; out[1] = g > 0 ? g/(1+g) : g; out[2] = b > 0 ? b/(1+b) : b;\n };\n let map: (l: number) => number;\n if (curve === \"extended-reinhard-luminance\" && p && !(\"exponent\" in p)) {\n const white2 = p.whiteLuminance*p.whiteLuminance;\n // Written as L/(1+L)·(1+L/Lw²) so a very large finite L cannot overflow an intermediate product.\n map = (l: number): number => l/(1+l)*(1+l/white2);\n } else if (curve === \"naka-rushton-luminance\" && p && \"exponent\" in p) {\n // g(L) = Lⁿ/(Lⁿ+σⁿ) = 1/(1+(σ/L)ⁿ): no overflow for large L.\n const q = p as Extract<SdrToneCurveParameters, { exponent: number }>;\n const n = q.exponent, sigma = q.semiSaturation, g = (l: number): number => 1/(1+(sigma/l)**n), white = g(q.whiteLuminance);\n map = (l: number): number => g(l)/white;\n } else throw new InvalidConfigurationError(\"Unsupported SDR rendering profile.\");\n const kr = LUMINANCE[0]!, kg = LUMINANCE[1]!, kb = LUMINANCE[2]!;\n return (r, g, b, out) => {\n const l = kr*r+kg*g+kb*b;\n if (!(l > 0)) { out[0] = r; out[1] = g; out[2] = b; return; }\n const ratio = map(l)/l, mr = r*ratio, mg = g*ratio, mb = b*ratio;\n if (!Number.isFinite(mr) || !Number.isFinite(mg) || !Number.isFinite(mb)) throw new InvalidScientificResultError(\"Tone mapping produced a non-finite sample.\");\n out[0] = mr; out[1] = mg; out[2] = mb;\n };\n}\n/** Validates a rendering and encoding profile. Unknown HDR or display modes are rejected. */\nexport function parseSdrRenderingProfile(value: unknown): SdrRenderingProfile {\n const r = object(value, [\"schemaVersion\", \"profileId\", \"profileVersion\", \"renderingExposureEv\", \"toneCurve\", \"toneCurveParameters\", \"gamutHandling\",\n \"outputDynamicRange\", \"transferFunction\", \"bitDepth\", \"rounding\", \"dither\"]);\n const toneCurveParameters = parseToneCurveParameters(r.toneCurve, r.toneCurveParameters);\n if (r.schemaVersion !== SDR_RENDERING_SCHEMA_VERSION || typeof r.renderingExposureEv !== \"number\" ||\n !Number.isFinite(r.renderingExposureEv) || Math.abs(r.renderingExposureEv) > 32 ||\n (r.gamutHandling !== \"clip-components\" && r.gamutHandling !== \"reject-out-of-range\") ||\n r.outputDynamicRange !== \"sdr\" || r.transferFunction !== \"srgb\" || (r.bitDepth !== 8 && r.bitDepth !== 16) ||\n r.rounding !== \"nearest-ties-up\" || r.dither !== \"none\") throw new InvalidConfigurationError(\"Unsupported SDR rendering profile.\");\n return { schemaVersion: SDR_RENDERING_SCHEMA_VERSION, profileId: publicId(r.profileId), profileVersion: publicId(r.profileVersion),\n renderingExposureEv: Object.is(r.renderingExposureEv, -0) ? 0 : r.renderingExposureEv, toneCurve: r.toneCurve as SdrToneCurve,\n ...(toneCurveParameters === undefined ? {} : { toneCurveParameters }), gamutHandling: r.gamutHandling, outputDynamicRange: r.outputDynamicRange, transferFunction: r.transferFunction,\n bitDepth: r.bitDepth, rounding: r.rounding, dither: r.dither };\n}\n/** Validates the declared image state and a bounded, finite, inline image. It never applies white balance or colour conversion. */\nexport function parseSdrRenderingInput(value: unknown): SdrRenderingInput {\n const r = object(value, [\"sourceImageStateId\", \"inputImageState\", \"inputColorSpace\", \"whiteBalanceHandling\",\n \"pixelWidth\", \"pixelHeight\", \"referenceWhiteValue\", \"samples\", \"profile\"]);\n const samples = r.samples;\n if (r.inputImageState !== \"color-transformed-linear-rgb\" || r.inputColorSpace !== \"linear-srgb-d65\" ||\n (r.whiteBalanceHandling !== \"already-applied-upstream\" && r.whiteBalanceHandling !== \"not-required\") ||\n typeof r.pixelWidth !== \"number\" || !Number.isSafeInteger(r.pixelWidth) || r.pixelWidth <= 0 ||\n typeof r.pixelHeight !== \"number\" || !Number.isSafeInteger(r.pixelHeight) || r.pixelHeight <= 0 ||\n typeof r.referenceWhiteValue !== \"number\" || !Number.isFinite(r.referenceWhiteValue) || r.referenceWhiteValue <= 0 ||\n !Array.isArray(samples) || samples.length !== r.pixelWidth*r.pixelHeight*3 || samples.length > 262144 ||\n Array.from({ length: samples.length }, (_, i) => i in samples).includes(false) ||\n samples.some((v) => typeof v !== \"number\" || !Number.isFinite(v))) throw new InvalidConfigurationError(\"Unsupported SDR input domain/raster.\");\n return { sourceImageStateId: publicId(r.sourceImageStateId), inputImageState: r.inputImageState, inputColorSpace: r.inputColorSpace,\n whiteBalanceHandling: r.whiteBalanceHandling, pixelWidth: r.pixelWidth, pixelHeight: r.pixelHeight,\n referenceWhiteValue: r.referenceWhiteValue, samples: samples.map((v: number) => Object.is(v, -0) ? 0 : v),\n profile: parseSdrRenderingProfile(r.profile) };\n}\nexport interface SdrRenderingResult {\n schemaVersion: typeof SDR_RENDERING_SCHEMA_VERSION;\n sourceImageStateId: string;\n profile: SdrRenderingProfile;\n pixelWidth: number;\n pixelHeight: number;\n channelOrder: readonly [\"red\", \"green\", \"blue\"];\n whiteBalanceHandling: SdrRenderingInput[\"whiteBalanceHandling\"];\n /** Relative normalized linear samples after exposure/tone, before gamut handling. */\n toneMappedLinearSamples: readonly number[];\n outputLinearSamples: readonly number[];\n outputEncodedSamples: readonly number[];\n integerSamples: readonly number[];\n outputEncoding: {\n imageState: \"output-referred-sdr\";\n colorSpace: \"srgb\";\n primariesXy: { red: readonly [number, number]; green: readonly [number, number]; blue: readonly [number, number] };\n whitePointXy: readonly [number, number];\n referenceWhiteLuminanceCdM2: 80;\n codeMinimum: 0;\n codeMaximum: number;\n };\n diagnostics: {\n renderingNegativeSampleCount: number;\n renderingAboveReferenceSampleCount: number;\n toneChangedSampleCount: number;\n gamutClippedLowSampleCount: number;\n gamutClippedHighSampleCount: number;\n /**\n * `not-consumed`: no upstream saturation data (full well, ADC or RAW) is available, and it is never\n * guessed from the output.\n * `consumed-in-raw-development`: RAW development already clipped or reconstructed flagged and\n * white-level samples before white balance (see its highlight diagnostics).\n */\n captureSaturation: \"not-consumed\" | \"consumed-in-raw-development\";\n };\n /** Describes the encoded output for the platform's colour management. No real display is assessed. */\n displayAdaptation: { kind: \"external-platform\"; applied: false; displayCapabilities: \"unknown\" };\n}\n/**\n * Standalone SDR rendering: rendering exposure → tone → gamut → sRGB transfer → quantization.\n * No physical capture, metering, white balance, colour conversion, lens correction or display\n * adaptation runs.\n */\nexport function calculateSdrRendering(input: SdrRenderingInput): CalculationResult<SdrRenderingResult> {\n const value = parseSdrRenderingInput(input), p = value.profile;\n const scale = 2**p.renderingExposureEv/value.referenceWhiteValue;\n if (!Number.isFinite(scale) || scale <= 0) throw new InvalidScientificResultError(\"Rendering scale is non-finite/unrepresentable.\");\n let negative = 0, above = 0, changed = 0, low = 0, high = 0;\n const toneOf = prepareSdrPixelTone(p), exposed = [0, 0, 0], mapped = [0, 0, 0], tone: number[] = [];\n for (let i = 0; i < value.samples.length; i += 3) {\n for (let c = 0; c < 3; c++) {\n const e = value.samples[i+c]!*scale;\n if (!Number.isFinite(e)) throw new InvalidScientificResultError(\"Rendering exposure produced a non-finite sample.\");\n if (e < 0) negative++;\n if (e > 1) above++;\n exposed[c] = e;\n }\n toneOf(exposed[0]!, exposed[1]!, exposed[2]!, mapped);\n for (let c = 0; c < 3; c++) {\n const m = mapped[c]!;\n if (m !== exposed[c]) changed++;\n tone.push(m === 0 ? 0 : m);\n }\n }\n const linear = tone.map((sample) => {\n if (sample < 0 || sample > 1) {\n if (p.gamutHandling === \"reject-out-of-range\") throw new InvalidConfigurationError(\"Tone output exceeds the declared SDR gamut range.\");\n if (sample < 0) { low++; return 0; }\n high++; return 1;\n }\n return sample;\n });\n const encoded = linear.map(encodeSrgbComponent);\n const maximum = 2**p.bitDepth-1;\n // Nearest, ties up: encoded samples are in [0,1], where Math.round is exact ties-up rounding.\n const codes = encoded.map((sample) => Math.round(sample*maximum));\n return calculatedResult({ schemaVersion: SDR_RENDERING_SCHEMA_VERSION, sourceImageStateId: value.sourceImageStateId,\n profile: p, pixelWidth: value.pixelWidth, pixelHeight: value.pixelHeight, channelOrder: [\"red\", \"green\", \"blue\"],\n whiteBalanceHandling: value.whiteBalanceHandling, toneMappedLinearSamples: tone, outputLinearSamples: linear,\n outputEncodedSamples: encoded, integerSamples: codes,\n outputEncoding: { imageState: \"output-referred-sdr\", colorSpace: \"srgb\", primariesXy: { red: [.64, .33], green: [.30, .60], blue: [.15, .06] },\n whitePointXy: [.3127, .3290], referenceWhiteLuminanceCdM2: 80, codeMinimum: 0, codeMaximum: maximum },\n diagnostics: { renderingNegativeSampleCount: negative, renderingAboveReferenceSampleCount: above,\n toneChangedSampleCount: changed, gamutClippedLowSampleCount: low, gamutClippedHighSampleCount: high, captureSaturation: \"not-consumed\" },\n displayAdaptation: { kind: \"external-platform\", applied: false, displayCapabilities: \"unknown\" } },\n \"generic-sdr-rendering-reference\", SDR_RENDERING_MODEL_VERSION,\n [\"Deterministic first-party rendering choice, not a calibrated camera look or scene-light model\",\n \"Per-channel positive Reinhard can change chromaticity; luminance curves preserve chromaticity until component clipping, which is not perceptual gamut mapping\",\n \"Input WB/color completion is a producer declaration; capture/correction adapter and production activation remain pending\",\n \"sRGB reference encoding assumptions do not establish actual display luminance, saturation or viewing conditions\"]);\n}\n"]}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* height. This calculation assumes a centered/positionable crop with enough spatial margin around the
|
|
5
|
-
* subject. It does not validate subject position against image edges.
|
|
2
|
+
* Subject framing: how much to crop (keeping the aspect ratio) so a subject fills a chosen share
|
|
3
|
+
* of the frame height.
|
|
6
4
|
* @see docs/PROCESSED_OUTPUT.md for equations, coordinate/unit conventions, blockers and support
|
|
7
5
|
* limits.
|
|
8
6
|
*/
|
|
@@ -33,12 +31,10 @@ export interface SubjectFramingCrop {
|
|
|
33
31
|
cropped: boolean;
|
|
34
32
|
}
|
|
35
33
|
/**
|
|
36
|
-
* Calculates the
|
|
37
|
-
* requested fraction of frame height.
|
|
34
|
+
* Calculates the crop (keeping the aspect ratio) that makes a subject fill a
|
|
35
|
+
* requested fraction of the frame height.
|
|
38
36
|
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* image edges.
|
|
37
|
+
* It assumes the crop can be centred or moved freely, with enough room around
|
|
38
|
+
* the subject. It does not check the subject's position against the image edges.
|
|
42
39
|
*/
|
|
43
40
|
export declare function calculateSubjectFramingCrop(input: CalculateSubjectFramingCropInput): CalculationResult<SubjectFramingCrop>;
|
|
44
|
-
//# sourceMappingURL=subject-framing-crop.d.ts.map
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* height. This calculation assumes a centered/positionable crop with enough spatial margin around the
|
|
6
|
-
* subject. It does not validate subject position against image edges.
|
|
3
|
+
* Subject framing: how much to crop (keeping the aspect ratio) so a subject fills a chosen share
|
|
4
|
+
* of the frame height.
|
|
7
5
|
* @see docs/PROCESSED_OUTPUT.md for equations, coordinate/unit conventions, blockers and support
|
|
8
6
|
* limits.
|
|
9
7
|
*/
|
|
10
8
|
import { calculatedResult } from "../core/calculation-result.js";
|
|
11
9
|
import { InvalidScientificInputError, requirePositiveFinite, requirePositiveInteger } from "../core/validation.js";
|
|
10
|
+
import { floorWholePixels } from "./crop.js";
|
|
11
|
+
import { requireInputKeys } from "../core/record-validation.js";
|
|
12
12
|
/**
|
|
13
|
-
* Calculates the
|
|
14
|
-
* requested fraction of frame height.
|
|
13
|
+
* Calculates the crop (keeping the aspect ratio) that makes a subject fill a
|
|
14
|
+
* requested fraction of the frame height.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* image edges.
|
|
16
|
+
* It assumes the crop can be centred or moved freely, with enough room around
|
|
17
|
+
* the subject. It does not check the subject's position against the image edges.
|
|
19
18
|
*/
|
|
20
19
|
export function calculateSubjectFramingCrop(input) {
|
|
20
|
+
requireInputKeys(input, "calculateSubjectFramingCrop", ["pixelWidth", "pixelHeight", "subjectHeightPixels", "targetSubjectHeightFraction"]);
|
|
21
21
|
requirePositiveInteger("pixelWidth", input.pixelWidth);
|
|
22
22
|
requirePositiveInteger("pixelHeight", input.pixelHeight);
|
|
23
23
|
requirePositiveFinite("subjectHeightPixels", input.subjectHeightPixels);
|
|
@@ -29,8 +29,18 @@ export function calculateSubjectFramingCrop(input) {
|
|
|
29
29
|
const cropFactor = requestedCropHeight >= input.pixelHeight
|
|
30
30
|
? 1
|
|
31
31
|
: input.pixelHeight / requestedCropHeight;
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
// Height is the limiting axis. Compute it straight from the requested crop
|
|
33
|
+
// height, not through H / (H / requested), whose rounding could lose a pixel.
|
|
34
|
+
// It is the largest whole-pixel height within the requested crop, so the
|
|
35
|
+
// subject fills at least the target fraction. It is never smaller than the
|
|
36
|
+
// subject, so rounding alone never clips the subject. Width follows from that
|
|
37
|
+
// integer height and the source aspect ratio.
|
|
38
|
+
const pixelHeight = cropFactor === 1
|
|
39
|
+
? input.pixelHeight
|
|
40
|
+
: Math.min(input.pixelHeight, Math.max(floorWholePixels(requestedCropHeight), Math.ceil(input.subjectHeightPixels)));
|
|
41
|
+
const pixelWidth = cropFactor === 1
|
|
42
|
+
? input.pixelWidth
|
|
43
|
+
: Math.max(1, Math.min(input.pixelWidth, Math.round((pixelHeight * input.pixelWidth) / input.pixelHeight)));
|
|
34
44
|
const subjectHeightFraction = input.subjectHeightPixels / pixelHeight;
|
|
35
45
|
return calculatedResult({
|
|
36
46
|
cropFactor,
|
|
@@ -40,8 +50,8 @@ export function calculateSubjectFramingCrop(input) {
|
|
|
40
50
|
subjectHeightFraction,
|
|
41
51
|
subjectClipped: subjectHeightFraction > 1,
|
|
42
52
|
cropped: cropFactor > 1
|
|
43
|
-
}, "subject-height-framing-crop", "
|
|
44
|
-
"
|
|
53
|
+
}, "subject-height-framing-crop", "2.0.0", [
|
|
54
|
+
"Crop height is the largest whole-pixel height within the requested crop, but never smaller than the subject; width is the nearest integer to the original aspect ratio",
|
|
45
55
|
"Crop can be positioned around the subject",
|
|
46
56
|
"Subject edge/margin constraints are not modeled",
|
|
47
57
|
"subjectHeightFraction may exceed 1 when the subject is clipped by frame height"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject-framing-crop.js","sourceRoot":"","sources":["../../src/output/subject-framing-crop.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC
|
|
1
|
+
{"version":3,"file":"subject-framing-crop.js","sourceRoot":"","sources":["../../src/output/subject-framing-crop.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;GAKG;AAEH,OAAO,EACL,gBAAgB,EAEjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AA6BhE;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAuC;IAEvC,gBAAgB,CAAC,KAAK,EAAE,6BAA6B,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAC5I,sBAAsB,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACvD,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACzD,qBAAqB,CAAC,qBAAqB,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACxE,qBAAqB,CACnB,6BAA6B,EAC7B,KAAK,CAAC,2BAA2B,CAClC,CAAC;IAEF,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,2BAA2B,CACnC,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GACvB,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC,2BAA2B,CAAC;IAChE,MAAM,UAAU,GACd,mBAAmB,IAAI,KAAK,CAAC,WAAW;QACtC,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,mBAAmB,CAAC;IAE9C,2EAA2E;IAC3E,8EAA8E;IAC9E,yEAAyE;IACzE,2EAA2E;IAC3E,8EAA8E;IAC9E,8CAA8C;IAC9C,MAAM,WAAW,GACf,UAAU,KAAK,CAAC;QACd,CAAC,CAAC,KAAK,CAAC,WAAW;QACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CACN,KAAK,CAAC,WAAW,EACjB,IAAI,CAAC,GAAG,CACN,gBAAgB,CAAC,mBAAmB,CAAC,EACrC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CACrC,CACF,CAAC;IACR,MAAM,UAAU,GACd,UAAU,KAAK,CAAC;QACd,CAAC,CAAC,KAAK,CAAC,UAAU;QAClB,CAAC,CAAC,IAAI,CAAC,GAAG,CACN,CAAC,EACD,IAAI,CAAC,GAAG,CACN,KAAK,CAAC,UAAU,EAChB,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CACjE,CACF,CAAC;IACR,MAAM,qBAAqB,GACzB,KAAK,CAAC,mBAAmB,GAAG,WAAW,CAAC;IAE1C,OAAO,gBAAgB,CACrB;QACE,UAAU;QACV,UAAU;QACV,WAAW;QACX,UAAU,EAAE,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,SAAS;QAClD,qBAAqB;QACrB,cAAc,EAAE,qBAAqB,GAAG,CAAC;QACzC,OAAO,EAAE,UAAU,GAAG,CAAC;KACxB,EACD,6BAA6B,EAC7B,OAAO,EACP;QACE,wKAAwK;QACxK,2CAA2C;QAC3C,iDAAiD;QACjD,gFAAgF;KACjF,CACF,CAAC;AACJ,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Subject framing: how much to crop (keeping the aspect ratio) so a subject fills a chosen share\n * of the frame height.\n * @see docs/PROCESSED_OUTPUT.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport {\n calculatedResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveFinite,\n requirePositiveInteger\n} from \"../core/validation.js\";\nimport { floorWholePixels } from \"./crop.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\n\nexport interface CalculateSubjectFramingCropInput {\n /** Source image width in pixels. */\n pixelWidth: number;\n /** Source image height in pixels. */\n pixelHeight: number;\n /** Projected subject height in source-image pixels. */\n subjectHeightPixels: number;\n /** Desired subject height as a fraction of output frame height, >0 and <=1. */\n targetSubjectHeightFraction: number;\n}\n\nexport interface SubjectFramingCrop {\n cropFactor: number;\n pixelWidth: number;\n pixelHeight: number;\n megapixels: number;\n /**\n * Actual subject height divided by cropped frame height.\n * Values greater than 1 mean the subject is taller than the output frame.\n */\n subjectHeightFraction: number;\n /** Whether the projected subject exceeds the cropped frame height. */\n subjectClipped: boolean;\n /** Whether achieving the target required an additional crop. */\n cropped: boolean;\n}\n\n/**\n * Calculates the crop (keeping the aspect ratio) that makes a subject fill a\n * requested fraction of the frame height.\n *\n * It assumes the crop can be centred or moved freely, with enough room around\n * the subject. It does not check the subject's position against the image edges.\n */\nexport function calculateSubjectFramingCrop(\n input: CalculateSubjectFramingCropInput\n): CalculationResult<SubjectFramingCrop> {\n requireInputKeys(input, \"calculateSubjectFramingCrop\", [\"pixelWidth\", \"pixelHeight\", \"subjectHeightPixels\", \"targetSubjectHeightFraction\"]);\n requirePositiveInteger(\"pixelWidth\", input.pixelWidth);\n requirePositiveInteger(\"pixelHeight\", input.pixelHeight);\n requirePositiveFinite(\"subjectHeightPixels\", input.subjectHeightPixels);\n requirePositiveFinite(\n \"targetSubjectHeightFraction\",\n input.targetSubjectHeightFraction\n );\n\n if (input.targetSubjectHeightFraction > 1) {\n throw new InvalidScientificInputError(\n \"targetSubjectHeightFraction must be less than or equal to 1.\"\n );\n }\n\n const requestedCropHeight =\n input.subjectHeightPixels / input.targetSubjectHeightFraction;\n const cropFactor =\n requestedCropHeight >= input.pixelHeight\n ? 1\n : input.pixelHeight / requestedCropHeight;\n\n // Height is the limiting axis. Compute it straight from the requested crop\n // height, not through H / (H / requested), whose rounding could lose a pixel.\n // It is the largest whole-pixel height within the requested crop, so the\n // subject fills at least the target fraction. It is never smaller than the\n // subject, so rounding alone never clips the subject. Width follows from that\n // integer height and the source aspect ratio.\n const pixelHeight =\n cropFactor === 1\n ? input.pixelHeight\n : Math.min(\n input.pixelHeight,\n Math.max(\n floorWholePixels(requestedCropHeight),\n Math.ceil(input.subjectHeightPixels)\n )\n );\n const pixelWidth =\n cropFactor === 1\n ? input.pixelWidth\n : Math.max(\n 1,\n Math.min(\n input.pixelWidth,\n Math.round((pixelHeight * input.pixelWidth) / input.pixelHeight)\n )\n );\n const subjectHeightFraction =\n input.subjectHeightPixels / pixelHeight;\n\n return calculatedResult(\n {\n cropFactor,\n pixelWidth,\n pixelHeight,\n megapixels: (pixelWidth * pixelHeight) / 1_000_000,\n subjectHeightFraction,\n subjectClipped: subjectHeightFraction > 1,\n cropped: cropFactor > 1\n },\n \"subject-height-framing-crop\",\n \"2.0.0\",\n [\n \"Crop height is the largest whole-pixel height within the requested crop, but never smaller than the subject; width is the nearest integer to the original aspect ratio\",\n \"Crop can be positioned around the subject\",\n \"Subject edge/margin constraints are not modeled\",\n \"subjectHeightFraction may exceed 1 when the subject is clipped by frame height\"\n ]\n );\n}\n"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { type ColorMatrix3x3 } from "../color/colorimetry-math.js";
|
|
2
|
+
import { type SensorColorSamplingProfile } from "../sensor/color-sampling.js";
|
|
3
|
+
import { type RawReconstructionBorderHandling } from "../sensor/raw-reconstruction.js";
|
|
4
|
+
import { type RawFrameReconstructionPhaseProfile } from "../capture/raw-frame-reconstruction.js";
|
|
5
|
+
import { type ProcessingProvenance, type ProcessingProvider, type ProcessingRgbImage, type ProcessingTask } from "./processing-task.js";
|
|
6
|
+
/** A single-channel linear CFA mosaic in absolute native site coordinates (row-major, +Y down). */
|
|
7
|
+
export interface CfaMosaicPlane {
|
|
8
|
+
width: number;
|
|
9
|
+
height: number;
|
|
10
|
+
captureModeId: string;
|
|
11
|
+
/** Periodic mosaic anchored at site (0, 0) of this plane. */
|
|
12
|
+
colorSamplingProfile: SensorColorSamplingProfile;
|
|
13
|
+
/** Linear values, e.g. black-subtracted normalized RAW or merged HDR radiance. */
|
|
14
|
+
samples: Float32Array;
|
|
15
|
+
}
|
|
16
|
+
export interface CfaPlaneReconstructionInput {
|
|
17
|
+
plane: CfaMosaicPlane;
|
|
18
|
+
phaseProfiles: readonly RawFrameReconstructionPhaseProfile[];
|
|
19
|
+
/** Default `reject`: every neighbourhood must lie inside the plane. */
|
|
20
|
+
borderHandling?: RawReconstructionBorderHandling;
|
|
21
|
+
/** Output region in plane coordinates; default the whole plane. */
|
|
22
|
+
region?: {
|
|
23
|
+
x: number;
|
|
24
|
+
y: number;
|
|
25
|
+
width: number;
|
|
26
|
+
height: number;
|
|
27
|
+
};
|
|
28
|
+
maximumWorkingBytes?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface CfaPlaneReconstructionOutput {
|
|
31
|
+
width: number;
|
|
32
|
+
height: number;
|
|
33
|
+
region: {
|
|
34
|
+
x: number;
|
|
35
|
+
y: number;
|
|
36
|
+
width: number;
|
|
37
|
+
height: number;
|
|
38
|
+
};
|
|
39
|
+
channelIds: readonly string[];
|
|
40
|
+
/** Interleaved `channelIds.length` channels, row-major over the region. */
|
|
41
|
+
data: Float32Array;
|
|
42
|
+
borderHandling: RawReconstructionBorderHandling;
|
|
43
|
+
provenance: ProcessingProvenance;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Runs explicit linear reconstruction kernels, one per CFA phase, over a typed CFA plane.
|
|
47
|
+
* - With `mirror` borders, a site outside the plane is read from its mirrored (reflect-101) position.
|
|
48
|
+
* This is accepted only if the mirrored site has the same CFA channel, which is always true for a
|
|
49
|
+
* 2×2 Bayer pattern.
|
|
50
|
+
* - With `reject`, out-of-plane reads throw (fail closed), like the reference resolver.
|
|
51
|
+
* Values are linear and signed. No clamping, white balance or colour transform is applied.
|
|
52
|
+
*/
|
|
53
|
+
export declare function createCfaPlaneReconstructionTask(input: CfaPlaneReconstructionInput, provider: ProcessingProvider): ProcessingTask<CfaPlaneReconstructionOutput>;
|
|
54
|
+
export interface AhdDemosaicInput {
|
|
55
|
+
plane: CfaMosaicPlane;
|
|
56
|
+
/** CFA channel ids of the red, green and blue sites; output order is red, green, blue. */
|
|
57
|
+
channelRoles: {
|
|
58
|
+
red: string;
|
|
59
|
+
green: string;
|
|
60
|
+
blue: string;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Camera-linear RGB → CIE XYZ, used only for the homogeneity metric (in CIELAB). Default: the
|
|
64
|
+
* sRGB/D65 matrix, so the plane is treated as linear sRGB for the metric. Output values are never
|
|
65
|
+
* transformed.
|
|
66
|
+
*/
|
|
67
|
+
cameraToXyz?: ColorMatrix3x3;
|
|
68
|
+
maximumWorkingBytes?: number;
|
|
69
|
+
}
|
|
70
|
+
export interface AhdDemosaicOutput extends ProcessingRgbImage {
|
|
71
|
+
/** Per pixel: 0 horizontal, 1 vertical, 2 equal homogeneity (average of both). */
|
|
72
|
+
direction: Uint8Array;
|
|
73
|
+
provenance: ProcessingProvenance;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Adaptive homogeneity-directed (AHD) demosaicing after Hirakawa & Parks, IEEE TIP 14(3), 2005:
|
|
77
|
+
* 1. green is interpolated separately along rows and columns with the 5-tap directional filter
|
|
78
|
+
* [−1/4, 1/2, 1/2, 1/2, −1/4] (bilinear green plus the own-channel second difference);
|
|
79
|
+
* 2. red and blue are filled from bilinearly interpolated colour differences (R−G, B−G) against each
|
|
80
|
+
* directional green, giving two full-colour candidates;
|
|
81
|
+
* 3. both candidates are converted to CIELAB. At each pixel, the homogeneity is the number of
|
|
82
|
+
* 4-neighbours within adaptive luminance and chrominance tolerances ε_L, ε_C. Each tolerance is the
|
|
83
|
+
* smaller of the two directions' largest differences along their own direction;
|
|
84
|
+
* 4. homogeneity is summed over 3×3, and the more homogeneous candidate is chosen (a tie averages
|
|
85
|
+
* both).
|
|
86
|
+
* The paper's optional iterative median step for reducing artifacts is not applied. Mirrored
|
|
87
|
+
* (reflect-101) borders keep each site's Bayer channel. The method is non-linear: the output is not a
|
|
88
|
+
* linear function of the mosaic.
|
|
89
|
+
*/
|
|
90
|
+
export declare function createAhdDemosaicTask(input: AhdDemosaicInput, provider: ProcessingProvider): ProcessingTask<AhdDemosaicOutput>;
|