@photivra/engine 1.5.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +414 -6
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +64 -12
- package/README.md +301 -182
- package/SECURITY.md +37 -28
- package/THIRD_PARTY.md +148 -4
- package/dist/camera/equivalent-focal-length.d.ts +13 -14
- package/dist/camera/equivalent-focal-length.js +15 -13
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +30 -19
- package/dist/camera/field-of-view.js +67 -18
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/lens-projection.d.ts +170 -0
- package/dist/camera/lens-projection.js +444 -0
- package/dist/camera/lens-projection.js.map +1 -0
- package/dist/camera/projected-object-size.d.ts +10 -11
- package/dist/camera/projected-object-size.js +12 -10
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +9 -10
- package/dist/capture/capture-export-metadata.js +8 -5
- package/dist/capture/capture-export-metadata.js.map +1 -1
- package/dist/capture/dng-import.d.ts +91 -0
- package/dist/capture/dng-import.js +343 -0
- package/dist/capture/dng-import.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +37 -17
- package/dist/capture/environment-raw-producer.js +43 -19
- package/dist/capture/environment-raw-producer.js.map +1 -1
- package/dist/capture/export-jpeg.d.ts +35 -4
- package/dist/capture/export-jpeg.js +133 -47
- package/dist/capture/export-jpeg.js.map +1 -1
- package/dist/capture/export-tiff.d.ts +48 -24
- package/dist/capture/export-tiff.js +91 -31
- package/dist/capture/export-tiff.js.map +1 -1
- package/dist/capture/focus-control.d.ts +42 -65
- package/dist/capture/focus-control.js +56 -75
- package/dist/capture/focus-control.js.map +1 -1
- package/dist/capture/host-yield-cadence.d.ts +25 -0
- package/dist/capture/host-yield-cadence.js +25 -0
- package/dist/capture/host-yield-cadence.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +14 -12
- package/dist/capture/linear-encoding.js +14 -13
- package/dist/capture/linear-encoding.js.map +1 -1
- package/dist/capture/lossless-jpeg.d.ts +27 -0
- package/dist/capture/lossless-jpeg.js +237 -0
- package/dist/capture/lossless-jpeg.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +227 -0
- package/dist/capture/native-environment-lean.js +974 -0
- package/dist/capture/native-environment-lean.js.map +1 -0
- package/dist/capture/native-environment-optical-stage.d.ts +97 -0
- package/dist/capture/native-environment-optical-stage.js +340 -0
- package/dist/capture/native-environment-optical-stage.js.map +1 -0
- package/dist/capture/native-environment-raw.d.ts +140 -6
- package/dist/capture/native-environment-raw.js +435 -34
- package/dist/capture/native-environment-raw.js.map +1 -1
- package/dist/capture/native-raw-development.d.ts +116 -9
- package/dist/capture/native-raw-development.js +221 -62
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/capture/native-raw-dng.d.ts +60 -0
- package/dist/capture/native-raw-dng.js +167 -0
- package/dist/capture/native-raw-dng.js.map +1 -0
- package/dist/capture/native-raw.d.ts +65 -12
- package/dist/capture/native-raw.js +81 -19
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/packed-sensor-raw.d.ts +160 -0
- package/dist/capture/packed-sensor-raw.js +221 -0
- package/dist/capture/packed-sensor-raw.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +58 -35
- package/dist/capture/photographic-export.js +177 -70
- package/dist/capture/photographic-export.js.map +1 -1
- package/dist/capture/raw-development-kernel.d.ts +52 -0
- package/dist/capture/raw-development-kernel.js +88 -0
- package/dist/capture/raw-development-kernel.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +7 -7
- package/dist/capture/raw-frame-limits.js +7 -6
- package/dist/capture/raw-frame-limits.js.map +1 -1
- package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
- package/dist/capture/raw-frame-reconstruction.js +9 -8
- package/dist/capture/raw-frame-reconstruction.js.map +1 -1
- package/dist/capture/raw-white-level.d.ts +55 -0
- package/dist/capture/raw-white-level.js +165 -0
- package/dist/capture/raw-white-level.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +5 -7
- package/dist/capture/release-sequence.js +15 -13
- package/dist/capture/release-sequence.js.map +1 -1
- package/dist/capture/sensor-raw-frame.d.ts +5 -6
- package/dist/capture/sensor-raw-frame.js +26 -9
- package/dist/capture/sensor-raw-frame.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +21 -13
- package/dist/capture/sensor-raw-producer.js +86 -25
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/capture/simulated-capture.d.ts +15 -16
- package/dist/capture/simulated-capture.js +22 -12
- package/dist/capture/simulated-capture.js.map +1 -1
- package/dist/color/camera-color-matrix.d.ts +69 -0
- package/dist/color/camera-color-matrix.js +132 -0
- package/dist/color/camera-color-matrix.js.map +1 -0
- package/dist/color/capture-color.d.ts +17 -10
- package/dist/color/capture-color.js +50 -17
- package/dist/color/capture-color.js.map +1 -1
- package/dist/color/chromatic-adaptation.d.ts +63 -0
- package/dist/color/chromatic-adaptation.js +91 -0
- package/dist/color/chromatic-adaptation.js.map +1 -0
- package/dist/color/color-difference.d.ts +104 -0
- package/dist/color/color-difference.js +205 -0
- package/dist/color/color-difference.js.map +1 -0
- package/dist/color/color-matching-functions.d.ts +168 -0
- package/dist/color/color-matching-functions.js +309 -0
- package/dist/color/color-matching-functions.js.map +1 -0
- package/dist/color/colorimetry-math.d.ts +52 -0
- package/dist/color/colorimetry-math.js +144 -0
- package/dist/color/colorimetry-math.js.map +1 -0
- package/dist/color/gamut-mapping.d.ts +54 -0
- package/dist/color/gamut-mapping.js +107 -0
- package/dist/color/gamut-mapping.js.map +1 -0
- package/dist/color/illuminants.d.ts +182 -0
- package/dist/color/illuminants.js +434 -0
- package/dist/color/illuminants.js.map +1 -0
- package/dist/color/rgb-color-spaces.d.ts +79 -0
- package/dist/color/rgb-color-spaces.js +115 -0
- package/dist/color/rgb-color-spaces.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +33 -11
- package/dist/color/sensor-color-development.js +104 -30
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/srgb-icc.d.ts +9 -2
- package/dist/color/srgb-icc.js +16 -5
- package/dist/color/srgb-icc.js.map +1 -1
- package/dist/color/srgb-transfer.d.ts +1 -2
- package/dist/color/srgb-transfer.js +1 -1
- package/dist/color/srgb-transfer.js.map +1 -1
- package/dist/color/white-balance.d.ts +68 -19
- package/dist/color/white-balance.js +168 -35
- package/dist/color/white-balance.js.map +1 -1
- package/dist/composition/image-formation-plan.d.ts +152 -128
- package/dist/composition/image-formation-plan.js +292 -138
- package/dist/composition/image-formation-plan.js.map +1 -1
- package/dist/composition/plan-consumer.d.ts +6 -7
- package/dist/composition/plan-consumer.js +14 -11
- package/dist/composition/plan-consumer.js.map +1 -1
- package/dist/core/calculation-result.d.ts +21 -14
- package/dist/core/calculation-result.js +209 -11
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +13 -8
- package/dist/core/canonical-json.js +34 -15
- package/dist/core/canonical-json.js.map +1 -1
- package/dist/core/configuration-error.d.ts +5 -4
- package/dist/core/configuration-error.js +5 -3
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +12 -12
- package/dist/core/evidence-provenance.js +10 -9
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +11 -10
- package/dist/core/image-formation.js +11 -9
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +9 -17
- package/dist/core/owned-data.js +9 -16
- package/dist/core/owned-data.js.map +1 -1
- package/dist/core/portable-math.d.ts +15 -0
- package/dist/core/portable-math.js +56 -0
- package/dist/core/portable-math.js.map +1 -0
- package/dist/core/record-validation.d.ts +48 -9
- package/dist/core/record-validation.js +93 -19
- package/dist/core/record-validation.js.map +1 -1
- package/dist/core/scientific-assurance.d.ts +16 -14
- package/dist/core/scientific-assurance.js +22 -18
- package/dist/core/scientific-assurance.js.map +1 -1
- package/dist/core/spectral-composition.d.ts +13 -14
- package/dist/core/spectral-composition.js +30 -27
- package/dist/core/spectral-composition.js.map +1 -1
- package/dist/core/spectral.d.ts +5 -6
- package/dist/core/spectral.js +9 -7
- package/dist/core/spectral.js.map +1 -1
- package/dist/core/validation.d.ts +3 -6
- package/dist/core/validation.js +3 -5
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +6 -6
- package/dist/core/version.js +6 -5
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/exposure-capabilities.d.ts +10 -10
- package/dist/equipment/exposure-capabilities.js +40 -30
- package/dist/equipment/exposure-capabilities.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +13 -6
- package/dist/equipment/generic-tier-assets.js +34 -15
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/generic-tier-presets.d.ts +5 -6
- package/dist/equipment/generic-tier-presets.js +15 -13
- package/dist/equipment/generic-tier-presets.js.map +1 -1
- package/dist/equipment/iso-capabilities.d.ts +21 -22
- package/dist/equipment/iso-capabilities.js +49 -44
- package/dist/equipment/iso-capabilities.js.map +1 -1
- package/dist/equipment/metering-capabilities.d.ts +5 -6
- package/dist/equipment/metering-capabilities.js +22 -19
- package/dist/equipment/metering-capabilities.js.map +1 -1
- package/dist/equipment/release-capabilities.d.ts +3 -4
- package/dist/equipment/release-capabilities.js +18 -14
- package/dist/equipment/release-capabilities.js.map +1 -1
- package/dist/exposure/exposure-duration-control.d.ts +19 -17
- package/dist/exposure/exposure-duration-control.js +27 -23
- package/dist/exposure/exposure-duration-control.js.map +1 -1
- package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
- package/dist/exposure/exposure-mode-resolver.js +127 -82
- package/dist/exposure/exposure-mode-resolver.js.map +1 -1
- package/dist/exposure/exposure.d.ts +17 -16
- package/dist/exposure/exposure.js +22 -15
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash-ttl.d.ts +135 -0
- package/dist/exposure/flash-ttl.js +193 -0
- package/dist/exposure/flash-ttl.js.map +1 -0
- package/dist/exposure/flash.d.ts +144 -36
- package/dist/exposure/flash.js +259 -59
- package/dist/exposure/flash.js.map +1 -1
- package/dist/exposure/metering-scene-radiance.d.ts +10 -10
- package/dist/exposure/metering-scene-radiance.js +42 -23
- package/dist/exposure/metering-scene-radiance.js.map +1 -1
- package/dist/exposure/metering-target.d.ts +8 -8
- package/dist/exposure/metering-target.js +30 -20
- package/dist/exposure/metering-target.js.map +1 -1
- package/dist/exposure/metering-temporal.d.ts +16 -15
- package/dist/exposure/metering-temporal.js +41 -19
- package/dist/exposure/metering-temporal.js.map +1 -1
- package/dist/exposure/metering.d.ts +64 -17
- package/dist/exposure/metering.js +159 -30
- package/dist/exposure/metering.js.map +1 -1
- package/dist/exposure/program-line.d.ts +5 -5
- package/dist/exposure/program-line.js +20 -13
- package/dist/exposure/program-line.js.map +1 -1
- package/dist/facade/camera-preset.d.ts +8 -0
- package/dist/facade/camera-preset.js +102 -0
- package/dist/facade/camera-preset.js.map +1 -0
- package/dist/facade/chart-radiance-batch.d.ts +57 -0
- package/dist/facade/chart-radiance-batch.js +121 -0
- package/dist/facade/chart-radiance-batch.js.map +1 -0
- package/dist/facade/chart-scenes.d.ts +177 -0
- package/dist/facade/chart-scenes.js +232 -0
- package/dist/facade/chart-scenes.js.map +1 -0
- package/dist/facade/diffraction-provider.d.ts +30 -0
- package/dist/facade/diffraction-provider.js +127 -0
- package/dist/facade/diffraction-provider.js.map +1 -0
- package/dist/facade/host-yield.d.ts +7 -0
- package/dist/facade/host-yield.js +19 -0
- package/dist/facade/host-yield.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +117 -0
- package/dist/facade/scene-radiance.js +205 -0
- package/dist/facade/scene-radiance.js.map +1 -0
- package/dist/facade/simulate-capture.d.ts +363 -0
- package/dist/facade/simulate-capture.js +1281 -0
- package/dist/facade/simulate-capture.js.map +1 -0
- package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
- package/dist/gpu/chart-radiance-gpu.js +176 -0
- package/dist/gpu/chart-radiance-gpu.js.map +1 -0
- package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
- package/dist/gpu/image-kernel-accelerator.js +720 -0
- package/dist/gpu/image-kernel-accelerator.js.map +1 -0
- package/dist/gpu/image-kernel-execution.d.ts +92 -0
- package/dist/gpu/image-kernel-execution.js +84 -0
- package/dist/gpu/image-kernel-execution.js.map +1 -0
- package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
- package/dist/gpu/sensor-stage-gpu.js +317 -0
- package/dist/gpu/sensor-stage-gpu.js.map +1 -0
- package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
- package/dist/gpu/temporal-sum-gpu.js +150 -0
- package/dist/gpu/temporal-sum-gpu.js.map +1 -0
- package/dist/gpu/webgpu-runtime.d.ts +63 -0
- package/dist/gpu/webgpu-runtime.js +215 -0
- package/dist/gpu/webgpu-runtime.js.map +1 -0
- package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
- package/dist/gpu/wgsl-chart-kernel.js +165 -0
- package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
- package/dist/gpu/wgsl-kernels.d.ts +53 -0
- package/dist/gpu/wgsl-kernels.js +365 -0
- package/dist/gpu/wgsl-kernels.js.map +1 -0
- package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
- package/dist/gpu/wgsl-sensor-kernel.js +409 -0
- package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
- package/dist/index.d.ts +91 -25
- package/dist/index.js +60 -15
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +92 -40
- package/dist/motion/camera-rotation.js +84 -47
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
- package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
- package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
- package/dist/motion/capture-rotation-trajectory.js +36 -26
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
- package/dist/motion/extended-object-projection.d.ts +19 -16
- package/dist/motion/extended-object-projection.js +38 -18
- package/dist/motion/extended-object-projection.js.map +1 -1
- package/dist/motion/projected-motion.d.ts +18 -17
- package/dist/motion/projected-motion.js +25 -17
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/motion/temporal-exposure-sum.d.ts +55 -0
- package/dist/motion/temporal-exposure-sum.js +141 -0
- package/dist/motion/temporal-exposure-sum.js.map +1 -0
- package/dist/motion/video-sequence.d.ts +111 -0
- package/dist/motion/video-sequence.js +179 -0
- package/dist/motion/video-sequence.js.map +1 -0
- package/dist/optics/aperture.d.ts +14 -15
- package/dist/optics/aperture.js +13 -11
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/atmospheric-haze.d.ts +83 -0
- package/dist/optics/atmospheric-haze.js +113 -0
- package/dist/optics/atmospheric-haze.js.map +1 -0
- package/dist/optics/brown-conrady-distortion.d.ts +116 -0
- package/dist/optics/brown-conrady-distortion.js +291 -0
- package/dist/optics/brown-conrady-distortion.js.map +1 -0
- package/dist/optics/circle-of-confusion.d.ts +10 -10
- package/dist/optics/circle-of-confusion.js +15 -11
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +64 -33
- package/dist/optics/complex-pupil-psf.js +190 -98
- package/dist/optics/complex-pupil-psf.js.map +1 -1
- package/dist/optics/depth-of-field.d.ts +25 -15
- package/dist/optics/depth-of-field.js +67 -27
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction-psf-profile.d.ts +118 -0
- package/dist/optics/diffraction-psf-profile.js +252 -0
- package/dist/optics/diffraction-psf-profile.js.map +1 -0
- package/dist/optics/diffraction.d.ts +14 -13
- package/dist/optics/diffraction.js +14 -10
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +88 -27
- package/dist/optics/focus-breathing.js +114 -23
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +18 -18
- package/dist/optics/focus-state.js +21 -15
- package/dist/optics/focus-state.js.map +1 -1
- package/dist/optics/front-of-lens-filter.d.ts +45 -14
- package/dist/optics/front-of-lens-filter.js +259 -88
- package/dist/optics/front-of-lens-filter.js.map +1 -1
- package/dist/optics/illumination-vignetting.d.ts +16 -17
- package/dist/optics/illumination-vignetting.js +40 -17
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/irradiance-convolution.d.ts +59 -0
- package/dist/optics/irradiance-convolution.js +138 -0
- package/dist/optics/irradiance-convolution.js.map +1 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
- package/dist/optics/lateral-chromatic-aberration.js +33 -23
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-kernels.d.ts +89 -0
- package/dist/optics/lens-psf-kernels.js +175 -0
- package/dist/optics/lens-psf-kernels.js.map +1 -0
- package/dist/optics/lens-psf-profile.d.ts +78 -46
- package/dist/optics/lens-psf-profile.js +335 -124
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
- package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
- package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +80 -23
- package/dist/optics/polygon-diffraction.js +130 -25
- package/dist/optics/polygon-diffraction.js.map +1 -1
- package/dist/optics/profile-contract.d.ts +5 -6
- package/dist/optics/profile-contract.js +14 -11
- package/dist/optics/profile-contract.js.map +1 -1
- package/dist/optics/psf-foundation.d.ts +23 -23
- package/dist/optics/psf-foundation.js +24 -21
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/pupil-vignetting.d.ts +118 -0
- package/dist/optics/pupil-vignetting.js +264 -0
- package/dist/optics/pupil-vignetting.js.map +1 -0
- package/dist/optics/radial-distortion.d.ts +34 -33
- package/dist/optics/radial-distortion.js +37 -30
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
- package/dist/optics/scene-to-sensor-irradiance.js +73 -45
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
- package/dist/optics/scene-to-sensor-quadrature.js +16 -11
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
- package/dist/optics/sensor-aperture-rays.d.ts +20 -4
- package/dist/optics/sensor-aperture-rays.js +32 -14
- package/dist/optics/sensor-aperture-rays.js.map +1 -1
- package/dist/optics/sensor-environment-query.d.ts +81 -16
- package/dist/optics/sensor-environment-query.js +145 -12
- package/dist/optics/sensor-environment-query.js.map +1 -1
- package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
- package/dist/optics/sensor-psf-quadrature.js +18 -11
- package/dist/optics/sensor-psf-quadrature.js.map +1 -1
- package/dist/optics/sensor-psf-support.d.ts +8 -6
- package/dist/optics/sensor-psf-support.js +8 -5
- package/dist/optics/sensor-psf-support.js.map +1 -1
- package/dist/optics/stray-light.d.ts +22 -19
- package/dist/optics/stray-light.js +18 -12
- package/dist/optics/stray-light.js.map +1 -1
- package/dist/optics/thin-lens.d.ts +10 -9
- package/dist/optics/thin-lens.js +12 -8
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/optics/zernike-wavefront.d.ts +154 -0
- package/dist/optics/zernike-wavefront.js +352 -0
- package/dist/optics/zernike-wavefront.js.map +1 -0
- package/dist/output/capture-corrected-sdr.d.ts +16 -8
- package/dist/output/capture-corrected-sdr.js +16 -8
- package/dist/output/capture-corrected-sdr.js.map +1 -1
- package/dist/output/capture-geometry.d.ts +34 -36
- package/dist/output/capture-geometry.js +52 -32
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +7 -6
- package/dist/output/capture-sdr.js +11 -8
- package/dist/output/capture-sdr.js.map +1 -1
- package/dist/output/crop.d.ts +22 -6
- package/dist/output/crop.js +40 -6
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +60 -23
- package/dist/output/geometric-transforms.js +111 -24
- package/dist/output/geometric-transforms.js.map +1 -1
- package/dist/output/lens-corrections.d.ts +27 -19
- package/dist/output/lens-corrections.js +29 -13
- package/dist/output/lens-corrections.js.map +1 -1
- package/dist/output/native-capture-sdr.d.ts +71 -16
- package/dist/output/native-capture-sdr.js +190 -33
- package/dist/output/native-capture-sdr.js.map +1 -1
- package/dist/output/png-encoder.d.ts +65 -0
- package/dist/output/png-encoder.js +461 -0
- package/dist/output/png-encoder.js.map +1 -0
- package/dist/output/print-contrast-reference.d.ts +10 -9
- package/dist/output/print-contrast-reference.js +10 -8
- package/dist/output/print-contrast-reference.js.map +1 -1
- package/dist/output/print-detail.d.ts +18 -17
- package/dist/output/print-detail.js +12 -10
- package/dist/output/print-detail.js.map +1 -1
- package/dist/output/print-jpeg.d.ts +26 -5
- package/dist/output/print-jpeg.js +117 -50
- package/dist/output/print-jpeg.js.map +1 -1
- package/dist/output/print-plan.d.ts +19 -19
- package/dist/output/print-plan.js +11 -10
- package/dist/output/print-plan.js.map +1 -1
- package/dist/output/print-region-statistics.d.ts +14 -15
- package/dist/output/print-region-statistics.js +11 -11
- package/dist/output/print-region-statistics.js.map +1 -1
- package/dist/output/sdr-rendering.d.ts +48 -10
- package/dist/output/sdr-rendering.js +114 -25
- package/dist/output/sdr-rendering.js.map +1 -1
- package/dist/output/subject-framing-crop.d.ts +6 -10
- package/dist/output/subject-framing-crop.js +23 -13
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/processing/demosaic.d.ts +90 -0
- package/dist/processing/demosaic.js +275 -0
- package/dist/processing/demosaic.js.map +1 -0
- package/dist/processing/denoise.d.ts +68 -0
- package/dist/processing/denoise.js +214 -0
- package/dist/processing/denoise.js.map +1 -0
- package/dist/processing/focus-stacking.d.ts +17 -0
- package/dist/processing/focus-stacking.js +80 -0
- package/dist/processing/focus-stacking.js.map +1 -0
- package/dist/processing/hdr.d.ts +54 -0
- package/dist/processing/hdr.js +172 -0
- package/dist/processing/hdr.js.map +1 -0
- package/dist/processing/image-ops.d.ts +66 -0
- package/dist/processing/image-ops.js +192 -0
- package/dist/processing/image-ops.js.map +1 -0
- package/dist/processing/panorama.d.ts +51 -0
- package/dist/processing/panorama.js +305 -0
- package/dist/processing/panorama.js.map +1 -0
- package/dist/processing/processing-task.d.ts +85 -0
- package/dist/processing/processing-task.js +164 -0
- package/dist/processing/processing-task.js.map +1 -0
- package/dist/processing/tone-mapping.d.ts +69 -0
- package/dist/processing/tone-mapping.js +310 -0
- package/dist/processing/tone-mapping.js.map +1 -0
- package/dist/schema/camera.d.ts +5 -4
- package/dist/schema/illumination-spectral.d.ts +13 -19
- package/dist/schema/illumination-spectral.js +23 -19
- package/dist/schema/illumination-spectral.js.map +1 -1
- package/dist/schema/illumination-temporal.d.ts +12 -15
- package/dist/schema/illumination-temporal.js +43 -28
- package/dist/schema/illumination-temporal.js.map +1 -1
- package/dist/schema/illumination.d.ts +5 -4
- package/dist/schema/illumination.js +55 -20
- package/dist/schema/illumination.js.map +1 -1
- package/dist/schema/scene-radiance-temporal.d.ts +9 -11
- package/dist/schema/scene-radiance-temporal.js +26 -23
- package/dist/schema/scene-radiance-temporal.js.map +1 -1
- package/dist/schema/scene-radiance.d.ts +17 -17
- package/dist/schema/scene-radiance.js +56 -34
- package/dist/schema/scene-radiance.js.map +1 -1
- package/dist/schema/scene.d.ts +14 -13
- package/dist/schema/validation.d.ts +0 -1
- package/dist/schema/validation.js +17 -15
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +45 -64
- package/dist/sensor/accumulated-charge.js +41 -47
- package/dist/sensor/accumulated-charge.js.map +1 -1
- package/dist/sensor/architecture.d.ts +22 -25
- package/dist/sensor/architecture.js +17 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
- package/dist/sensor/camera-saturation-capacity.js +36 -34
- package/dist/sensor/camera-saturation-capacity.js.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
- package/dist/sensor/capture-color-sampling-binding.js +39 -41
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- package/dist/sensor/capture-mode-timing.d.ts +8 -9
- package/dist/sensor/capture-mode-timing.js +24 -21
- package/dist/sensor/capture-mode-timing.js.map +1 -1
- package/dist/sensor/capture-mode.d.ts +28 -30
- package/dist/sensor/capture-mode.js +33 -31
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts +30 -33
- package/dist/sensor/color-sampling.js +32 -37
- package/dist/sensor/color-sampling.js.map +1 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
- package/dist/sensor/constant-rate-temporal-integration.js +28 -26
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
- package/dist/sensor/dark-current.d.ts +53 -49
- package/dist/sensor/dark-current.js +87 -46
- package/dist/sensor/dark-current.js.map +1 -1
- package/dist/sensor/environment-photo-signal.d.ts +71 -30
- package/dist/sensor/environment-photo-signal.js +127 -46
- package/dist/sensor/environment-photo-signal.js.map +1 -1
- package/dist/sensor/eqe-electron-rate.d.ts +14 -13
- package/dist/sensor/eqe-electron-rate.js +34 -14
- package/dist/sensor/eqe-electron-rate.js.map +1 -1
- package/dist/sensor/eqe-local-exposure.d.ts +24 -24
- package/dist/sensor/eqe-local-exposure.js +15 -11
- package/dist/sensor/eqe-local-exposure.js.map +1 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
- package/dist/sensor/eqe-temporal-exposure.js +15 -10
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/exposure-window.d.ts +48 -34
- package/dist/sensor/exposure-window.js +77 -36
- package/dist/sensor/exposure-window.js.map +1 -1
- package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
- package/dist/sensor/fixed-pattern-noise.js +166 -0
- package/dist/sensor/fixed-pattern-noise.js.map +1 -0
- package/dist/sensor/iso-gain.d.ts +44 -0
- package/dist/sensor/iso-gain.js +119 -0
- package/dist/sensor/iso-gain.js.map +1 -0
- package/dist/sensor/iso-signal-chain.d.ts +25 -48
- package/dist/sensor/iso-signal-chain.js +52 -66
- package/dist/sensor/iso-signal-chain.js.map +1 -1
- package/dist/sensor/local-exposure-binding.d.ts +21 -21
- package/dist/sensor/local-exposure-binding.js +22 -18
- package/dist/sensor/local-exposure-binding.js.map +1 -1
- package/dist/sensor/optical-stack.d.ts +36 -40
- package/dist/sensor/optical-stack.js +34 -37
- package/dist/sensor/optical-stack.js.map +1 -1
- package/dist/sensor/photon-energy.d.ts +22 -28
- package/dist/sensor/photon-energy.js +42 -34
- package/dist/sensor/photon-energy.js.map +1 -1
- package/dist/sensor/physical-charge-capacity.d.ts +20 -30
- package/dist/sensor/physical-charge-capacity.js +35 -36
- package/dist/sensor/physical-charge-capacity.js.map +1 -1
- package/dist/sensor/pixel-pitch.d.ts +2 -3
- package/dist/sensor/pixel-pitch.js +4 -2
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +13 -15
- package/dist/sensor/radiometry-readiness.js +20 -17
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +173 -83
- package/dist/sensor/raw-readout.js +425 -160
- package/dist/sensor/raw-readout.js.map +1 -1
- package/dist/sensor/raw-reconstruction.d.ts +112 -44
- package/dist/sensor/raw-reconstruction.js +200 -47
- package/dist/sensor/raw-reconstruction.js.map +1 -1
- package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
- package/dist/sensor/readout-exposure-linkage.js +125 -27
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +43 -44
- package/dist/sensor/readout-timing.js +38 -30
- package/dist/sensor/readout-timing.js.map +1 -1
- package/dist/sensor/response-application-compatibility.d.ts +21 -28
- package/dist/sensor/response-application-compatibility.js +35 -34
- package/dist/sensor/response-application-compatibility.js.map +1 -1
- package/dist/sensor/response-operating-range.d.ts +26 -35
- package/dist/sensor/response-operating-range.js +40 -39
- package/dist/sensor/response-operating-range.js.map +1 -1
- package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
- package/dist/sensor/responsivity-photocurrent.js +57 -40
- package/dist/sensor/responsivity-photocurrent.js.map +1 -1
- package/dist/sensor/sampling-aperture.d.ts +21 -25
- package/dist/sensor/sampling-aperture.js +29 -28
- package/dist/sensor/sampling-aperture.js.map +1 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
- package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/sensor-geometry.d.ts +28 -32
- package/dist/sensor/sensor-geometry.js +35 -20
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +14 -16
- package/dist/sensor/signal-noise.js +15 -13
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
- package/dist/sensor/spatial-sample-reduction.js +39 -48
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
- package/dist/sensor/spatial-sampling-quadrature.js +31 -36
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
- package/dist/sensor/spatio-spectral-reduction.js +24 -29
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
- package/dist/sensor/spectral-coverage.d.ts +6 -9
- package/dist/sensor/spectral-coverage.js +9 -6
- package/dist/sensor/spectral-coverage.js.map +1 -1
- package/dist/sensor/spectral-quadrature.d.ts +46 -60
- package/dist/sensor/spectral-quadrature.js +38 -48
- package/dist/sensor/spectral-quadrature.js.map +1 -1
- package/dist/sensor/spectral-response.d.ts +53 -41
- package/dist/sensor/spectral-response.js +80 -47
- package/dist/sensor/spectral-response.js.map +1 -1
- package/dist/sensor/stochastic-seed.d.ts +50 -0
- package/dist/sensor/stochastic-seed.js +123 -0
- package/dist/sensor/stochastic-seed.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
- package/dist/sensor/temporal-eqe-sum.js +5 -6
- package/dist/sensor/temporal-eqe-sum.js.map +1 -1
- package/dist/sensor/temporal-photo-signal.d.ts +5 -6
- package/dist/sensor/temporal-photo-signal.js +11 -10
- package/dist/sensor/temporal-photo-signal.js.map +1 -1
- package/dist/sensor/temporal-sample-binding.d.ts +1 -2
- package/dist/sensor/temporal-sample-binding.js +3 -3
- package/dist/sensor/temporal-sample-binding.js.map +1 -1
- package/dist/simulation/poc-simulation.d.ts +16 -16
- package/dist/simulation/poc-simulation.js +20 -15
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +42 -18
- package/dist/stabilization/camera-shake.js +43 -20
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +44 -41
- package/dist/stabilization/system.js +196 -108
- package/dist/stabilization/system.js.map +1 -1
- package/docs/AGENT_GUIDE.md +183 -0
- package/docs/API_REFERENCE.md +777 -2
- package/docs/QUICK_START.md +663 -0
- package/docs/USAGE.md +1719 -714
- package/docs/api/camera-equivalent-focal-length.md +6 -7
- package/docs/api/camera-field-of-view.md +16 -8
- package/docs/api/camera-lens-projection.md +246 -0
- package/docs/api/camera-projected-object-size.md +6 -5
- package/docs/api/capture-capture-export-metadata.md +10 -10
- package/docs/api/capture-dng-import.md +134 -0
- package/docs/api/capture-environment-raw-producer.md +17 -11
- package/docs/api/capture-export-jpeg.md +16 -0
- package/docs/api/capture-focus-control.md +25 -47
- package/docs/api/capture-linear-encoding.md +21 -12
- package/docs/api/capture-lossless-jpeg.md +49 -0
- package/docs/api/capture-native-environment-optical-stage.md +75 -0
- package/docs/api/capture-native-environment-raw.md +161 -4
- package/docs/api/capture-native-raw-development.md +69 -8
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +21 -10
- package/docs/api/capture-packed-sensor-raw.md +156 -0
- package/docs/api/capture-photographic-export.md +69 -31
- package/docs/api/capture-raw-frame-reconstruction.md +8 -8
- package/docs/api/capture-raw-white-level.md +37 -0
- package/docs/api/capture-release-sequence.md +6 -7
- package/docs/api/capture-sensor-raw-frame.md +6 -6
- package/docs/api/capture-sensor-raw-producer.md +17 -11
- package/docs/api/capture-simulated-capture.md +15 -15
- package/docs/api/color-camera-color-matrix.md +103 -0
- package/docs/api/color-capture-color.md +22 -11
- package/docs/api/color-chromatic-adaptation.md +82 -0
- package/docs/api/color-color-difference.md +134 -0
- package/docs/api/color-color-matching-functions.md +259 -0
- package/docs/api/color-colorimetry-math.md +54 -0
- package/docs/api/color-gamut-mapping.md +72 -0
- package/docs/api/color-illuminants.md +280 -0
- package/docs/api/color-rgb-color-spaces.md +151 -0
- package/docs/api/color-sensor-color-development.md +27 -0
- package/docs/api/color-srgb-icc.md +2 -4
- package/docs/api/color-white-balance.md +95 -19
- package/docs/api/composition-image-formation-plan.md +124 -95
- package/docs/api/composition-plan-consumer.md +7 -7
- package/docs/api/core-calculation-result.md +18 -14
- package/docs/api/core-configuration-error.md +1 -1
- package/docs/api/core-image-formation.md +7 -7
- package/docs/api/core-scientific-assurance.md +12 -10
- package/docs/api/core-spectral-composition.md +14 -14
- package/docs/api/core-spectral.md +6 -6
- package/docs/api/core-validation.md +3 -3
- package/docs/api/core-version.md +7 -6
- package/docs/api/equipment-exposure-capabilities.md +11 -10
- package/docs/api/equipment-generic-tier-assets.md +7 -2
- package/docs/api/equipment-generic-tier-presets.md +6 -6
- package/docs/api/equipment-iso-capabilities.md +18 -18
- package/docs/api/equipment-metering-capabilities.md +6 -6
- package/docs/api/equipment-release-capabilities.md +4 -4
- package/docs/api/exports.json +2253 -3
- package/docs/api/exposure-exposure-duration-control.md +9 -9
- package/docs/api/exposure-exposure-mode-resolver.md +35 -31
- package/docs/api/exposure-exposure.md +10 -10
- package/docs/api/exposure-flash-ttl.md +182 -0
- package/docs/api/exposure-flash.md +183 -28
- package/docs/api/exposure-metering-scene-radiance.md +11 -10
- package/docs/api/exposure-metering-target.md +9 -8
- package/docs/api/exposure-metering-temporal.md +8 -8
- package/docs/api/exposure-metering.md +69 -9
- package/docs/api/exposure-program-line.md +6 -5
- package/docs/api/facade-chart-radiance-batch.md +96 -0
- package/docs/api/facade-chart-scenes.md +240 -0
- package/docs/api/facade-scene-radiance.md +122 -0
- package/docs/api/facade-simulate-capture.md +397 -0
- package/docs/api/gpu-image-kernel-accelerator.md +157 -0
- package/docs/api/gpu-image-kernel-execution.md +152 -0
- package/docs/api/motion-camera-rotation.md +43 -26
- package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
- package/docs/api/motion-capture-rotation-trajectory.md +15 -15
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
- package/docs/api/motion-extended-object-projection.md +10 -8
- package/docs/api/motion-projected-motion.md +8 -8
- package/docs/api/motion-temporal-exposure-sum.md +98 -0
- package/docs/api/motion-video-sequence.md +159 -0
- package/docs/api/optics-aperture.md +8 -8
- package/docs/api/optics-atmospheric-haze.md +104 -0
- package/docs/api/optics-brown-conrady-distortion.md +123 -0
- package/docs/api/optics-circle-of-confusion.md +5 -4
- package/docs/api/optics-complex-pupil-psf.md +57 -16
- package/docs/api/optics-depth-of-field.md +12 -6
- package/docs/api/optics-diffraction-psf-profile.md +96 -0
- package/docs/api/optics-diffraction.md +8 -7
- package/docs/api/optics-focus-breathing.md +104 -16
- package/docs/api/optics-focus-state.md +9 -10
- package/docs/api/optics-front-of-lens-filter.md +72 -14
- package/docs/api/optics-illumination-vignetting.md +10 -10
- package/docs/api/optics-irradiance-convolution.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
- package/docs/api/optics-lens-psf-kernels.md +72 -0
- package/docs/api/optics-lens-psf-profile.md +48 -26
- package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
- package/docs/api/optics-polygon-diffraction.md +78 -13
- package/docs/api/optics-profile-contract.md +4 -4
- package/docs/api/optics-psf-foundation.md +12 -12
- package/docs/api/optics-pupil-vignetting.md +132 -0
- package/docs/api/optics-radial-distortion.md +12 -12
- package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
- package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
- package/docs/api/optics-sensor-aperture-rays.md +3 -2
- package/docs/api/optics-sensor-environment-query.md +52 -9
- package/docs/api/optics-sensor-psf-quadrature.md +13 -10
- package/docs/api/optics-stray-light.md +12 -11
- package/docs/api/optics-thin-lens.md +4 -3
- package/docs/api/optics-zernike-wavefront.md +229 -0
- package/docs/api/output-capture-corrected-sdr.md +10 -7
- package/docs/api/output-capture-geometry.md +35 -36
- package/docs/api/output-capture-sdr.md +4 -4
- package/docs/api/output-crop.md +7 -4
- package/docs/api/output-geometric-transforms.md +65 -19
- package/docs/api/output-lens-corrections.md +17 -15
- package/docs/api/output-native-capture-sdr.md +26 -13
- package/docs/api/output-png-encoder.md +105 -0
- package/docs/api/output-print-contrast-reference.md +8 -8
- package/docs/api/output-print-detail.md +14 -14
- package/docs/api/output-print-jpeg.md +22 -5
- package/docs/api/output-print-plan.md +18 -18
- package/docs/api/output-print-region-statistics.md +14 -14
- package/docs/api/output-sdr-rendering.md +52 -10
- package/docs/api/output-subject-framing-crop.md +5 -6
- package/docs/api/processing-demosaic.md +120 -0
- package/docs/api/processing-denoise.md +148 -0
- package/docs/api/processing-focus-stacking.md +41 -0
- package/docs/api/processing-hdr.md +113 -0
- package/docs/api/processing-panorama.md +82 -0
- package/docs/api/processing-processing-task.md +107 -0
- package/docs/api/processing-tone-mapping.md +142 -0
- package/docs/api/schema-camera.md +6 -4
- package/docs/api/schema-illumination-spectral.md +10 -11
- package/docs/api/schema-illumination-temporal.md +13 -15
- package/docs/api/schema-illumination.md +4 -4
- package/docs/api/schema-scene-radiance-temporal.md +10 -11
- package/docs/api/schema-scene-radiance.md +18 -17
- package/docs/api/schema-scene.md +9 -9
- package/docs/api/schema-validation.md +1 -1
- package/docs/api/sensor-accumulated-charge.md +12 -20
- package/docs/api/sensor-architecture.md +15 -16
- package/docs/api/sensor-camera-saturation-capacity.md +9 -11
- package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
- package/docs/api/sensor-capture-mode-timing.md +9 -9
- package/docs/api/sensor-capture-mode.md +29 -30
- package/docs/api/sensor-color-sampling.md +31 -33
- package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
- package/docs/api/sensor-dark-current.md +30 -14
- package/docs/api/sensor-environment-photo-signal.md +13 -6
- package/docs/api/sensor-eqe-electron-rate.md +9 -8
- package/docs/api/sensor-eqe-local-exposure.md +18 -17
- package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
- package/docs/api/sensor-exposure-window.md +24 -24
- package/docs/api/sensor-fixed-pattern-noise.md +104 -0
- package/docs/api/sensor-iso-gain.md +63 -0
- package/docs/api/sensor-iso-signal-chain.md +13 -22
- package/docs/api/sensor-local-exposure-binding.md +12 -13
- package/docs/api/sensor-optical-stack.md +37 -40
- package/docs/api/sensor-photon-energy.md +10 -11
- package/docs/api/sensor-physical-charge-capacity.md +8 -13
- package/docs/api/sensor-pixel-pitch.md +1 -1
- package/docs/api/sensor-radiometry-readiness.md +9 -9
- package/docs/api/sensor-raw-readout.md +118 -52
- package/docs/api/sensor-raw-reconstruction.md +97 -20
- package/docs/api/sensor-readout-exposure-linkage.md +120 -24
- package/docs/api/sensor-readout-timing.md +33 -35
- package/docs/api/sensor-response-application-compatibility.md +9 -11
- package/docs/api/sensor-response-operating-range.md +14 -18
- package/docs/api/sensor-responsivity-photocurrent.md +9 -12
- package/docs/api/sensor-sampling-aperture.md +22 -25
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
- package/docs/api/sensor-sensor-geometry.md +23 -24
- package/docs/api/sensor-signal-noise.md +10 -10
- package/docs/api/sensor-spatial-sample-reduction.md +27 -30
- package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
- package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
- package/docs/api/sensor-spectral-coverage.md +5 -5
- package/docs/api/sensor-spectral-quadrature.md +33 -35
- package/docs/api/sensor-spectral-response.md +28 -16
- package/docs/api/sensor-temporal-photo-signal.md +6 -6
- package/docs/api/simulation-poc-simulation.md +17 -16
- package/docs/api/stabilization-camera-shake.md +29 -10
- package/docs/api/stabilization-system.md +25 -21
- package/docs/examples/production-request.json +3821 -2157
- package/docs/examples/simulate-capture.mjs +14 -0
- package/llms.txt +35 -0
- package/package.json +32 -11
- package/AGENTS.md +0 -674
- package/CONTRIBUTING.md +0 -76
- package/DCO +0 -33
- package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
- package/dist/camera/field-of-view.d.ts.map +0 -1
- package/dist/camera/projected-object-size.d.ts.map +0 -1
- package/dist/capture/capture-export-metadata.d.ts.map +0 -1
- package/dist/capture/environment-raw-producer.d.ts.map +0 -1
- package/dist/capture/export-jpeg.d.ts.map +0 -1
- package/dist/capture/export-tiff.d.ts.map +0 -1
- package/dist/capture/focus-control.d.ts.map +0 -1
- package/dist/capture/linear-encoding.d.ts.map +0 -1
- package/dist/capture/native-environment-raw.d.ts.map +0 -1
- package/dist/capture/native-raw-development.d.ts.map +0 -1
- package/dist/capture/native-raw.d.ts.map +0 -1
- package/dist/capture/photographic-export.d.ts.map +0 -1
- package/dist/capture/raw-frame-limits.d.ts.map +0 -1
- package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
- package/dist/capture/release-sequence.d.ts.map +0 -1
- package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
- package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
- package/dist/capture/simulated-capture.d.ts.map +0 -1
- package/dist/color/capture-color.d.ts.map +0 -1
- package/dist/color/sensor-color-development.d.ts.map +0 -1
- package/dist/color/srgb-icc.d.ts.map +0 -1
- package/dist/color/srgb-transfer.d.ts.map +0 -1
- package/dist/color/white-balance.d.ts.map +0 -1
- package/dist/composition/image-formation-plan.d.ts.map +0 -1
- package/dist/composition/plan-consumer.d.ts.map +0 -1
- package/dist/core/calculation-result.d.ts.map +0 -1
- package/dist/core/canonical-json.d.ts.map +0 -1
- package/dist/core/configuration-error.d.ts.map +0 -1
- package/dist/core/evidence-provenance.d.ts.map +0 -1
- package/dist/core/image-formation.d.ts.map +0 -1
- package/dist/core/owned-data.d.ts.map +0 -1
- package/dist/core/record-validation.d.ts.map +0 -1
- package/dist/core/scientific-assurance.d.ts.map +0 -1
- package/dist/core/spectral-composition.d.ts.map +0 -1
- package/dist/core/spectral.d.ts.map +0 -1
- package/dist/core/validation.d.ts.map +0 -1
- package/dist/core/version.d.ts.map +0 -1
- package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
- package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
- package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
- package/dist/equipment/iso-capabilities.d.ts.map +0 -1
- package/dist/equipment/metering-capabilities.d.ts.map +0 -1
- package/dist/equipment/release-capabilities.d.ts.map +0 -1
- package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
- package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
- package/dist/exposure/exposure.d.ts.map +0 -1
- package/dist/exposure/flash.d.ts.map +0 -1
- package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
- package/dist/exposure/metering-target.d.ts.map +0 -1
- package/dist/exposure/metering-temporal.d.ts.map +0 -1
- package/dist/exposure/metering.d.ts.map +0 -1
- package/dist/exposure/program-line.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/motion/camera-rotation.d.ts.map +0 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/extended-object-projection.d.ts.map +0 -1
- package/dist/motion/projected-motion.d.ts.map +0 -1
- package/dist/optics/aperture.d.ts.map +0 -1
- package/dist/optics/circle-of-confusion.d.ts.map +0 -1
- package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
- package/dist/optics/depth-of-field.d.ts.map +0 -1
- package/dist/optics/diffraction.d.ts.map +0 -1
- package/dist/optics/focus-breathing.d.ts.map +0 -1
- package/dist/optics/focus-state.d.ts.map +0 -1
- package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
- package/dist/optics/illumination-vignetting.d.ts.map +0 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
- package/dist/optics/lens-psf-profile.d.ts.map +0 -1
- package/dist/optics/polygon-diffraction.d.ts.map +0 -1
- package/dist/optics/profile-contract.d.ts.map +0 -1
- package/dist/optics/psf-foundation.d.ts.map +0 -1
- package/dist/optics/radial-distortion.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
- package/dist/optics/sensor-environment-query.d.ts.map +0 -1
- package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-psf-support.d.ts.map +0 -1
- package/dist/optics/stray-light.d.ts.map +0 -1
- package/dist/optics/thin-lens.d.ts.map +0 -1
- package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
- package/dist/output/capture-geometry.d.ts.map +0 -1
- package/dist/output/capture-sdr.d.ts.map +0 -1
- package/dist/output/crop.d.ts.map +0 -1
- package/dist/output/geometric-transforms.d.ts.map +0 -1
- package/dist/output/lens-corrections.d.ts.map +0 -1
- package/dist/output/native-capture-sdr.d.ts.map +0 -1
- package/dist/output/print-contrast-reference.d.ts.map +0 -1
- package/dist/output/print-detail.d.ts.map +0 -1
- package/dist/output/print-jpeg.d.ts.map +0 -1
- package/dist/output/print-plan.d.ts.map +0 -1
- package/dist/output/print-region-statistics.d.ts.map +0 -1
- package/dist/output/sdr-rendering.d.ts.map +0 -1
- package/dist/output/subject-framing-crop.d.ts.map +0 -1
- package/dist/schema/camera.d.ts.map +0 -1
- package/dist/schema/camera.js +0 -3
- package/dist/schema/camera.js.map +0 -1
- package/dist/schema/illumination-spectral.d.ts.map +0 -1
- package/dist/schema/illumination-temporal.d.ts.map +0 -1
- package/dist/schema/illumination.d.ts.map +0 -1
- package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
- package/dist/schema/scene-radiance.d.ts.map +0 -1
- package/dist/schema/scene.d.ts.map +0 -1
- package/dist/schema/scene.js +0 -3
- package/dist/schema/scene.js.map +0 -1
- package/dist/schema/validation.d.ts.map +0 -1
- package/dist/sensor/accumulated-charge.d.ts.map +0 -1
- package/dist/sensor/architecture.d.ts.map +0 -1
- package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
- package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
- package/dist/sensor/capture-mode.d.ts.map +0 -1
- package/dist/sensor/color-sampling.d.ts.map +0 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
- package/dist/sensor/dark-current.d.ts.map +0 -1
- package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
- package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
- package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/exposure-window.d.ts.map +0 -1
- package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
- package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
- package/dist/sensor/optical-stack.d.ts.map +0 -1
- package/dist/sensor/photon-energy.d.ts.map +0 -1
- package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
- package/dist/sensor/pixel-pitch.d.ts.map +0 -1
- package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
- package/dist/sensor/raw-readout.d.ts.map +0 -1
- package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
- package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
- package/dist/sensor/readout-timing.d.ts.map +0 -1
- package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
- package/dist/sensor/response-operating-range.d.ts.map +0 -1
- package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
- package/dist/sensor/sampling-aperture.d.ts.map +0 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/sensor-geometry.d.ts.map +0 -1
- package/dist/sensor/signal-noise.d.ts.map +0 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
- package/dist/sensor/spectral-coverage.d.ts.map +0 -1
- package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
- package/dist/sensor/spectral-response.d.ts.map +0 -1
- package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
- package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
- package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
- package/dist/simulation/poc-simulation.d.ts.map +0 -1
- package/dist/stabilization/camera-shake.d.ts.map +0 -1
- package/dist/stabilization/system.d.ts.map +0 -1
- package/docs/API_STYLE.md +0 -235
- package/docs/ARCHITECTURE.md +0 -356
- package/docs/AUTOMATION_COORDINATION.md +0 -190
- package/docs/CAPTURE_COLOR.md +0 -25
- package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
- package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
- package/docs/CAPTURE_SDR.md +0 -22
- package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
- package/docs/DEVELOPERS.md +0 -68
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
- package/docs/EXPORT_ACCEPTANCE.md +0 -133
- package/docs/GENERIC_TIER_PRESETS.md +0 -269
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
- package/docs/IMAGE_FORMATION.md +0 -247
- package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
- package/docs/MOTION_AND_SIGNAL.md +0 -250
- package/docs/NATIVE_CAPTURE_SDR.md +0 -70
- package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
- package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
- package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
- package/docs/NUMERICAL_CORRECTNESS.md +0 -191
- package/docs/PERFORMANCE_BASELINE.md +0 -56
- package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
- package/docs/PHYSICS_FOUNDATION.md +0 -426
- package/docs/POC_API.md +0 -278
- package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
- package/docs/POC_PROJECTION_REUSE.md +0 -124
- package/docs/PRINT_195_196_REVIEW.md +0 -93
- package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
- package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
- package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
- package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
- package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
- package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
- package/docs/PRINT_PLANNING.md +0 -75
- package/docs/PRINT_REGION_STATISTICS.md +0 -38
- package/docs/PROCESSED_OUTPUT.md +0 -157
- package/docs/PRODUCTION_COMPOSITION.md +0 -373
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
- package/docs/PROVENANCE.md +0 -115
- package/docs/PSF_FOUNDATION.md +0 -165
- package/docs/RAW_FRAME_ENVELOPE.md +0 -56
- package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
- package/docs/RELEASE_1_0.md +0 -66
- package/docs/RELEASE_1_0_1.md +0 -61
- package/docs/RELEASE_1_1_0.md +0 -25
- package/docs/RELEASE_1_2_0.md +0 -51
- package/docs/RELEASE_1_3_0.md +0 -15
- package/docs/RELEASE_1_4_0.md +0 -23
- package/docs/RELEASE_1_5_0.md +0 -105
- package/docs/RELEASE_AUDIT.md +0 -39
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
- package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
- package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
- package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
- package/docs/SDR_RENDERING.md +0 -33
- package/docs/SENSOR_APERTURE_RAYS.md +0 -23
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
- package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
- package/docs/SENSOR_RAW_FRAME.md +0 -20
- package/docs/SENSOR_RAW_PRODUCER.md +0 -77
- package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
- package/docs/SIGNAL_CONFORMANCE.md +0 -23
- package/docs/SIMULATED_CAPTURE.md +0 -65
- package/docs/STABILIZATION.md +0 -234
- package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
- package/docs/TIER_ACCEPTANCE.md +0 -129
- package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
- package/docs/V1_COMPOSITION_MAP.md +0 -123
- package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
- package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
- package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
- package/docs/licenses/castleCSF-MIT.txt +0 -21
- package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
- package/docs/validation/documentation-fragments.json +0 -212
- package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
- package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
- package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
- package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
- package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
- package/docs/validation/print-196-candidate-capabilities.json +0 -28
- package/docs/validation/print-196-candidate-evidence.json +0 -356
- package/docs/validation/print-196-engine-acceptance.json +0 -81
- package/docs/validation/print-detail-capabilities.json +0 -103
- package/docs/validation/print-detail-jpeg-evidence.json +0 -116
- package/docs/validation/print-detail-sdr-evidence.json +0 -81
- package/docs/validation/release-audit-inventory.json +0 -1306
- package/docs/validation/tier-acceptance-report-v1.json +0 -2538
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* CFA phase is absolute and
|
|
8
|
-
* does not infer
|
|
9
|
-
* algorithm.
|
|
10
|
-
*
|
|
11
|
-
* reconstruction. Reconstruction consumes explicitly bound native post-ADC samples and declared
|
|
12
|
-
* normalized channel kernels. Native CFA phase is absolute and orientation/crop remain downstream.
|
|
13
|
-
* This structural linear reconstruction does not infer spectral sensor primaries, calibrated color or
|
|
14
|
-
* a complete arbitrary demosaic algorithm.
|
|
3
|
+
* RAW reconstruction (demosaicing): estimates every colour channel at each pixel from the RAW samples
|
|
4
|
+
* of nearby CFA (colour filter array) sites, using declared linear kernels.
|
|
5
|
+
*
|
|
6
|
+
* It uses native RAW samples (after the ADC) that are explicitly bound to their sites, and declared
|
|
7
|
+
* normalized kernels for each channel. The CFA phase is absolute; orientation and crop are applied
|
|
8
|
+
* later. This is a fixed linear reconstruction. It does not infer the sensor's spectral primaries or
|
|
9
|
+
* calibrated colour, and is not a general demosaic algorithm. Built-in bilinear Bayer kernels are
|
|
10
|
+
* provided.
|
|
15
11
|
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
16
12
|
* limits.
|
|
17
13
|
*/
|
|
18
14
|
import { approximationResult } from "../core/calculation-result.js";
|
|
19
15
|
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
16
|
+
import { computeEffectiveSaturationCode } from "../capture/raw-white-level.js";
|
|
20
17
|
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
21
18
|
import { InvalidScientificInputError } from "../core/validation.js";
|
|
22
19
|
import { parseSensorColorSamplingProfile, resolveColorSamplingSite } from "./color-sampling.js";
|
|
20
|
+
import { requireInputObject, requireInputKeys, rejectUnknownFields } from "../core/record-validation.js";
|
|
23
21
|
export const SENSOR_RAW_CAPTURE_SAMPLE_VERSION = "0.1.0";
|
|
24
22
|
export const SENSOR_RAW_RECONSTRUCTION_PROFILE_SCHEMA_VERSION = "0.1.0";
|
|
25
|
-
function requireRecord(value, path) {
|
|
23
|
+
function requireRecord(value, path, allowedKeys) {
|
|
26
24
|
if (typeof value !== "object" ||
|
|
27
25
|
value === null ||
|
|
28
26
|
Array.isArray(value)) {
|
|
29
27
|
throw new InvalidConfigurationError(path + " must be an object.");
|
|
30
28
|
}
|
|
29
|
+
if (allowedKeys !== null)
|
|
30
|
+
rejectUnknownFields(value, allowedKeys, path);
|
|
31
31
|
return value;
|
|
32
32
|
}
|
|
33
33
|
function requireNonEmptyString(value, path) {
|
|
@@ -84,7 +84,7 @@ function parseStatus(value, path) {
|
|
|
84
84
|
return value;
|
|
85
85
|
}
|
|
86
86
|
function parseContribution(value, path) {
|
|
87
|
-
const record = requireRecord(value, path);
|
|
87
|
+
const record = requireRecord(value, path, ["offsetX", "offsetY", "sourceChannelId", "weight"]);
|
|
88
88
|
return {
|
|
89
89
|
offsetX: requireSafeInteger(record.offsetX, path + ".offsetX"),
|
|
90
90
|
offsetY: requireSafeInteger(record.offsetY, path + ".offsetY"),
|
|
@@ -93,7 +93,7 @@ function parseContribution(value, path) {
|
|
|
93
93
|
};
|
|
94
94
|
}
|
|
95
95
|
function parseKernel(value, path) {
|
|
96
|
-
const record = requireRecord(value, path);
|
|
96
|
+
const record = requireRecord(value, path, ["contributions", "outputChannelId"]);
|
|
97
97
|
if (!Array.isArray(record.contributions) ||
|
|
98
98
|
record.contributions
|
|
99
99
|
.length === 0) {
|
|
@@ -128,20 +128,18 @@ function parseKernel(value, path) {
|
|
|
128
128
|
};
|
|
129
129
|
}
|
|
130
130
|
/**
|
|
131
|
-
*
|
|
132
|
-
* missing required fields and
|
|
131
|
+
* Validates untrusted input and returns it as a normalized, typed value. Unknown enum values,
|
|
132
|
+
* missing required fields and inconsistent scientific data are rejected.
|
|
133
133
|
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
* @param value - unknown. Treated as untrusted data; static typing alone is not validation.
|
|
139
|
-
* @returns SensorRawReconstructionProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
134
|
+
* The profile declares a normalized linear kernel for each output channel. It does not infer the
|
|
135
|
+
* sensor's spectral primaries or calibrated colour.
|
|
136
|
+
* @param value - Untrusted data. TypeScript types alone are not validation.
|
|
137
|
+
* @returns The result. Success does not imply calibration.
|
|
140
138
|
*
|
|
141
|
-
* @see docs/API_REFERENCE.md for the
|
|
139
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
142
140
|
*/
|
|
143
141
|
export function parseSensorRawReconstructionProfile(value) {
|
|
144
|
-
const record = requireRecord(value, "sensorRawReconstructionProfile");
|
|
142
|
+
const record = requireRecord(value, "sensorRawReconstructionProfile", ["schemaVersion", "method", "normalization", "negativeBlackSubtractedValuesAllowed", "kernels", "profileId", "profileVersion", "captureModeId", "colorSamplingProfileId", "scientificStatus", "evidence", "limitations"]);
|
|
145
143
|
if (record.schemaVersion !==
|
|
146
144
|
SENSOR_RAW_RECONSTRUCTION_PROFILE_SCHEMA_VERSION) {
|
|
147
145
|
throw new InvalidConfigurationError('sensorRawReconstructionProfile.schemaVersion must be "' +
|
|
@@ -189,21 +187,18 @@ export function parseSensorRawReconstructionProfile(value) {
|
|
|
189
187
|
};
|
|
190
188
|
}
|
|
191
189
|
/**
|
|
192
|
-
*
|
|
193
|
-
* reconstruction.
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
* kernels. Native CFA phase is absolute and orientation/crop remain downstream. This structural linear
|
|
197
|
-
* reconstruction does not infer spectral sensor primaries, calibrated color or a complete arbitrary
|
|
198
|
-
* demosaic algorithm.
|
|
199
|
-
* @param input - CreateSensorRawCaptureSampleInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
200
|
-
* @returns SensorRawCaptureSample. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
190
|
+
* Commits one validated native RAW sample, with its exact site, channel and exposure event, for use
|
|
191
|
+
* in reconstruction.
|
|
192
|
+
* @param input - The input; see `CreateSensorRawCaptureSampleInput` for its fields, units and coordinates.
|
|
193
|
+
* @returns The result. Success does not imply calibration.
|
|
201
194
|
*
|
|
202
|
-
* @see docs/API_REFERENCE.md for the
|
|
195
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
203
196
|
*/
|
|
204
197
|
export function createSensorRawCaptureSample(input) {
|
|
198
|
+
requireInputKeys(input, "createSensorRawCaptureSample", ["rawCode", "contributors", "adcIntegralNonLinearity"]);
|
|
205
199
|
const raw = input.rawCode;
|
|
206
200
|
const contributors = input.contributors;
|
|
201
|
+
requireInputObject(contributors, "contributors input");
|
|
207
202
|
if (contributors
|
|
208
203
|
.modeSamplingKind !==
|
|
209
204
|
"native-effective-raster" ||
|
|
@@ -266,6 +261,17 @@ export function createSensorRawCaptureSample(input) {
|
|
|
266
261
|
blackSubtractedNormalizedCode: (raw.rawCode -
|
|
267
262
|
raw.blackLevelCode) /
|
|
268
263
|
denominator,
|
|
264
|
+
effectiveSaturationCode: computeEffectiveSaturationCode(input.adcIntegralNonLinearity ===
|
|
265
|
+
undefined
|
|
266
|
+
? raw
|
|
267
|
+
: {
|
|
268
|
+
...raw,
|
|
269
|
+
integralNonLinearity: input.adcIntegralNonLinearity
|
|
270
|
+
}),
|
|
271
|
+
systemConversionGainElectronsPerCode: raw.systemConversionGainElectronsPerCode,
|
|
272
|
+
readNoiseRmsElectrons: Math.sqrt(raw.electronicReadNoiseComponents.reduce((sum, component) => sum +
|
|
273
|
+
component.rmsElectrons *
|
|
274
|
+
component.rmsElectrons, 0)),
|
|
269
275
|
readoutProfileId: raw.readoutProfileId,
|
|
270
276
|
readoutRegimeId: raw.regimeId,
|
|
271
277
|
sourceChargeSeedUint32: raw.chargeSeedUint32,
|
|
@@ -290,19 +296,18 @@ function requireCenterSite(value) {
|
|
|
290
296
|
};
|
|
291
297
|
}
|
|
292
298
|
/**
|
|
293
|
-
*
|
|
294
|
-
*
|
|
299
|
+
* Combines the supplied native samples through explicit normalized kernels, keeping CFA identity
|
|
300
|
+
* and signed black-subtracted values.
|
|
295
301
|
*
|
|
296
|
-
*
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
*
|
|
300
|
-
* @param input - ResolveSensorRawReconstructionInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
301
|
-
* @returns CalculationResult<SensorRawReconstructedPixel>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
302
|
+
* The CFA phase is absolute; orientation and crop come later. This fixed linear reconstruction does
|
|
303
|
+
* not infer spectral primaries or calibrated colour, and is not a general demosaic algorithm.
|
|
304
|
+
* @param input - The input; see `ResolveSensorRawReconstructionInput` for its fields, units and coordinates.
|
|
305
|
+
* @returns The result. Success does not imply calibration.
|
|
302
306
|
*
|
|
303
|
-
* @see docs/API_REFERENCE.md for the
|
|
307
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
304
308
|
*/
|
|
305
309
|
export function resolveSensorRawReconstruction(input) {
|
|
310
|
+
requireInputKeys(input, "resolveSensorRawReconstruction", ["profile", "colorSamplingProfile", "centerSite", "samples"]);
|
|
306
311
|
const profile = parseSensorRawReconstructionProfile(input.profile);
|
|
307
312
|
const center = requireCenterSite(input.centerSite);
|
|
308
313
|
const colorSamplingProfile = parseSensorColorSamplingProfile(input.colorSamplingProfile);
|
|
@@ -380,11 +385,20 @@ export function resolveSensorRawReconstruction(input) {
|
|
|
380
385
|
"Aliasing and moire are explicitly not modeled because this reconstruction contract does not establish an adequate pre-sampling optical transfer/scene-frequency model."
|
|
381
386
|
]);
|
|
382
387
|
}
|
|
383
|
-
/**
|
|
384
|
-
|
|
388
|
+
/**
|
|
389
|
+
* Internal: sums one channel's weighted contributions. The reference and packed paths use the same
|
|
390
|
+
* order of operations. With `mirrorBounds`, a contribution site outside the native frame is read from
|
|
391
|
+
* its mirror image (reflect-101, see `reflectRawSiteIndex`). Without it (the default), such a site is
|
|
392
|
+
* rejected.
|
|
393
|
+
*/
|
|
394
|
+
export function calculateRawReconstructionChannel(kernel, center, read, mirrorBounds) {
|
|
385
395
|
let value = 0;
|
|
386
396
|
const sourceContributions = kernel.contributions.map(contribution => {
|
|
387
|
-
|
|
397
|
+
let x = center.x + contribution.offsetX, y = center.y + contribution.offsetY;
|
|
398
|
+
if (mirrorBounds !== undefined) {
|
|
399
|
+
x = reflectRawSiteIndex(x, mirrorBounds.width);
|
|
400
|
+
y = reflectRawSiteIndex(y, mirrorBounds.height);
|
|
401
|
+
}
|
|
388
402
|
if (x < 0 || y < 0)
|
|
389
403
|
throw new InvalidScientificInputError("RAW reconstruction kernel references a site outside the non-negative native sensor coordinate domain.");
|
|
390
404
|
const sourceValue = read(x, y, contribution.sourceChannelId);
|
|
@@ -395,4 +409,143 @@ export function calculateRawReconstructionChannel(kernel, center, read) {
|
|
|
395
409
|
throw new InvalidScientificInputError("Reconstructed linear channel value must remain finite.");
|
|
396
410
|
return { channelId: kernel.outputChannelId, linearBlackSubtractedNormalizedValue: value, sourceContributions };
|
|
397
411
|
}
|
|
412
|
+
/**
|
|
413
|
+
* Mirror index ("reflect-101"): −1 → 1, −2 → 2, n → n−2. The edge site itself is not repeated, so
|
|
414
|
+
* for a CFA that repeats every 2 sites (Bayer) each mirrored site has the same channel as the site the
|
|
415
|
+
* repeating pattern would put there. Requires size ≥ 1; for size 1 every index maps to 0.
|
|
416
|
+
*/
|
|
417
|
+
export function reflectRawSiteIndex(index, size) {
|
|
418
|
+
if (index >= 0 && index < size)
|
|
419
|
+
return index;
|
|
420
|
+
if (size === 1)
|
|
421
|
+
return 0;
|
|
422
|
+
const period = 2 * size - 2, m = ((index % period) + period) % period;
|
|
423
|
+
return m < size ? m : period - m;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Internal: proves that mirrored (reflect-101) reads at the border return the channel the repeating
|
|
427
|
+
* CFA would put at every virtual site within `reach` of each frame edge, for every row and column
|
|
428
|
+
* phase. Mirroring works per axis, so checking each axis over every phase also covers the corners.
|
|
429
|
+
* Throws otherwise.
|
|
430
|
+
*/
|
|
431
|
+
export function validateMirrorBorderCfaConsistency(layout, width, height, reach) {
|
|
432
|
+
const rw = layout.repeatWidthSites, rh = layout.repeatHeightSites, ids = layout.siteChannelIds;
|
|
433
|
+
const at = (x, y) => ids[(((y % rh) + rh) % rh) * rw + ((x % rw) + rw) % rw];
|
|
434
|
+
if (reach >= width || reach >= height) {
|
|
435
|
+
throw new InvalidConfigurationError("Mirror border handling requires a native frame larger than the kernel reach.");
|
|
436
|
+
}
|
|
437
|
+
for (let d = 1; d <= reach; d++) {
|
|
438
|
+
for (let p = 0; p < Math.max(rw, rh); p++) {
|
|
439
|
+
if (at(-d, p) !== at(reflectRawSiteIndex(-d, width), p) || at(width - 1 + d, p) !== at(reflectRawSiteIndex(width - 1 + d, width), p) ||
|
|
440
|
+
at(p, -d) !== at(p, reflectRawSiteIndex(-d, height)) || at(p, height - 1 + d) !== at(p, reflectRawSiteIndex(height - 1 + d, height))) {
|
|
441
|
+
throw new InvalidConfigurationError("Mirror border handling would change the CFA channel of a reflected site; this CFA/frame size needs reject handling or a smaller region.");
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/** Internal: largest absolute site offset of any contribution (the neighbourhood reach). */
|
|
447
|
+
export function rawReconstructionKernelReach(profiles) {
|
|
448
|
+
let reach = 0;
|
|
449
|
+
for (const { profile } of profiles)
|
|
450
|
+
for (const kernel of profile.kernels)
|
|
451
|
+
for (const c of kernel.contributions) {
|
|
452
|
+
reach = Math.max(reach, Math.abs(c.offsetX), Math.abs(c.offsetY));
|
|
453
|
+
}
|
|
454
|
+
return reach;
|
|
455
|
+
}
|
|
456
|
+
export const BUILT_IN_BAYER_DEMOSAIC_MODEL_VERSION = "1.0.0";
|
|
457
|
+
const CROSS1 = [[1, 0], [-1, 0], [0, 1], [0, -1]];
|
|
458
|
+
const DIAG1 = [[1, 1], [-1, 1], [1, -1], [-1, -1]];
|
|
459
|
+
function bayerTaps(points, role, weight) {
|
|
460
|
+
return points.map(([x, y]) => [x, y, role, weight]);
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Kernels for one kind of site. `own` is the site's channel; `horizontal` is the colour channel on the
|
|
464
|
+
* same row, for a green site.
|
|
465
|
+
*
|
|
466
|
+
* Bilinear: the average of the nearest sites of the wanted channel. Every kernel sums to one and
|
|
467
|
+
* reproduces signals that vary linearly (affine) exactly.
|
|
468
|
+
*/
|
|
469
|
+
function bayerSiteKernels(own, horizontal) {
|
|
470
|
+
if (own !== "G") {
|
|
471
|
+
const other = own === "R" ? "B" : "R";
|
|
472
|
+
const green = bayerTaps(CROSS1, "G", 1 / 4);
|
|
473
|
+
const opposite = bayerTaps(DIAG1, other, 1 / 4);
|
|
474
|
+
const result = { G: green };
|
|
475
|
+
result[own] = [[0, 0, own, 1]];
|
|
476
|
+
result[other] = opposite;
|
|
477
|
+
return result;
|
|
478
|
+
}
|
|
479
|
+
const h = horizontal, v = h === "R" ? "B" : "R";
|
|
480
|
+
const along = (role, horizontalAxis) => {
|
|
481
|
+
const near = horizontalAxis ? [[1, 0], [-1, 0]] : [[0, 1], [0, -1]];
|
|
482
|
+
return bayerTaps(near, role, 1 / 2);
|
|
483
|
+
};
|
|
484
|
+
const identity = [[0, 0, "G", 1]];
|
|
485
|
+
const result = { G: identity };
|
|
486
|
+
result[h] = along(h, true);
|
|
487
|
+
result[v] = along(v, false);
|
|
488
|
+
return result;
|
|
489
|
+
}
|
|
490
|
+
const BAYER_DEMOSAIC_EVIDENCE = {
|
|
491
|
+
bilinear: [{ sourceOrigin: "third-party", reuseStatus: "factual-reference-only",
|
|
492
|
+
sourceReference: "Gunturk, Glotzbach, Altunbasak, Schafer & Mersereau, Demosaicking: color filter array interpolation, IEEE Signal Processing Magazine 22(1), 2005",
|
|
493
|
+
note: "Bilinear interpolation of each Bayer channel from its nearest same-channel sites; weights derived in Photivra from that published definition." }]
|
|
494
|
+
};
|
|
495
|
+
/**
|
|
496
|
+
* Builds the per-phase linear reconstruction profiles of the built-in bilinear Bayer demosaic kernel.
|
|
497
|
+
*
|
|
498
|
+
* The result is the ordinary `explicit-linear-native-neighborhood` profile used by RAW frame
|
|
499
|
+
* reconstruction, native RAW development and `createCfaPlaneReconstructionTask`; there is no special
|
|
500
|
+
* code path. Edge pixels need either a region whose neighbourhood stays inside the frame, or mirror
|
|
501
|
+
* border handling.
|
|
502
|
+
*
|
|
503
|
+
* Approximation: fixed linear interpolation, not a calibrated or adaptive demosaic. Bilinear blurs
|
|
504
|
+
* and shows "zipper" artefacts at edges. Aliasing and moiré are not modelled. The adaptive AHD method
|
|
505
|
+
* is `createAhdDemosaicTask`.
|
|
506
|
+
*/
|
|
507
|
+
export function createBuiltInBayerDemosaicProfiles(input) {
|
|
508
|
+
requireInputKeys(input, "createBuiltInBayerDemosaicProfiles", ["kernel", "captureModeId", "colorSamplingProfile", "channelRoles"]);
|
|
509
|
+
const kernel = input.kernel;
|
|
510
|
+
if (kernel !== "bilinear")
|
|
511
|
+
throw new InvalidConfigurationError("Unknown built-in Bayer demosaic kernel.");
|
|
512
|
+
const captureModeId = requireNonEmptyString(input.captureModeId, "captureModeId");
|
|
513
|
+
const cfa = parseSensorColorSamplingProfile(input.colorSamplingProfile), layout = cfa.layout;
|
|
514
|
+
const roles = requireRecord(input.channelRoles, "channelRoles", ["red", "green", "blue"]);
|
|
515
|
+
const ids = { R: requireNonEmptyString(roles.red, "channelRoles.red"),
|
|
516
|
+
G: requireNonEmptyString(roles.green, "channelRoles.green"), B: requireNonEmptyString(roles.blue, "channelRoles.blue") };
|
|
517
|
+
if (new Set(Object.values(ids)).size !== 3)
|
|
518
|
+
throw new InvalidConfigurationError("channelRoles must name three distinct channels.");
|
|
519
|
+
if (layout.kind !== "periodic-mosaic" || layout.repeatWidthSites !== 2 || layout.repeatHeightSites !== 2) {
|
|
520
|
+
throw new InvalidScientificInputError("Built-in Bayer kernels require a 2×2 periodic mosaic.");
|
|
521
|
+
}
|
|
522
|
+
const tile = layout.siteChannelIds.map((id) => {
|
|
523
|
+
const found = ["R", "G", "B"].find((r) => ids[r] === id);
|
|
524
|
+
if (found === undefined)
|
|
525
|
+
throw new InvalidScientificInputError("Bayer CFA channel is not one of channelRoles.");
|
|
526
|
+
return found;
|
|
527
|
+
});
|
|
528
|
+
const red = tile.indexOf("R"), blue = tile.indexOf("B");
|
|
529
|
+
if (tile.filter((r) => r === "G").length !== 2 || red < 0 || blue < 0 || red + blue !== 3) {
|
|
530
|
+
throw new InvalidScientificInputError("Built-in Bayer kernels require one red, one blue and two diagonal green sites.");
|
|
531
|
+
}
|
|
532
|
+
const phaseProfiles = [0, 1, 2, 3].map((i) => {
|
|
533
|
+
const phaseX = i % 2, phaseY = (i - phaseX) / 2, own = tile[i];
|
|
534
|
+
const byRole = bayerSiteKernels(own, own === "G" ? tile[phaseY * 2 + (1 - phaseX)] : null);
|
|
535
|
+
const profile = parseSensorRawReconstructionProfile({
|
|
536
|
+
schemaVersion: SENSOR_RAW_RECONSTRUCTION_PROFILE_SCHEMA_VERSION, profileId: "photivra-builtin-" + kernel + "-phase-" + phaseX + "-" + phaseY,
|
|
537
|
+
profileVersion: BUILT_IN_BAYER_DEMOSAIC_MODEL_VERSION, captureModeId, colorSamplingProfileId: cfa.profileId, scientificStatus: "approximation",
|
|
538
|
+
method: "explicit-linear-native-neighborhood", normalization: "weights-sum-to-one-per-output-channel", negativeBlackSubtractedValuesAllowed: true,
|
|
539
|
+
kernels: ["R", "G", "B"].map((r) => ({ outputChannelId: ids[r], contributions: byRole[r].map(([offsetX, offsetY, source, weight]) => ({ offsetX, offsetY, sourceChannelId: ids[source], weight })) })),
|
|
540
|
+
evidence: BAYER_DEMOSAIC_EVIDENCE[kernel].map((e) => ({ ...e })),
|
|
541
|
+
limitations: ["Fixed linear Bayer interpolation; not adaptive, calibrated or manufacturer-specific.", "Aliasing, moire and colour fringing are not modelled or suppressed."]
|
|
542
|
+
});
|
|
543
|
+
return { phaseX, phaseY, profile };
|
|
544
|
+
});
|
|
545
|
+
return approximationResult({ kernel, phaseProfiles, outputChannelIds: [ids.R, ids.G, ids.B], kernelReachSites: 1 }, "built-in-bayer-demosaic-" + kernel, BUILT_IN_BAYER_DEMOSAIC_MODEL_VERSION, [
|
|
546
|
+
"Nearest same-channel bilinear interpolation.",
|
|
547
|
+
"Weights sum to one per output channel and reproduce affine channel signals exactly.",
|
|
548
|
+
"Linear kernels only; adaptive (edge-directed) reconstruction is a separate non-linear path."
|
|
549
|
+
]);
|
|
550
|
+
}
|
|
398
551
|
//# sourceMappingURL=raw-reconstruction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raw-reconstruction.js","sourceRoot":"","sources":["../../src/sensor/raw-reconstruction.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raw-reconstruction.js","sourceRoot":"","sources":["../../src/sensor/raw-reconstruction.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * RAW reconstruction (demosaicing): estimates every colour channel at each pixel from the RAW samples\n * of nearby CFA (colour filter array) sites, using declared linear kernels.\n *\n * It uses native RAW samples (after the ADC) that are explicitly bound to their sites, and declared\n * normalized kernels for each channel. The CFA phase is absolute; orientation and crop are applied\n * later. This is a fixed linear reconstruction. It does not infer the sensor's spectral primaries or\n * calibrated colour, and is not a general demosaic algorithm. Built-in bilinear Bayer kernels are\n * provided.\n * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport {\n approximationResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { computeEffectiveSaturationCode } from \"../capture/raw-white-level.js\";\nimport {\n parseEvidenceList,\n type EvidenceProvenance\n} from \"../core/evidence-provenance.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport type {\n ResolvedCaptureModeColorSamplingContributors\n} from \"./capture-color-sampling-binding.js\";\nimport {\n parseSensorColorSamplingProfile,\n resolveColorSamplingSite,\n type SensorColorSamplingProfile\n} from \"./color-sampling.js\";\nimport type {\n SensorAdcIntegralNonLinearity,\n SensorRawCodeSample\n} from \"./raw-readout.js\";\nimport type {\n SensorSpectralResponseScientificStatus\n} from \"./spectral-response.js\";\nimport { requireInputObject, requireInputKeys, rejectUnknownFields } from \"../core/record-validation.js\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport const SENSOR_RAW_CAPTURE_SAMPLE_VERSION =\n \"0.1.0\" as const;\nexport const SENSOR_RAW_RECONSTRUCTION_PROFILE_SCHEMA_VERSION =\n \"0.1.0\" as const;\n\nexport interface CreateSensorRawCaptureSampleInput {\n rawCode:\n SensorRawCodeSample;\n contributors:\n ResolvedCaptureModeColorSamplingContributors;\n /**\n * The selected readout regime's declared ADC integral non-linearity (INL), if any. The code sample\n * records INL only at its own code, but the effective white level needs it at saturation.\n */\n adcIntegralNonLinearity?:\n SensorAdcIntegralNonLinearity;\n}\n\nexport interface SensorRawCaptureSample {\n version:\n typeof SENSOR_RAW_CAPTURE_SAMPLE_VERSION;\n captureModeId: string;\n modeSampleCoordinateSystem:\n \"capture-mode-full-frame-effective-sample-index\";\n modeSampleIndexFullFrame: {\n x: number;\n y: number;\n };\n colorSamplingProfileId: string;\n colorSamplingSite: {\n x: number;\n y: number;\n };\n channelId: string;\n rawCode: number;\n blackLevelCode: number;\n digitalSaturationCode: number;\n blackSubtractedNormalizedCode:\n number;\n /** Full-saturation code from `calculateEffectiveSaturationCode`; constant per CFA phase. */\n effectiveSaturationCode: number;\n /** Regime system conversion gain, e⁻ per code (DNG NoiseProfile input). */\n systemConversionGainElectronsPerCode: number;\n /** Total read noise in e⁻: the square root of the sum of the squared RMS components (DNG NoiseProfile input). */\n readNoiseRmsElectrons: number;\n readoutProfileId: string;\n readoutRegimeId: string;\n sourceChargeSeedUint32: number;\n sourceReadNoiseSeedUint32: number;\n physicalScalarSaturationApplied:\n boolean;\n digitalSaturationApplied:\n boolean;\n cfaPhasePreservedInNativeCoordinates:\n true;\n physicalOrientationApplied:\n false;\n outputRotationApplied:\n false;\n groupedModeCombinationApplied:\n false;\n reconstructionApplied: false;\n aliasingModeled: false;\n moireModeled: false;\n}\n\nexport interface SensorRawReconstructionKernelContribution {\n offsetX: number;\n offsetY: number;\n sourceChannelId: string;\n weight: number;\n}\n\nexport interface SensorRawReconstructionChannelKernel {\n outputChannelId: string;\n contributions:\n readonly SensorRawReconstructionKernelContribution[];\n}\n\nexport interface SensorRawReconstructionProfile {\n schemaVersion:\n typeof SENSOR_RAW_RECONSTRUCTION_PROFILE_SCHEMA_VERSION;\n profileId: string;\n profileVersion: string;\n captureModeId: string;\n colorSamplingProfileId: string;\n scientificStatus:\n SensorSpectralResponseScientificStatus;\n method:\n \"explicit-linear-native-neighborhood\";\n normalization:\n \"weights-sum-to-one-per-output-channel\";\n negativeBlackSubtractedValuesAllowed:\n true;\n kernels:\n readonly SensorRawReconstructionChannelKernel[];\n evidence:\n readonly EvidenceProvenance[];\n limitations: readonly string[];\n}\n\nexport interface ResolveSensorRawReconstructionInput {\n profile:\n SensorRawReconstructionProfile;\n colorSamplingProfile:\n SensorColorSamplingProfile;\n centerSite: {\n x: number;\n y: number;\n };\n samples:\n readonly SensorRawCaptureSample[];\n}\n\nexport interface SensorRawReconstructedPixel {\n reconstructionProfileId:\n string;\n reconstructionProfileVersion:\n string;\n captureModeId: string;\n colorSamplingProfileId: string;\n centerSite: {\n x: number;\n y: number;\n };\n outputChannels:\n readonly {\n channelId: string;\n linearBlackSubtractedNormalizedValue:\n number;\n sourceContributions:\n readonly {\n site: {\n x: number;\n y: number;\n };\n sourceChannelId: string;\n weight: number;\n sourceValue: number;\n }[];\n }[];\n method:\n \"explicit-linear-native-neighborhood\";\n cfaAware: true;\n captureModeAware: true;\n physicalOrientationApplied:\n false;\n outputRotationApplied: false;\n sharpeningApplied: false;\n denoisingApplied: false;\n aliasingModeled: false;\n moireModeled: false;\n preSamplingOpticalTransferAdequacyEstablished:\n false;\n reconstructionDoesNotModifyRawSamples:\n true;\n}\n\nfunction requireRecord(\n value: unknown,\n path: string,\n allowedKeys: readonly string[] | null\n): UnknownRecord {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be an object.\"\n );\n }\n if (allowedKeys !== null) rejectUnknownFields(value, allowedKeys, path);\n return value as UnknownRecord;\n}\n\nfunction requireNonEmptyString(\n value: unknown,\n path: string\n): string {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must be a non-empty string.\"\n );\n }\n return value.trim();\n}\n\nfunction requireFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be finite.\"\n );\n }\n return value;\n}\n\nfunction requireSafeInteger(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a safe integer.\"\n );\n }\n return value;\n}\n\nfunction requireNonNegativeSafeIntegerInput(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value < 0\n ) {\n throw new InvalidScientificInputError(\n path +\n \" must be a non-negative safe integer.\"\n );\n }\n return value;\n}\n\nfunction parseLimitations(\n value: unknown,\n path: string\n): readonly string[] {\n if (!Array.isArray(value)) {\n throw new InvalidConfigurationError(\n path + \" must be an array.\"\n );\n }\n const parsed =\n value.map((entry, index) =>\n requireNonEmptyString(\n entry,\n path +\n \"[\" +\n index +\n \"]\"\n )\n );\n if (\n new Set(parsed).size !==\n parsed.length\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must not contain duplicates.\"\n );\n }\n return parsed;\n}\n\nfunction parseStatus(\n value: unknown,\n path: string\n): SensorSpectralResponseScientificStatus {\n if (\n value !== \"calibrated\" &&\n value !== \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n path + \" is invalid.\"\n );\n }\n return value;\n}\n\nfunction parseContribution(\n value: unknown,\n path: string\n): SensorRawReconstructionKernelContribution {\n const record =\n requireRecord(value, path, [\"offsetX\", \"offsetY\", \"sourceChannelId\", \"weight\"]);\n return {\n offsetX:\n requireSafeInteger(\n record.offsetX,\n path + \".offsetX\"\n ),\n offsetY:\n requireSafeInteger(\n record.offsetY,\n path + \".offsetY\"\n ),\n sourceChannelId:\n requireNonEmptyString(\n record.sourceChannelId,\n path + \".sourceChannelId\"\n ),\n weight:\n requireFinite(\n record.weight,\n path + \".weight\"\n )\n };\n}\n\nfunction parseKernel(\n value: unknown,\n path: string\n): SensorRawReconstructionChannelKernel {\n const record =\n requireRecord(value, path, [\"contributions\", \"outputChannelId\"]);\n if (\n !Array.isArray(\n record.contributions\n ) ||\n record.contributions\n .length === 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \".contributions must be a non-empty array.\"\n );\n }\n const contributions =\n record.contributions.map(\n (entry, index) =>\n parseContribution(\n entry,\n path +\n \".contributions[\" +\n index +\n \"]\"\n )\n );\n const keys =\n contributions.map(\n (entry) =>\n entry.offsetX +\n \":\" +\n entry.offsetY +\n \":\" +\n entry.sourceChannelId\n );\n if (\n new Set(keys).size !==\n keys.length\n ) {\n throw new InvalidConfigurationError(\n path +\n \".contributions must not contain duplicate site/channel references.\"\n );\n }\n\n const sum =\n contributions.reduce(\n (valueSum, entry) =>\n valueSum + entry.weight,\n 0\n );\n if (\n !Number.isFinite(sum) ||\n Math.abs(sum - 1) >\n 1e-12\n ) {\n throw new InvalidConfigurationError(\n path +\n \".contribution weights must sum to one.\"\n );\n }\n\n return {\n outputChannelId:\n requireNonEmptyString(\n record.outputChannelId,\n path +\n \".outputChannelId\"\n ),\n contributions\n };\n}\n\n/**\n * Validates untrusted input and returns it as a normalized, typed value. Unknown enum values,\n * missing required fields and inconsistent scientific data are rejected.\n *\n * The profile declares a normalized linear kernel for each output channel. It does not infer the\n * sensor's spectral primaries or calibrated colour.\n * @param value - Untrusted data. TypeScript types alone are not validation.\n * @returns The result. Success does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the package export and its full type definitions.\n */\nexport function parseSensorRawReconstructionProfile(\n value: unknown\n): SensorRawReconstructionProfile {\n const record =\n requireRecord(\n value,\n \"sensorRawReconstructionProfile\", [\"schemaVersion\", \"method\", \"normalization\", \"negativeBlackSubtractedValuesAllowed\", \"kernels\", \"profileId\", \"profileVersion\", \"captureModeId\", \"colorSamplingProfileId\", \"scientificStatus\", \"evidence\", \"limitations\"]\n );\n if (\n record.schemaVersion !==\n SENSOR_RAW_RECONSTRUCTION_PROFILE_SCHEMA_VERSION\n ) {\n throw new InvalidConfigurationError(\n 'sensorRawReconstructionProfile.schemaVersion must be \"' +\n SENSOR_RAW_RECONSTRUCTION_PROFILE_SCHEMA_VERSION +\n '\".'\n );\n }\n if (\n record.method !==\n \"explicit-linear-native-neighborhood\"\n ) {\n throw new InvalidConfigurationError(\n 'sensorRawReconstructionProfile.method must be \"explicit-linear-native-neighborhood\".'\n );\n }\n if (\n record.normalization !==\n \"weights-sum-to-one-per-output-channel\"\n ) {\n throw new InvalidConfigurationError(\n \"sensorRawReconstructionProfile.normalization is invalid.\"\n );\n }\n if (\n record\n .negativeBlackSubtractedValuesAllowed !==\n true\n ) {\n throw new InvalidConfigurationError(\n \"sensorRawReconstructionProfile.negativeBlackSubtractedValuesAllowed must be true.\"\n );\n }\n if (\n !Array.isArray(\n record.kernels\n ) ||\n record.kernels.length === 0\n ) {\n throw new InvalidConfigurationError(\n \"sensorRawReconstructionProfile.kernels must be a non-empty array.\"\n );\n }\n\n const kernels =\n record.kernels.map(\n (entry, index) =>\n parseKernel(\n entry,\n \"sensorRawReconstructionProfile.kernels[\" +\n index +\n \"]\"\n )\n );\n const outputIds =\n kernels.map(\n (kernel) =>\n kernel.outputChannelId\n );\n if (\n new Set(outputIds).size !==\n outputIds.length\n ) {\n throw new InvalidConfigurationError(\n \"sensorRawReconstructionProfile.kernels must not contain duplicate outputChannelId values.\"\n );\n }\n\n return {\n schemaVersion:\n SENSOR_RAW_RECONSTRUCTION_PROFILE_SCHEMA_VERSION,\n profileId:\n requireNonEmptyString(\n record.profileId,\n \"sensorRawReconstructionProfile.profileId\"\n ),\n profileVersion:\n requireNonEmptyString(\n record.profileVersion,\n \"sensorRawReconstructionProfile.profileVersion\"\n ),\n captureModeId:\n requireNonEmptyString(\n record.captureModeId,\n \"sensorRawReconstructionProfile.captureModeId\"\n ),\n colorSamplingProfileId:\n requireNonEmptyString(\n record.colorSamplingProfileId,\n \"sensorRawReconstructionProfile.colorSamplingProfileId\"\n ),\n scientificStatus:\n parseStatus(\n record.scientificStatus,\n \"sensorRawReconstructionProfile.scientificStatus\"\n ),\n method:\n \"explicit-linear-native-neighborhood\",\n normalization:\n \"weights-sum-to-one-per-output-channel\",\n negativeBlackSubtractedValuesAllowed:\n true,\n kernels,\n evidence:\n parseEvidenceList(\n record.evidence,\n \"sensorRawReconstructionProfile.evidence\"\n ),\n limitations:\n parseLimitations(\n record.limitations,\n \"sensorRawReconstructionProfile.limitations\"\n )\n };\n}\n\n/**\n * Commits one validated native RAW sample, with its exact site, channel and exposure event, for use\n * in reconstruction.\n * @param input - The input; see `CreateSensorRawCaptureSampleInput` for its fields, units and coordinates.\n * @returns The result. Success does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the package export and its full type definitions.\n */\nexport function createSensorRawCaptureSample(\n input:\n CreateSensorRawCaptureSampleInput\n): SensorRawCaptureSample {\n requireInputKeys(input, \"createSensorRawCaptureSample\", [\"rawCode\", \"contributors\", \"adcIntegralNonLinearity\"]);\n const raw =\n input.rawCode;\n const contributors =\n input.contributors;\n\n requireInputObject(contributors, \"contributors input\");\n if (\n contributors\n .modeSamplingKind !==\n \"native-effective-raster\" ||\n contributors.grouping !==\n null ||\n contributors\n .totalContributorSites !==\n 1 ||\n contributors\n .colorSamplingSiteRect\n .width !== 1 ||\n contributors\n .colorSamplingSiteRect\n .height !== 1\n ) {\n throw new InvalidScientificInputError(\n \"RAW site creation schema 0.1.0 requires one ungrouped native-effective capture-mode sample bound to exactly one color-sampling site; grouped/remosaic modes need explicit signal-combination weights.\"\n );\n }\n\n if (\n contributors\n .colorSamplingProfileId !==\n raw.colorSamplingProfileId\n ) {\n throw new InvalidScientificInputError(\n \"RAW readout color-sampling profile identity must match the capture-mode contributor binding.\"\n );\n }\n\n if (\n contributors\n .channelComposition.kind !==\n \"single-channel\" ||\n contributors\n .channelComposition\n .channelId !==\n raw.channelId\n ) {\n throw new InvalidScientificInputError(\n \"RAW readout channel must match the capture-mode color-sampling contributor channel.\"\n );\n }\n\n if (\n raw.site.x !==\n contributors\n .colorSamplingSiteRect.x ||\n raw.site.y !==\n contributors\n .colorSamplingSiteRect.y\n ) {\n throw new InvalidScientificInputError(\n \"RAW readout site must match the exact capture-mode color-sampling contributor site.\"\n );\n }\n\n const denominator =\n raw.digitalSaturationCode -\n raw.blackLevelCode;\n if (denominator <= 0) {\n throw new InvalidScientificInputError(\n \"RAW black/white code span must be positive.\"\n );\n }\n\n return {\n version:\n SENSOR_RAW_CAPTURE_SAMPLE_VERSION,\n captureModeId:\n contributors.modeId,\n modeSampleCoordinateSystem:\n \"capture-mode-full-frame-effective-sample-index\",\n modeSampleIndexFullFrame: {\n ...contributors\n .modeSampleIndexFullFrame\n },\n colorSamplingProfileId:\n raw.colorSamplingProfileId,\n colorSamplingSite: {\n ...raw.site\n },\n channelId:\n raw.channelId,\n rawCode:\n raw.rawCode,\n blackLevelCode:\n raw.blackLevelCode,\n digitalSaturationCode:\n raw.digitalSaturationCode,\n blackSubtractedNormalizedCode:\n (\n raw.rawCode -\n raw.blackLevelCode\n ) /\n denominator,\n effectiveSaturationCode:\n computeEffectiveSaturationCode(\n input.adcIntegralNonLinearity ===\n undefined\n ? raw\n : {\n ...raw,\n integralNonLinearity:\n input.adcIntegralNonLinearity\n }\n ),\n systemConversionGainElectronsPerCode:\n raw.systemConversionGainElectronsPerCode,\n readNoiseRmsElectrons:\n Math.sqrt(\n raw.electronicReadNoiseComponents.reduce(\n (sum, component) =>\n sum +\n component.rmsElectrons *\n component.rmsElectrons,\n 0\n )\n ),\n readoutProfileId:\n raw.readoutProfileId,\n readoutRegimeId:\n raw.regimeId,\n sourceChargeSeedUint32:\n raw.chargeSeedUint32,\n sourceReadNoiseSeedUint32:\n raw.readNoiseSeedUint32,\n physicalScalarSaturationApplied:\n raw\n .physicalScalarSaturationApplied,\n digitalSaturationApplied:\n raw\n .digitalSaturationApplied,\n cfaPhasePreservedInNativeCoordinates:\n true,\n physicalOrientationApplied:\n false,\n outputRotationApplied:\n false,\n groupedModeCombinationApplied:\n false,\n reconstructionApplied:\n false,\n aliasingModeled:\n false,\n moireModeled: false\n };\n}\n\nfunction requireCenterSite(\n value: {\n x: number;\n y: number;\n }\n): {\n x: number;\n y: number;\n} {\n return {\n x:\n requireNonNegativeSafeIntegerInput(\n value.x,\n \"centerSite.x\"\n ),\n y:\n requireNonNegativeSafeIntegerInput(\n value.y,\n \"centerSite.y\"\n )\n };\n}\n\n/**\n * Combines the supplied native samples through explicit normalized kernels, keeping CFA identity\n * and signed black-subtracted values.\n *\n * The CFA phase is absolute; orientation and crop come later. This fixed linear reconstruction does\n * not infer spectral primaries or calibrated colour, and is not a general demosaic algorithm.\n * @param input - The input; see `ResolveSensorRawReconstructionInput` for its fields, units and coordinates.\n * @returns The result. Success does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the package export and its full type definitions.\n */\nexport function resolveSensorRawReconstruction(\n input:\n ResolveSensorRawReconstructionInput\n): CalculationResult<SensorRawReconstructedPixel> {\n requireInputKeys(input, \"resolveSensorRawReconstruction\", [\"profile\", \"colorSamplingProfile\", \"centerSite\", \"samples\"]);\n const profile =\n parseSensorRawReconstructionProfile(\n input.profile\n );\n const center =\n requireCenterSite(\n input.centerSite\n );\n const colorSamplingProfile =\n parseSensorColorSamplingProfile(\n input.colorSamplingProfile\n );\n if (\n colorSamplingProfile.profileId !==\n profile.colorSamplingProfileId\n ) {\n throw new InvalidScientificInputError(\n \"Reconstruction color-sampling profile identity must match the reconstruction profile.\"\n );\n }\n\n if (\n !Array.isArray(input.samples) ||\n input.samples.length === 0\n ) {\n throw new InvalidScientificInputError(\n \"samples must be a non-empty RAW neighborhood.\"\n );\n }\n\n for (\n const sample of\n input.samples\n ) {\n if (\n sample.captureModeId !==\n profile.captureModeId ||\n sample\n .colorSamplingProfileId !==\n profile\n .colorSamplingProfileId\n ) {\n throw new InvalidScientificInputError(\n \"Every RAW neighborhood sample must match the reconstruction profile capture-mode and color-sampling identities.\"\n );\n }\n const resolvedSite =\n resolveColorSamplingSite({\n profile:\n colorSamplingProfile,\n site:\n sample\n .colorSamplingSite\n });\n if (\n resolvedSite.mapping\n .channelId !==\n sample.channelId\n ) {\n throw new InvalidScientificInputError(\n \"RAW neighborhood sample channelId must match the declared color-sampling topology at its native site.\"\n );\n }\n }\n\n const sampleMap =\n new Map(\n input.samples.map(\n (sample) => [\n sample.colorSamplingSite.x +\n \":\" +\n sample.colorSamplingSite.y +\n \":\" +\n sample.channelId,\n sample\n ] as const\n )\n );\n if (\n sampleMap.size !==\n input.samples.length\n ) {\n throw new InvalidScientificInputError(\n \"RAW neighborhood must not contain duplicate site/channel samples.\"\n );\n }\n\n const outputChannels = profile.kernels.map(kernel => calculateRawReconstructionChannel(kernel, center, (x, y, channelId) => {\n const sample = sampleMap.get(x + \":\" + y + \":\" + channelId);\n if (sample === undefined) throw new InvalidScientificInputError(\"RAW reconstruction neighborhood is missing a required site/channel contribution.\");\n return sample.blackSubtractedNormalizedCode;\n }));\n\n return approximationResult(\n {\n reconstructionProfileId:\n profile.profileId,\n reconstructionProfileVersion:\n profile.profileVersion,\n captureModeId:\n profile.captureModeId,\n colorSamplingProfileId:\n profile\n .colorSamplingProfileId,\n centerSite:\n center,\n outputChannels,\n method:\n \"explicit-linear-native-neighborhood\",\n cfaAware: true,\n captureModeAware:\n true,\n physicalOrientationApplied:\n false,\n outputRotationApplied:\n false,\n sharpeningApplied:\n false,\n denoisingApplied: false,\n aliasingModeled: false,\n moireModeled: false,\n preSamplingOpticalTransferAdequacyEstablished:\n false,\n reconstructionDoesNotModifyRawSamples:\n true\n },\n \"sensor-raw-explicit-linear-reconstruction\",\n \"1.0.0\",\n [\n \"Reconstruction uses only explicitly declared linear native-neighborhood weights tied to exact capture-mode and color-sampling identities.\",\n \"No manufacturer-specific CFA algorithm or branded demosaic behavior is inferred from topology labels.\",\n \"RAW samples remain in invariant native sensor/CFA coordinates; physical orientation and final output rotation are downstream.\",\n \"Negative black-subtracted values are preserved through the linear reconstruction instead of being silently clamped.\",\n \"Sharpening and denoising are not part of RAW reconstruction.\",\n \"Aliasing and moire are explicitly not modeled because this reconstruction contract does not establish an adequate pre-sampling optical transfer/scene-frequency model.\"\n ]\n );\n}\n\n/**\n * Internal: sums one channel's weighted contributions. The reference and packed paths use the same\n * order of operations. With `mirrorBounds`, a contribution site outside the native frame is read from\n * its mirror image (reflect-101, see `reflectRawSiteIndex`). Without it (the default), such a site is\n * rejected.\n */\nexport function calculateRawReconstructionChannel(kernel: SensorRawReconstructionChannelKernel,\n center: {x:number;y:number}, read: (x:number,y:number,channelId:string)=>number,\n mirrorBounds?: {width:number;height:number}): SensorRawReconstructedPixel[\"outputChannels\"][number] {\n let value = 0;\n const sourceContributions = kernel.contributions.map(contribution => {\n let x = center.x + contribution.offsetX, y = center.y + contribution.offsetY;\n if (mirrorBounds !== undefined) { x = reflectRawSiteIndex(x, mirrorBounds.width); y = reflectRawSiteIndex(y, mirrorBounds.height); }\n if (x < 0 || y < 0) throw new InvalidScientificInputError(\"RAW reconstruction kernel references a site outside the non-negative native sensor coordinate domain.\");\n const sourceValue = read(x,y,contribution.sourceChannelId);\n value += sourceValue*contribution.weight;\n return {site:{x,y},sourceChannelId:contribution.sourceChannelId,weight:contribution.weight,sourceValue};\n });\n if (!Number.isFinite(value)) throw new InvalidScientificInputError(\"Reconstructed linear channel value must remain finite.\");\n return {channelId:kernel.outputChannelId,linearBlackSubtractedNormalizedValue:value,sourceContributions};\n}\n\n// ------------------------------------------------------------------ built-in Bayer kernels and borders\n\n/** How a reconstruction neighbourhood that leaves the native frame is handled. */\nexport type RawReconstructionBorderHandling = \"reject\" | \"mirror\";\n\n/**\n * Mirror index (\"reflect-101\"): −1 → 1, −2 → 2, n → n−2. The edge site itself is not repeated, so\n * for a CFA that repeats every 2 sites (Bayer) each mirrored site has the same channel as the site the\n * repeating pattern would put there. Requires size ≥ 1; for size 1 every index maps to 0.\n */\nexport function reflectRawSiteIndex(index: number, size: number): number {\n if (index >= 0 && index < size) return index;\n if (size === 1) return 0;\n const period = 2 * size - 2, m = ((index % period) + period) % period;\n return m < size ? m : period - m;\n}\n\n/**\n * Internal: proves that mirrored (reflect-101) reads at the border return the channel the repeating\n * CFA would put at every virtual site within `reach` of each frame edge, for every row and column\n * phase. Mirroring works per axis, so checking each axis over every phase also covers the corners.\n * Throws otherwise.\n */\nexport function validateMirrorBorderCfaConsistency(layout: { repeatWidthSites: number; repeatHeightSites: number;\n siteChannelIds: readonly string[] }, width: number, height: number, reach: number): void {\n const rw = layout.repeatWidthSites, rh = layout.repeatHeightSites, ids = layout.siteChannelIds;\n const at = (x: number, y: number): string => ids[(((y % rh) + rh) % rh) * rw + ((x % rw) + rw) % rw]!;\n if (reach >= width || reach >= height) {\n throw new InvalidConfigurationError(\"Mirror border handling requires a native frame larger than the kernel reach.\");\n }\n for (let d = 1; d <= reach; d++) {\n for (let p = 0; p < Math.max(rw, rh); p++) {\n if (at(-d, p) !== at(reflectRawSiteIndex(-d, width), p) || at(width - 1 + d, p) !== at(reflectRawSiteIndex(width - 1 + d, width), p) ||\n at(p, -d) !== at(p, reflectRawSiteIndex(-d, height)) || at(p, height - 1 + d) !== at(p, reflectRawSiteIndex(height - 1 + d, height))) {\n throw new InvalidConfigurationError(\"Mirror border handling would change the CFA channel of a reflected site; this CFA/frame size needs reject handling or a smaller region.\");\n }\n }\n }\n}\n\n/** Internal: largest absolute site offset of any contribution (the neighbourhood reach). */\nexport function rawReconstructionKernelReach(profiles: readonly { profile: SensorRawReconstructionProfile }[]): number {\n let reach = 0;\n for (const { profile } of profiles) for (const kernel of profile.kernels) for (const c of kernel.contributions) {\n reach = Math.max(reach, Math.abs(c.offsetX), Math.abs(c.offsetY));\n }\n return reach;\n}\n\nexport type BuiltInBayerDemosaicKernel = \"bilinear\";\nexport const BUILT_IN_BAYER_DEMOSAIC_MODEL_VERSION = \"1.0.0\" as const;\n\nexport interface CreateBuiltInBayerDemosaicProfilesInput {\n kernel: BuiltInBayerDemosaicKernel;\n /** Capture mode the RAW frame belongs to; copied into every phase profile. */\n captureModeId: string;\n /** Must be a 2×2 periodic Bayer mosaic: one red, one blue and two diagonal green sites. */\n colorSamplingProfile: SensorColorSamplingProfile;\n /** CFA channel IDs for the red, green and blue roles. This is also the output channel order. */\n channelRoles: { red: string; green: string; blue: string };\n}\n\nexport interface BuiltInBayerDemosaicProfiles {\n kernel: BuiltInBayerDemosaicKernel;\n /** One profile per absolute CFA phase, row-major (`phaseY`, then `phaseX`). */\n phaseProfiles: { phaseX: number; phaseY: number; profile: SensorRawReconstructionProfile }[];\n outputChannelIds: [string, string, string];\n /** Largest |offset| of any contribution: 1 for bilinear. */\n kernelReachSites: number;\n}\n\ntype BayerRole = \"R\" | \"G\" | \"B\";\ntype BayerTap = readonly [dx: number, dy: number, role: BayerRole, weight: number];\nconst CROSS1 = [[1, 0], [-1, 0], [0, 1], [0, -1]] as const;\nconst DIAG1 = [[1, 1], [-1, 1], [1, -1], [-1, -1]] as const;\nfunction bayerTaps(points: readonly (readonly [number, number])[], role: BayerRole, weight: number): BayerTap[] {\n return points.map(([x, y]) => [x, y, role, weight] as const);\n}\n\n/**\n * Kernels for one kind of site. `own` is the site's channel; `horizontal` is the colour channel on the\n * same row, for a green site.\n *\n * Bilinear: the average of the nearest sites of the wanted channel. Every kernel sums to one and\n * reproduces signals that vary linearly (affine) exactly.\n */\nfunction bayerSiteKernels(own: BayerRole, horizontal: BayerRole | null): Record<BayerRole, BayerTap[]> {\n if (own !== \"G\") {\n const other: BayerRole = own === \"R\" ? \"B\" : \"R\";\n const green: BayerTap[] = bayerTaps(CROSS1, \"G\", 1 / 4);\n const opposite: BayerTap[] = bayerTaps(DIAG1, other, 1 / 4);\n const result = { G: green } as Record<BayerRole, BayerTap[]>;\n result[own] = [[0, 0, own, 1]]; result[other] = opposite;\n return result;\n }\n const h = horizontal!, v: BayerRole = h === \"R\" ? \"B\" : \"R\";\n const along = (role: BayerRole, horizontalAxis: boolean): BayerTap[] => {\n const near = horizontalAxis ? [[1, 0], [-1, 0]] as const : [[0, 1], [0, -1]] as const;\n return bayerTaps(near, role, 1 / 2);\n };\n const identity: BayerTap[] = [[0, 0, \"G\", 1]];\n const result = { G: identity } as Record<BayerRole, BayerTap[]>;\n result[h] = along(h, true); result[v] = along(v, false);\n return result;\n}\n\nconst BAYER_DEMOSAIC_EVIDENCE: Readonly<Record<BuiltInBayerDemosaicKernel, readonly EvidenceProvenance[]>> = {\n bilinear: [{ sourceOrigin: \"third-party\", reuseStatus: \"factual-reference-only\",\n sourceReference: \"Gunturk, Glotzbach, Altunbasak, Schafer & Mersereau, Demosaicking: color filter array interpolation, IEEE Signal Processing Magazine 22(1), 2005\",\n note: \"Bilinear interpolation of each Bayer channel from its nearest same-channel sites; weights derived in Photivra from that published definition.\" }]\n};\n\n/**\n * Builds the per-phase linear reconstruction profiles of the built-in bilinear Bayer demosaic kernel.\n *\n * The result is the ordinary `explicit-linear-native-neighborhood` profile used by RAW frame\n * reconstruction, native RAW development and `createCfaPlaneReconstructionTask`; there is no special\n * code path. Edge pixels need either a region whose neighbourhood stays inside the frame, or mirror\n * border handling.\n *\n * Approximation: fixed linear interpolation, not a calibrated or adaptive demosaic. Bilinear blurs\n * and shows \"zipper\" artefacts at edges. Aliasing and moiré are not modelled. The adaptive AHD method\n * is `createAhdDemosaicTask`.\n */\nexport function createBuiltInBayerDemosaicProfiles(input: CreateBuiltInBayerDemosaicProfilesInput): CalculationResult<BuiltInBayerDemosaicProfiles> {\n requireInputKeys(input, \"createBuiltInBayerDemosaicProfiles\", [\"kernel\", \"captureModeId\", \"colorSamplingProfile\", \"channelRoles\"]);\n const kernel = input.kernel;\n if (kernel !== \"bilinear\") throw new InvalidConfigurationError(\"Unknown built-in Bayer demosaic kernel.\");\n const captureModeId = requireNonEmptyString(input.captureModeId, \"captureModeId\");\n const cfa = parseSensorColorSamplingProfile(input.colorSamplingProfile), layout = cfa.layout;\n const roles = requireRecord(input.channelRoles, \"channelRoles\", [\"red\", \"green\", \"blue\"]);\n const ids: Record<BayerRole, string> = { R: requireNonEmptyString(roles.red, \"channelRoles.red\"),\n G: requireNonEmptyString(roles.green, \"channelRoles.green\"), B: requireNonEmptyString(roles.blue, \"channelRoles.blue\") };\n if (new Set(Object.values(ids)).size !== 3) throw new InvalidConfigurationError(\"channelRoles must name three distinct channels.\");\n if (layout.kind !== \"periodic-mosaic\" || layout.repeatWidthSites !== 2 || layout.repeatHeightSites !== 2) {\n throw new InvalidScientificInputError(\"Built-in Bayer kernels require a 2×2 periodic mosaic.\");\n }\n const tile = layout.siteChannelIds.map((id): BayerRole => {\n const found = ([\"R\", \"G\", \"B\"] as const).find((r) => ids[r] === id);\n if (found === undefined) throw new InvalidScientificInputError(\"Bayer CFA channel is not one of channelRoles.\");\n return found;\n });\n const red = tile.indexOf(\"R\"), blue = tile.indexOf(\"B\");\n if (tile.filter((r) => r === \"G\").length !== 2 || red < 0 || blue < 0 || red + blue !== 3) {\n throw new InvalidScientificInputError(\"Built-in Bayer kernels require one red, one blue and two diagonal green sites.\");\n }\n const phaseProfiles = [0, 1, 2, 3].map((i) => {\n const phaseX = i % 2, phaseY = (i - phaseX) / 2, own = tile[i]!;\n const byRole = bayerSiteKernels(own, own === \"G\" ? tile[phaseY * 2 + (1 - phaseX)]! : null);\n const profile = parseSensorRawReconstructionProfile({\n schemaVersion: SENSOR_RAW_RECONSTRUCTION_PROFILE_SCHEMA_VERSION, profileId: \"photivra-builtin-\" + kernel + \"-phase-\" + phaseX + \"-\" + phaseY,\n profileVersion: BUILT_IN_BAYER_DEMOSAIC_MODEL_VERSION, captureModeId, colorSamplingProfileId: cfa.profileId, scientificStatus: \"approximation\",\n method: \"explicit-linear-native-neighborhood\", normalization: \"weights-sum-to-one-per-output-channel\", negativeBlackSubtractedValuesAllowed: true,\n kernels: ([\"R\", \"G\", \"B\"] as const).map((r) => ({ outputChannelId: ids[r], contributions: byRole[r].map(([offsetX, offsetY, source, weight]) =>\n ({ offsetX, offsetY, sourceChannelId: ids[source], weight })) })),\n evidence: BAYER_DEMOSAIC_EVIDENCE[kernel].map((e) => ({ ...e })),\n limitations: [\"Fixed linear Bayer interpolation; not adaptive, calibrated or manufacturer-specific.\", \"Aliasing, moire and colour fringing are not modelled or suppressed.\"]\n });\n return { phaseX, phaseY, profile };\n });\n return approximationResult({ kernel, phaseProfiles, outputChannelIds: [ids.R, ids.G, ids.B], kernelReachSites: 1 },\n \"built-in-bayer-demosaic-\" + kernel, BUILT_IN_BAYER_DEMOSAIC_MODEL_VERSION, [\n \"Nearest same-channel bilinear interpolation.\",\n \"Weights sum to one per output channel and reproduce affine channel signals exactly.\",\n \"Linear kernels only; adaptive (edge-directed) reconstruction is a separate non-linear path.\"\n ]);\n}\n"]}
|