@photivra/engine 2.20.0 → 2.22.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 +295 -1
- package/CITATION.cff +1 -1
- package/README.md +7 -6
- package/SECURITY.md +1 -1
- package/THIRD_PARTY.md +18 -0
- package/dist/capture/c2pa-embed.d.ts +116 -0
- package/dist/capture/c2pa-embed.js +493 -0
- package/dist/capture/c2pa-embed.js.map +1 -0
- package/dist/capture/dng-import.d.ts +73 -8
- package/dist/capture/dng-import.js +315 -80
- package/dist/capture/dng-import.js.map +1 -1
- package/dist/capture/dng-lens-correction-opcodes.d.ts +2 -2
- package/dist/capture/dng-lens-correction-opcodes.js +2 -2
- package/dist/capture/dng-lens-correction-opcodes.js.map +1 -1
- package/dist/capture/dng-opcodes.d.ts +96 -0
- package/dist/capture/dng-opcodes.js +391 -0
- package/dist/capture/dng-opcodes.js.map +1 -0
- package/dist/capture/dng-profile-maps.d.ts +99 -0
- package/dist/capture/dng-profile-maps.js +381 -0
- package/dist/capture/dng-profile-maps.js.map +1 -0
- package/dist/capture/dng-stage-image.d.ts +23 -0
- package/dist/capture/dng-stage-image.js +65 -0
- package/dist/capture/dng-stage-image.js.map +1 -0
- package/dist/capture/exposure-build-up-stage.d.ts +16 -0
- package/dist/capture/exposure-build-up-stage.js +4 -0
- package/dist/capture/exposure-build-up-stage.js.map +1 -0
- package/dist/capture/jpeg-xl-tiles.d.ts +22 -0
- package/dist/capture/jpeg-xl-tiles.js +151 -0
- package/dist/capture/jpeg-xl-tiles.js.map +1 -0
- package/dist/capture/lossy-jpeg.d.ts +17 -0
- package/dist/capture/lossy-jpeg.js +369 -0
- package/dist/capture/lossy-jpeg.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +2 -1
- package/dist/capture/native-environment-lean.js +41 -73
- package/dist/capture/native-environment-lean.js.map +1 -1
- package/dist/capture/native-environment-tabulated.js +4 -3
- package/dist/capture/native-environment-tabulated.js.map +1 -1
- package/dist/capture/native-raw-development.d.ts +2 -1
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/capture/native-raw.d.ts +3 -2
- package/dist/capture/native-raw.js +5 -4
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +4 -1
- package/dist/capture/sensor-raw-producer.js +12 -3
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/color/neighbor-highlight-reconstruction.d.ts +66 -0
- package/dist/color/neighbor-highlight-reconstruction.js +234 -0
- package/dist/color/neighbor-highlight-reconstruction.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +5 -0
- package/dist/color/sensor-color-development.js +7 -1
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/spectral-spikiness.d.ts +11 -0
- package/dist/color/spectral-spikiness.js +23 -0
- package/dist/color/spectral-spikiness.js.map +1 -0
- package/dist/core/execution-error.d.ts +21 -0
- package/dist/core/execution-error.js +12 -0
- package/dist/core/execution-error.js.map +1 -0
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/generic-lens-catalogue.d.ts +3 -2
- package/dist/equipment/generic-lens-catalogue.js +18 -5
- package/dist/equipment/generic-lens-catalogue.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +32 -0
- package/dist/equipment/generic-tier-assets.js +16 -11
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/sensor-profile-body.d.ts +78 -0
- package/dist/equipment/sensor-profile-body.js +77 -0
- package/dist/equipment/sensor-profile-body.js.map +1 -0
- package/dist/equipment/sensor-profiles.d.ts +8 -0
- package/dist/equipment/sensor-profiles.js +82 -0
- package/dist/equipment/sensor-profiles.js.map +1 -0
- package/dist/facade/catalogue-lens-signal.d.ts +28 -3
- package/dist/facade/catalogue-lens-signal.js +83 -78
- package/dist/facade/catalogue-lens-signal.js.map +1 -1
- package/dist/facade/chart-radiance-batch.js +2 -1
- package/dist/facade/chart-radiance-batch.js.map +1 -1
- package/dist/facade/defocus-image-space-provider.d.ts +7 -0
- package/dist/facade/defocus-image-space-provider.js +64 -76
- package/dist/facade/defocus-image-space-provider.js.map +1 -1
- package/dist/facade/diffraction-provider.d.ts +1 -1
- package/dist/facade/diffraction-provider.js +4 -4
- package/dist/facade/diffraction-provider.js.map +1 -1
- package/dist/facade/display-view-gpu-session.js +39 -5
- package/dist/facade/display-view-gpu-session.js.map +1 -1
- package/dist/facade/display-view-gpu.d.ts +19 -6
- package/dist/facade/display-view-gpu.js.map +1 -1
- package/dist/facade/display-view-lens-signal.js +25 -23
- package/dist/facade/display-view-lens-signal.js.map +1 -1
- package/dist/facade/display-view-normal.d.ts +15 -0
- package/dist/facade/display-view-normal.js +44 -0
- package/dist/facade/display-view-normal.js.map +1 -0
- package/dist/facade/display-view-rendering.d.ts +97 -0
- package/dist/facade/display-view-rendering.js +598 -0
- package/dist/facade/display-view-rendering.js.map +1 -0
- package/dist/facade/display-view.d.ts +37 -65
- package/dist/facade/display-view.js +152 -499
- package/dist/facade/display-view.js.map +1 -1
- package/dist/facade/expected-signal-setup.d.ts +3 -1
- package/dist/facade/expected-signal-setup.js +3 -3
- package/dist/facade/expected-signal-setup.js.map +1 -1
- package/dist/facade/expected-signal.d.ts +47 -14
- package/dist/facade/expected-signal.js +117 -112
- package/dist/facade/expected-signal.js.map +1 -1
- package/dist/facade/exposure-build-up.d.ts +70 -0
- package/dist/facade/exposure-build-up.js +164 -0
- package/dist/facade/exposure-build-up.js.map +1 -0
- package/dist/facade/fast-methods.d.ts +1 -1
- package/dist/facade/fast-methods.js +46 -9
- package/dist/facade/fast-methods.js.map +1 -1
- package/dist/facade/generic-lens-capture.d.ts +3 -3
- package/dist/facade/generic-lens-capture.js +3 -3
- package/dist/facade/generic-lens-capture.js.map +1 -1
- package/dist/facade/image-plane-enable.d.ts +7 -0
- package/dist/facade/image-plane-enable.js +17 -0
- package/dist/facade/image-plane-enable.js.map +1 -0
- package/dist/facade/image-plane-lattice-data.d.ts +6 -0
- package/dist/facade/image-plane-lattice-data.js +10 -0
- package/dist/facade/image-plane-lattice-data.js.map +1 -0
- package/dist/facade/image-plane-support.d.ts +33 -0
- package/dist/facade/image-plane-support.js +11 -0
- package/dist/facade/image-plane-support.js.map +1 -0
- package/dist/facade/image-plane.d.ts +36 -0
- package/dist/facade/image-plane.js +384 -0
- package/dist/facade/image-plane.js.map +1 -0
- package/dist/facade/mixed-illumination.d.ts +108 -0
- package/dist/facade/mixed-illumination.js +174 -0
- package/dist/facade/mixed-illumination.js.map +1 -0
- package/dist/facade/on-demand-kits.d.ts +14 -0
- package/dist/facade/on-demand-kits.js +36 -0
- package/dist/facade/on-demand-kits.js.map +1 -0
- package/dist/facade/opt-in-kit.d.ts +9 -0
- package/dist/facade/opt-in-kit.js +11 -0
- package/dist/facade/opt-in-kit.js.map +1 -0
- package/dist/facade/quality-kit.d.ts +21 -0
- package/dist/facade/quality-kit.js +23 -0
- package/dist/facade/quality-kit.js.map +1 -0
- package/dist/facade/quality-paths.d.ts +22 -0
- package/dist/facade/quality-paths.js +44 -0
- package/dist/facade/quality-paths.js.map +1 -0
- package/dist/facade/representative-light-sources.d.ts +72 -0
- package/dist/facade/representative-light-sources.js +124 -0
- package/dist/facade/representative-light-sources.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +145 -4
- package/dist/facade/scene-radiance.js +50 -13
- package/dist/facade/scene-radiance.js.map +1 -1
- package/dist/facade/simulate-capture.d.ts +68 -20
- package/dist/facade/simulate-capture.js +399 -146
- package/dist/facade/simulate-capture.js.map +1 -1
- package/dist/facade/simulate-display-view.d.ts +10 -12
- package/dist/facade/simulate-display-view.js +70 -53
- package/dist/facade/simulate-display-view.js.map +1 -1
- package/dist/gpu/chart-composite-gpu.d.ts +13 -1
- package/dist/gpu/chart-composite-gpu.js +48 -9
- package/dist/gpu/chart-composite-gpu.js.map +1 -1
- package/dist/gpu/chart-radiance-gpu.js +4 -30
- package/dist/gpu/chart-radiance-gpu.js.map +1 -1
- package/dist/gpu/display-view-composite-material-module.d.ts +10 -4
- package/dist/gpu/display-view-composite-material-module.js +39 -13
- package/dist/gpu/display-view-composite-material-module.js.map +1 -1
- package/dist/gpu/display-view-gpu-renderer.d.ts +43 -0
- package/dist/gpu/display-view-gpu-renderer.js +134 -0
- package/dist/gpu/display-view-gpu-renderer.js.map +1 -0
- package/dist/gpu/display-view-image-material-module.d.ts +87 -0
- package/dist/gpu/display-view-image-material-module.js +361 -0
- package/dist/gpu/display-view-image-material-module.js.map +1 -0
- package/dist/gpu/display-view-image-quality.d.ts +87 -0
- package/dist/gpu/display-view-image-quality.js +625 -0
- package/dist/gpu/display-view-image-quality.js.map +1 -0
- package/dist/gpu/display-view-quality-gpu.d.ts +80 -65
- package/dist/gpu/display-view-quality-gpu.js +187 -445
- package/dist/gpu/display-view-quality-gpu.js.map +1 -1
- package/dist/gpu/display-view-speed-gpu.d.ts +67 -19
- package/dist/gpu/display-view-speed-gpu.js +181 -105
- package/dist/gpu/display-view-speed-gpu.js.map +1 -1
- package/dist/gpu/image-kernel-accelerator.js +3 -0
- package/dist/gpu/image-kernel-accelerator.js.map +1 -1
- package/dist/gpu/image-kernel-execution.d.ts +2 -13
- package/dist/gpu/image-kernel-execution.js +2 -10
- package/dist/gpu/image-kernel-execution.js.map +1 -1
- package/dist/gpu/wgsl-display-view-coupled-stub.d.ts +8 -0
- package/dist/gpu/wgsl-display-view-coupled-stub.js +21 -0
- package/dist/gpu/wgsl-display-view-coupled-stub.js.map +1 -0
- package/dist/gpu/wgsl-display-view-coupled.d.ts +88 -0
- package/dist/gpu/wgsl-display-view-coupled.js +353 -0
- package/dist/gpu/wgsl-display-view-coupled.js.map +1 -0
- package/dist/gpu/wgsl-display-view-quality-kernel.d.ts +33 -24
- package/dist/gpu/wgsl-display-view-quality-kernel.js +166 -146
- package/dist/gpu/wgsl-display-view-quality-kernel.js.map +1 -1
- package/dist/gpu/wgsl-display-view-speed-kernel.d.ts +19 -44
- package/dist/gpu/wgsl-display-view-speed-kernel.js +116 -18
- package/dist/gpu/wgsl-display-view-speed-kernel.js.map +1 -1
- package/dist/gpu/wgsl-exact-sum.d.ts +20 -0
- package/dist/gpu/wgsl-exact-sum.js +42 -0
- package/dist/gpu/wgsl-exact-sum.js.map +1 -0
- package/dist/index.d.ts +22 -6
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/motion/subject-motion.d.ts +66 -0
- package/dist/motion/subject-motion.js +52 -0
- package/dist/motion/subject-motion.js.map +1 -0
- package/dist/optics/generic-lens-lateral-color.d.ts +83 -0
- package/dist/optics/generic-lens-lateral-color.js +77 -0
- package/dist/optics/generic-lens-lateral-color.js.map +1 -0
- package/dist/optics/generic-lens-psf.js +54 -46
- package/dist/optics/generic-lens-psf.js.map +1 -1
- package/dist/optics/lens-psf-profile.d.ts +7 -0
- package/dist/optics/lens-psf-profile.js +2 -1
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/output/camera-channel-response.d.ts +50 -0
- package/dist/output/camera-channel-response.js +69 -0
- package/dist/output/camera-channel-response.js.map +1 -0
- package/dist/output/developed-lens-corrections.d.ts +19 -5
- package/dist/output/developed-lens-corrections.js +28 -9
- package/dist/output/developed-lens-corrections.js.map +1 -1
- package/dist/output/generic-lens-corrections.d.ts +41 -5
- package/dist/output/generic-lens-corrections.js +52 -8
- package/dist/output/generic-lens-corrections.js.map +1 -1
- package/dist/output/native-capture-sdr.js +5 -2
- package/dist/output/native-capture-sdr.js.map +1 -1
- package/dist/output/print-plan.d.ts +41 -5
- package/dist/output/print-plan.js +59 -14
- package/dist/output/print-plan.js.map +1 -1
- package/dist/output/sdr-rendering.d.ts +18 -1
- package/dist/output/sdr-rendering.js +39 -2
- package/dist/output/sdr-rendering.js.map +1 -1
- package/dist/sensor/binomial-sample.d.ts +3 -0
- package/dist/sensor/binomial-sample.js +86 -0
- package/dist/sensor/binomial-sample.js.map +1 -0
- package/dist/sensor/native-sensor-report.d.ts +10 -0
- package/dist/sensor/native-sensor-report.js +16 -0
- package/dist/sensor/native-sensor-report.js.map +1 -0
- package/dist/sensor/sensor-characteristics.d.ts +91 -13
- package/dist/sensor/sensor-characteristics.js +30 -15
- package/dist/sensor/sensor-characteristics.js.map +1 -1
- package/docs/AGENT_GUIDE.md +1 -0
- package/docs/API_REFERENCE.md +214 -4
- package/docs/QUICK_START.md +162 -8
- package/docs/USAGE.md +195 -22
- package/docs/api/capture-c2pa-embed.md +177 -0
- package/docs/api/capture-dng-import.md +86 -10
- package/docs/api/capture-dng-opcodes.md +93 -0
- package/docs/api/capture-dng-profile-maps.md +141 -0
- package/docs/api/capture-dng-stage-image.md +43 -0
- package/docs/api/capture-jpeg-xl-tiles.md +33 -0
- package/docs/api/capture-lossy-jpeg.md +41 -0
- package/docs/api/capture-native-raw-development.md +2 -1
- package/docs/api/core-execution-error.md +43 -0
- package/docs/api/core-version.md +1 -1
- package/docs/api/equipment-generic-lens-catalogue.md +10 -5
- package/docs/api/equipment-sensor-profile-body.md +64 -0
- package/docs/api/equipment-sensor-profiles.md +86 -0
- package/docs/api/exports.json +460 -5
- package/docs/api/facade-display-view-gpu.md +5 -2
- package/docs/api/facade-display-view.md +11 -15
- package/docs/api/facade-exposure-build-up.md +105 -0
- package/docs/api/facade-fast-methods.md +47 -10
- package/docs/api/facade-image-plane-enable.md +16 -0
- package/docs/api/facade-mixed-illumination.md +67 -0
- package/docs/api/facade-quality-paths.md +24 -0
- package/docs/api/facade-representative-light-sources.md +131 -0
- package/docs/api/facade-scene-radiance.md +54 -3
- package/docs/api/facade-simulate-capture.md +48 -11
- package/docs/api/facade-simulate-display-view.md +10 -12
- package/docs/api/gpu-image-kernel-execution.md +0 -36
- package/docs/api/motion-subject-motion.md +23 -0
- package/docs/api/optics-generic-lens-lateral-color.md +79 -0
- package/docs/api/output-camera-channel-response.md +55 -0
- package/docs/api/output-developed-lens-corrections.md +10 -1
- package/docs/api/output-generic-lens-corrections.md +40 -4
- package/docs/api/output-print-plan.md +35 -1
- package/docs/api/output-sdr-rendering.md +6 -1
- package/docs/api/sensor-sensor-characteristics.md +54 -2
- package/llms.txt +3 -0
- package/package.json +6 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lossy-jpeg.js","sourceRoot":"","sources":["../../src/capture/lossy-jpeg.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Size-limited decoder for 8-bit sequential DCT JPEG (ITU-T T.81 | ISO/IEC 10918-1, processes 1 and 2: SOF0 baseline and SOF1\n * extended sequential with Huffman coding), the variant DNG uses for Compression = 34892 (\"lossy JPEG\", DNG 1.4.0.0) strips and\n * tiles. Written independently from the published standard, with no third-party decoder source. Browser-safe: plain typed arrays.\n *\n * Decoding follows T.81 Annex F (Huffman decoding F.2.2, DC prediction, run-length AC decoding, restart intervals F.2.2.5) and the\n * inverse DCT of A.3.3, evaluated directly in double precision with the correctly rounded cosine table `JPEG_DCT_COSINES`, then\n * rounded half away from zero, level-shifted by 128 and clamped to 0..255 (A.3.1). DCT decoders may differ by one code from each\n * other (T.81 leaves the IDCT accuracy to ITU-T T.83 compliance limits); this one is deterministic.\n *\n * Subsampled components are interpolated linearly to full size with centred sample siting (T.871, JFIF: chroma samples sit at the\n * centre of the luma samples they cover), so a 2:1 factor uses the weights 3/4 and 1/4. Three-component data is converted from\n * YCbCr to RGB with the T.871 equations unless the stream says it is RGB: an APP14 \"Adobe\" segment with transform 0, or, without\n * JFIF or APP14 segments, component identifiers \"R\", \"G\", \"B\" (the conventions ITU-T T.872 describes). Four components are\n * returned as stored.\n *\n * Supported: precision 8, 1..4 components with sampling factors 1..4, interleaved and non-interleaved sequential scans, DRI restart\n * intervals, 8- and 16-bit quantization tables, tables defined in a separate abbreviated stream (DNG JPEGTables). Rejected:\n * progressive, hierarchical, lossless and arithmetic-coded frames, 12-bit precision, truncated data.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { JPEG_DCT_COSINES } from \"./export-jpeg.js\";\n\n/** Decoded samples, interleaved by component within each line (line, x, component), 0..255. */\nexport interface LossyJpegImage {\n width: number;\n height: number;\n components: number;\n /** \"ycbcr-to-rgb\" when three YCbCr components were converted to RGB; \"none\" otherwise. */\n colorTransform: \"ycbcr-to-rgb\" | \"none\";\n samples: Uint8Array;\n}\nexport interface LossyJpegLimits {\n /** Largest width x height x components accepted, checked before any sample buffer is allocated. */\n maximumSamples: number;\n /** An abbreviated table-specification stream (SOI, DQT/DHT, EOI) read before `bytes`, as DNG's JPEGTables tag (347) supplies. */\n tables?: Uint8Array;\n}\n\ninterface Huffman { maxCode: Int32Array; valPtr: Int32Array; minCode: Int32Array; values: Uint8Array }\ninterface Component { id: number; h: number; v: number; tq: number; blocksWide: number; blocksHigh: number; plane: Uint8Array; previousDc: number; dc?: Huffman | undefined; ac?: Huffman | undefined }\nfunction fail(message: string): never { throw new InvalidConfigurationError(\"Lossy JPEG: \" + message); }\n\nconst ZIGZAG = /* @__PURE__ */ ((): Int32Array => {\n const z = new Int32Array(64);\n for (let d = 0, i = 0; d <= 14; d++) {\n const points: number[] = [];\n for (let y = 0; y < 8; y++) { const x = d - y; if (x >= 0 && x < 8) points.push(y * 8 + x); }\n for (const p of d % 2 === 0 ? points.reverse() : points) z[i++] = p;\n }\n return z;\n})();\n\n/** T.81 Annex C code generation and F.2.2.3 decoder tables. */\nfunction buildHuffman(counts: Uint8Array, values: Uint8Array): Huffman {\n const maxCode = new Int32Array(18).fill(-1), minCode = new Int32Array(17), valPtr = new Int32Array(17);\n let code = 0, k = 0;\n for (let length = 1; length <= 16; length++) {\n const n = counts[length - 1]!;\n if (n) { valPtr[length] = k; minCode[length] = code; code += n; k += n; maxCode[length] = code - 1; }\n if (code > (1 << length)) fail(\"over-subscribed Huffman table.\");\n code <<= 1;\n }\n maxCode[17] = 0x7fffffff;\n return { maxCode, minCode, valPtr, values };\n}\n\n/** Decodes one DCT JPEG stream (see the module notes). Every length, count and table index is checked against the buffer. */\nexport function parseLossyJpeg(bytes: Uint8Array, limits: LossyJpegLimits): LossyJpegImage {\n if (!(bytes instanceof Uint8Array)) fail(\"input must be a Uint8Array.\");\n if (limits === null || typeof limits !== \"object\" || !Number.isSafeInteger(limits.maximumSamples) || limits.maximumSamples < 1) fail(\"invalid sample limit.\");\n if (limits.tables !== undefined && !(limits.tables instanceof Uint8Array)) fail(\"tables must be a Uint8Array.\");\n const quant: (Float64Array | undefined)[] = [], dcTables: (Huffman | undefined)[] = [], acTables: (Huffman | undefined)[] = [];\n const state = { restart: 0, jfif: false, adobe: -1 };\n let scanned = false;\n let frame: { width: number; height: number; components: Component[]; hMax: number; vMax: number; mcusWide: number; mcusHigh: number } | undefined;\n\n const segments = (data: Uint8Array, tablesOnly: boolean): void => {\n const n = data.length;\n if (n < 4 || data[0] !== 0xff || data[1] !== 0xd8) fail(\"missing SOI marker.\");\n let p = 2;\n for (;;) {\n while (p < n && data[p] === 0xff && data[p + 1] === 0xff) p++;\n if (p + 2 > n || data[p] !== 0xff) fail(\"malformed marker segment.\");\n const marker = data[p + 1]!;\n if (marker === 0xd9) { if (tablesOnly || scanned) return; fail(\"no scan before EOI.\"); }\n if (p + 4 > n) fail(\"malformed marker segment.\");\n const size = data[p + 2]! * 256 + data[p + 3]!, start = p + 4, end = p + 2 + size;\n if (size < 2 || end > n) fail(\"segment exceeds the stream.\");\n if (marker === 0xdb) {\n for (let q = start; q < end;) {\n const pq = data[q]! >> 4, tq = data[q]! & 15, len = pq ? 128 : 64;\n if (pq > 1 || tq > 3 || q + 1 + len > end) fail(\"invalid quantization table.\");\n const table = new Float64Array(64);\n for (let i = 0; i < 64; i++) {\n const v = pq ? data[q + 1 + i * 2]! * 256 + data[q + 2 + i * 2]! : data[q + 1 + i]!;\n if (v === 0) fail(\"zero quantization value.\");\n table[ZIGZAG[i]!] = v;\n }\n quant[tq] = table; q += 1 + len;\n }\n } else if (marker === 0xc4) {\n for (let q = start; q < end;) {\n const tc = data[q]! >> 4, th = data[q]! & 15;\n if (tc > 1 || th > 3 || q + 17 > end) fail(\"invalid Huffman table.\");\n const counts = data.subarray(q + 1, q + 17);\n let total = 0; for (const c of counts) total += c;\n if (total > 256 || q + 17 + total > end) fail(\"Huffman table exceeds its segment.\");\n (tc ? acTables : dcTables)[th] = buildHuffman(counts, data.slice(q + 17, q + 17 + total));\n q += 17 + total;\n }\n } else if (marker === 0xdd) {\n if (size !== 4) fail(\"invalid restart interval.\");\n state.restart = data[start]! * 256 + data[start + 1]!;\n } else if (marker === 0xe0) {\n if (size >= 7 && data[start] === 0x4a && data[start + 1] === 0x46 && data[start + 2] === 0x49 && data[start + 3] === 0x46 && data[start + 4] === 0) state.jfif = true;\n } else if (marker === 0xee) {\n if (size >= 14 && String.fromCharCode(...data.subarray(start, start + 5)) === \"Adobe\") state.adobe = data[start + 11]!;\n } else if (marker === 0xc0 || marker === 0xc1) {\n if (tablesOnly || frame) fail(\"unexpected frame header.\");\n if (size < 8) fail(\"unsupported frame header.\");\n const precision = data[start]!, height = data[start + 1]! * 256 + data[start + 2]!, width = data[start + 3]! * 256 + data[start + 4]!, nf = data[start + 5]!;\n if (precision !== 8) fail(\"only 8-bit precision is supported.\");\n if (height < 1 || width < 1 || nf < 1 || nf > 4 || size !== 8 + 3 * nf) fail(\"unsupported frame header.\");\n if (width * height * nf > limits.maximumSamples) fail(\"frame exceeds the sample limit.\");\n const raw: { id: number; h: number; v: number; tq: number }[] = [];\n for (let i = 0; i < nf; i++) {\n const o = start + 6 + i * 3, h = data[o + 1]! >> 4, v = data[o + 1]! & 15, tq = data[o + 2]!;\n if (h < 1 || h > 4 || v < 1 || v > 4 || tq > 3) fail(\"invalid component sampling or table.\");\n if (raw.some((c) => c.id === data[o])) fail(\"duplicate component identifier.\");\n raw.push({ id: data[o]!, h, v, tq });\n }\n const hMax = Math.max(...raw.map((c) => c.h)), vMax = Math.max(...raw.map((c) => c.v));\n const mcusWide = Math.ceil(width / (8 * hMax)), mcusHigh = Math.ceil(height / (8 * vMax));\n const components = raw.map((c) => {\n const blocksWide = mcusWide * c.h, blocksHigh = mcusHigh * c.v;\n return { ...c, blocksWide, blocksHigh, plane: new Uint8Array(blocksWide * blocksHigh * 64), previousDc: 0 };\n });\n frame = { width, height, components, hMax, vMax, mcusWide, mcusHigh };\n } else if (marker === 0xda) {\n if (tablesOnly || !frame) fail(\"scan before frame header.\");\n const ns = data[start]!;\n if (ns < 1 || ns > 4 || size !== 6 + 2 * ns) fail(\"invalid scan header.\");\n const scan: Component[] = [];\n for (let i = 0; i < ns; i++) {\n const c = frame.components.find((x) => x.id === data[start + 1 + i * 2]);\n if (!c || scan.includes(c)) fail(\"scan references an unknown component.\");\n const td = data[start + 2 + i * 2]! >> 4, ta = data[start + 2 + i * 2]! & 15;\n c.dc = dcTables[td]; c.ac = acTables[ta];\n if (!c.dc || !c.ac) fail(\"scan references an undefined Huffman table.\");\n if (!quant[c.tq]) fail(\"component references an undefined quantization table.\");\n scan.push(c);\n }\n const ss = data[start + 1 + 2 * ns]!, se = data[start + 2 + 2 * ns]!, a = data[start + 3 + 2 * ns]!;\n if (ss !== 0 || se !== 63 || a !== 0) fail(\"only sequential scans are supported.\");\n if (scan.reduce((s, c) => s + (ns === 1 ? 1 : c.h * c.v), 0) > 10) fail(\"too many blocks per MCU.\");\n // Further scans may follow (non-interleaved sequential); EOI ends the image.\n p = decodeScan(data, end, frame, scan, quant, state.restart);\n scanned = true;\n continue;\n } else if ((marker >= 0xc2 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) || marker === 0xde) {\n fail(\"only sequential Huffman DCT frames (SOF0, SOF1) are supported.\");\n } else if (marker === 0xcc) {\n fail(\"arithmetic coding is not supported.\");\n } else if (marker < 0xc0 || marker === 0xd8 || (marker >= 0xd0 && marker <= 0xd7)) {\n fail(\"unexpected marker.\");\n }\n p = end;\n }\n };\n if (limits.tables) segments(limits.tables, true);\n segments(bytes, false);\n if (!frame) fail(\"no image.\");\n if (frame.components.some((c) => !c.dc)) fail(\"a component has no scan.\");\n return assemble(frame, state);\n}\n\nfunction decodeScan(data: Uint8Array, start: number, frame: { width: number; height: number; hMax: number; vMax: number; mcusWide: number; mcusHigh: number },\n scan: Component[], quant: (Float64Array | undefined)[], restartInterval: number): number {\n let p = start, buffer = 0, bits = 0, padding = 0, marker = -1;\n const fill = (): void => {\n let byte = 0;\n if (marker < 0 && p < data.length && data[p] !== 0xff) byte = data[p++]!;\n else if (marker < 0 && p + 1 < data.length && data[p] === 0xff && data[p + 1] === 0x00) { byte = 0xff; p += 2; }\n else {\n if (marker < 0 && p + 1 < data.length) marker = data[p + 1]!;\n if (++padding > 8) fail(\"entropy-coded data is truncated.\");\n }\n buffer = ((buffer << 8) | byte) >>> 0; bits += 8;\n };\n const readBits = (count: number): number => {\n if (count === 0) return 0;\n while (bits < count) fill();\n bits -= count;\n return (buffer >>> bits) & ((1 << count) - 1);\n };\n const decode = (t: Huffman): number => {\n let code = readBits(1), len = 1;\n while (code > t.maxCode[len]!) {\n if (++len > 16) fail(\"invalid Huffman code.\");\n code = (code << 1) | readBits(1);\n }\n const v = t.values[t.valPtr[len]! + code - t.minCode[len]!];\n if (v === undefined) fail(\"invalid Huffman code.\");\n return v;\n };\n const extend = (v: number, s: number): number => v < (1 << (s - 1)) ? v - (1 << s) + 1 : v;\n const coefficients = new Float64Array(64), rows = new Float64Array(64), cos = JPEG_DCT_COSINES;\n const block = (c: Component, bx: number, by: number): void => {\n coefficients.fill(0);\n const t = decode(c.dc!);\n if (t > 11) fail(\"invalid DC difference category.\");\n c.previousDc += t ? extend(readBits(t), t) : 0;\n const q = quant[c.tq]!;\n coefficients[0] = c.previousDc * q[0]!;\n for (let k = 1; k < 64;) {\n const rs = decode(c.ac!), r = rs >> 4, s = rs & 15;\n if (s === 0) { if (r === 15) { k += 16; continue; } break; }\n k += r;\n if (k > 63 || s > 10) fail(\"invalid AC coefficient.\");\n const z = ZIGZAG[k]!;\n coefficients[z] = extend(readBits(s), s) * q[z]!;\n k++;\n }\n // A.3.3: s(y,x) = 1/4 Σ_u Σ_v C(u)C(v) S(v,u) cos((2x+1)uπ/16) cos((2y+1)vπ/16), rows (u) first, then columns (v).\n for (let v = 0; v < 8; v++) for (let x = 0; x < 8; x++) {\n let sum = 0;\n for (let u = 0; u < 8; u++) sum += (u === 0 ? Math.SQRT1_2 : 1) * coefficients[v * 8 + u]! * cos[u * 8 + x]!;\n rows[v * 8 + x] = sum;\n }\n const stride = c.blocksWide * 8, base = by * 8 * stride + bx * 8;\n for (let y = 0; y < 8; y++) for (let x = 0; x < 8; x++) {\n let sum = 0;\n for (let v = 0; v < 8; v++) sum += (v === 0 ? Math.SQRT1_2 : 1) * rows[v * 8 + x]! * cos[v * 8 + y]!;\n const value = sum / 4, rounded = value < 0 ? -Math.round(-value) : Math.round(value);\n c.plane[base + y * stride + x] = Math.min(255, Math.max(0, rounded + 128));\n }\n };\n for (const c of scan) c.previousDc = 0;\n // A single-component scan is non-interleaved: one block per MCU over the component's own (unpadded-to-MCU) block grid.\n const single = scan.length === 1 ? scan[0]! : undefined;\n const unitsWide = single ? Math.ceil(Math.ceil(frame.width * single.h / frame.hMax) / 8) : frame.mcusWide;\n const unitsHigh = single ? Math.ceil(Math.ceil(frame.height * single.v / frame.vMax) / 8) : frame.mcusHigh;\n const total = unitsWide * unitsHigh;\n for (let m = 0, restarts = 0; m < total; m++) {\n if (restartInterval && m > 0 && m % restartInterval === 0) {\n bits = 0; buffer = 0; padding = 0; marker = -1;\n if (p + 1 >= data.length || data[p] !== 0xff || data[p + 1] !== (0xd0 | (restarts & 7))) fail(\"missing restart marker.\");\n p += 2; restarts++;\n for (const c of scan) c.previousDc = 0;\n }\n const mx = m % unitsWide, my = Math.floor(m / unitsWide);\n if (single) block(single, mx, my);\n else for (const c of scan) for (let v = 0; v < c.v; v++) for (let h = 0; h < c.h; h++) block(c, mx * c.h + h, my * c.v + v);\n }\n // Skip to the next marker: remaining fill bits are discarded (T.81 F.1.2.3 pads with 1-bits).\n while (p < data.length && !(data[p] === 0xff && data[p + 1] !== 0x00 && !(data[p + 1]! >= 0xd0 && data[p + 1]! <= 0xd7))) p++;\n if (p + 1 >= data.length) fail(\"missing EOI marker.\");\n return p;\n}\n\nfunction assemble(frame: { width: number; height: number; components: Component[]; hMax: number; vMax: number }, state: { jfif: boolean; adobe: number }): LossyJpegImage {\n const { width, height, components, hMax, vMax } = frame, nf = components.length, out = new Uint8Array(width * height * nf);\n components.forEach((c, ci) => {\n const stride = c.blocksWide * 8, cw = Math.ceil(width * c.h / hMax), ch = Math.ceil(height * c.v / vMax);\n if (c.h === hMax && c.v === vMax) {\n for (let y = 0; y < height; y++) for (let x = 0; x < width; x++) out[(y * width + x) * nf + ci] = c.plane[y * stride + x]!;\n return;\n }\n // Centred linear interpolation: output sample x covers component position (x + 0.5)·h/hMax − 0.5, clamped to the samples.\n const sx = c.h / hMax, sy = c.v / vMax;\n for (let y = 0; y < height; y++) {\n const fy = Math.min(Math.max((y + 0.5) * sy - 0.5, 0), ch - 1), y0 = Math.floor(fy), y1 = Math.min(y0 + 1, ch - 1), wy = fy - y0;\n for (let x = 0; x < width; x++) {\n const fx = Math.min(Math.max((x + 0.5) * sx - 0.5, 0), cw - 1), x0 = Math.floor(fx), x1 = Math.min(x0 + 1, cw - 1), wx = fx - x0;\n const a = c.plane[y0 * stride + x0]!, b = c.plane[y0 * stride + x1]!, d = c.plane[y1 * stride + x0]!, e = c.plane[y1 * stride + x1]!;\n out[(y * width + x) * nf + ci] = Math.round((a * (1 - wx) + b * wx) * (1 - wy) + (d * (1 - wx) + e * wx) * wy);\n }\n }\n });\n const ids = components.map((c) => c.id), rgbIds = ids[0] === 0x52 && ids[1] === 0x47 && ids[2] === 0x42;\n const ycc = nf === 3 && (state.adobe >= 0 ? state.adobe !== 0 : state.jfif || !rgbIds);\n if (ycc) for (let i = 0; i < out.length; i += 3) {\n // T.871 §7: R = Y + 1.402 (Cr − 128), G = Y − 0.344136 (Cb − 128) − 0.714136 (Cr − 128), B = Y + 1.772 (Cb − 128).\n const y = out[i]!, cb = out[i + 1]! - 128, cr = out[i + 2]! - 128;\n out[i] = clamp8(y + 1.402 * cr); out[i + 1] = clamp8(y - 0.344136 * cb - 0.714136 * cr); out[i + 2] = clamp8(y + 1.772 * cb);\n }\n return { width, height, components: nf, colorTransform: ycc ? \"ycbcr-to-rgb\" : \"none\", samples: out };\n}\nfunction clamp8(v: number): number { return Math.min(255, Math.max(0, Math.round(v))); }\n"]}
|
|
@@ -41,6 +41,7 @@ import { parseFocusPlane } from "../optics/focus-state.js";
|
|
|
41
41
|
import { prepareCaptureExposureWindowSampler } from "../sensor/exposure-window.js";
|
|
42
42
|
import { calculateNativeRawSite, type NativeRawProducerFrameContext, type SensorRawProducerSiteInput } from "./sensor-raw-producer.js";
|
|
43
43
|
import type { NativeRawLeanOutput, NativeRawLeanSensorHook } from "./native-raw.js";
|
|
44
|
+
import type { ExposureBuildUpStage } from "./exposure-build-up-stage.js";
|
|
44
45
|
type Site = SimulateEnvironmentSensorRawFrameInput["sites"][number];
|
|
45
46
|
type Env = Site["environment"];
|
|
46
47
|
type FullPlan = ReturnType<typeof planEnvironmentSensorPhotoSignal>;
|
|
@@ -230,7 +231,7 @@ export interface NativeSiteReadout {
|
|
|
230
231
|
* its codes and its flags bit for bit. Its `compute` then gives `calculateNativeRawSite`'s outputs for any site of the same
|
|
231
232
|
* readout inputs (same CFA channel, dark current, capacity, readout regime and fixed-pattern profile).
|
|
232
233
|
*/
|
|
233
|
-
export declare function createVerifiedNativeSiteReadout(parsed: SensorRawProducerSiteInput, result: ReturnType<typeof calculateNativeRawSite>, whiteCode: number, photo: SensorEqeTemporalPhotoSignal, x: number, y: number, index: number, seed: number): NativeSiteReadout | undefined;
|
|
234
|
+
export declare function createVerifiedNativeSiteReadout(parsed: SensorRawProducerSiteInput, result: ReturnType<typeof calculateNativeRawSite>, whiteCode: number, photo: SensorEqeTemporalPhotoSignal, x: number, y: number, index: number, seed: number, b?: ExposureBuildUpStage): NativeSiteReadout | undefined;
|
|
234
235
|
/**
|
|
235
236
|
* Lean sensor stage for createNativeEnvironmentRawTask.
|
|
236
237
|
*
|
|
@@ -965,58 +965,21 @@ function sensorMatches(site, photo, x, y, t, memo) {
|
|
|
965
965
|
return sameRecordExcept(photo, t.photo, PHOTO_SITE_FIELDS, memo) && siteSlot(photo.site, x, y) &&
|
|
966
966
|
photo.temporalSamples.length === t.photo.temporalSamples.length;
|
|
967
967
|
}
|
|
968
|
-
/** The sensor stage of calculateNativeRawSite, in the same operation order. Returns undefined when one of its checks would throw. */
|
|
969
968
|
/**
|
|
970
|
-
* #418: the charge and read-noise streams of the site
|
|
969
|
+
* #418: the charge and read-noise streams of the site flatSensorSite is computing, reseeded for each site. flatSensorSite is
|
|
971
970
|
* synchronous and never re-entered, so one pair serves every call; reseeding sets exactly the state a new
|
|
972
971
|
* createDeterministicUniformStream would start from, so every draw is unchanged.
|
|
973
972
|
*/
|
|
974
973
|
const chargeStream = createResettableUniformStream(), readNoiseStream = createResettableUniformStream();
|
|
975
|
-
function
|
|
976
|
-
const ratio = h.total / t.capacity, headroom = t.capacity - h.total;
|
|
977
|
-
if (!Number.isFinite(ratio) || !Number.isFinite(headroom))
|
|
978
|
-
return undefined;
|
|
979
|
-
const pattern = t.pattern === undefined ? null : evaluateParsedFixedPatternSite(t.pattern, { x: h.x, y: h.y });
|
|
980
|
-
const photoE = h.photo.expectedGeneratedElectronCount;
|
|
981
|
-
const photoMean = pattern === null ? photoE : photoE * pattern.photoResponseGainFactor;
|
|
982
|
-
const darkMean = pattern === null ? h.darkE : h.darkE * pattern.darkCurrentFactor;
|
|
983
|
-
if (!Number.isFinite(photoMean) || photoMean < 0 || !Number.isFinite(darkMean) || darkMean < 0)
|
|
984
|
-
return undefined;
|
|
985
|
-
const random = chargeStream;
|
|
986
|
-
random.reset(deriveNativeSiteStreamSeedUint32(seed, index, NATIVE_SITE_CHARGE_STREAM_ID));
|
|
987
|
-
const photoRealized = samplePoisson(photoMean, random), darkRealized = samplePoisson(darkMean, random);
|
|
988
|
-
const realized = photoRealized + darkRealized + 0;
|
|
989
|
-
if (!Number.isFinite(realized) || realized < 0)
|
|
990
|
-
return undefined;
|
|
991
|
-
const readRandom = readNoiseStream;
|
|
992
|
-
readRandom.reset(deriveNativeSiteStreamSeedUint32(seed, index, NATIVE_SITE_READ_NOISE_STREAM_ID));
|
|
993
|
-
const regime = t.readout.regime, capacity = t.capacity;
|
|
994
|
-
const afterPhysical = Math.min(realized, capacity), physicalSaturation = afterPhysical < realized;
|
|
995
|
-
// The components' draws and their sum in one loop: the same draws, added to 0 in the same order as before (#418).
|
|
996
|
-
const components = regime.readNoiseComponents;
|
|
997
|
-
let totalReadNoise = 0;
|
|
998
|
-
for (let k = 0; k < components.length; k++) {
|
|
999
|
-
const rms = components[k].rmsElectrons.value;
|
|
1000
|
-
totalReadNoise = totalReadNoise + (rms === 0 ? 0 : sampleDeterministicStandardNormal(readRandom) * rms);
|
|
1001
|
-
}
|
|
1002
|
-
const afterReadNoise = afterPhysical + totalReadNoise + (pattern === null ? 0 : pattern.readoutOffsetElectrons);
|
|
1003
|
-
const threshold = regime.preAdcSaturationElectronEquivalent.value;
|
|
1004
|
-
const afterPreAdc = Math.min(afterReadNoise, threshold), preAdcSaturation = afterReadNoise > threshold;
|
|
1005
|
-
const quantized = adcTransfer(regime, t.readout.adcMaximumCode, afterPreAdc).quantized;
|
|
1006
|
-
const digitalSaturationCode = regime.adc.digitalSaturationCode;
|
|
1007
|
-
return { rawCode: Math.max(0, Math.min(quantized, digitalSaturationCode)), blackLevelCode: regime.adc.blackLevelCode, digitalSaturationCode,
|
|
1008
|
-
flags: Number(physicalSaturation) | Number(preAdcSaturation) << 1 | Number(quantized >= digitalSaturationCode) << 2,
|
|
1009
|
-
whiteCode: t.whiteCode, photoRealized, darkRealized };
|
|
1010
|
-
}
|
|
1011
|
-
function flatSensorStage(t) {
|
|
974
|
+
function flatSensorStage(t, b) {
|
|
1012
975
|
const regime = t.readout.regime;
|
|
1013
976
|
return { darkRate: t.darkRate, capacity: t.capacity, pattern: t.pattern, whiteCode: t.whiteCode, regime, adcMaximumCode: t.readout.adcMaximumCode,
|
|
1014
977
|
inlDefined: regime.adc.integralNonLinearity !== undefined, gain: regime.systemConversionGainElectronsPerCode.value, black: regime.adc.blackLevelCode,
|
|
1015
978
|
digitalGain: regime.adc.digitalGain, digitalSaturationCode: regime.adc.digitalSaturationCode, threshold: regime.preAdcSaturationElectronEquivalent.value,
|
|
1016
979
|
rms: Float64Array.from(regime.readNoiseComponents, (component) => component.rmsElectrons.value), darkMean: NaN, darkThreshold: NaN,
|
|
1017
|
-
out: { rawCode: 0, blackLevelCode: 0, digitalSaturationCode: 0, flags: 0, whiteCode: 0 } };
|
|
980
|
+
out: { rawCode: 0, blackLevelCode: 0, digitalSaturationCode: 0, flags: 0, whiteCode: 0, photoRealized: 0, darkRealized: 0 }, b };
|
|
1018
981
|
}
|
|
1019
|
-
/** Writes the site's outputs into `f.out`; false where
|
|
982
|
+
/** Writes the site's outputs into `f.out`; false where a check of calculateNativeRawSite would throw. */
|
|
1020
983
|
function flatSensorSite(f, photoE, darkE, total, x, y, index, seed) {
|
|
1021
984
|
const ratio = total / f.capacity, headroom = f.capacity - total;
|
|
1022
985
|
if (!Number.isFinite(ratio) || !Number.isFinite(headroom))
|
|
@@ -1028,8 +991,7 @@ function flatSensorSite(f, photoE, darkE, total, x, y, index, seed) {
|
|
|
1028
991
|
return false;
|
|
1029
992
|
const random = chargeStream;
|
|
1030
993
|
random.reset(deriveNativeSiteStreamSeedUint32(seed, index, NATIVE_SITE_CHARGE_STREAM_ID));
|
|
1031
|
-
|
|
1032
|
-
let darkRealized;
|
|
994
|
+
let photoRealized = samplePoisson(photoMean, random), darkRealized;
|
|
1033
995
|
if (darkMean > 0 && darkMean < 30) {
|
|
1034
996
|
// samplePoisson's branch for 0 < mean < 30 (Knuth's product of uniforms) with its threshold Math.exp(−mean) kept while the
|
|
1035
997
|
// mean repeats: the same draws from the same stream. (createPoissonSampler would also do this, but it brings the
|
|
@@ -1048,11 +1010,17 @@ function flatSensorSite(f, photoE, darkE, total, x, y, index, seed) {
|
|
|
1048
1010
|
}
|
|
1049
1011
|
else
|
|
1050
1012
|
darkRealized = samplePoisson(darkMean, random);
|
|
1013
|
+
const b = f.b;
|
|
1014
|
+
if (b) {
|
|
1015
|
+
b.split(index, photoMean, darkMean, photoRealized, darkRealized);
|
|
1016
|
+
photoRealized = b.photo;
|
|
1017
|
+
darkRealized = b.dark;
|
|
1018
|
+
}
|
|
1051
1019
|
const realized = photoRealized + darkRealized + 0;
|
|
1052
1020
|
if (!Number.isFinite(realized) || realized < 0)
|
|
1053
1021
|
return false;
|
|
1054
1022
|
const readRandom = readNoiseStream;
|
|
1055
|
-
readRandom.reset(deriveNativeSiteStreamSeedUint32(seed, index, NATIVE_SITE_READ_NOISE_STREAM_ID));
|
|
1023
|
+
readRandom.reset(deriveNativeSiteStreamSeedUint32(seed, index, b ? b.read : NATIVE_SITE_READ_NOISE_STREAM_ID));
|
|
1056
1024
|
const capacity = f.capacity;
|
|
1057
1025
|
const afterPhysical = Math.min(realized, capacity), physicalSaturation = afterPhysical < realized;
|
|
1058
1026
|
const rmsAll = f.rms;
|
|
@@ -1084,6 +1052,8 @@ function flatSensorSite(f, photoE, darkE, total, x, y, index, seed) {
|
|
|
1084
1052
|
out.digitalSaturationCode = digitalSaturationCode;
|
|
1085
1053
|
out.flags = Number(physicalSaturation) | Number(preAdcSaturation) << 1 | Number(quantized >= digitalSaturationCode) << 2;
|
|
1086
1054
|
out.whiteCode = f.whiteCode;
|
|
1055
|
+
out.photoRealized = photoRealized;
|
|
1056
|
+
out.darkRealized = darkRealized;
|
|
1087
1057
|
return true;
|
|
1088
1058
|
}
|
|
1089
1059
|
/** The Kahan (compensated) total that composeSensorAccumulatedCharge computes, for photo and dark charge only. */
|
|
@@ -1096,28 +1066,32 @@ function chargeTotal(photoE, darkE) {
|
|
|
1096
1066
|
}
|
|
1097
1067
|
return sum;
|
|
1098
1068
|
}
|
|
1069
|
+
/**
|
|
1070
|
+
* True when the flat stage `f` reproduces the fully computed site `result` bit for bit: its dark and total charge, both charge
|
|
1071
|
+
* realizations, its codes and its flags.
|
|
1072
|
+
*/
|
|
1073
|
+
function reproducesSite(f, parsed, result, photo, x, y, index, seed) {
|
|
1074
|
+
const darkE = f.darkRate * photo.localExposureDurationSeconds, total = chargeTotal(photo.expectedGeneratedElectronCount, darkE);
|
|
1075
|
+
const r = result.readout.value, realization = result.realization.value, out = f.out;
|
|
1076
|
+
return flatSensorSite(f, photo.expectedGeneratedElectronCount, darkE, total, x, y, index, seed) && Object.is(darkE, parsed.charge.darkCharge.expectedDarkElectronCount) &&
|
|
1077
|
+
Object.is(total, result.accumulatedCharge.value.totalExpectedStoredElectronCount) &&
|
|
1078
|
+
Object.is(out.photoRealized, realization.photoRealizedElectronCount) && Object.is(out.darkRealized, realization.darkRealizedElectronCount) &&
|
|
1079
|
+
realization.additionalComponents.length === 0 && out.rawCode === r.rawCode && out.blackLevelCode === r.blackLevelCode && out.digitalSaturationCode === r.digitalSaturationCode &&
|
|
1080
|
+
out.flags === (Number(r.physicalScalarSaturationApplied) | Number(r.preAdcSaturationApplied) << 1 | Number(r.digitalSaturationApplied) << 2);
|
|
1081
|
+
}
|
|
1099
1082
|
/**
|
|
1100
1083
|
* #394: a sensor template from one fully parsed and computed site (`calculateNativeRawSite`), as the lean sensor stage builds
|
|
1101
1084
|
* its templates; undefined unless the lean arithmetic reproduces that site's dark and total charge, both charge realizations,
|
|
1102
1085
|
* its codes and its flags bit for bit. Its `compute` then gives `calculateNativeRawSite`'s outputs for any site of the same
|
|
1103
1086
|
* readout inputs (same CFA channel, dark current, capacity, readout regime and fixed-pattern profile).
|
|
1104
1087
|
*/
|
|
1105
|
-
export function createVerifiedNativeSiteReadout(parsed, result, whiteCode, photo, x, y, index, seed) {
|
|
1088
|
+
export function createVerifiedNativeSiteReadout(parsed, result, whiteCode, photo, x, y, index, seed, b) {
|
|
1106
1089
|
try {
|
|
1107
1090
|
const readout = resolveSensorReadoutRegime({ profile: parsed.readoutProfile, regimeId: parsed.regimeId });
|
|
1108
1091
|
const t = { darkRate: parsed.charge.darkCharge.darkCurrentElectronsPerSecond,
|
|
1109
1092
|
capacity: result.capacity.value.physicalChargeCapacityElectrons, readout, pattern: parsed.fixedPatternNoise, whiteCode };
|
|
1110
|
-
const
|
|
1111
|
-
|
|
1112
|
-
if (!out || !Object.is(darkE, parsed.charge.darkCharge.expectedDarkElectronCount) || !Object.is(total, result.accumulatedCharge.value.totalExpectedStoredElectronCount) ||
|
|
1113
|
-
!Object.is(out.photoRealized, realization.photoRealizedElectronCount) || !Object.is(out.darkRealized, realization.darkRealizedElectronCount) ||
|
|
1114
|
-
realization.additionalComponents.length !== 0 || out.rawCode !== r.rawCode || out.blackLevelCode !== r.blackLevelCode || out.digitalSaturationCode !== r.digitalSaturationCode ||
|
|
1115
|
-
out.flags !== (Number(r.physicalScalarSaturationApplied) | Number(r.preAdcSaturationApplied) << 1 | Number(r.digitalSaturationApplied) << 2))
|
|
1116
|
-
return undefined;
|
|
1117
|
-
// #449: the flat stage must reproduce the verification site too.
|
|
1118
|
-
const flat = flatSensorStage(t), fo = flat.out;
|
|
1119
|
-
if (!flatSensorSite(flat, photo.expectedGeneratedElectronCount, darkE, total, x, y, index, seed) || fo.rawCode !== out.rawCode || fo.blackLevelCode !== out.blackLevelCode ||
|
|
1120
|
-
fo.digitalSaturationCode !== out.digitalSaturationCode || fo.flags !== out.flags || fo.whiteCode !== out.whiteCode)
|
|
1093
|
+
const flat = flatSensorStage(t, b), fo = flat.out;
|
|
1094
|
+
if (!reproducesSite(flat, parsed, result, photo, x, y, index, seed))
|
|
1121
1095
|
return undefined;
|
|
1122
1096
|
return {
|
|
1123
1097
|
compute(photoE, duration, sx, sy, siteIndex, siteSeed) {
|
|
@@ -1189,20 +1163,21 @@ export function createNativeEnvironmentSensorLean(frame, producerFrame, nativeWi
|
|
|
1189
1163
|
claim(site) {
|
|
1190
1164
|
return typeof site === "object" && site !== null && handles.has(site) ? site : undefined;
|
|
1191
1165
|
},
|
|
1192
|
-
compute(handle, index, seed, timing) {
|
|
1193
|
-
|
|
1194
|
-
|
|
1166
|
+
compute(handle, index, seed, timing, b) {
|
|
1167
|
+
// The template's flat stage (made in observe(), with the same build-up stage); the caller copies the outputs at once.
|
|
1168
|
+
const h = handles.get(handle), f = h.template.flat;
|
|
1169
|
+
if (flatSensorSite(f, h.photo.expectedGeneratedElectronCount, h.darkE, h.total, h.x, h.y, index, seed)) {
|
|
1195
1170
|
nativeEnvironmentLeanStatistics.sensorSites++;
|
|
1196
|
-
|
|
1197
|
-
|
|
1171
|
+
return f.out;
|
|
1172
|
+
}
|
|
1198
1173
|
// A compute-phase check failed: the full path computes (and throws) exactly as it would have.
|
|
1199
1174
|
const parsed = parseNativeRawProducerSite(composeNativeEnvironmentSensorSite(h.site, h.photo), index, producerFrame, timing);
|
|
1200
|
-
const r = calculateNativeRawSite(parsed, seed, index).readout.value;
|
|
1175
|
+
const r = calculateNativeRawSite(parsed, seed, index, b).readout.value;
|
|
1201
1176
|
return { rawCode: r.rawCode, blackLevelCode: r.blackLevelCode, digitalSaturationCode: r.digitalSaturationCode,
|
|
1202
1177
|
flags: Number(r.physicalScalarSaturationApplied) | Number(r.preAdcSaturationApplied) << 1 | Number(r.digitalSaturationApplied) << 2,
|
|
1203
1178
|
whiteCode: calculateSiteEffectiveSaturationCode(r, parsed.readoutProfile, parsed.regimeId) };
|
|
1204
1179
|
},
|
|
1205
|
-
observe(index, parsed, result, whiteCode, seed) {
|
|
1180
|
+
observe(index, parsed, result, whiteCode, seed, b) {
|
|
1206
1181
|
const entry = pending.get(index);
|
|
1207
1182
|
pending.delete(index);
|
|
1208
1183
|
if (!entry || templates.length >= MAXIMUM_TEMPLATES)
|
|
@@ -1215,18 +1190,11 @@ export function createNativeEnvironmentSensorLean(frame, producerFrame, nativeWi
|
|
|
1215
1190
|
const t = { site, photo, phase, x, y, verified: false, darkRate: parsed.charge.darkCharge.darkCurrentElectronsPerSecond,
|
|
1216
1191
|
capacity: result.capacity.value.physicalChargeCapacityElectrons, readout, pattern: parsed.fixedPatternNoise, whiteCode };
|
|
1217
1192
|
templates.push(t);
|
|
1218
|
-
// Self-check: the template matches itself and
|
|
1193
|
+
// Self-check: the template matches itself and its flat stage reproduces its full computation bit for bit.
|
|
1219
1194
|
if (!sensorMatches(site, photo, x, y, t, new WeakMap()))
|
|
1220
1195
|
return;
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
const out = leanSensorSite(t, { photo, darkE, total, x, y }, index, seed);
|
|
1224
|
-
if (!out || !Object.is(darkE, parsed.charge.darkCharge.expectedDarkElectronCount) ||
|
|
1225
|
-
!Object.is(total, result.accumulatedCharge.value.totalExpectedStoredElectronCount) ||
|
|
1226
|
-
!Object.is(out.photoRealized, realization.photoRealizedElectronCount) || !Object.is(out.darkRealized, realization.darkRealizedElectronCount) ||
|
|
1227
|
-
realization.additionalComponents.length !== 0 || out.rawCode !== r.rawCode || out.blackLevelCode !== r.blackLevelCode ||
|
|
1228
|
-
out.digitalSaturationCode !== r.digitalSaturationCode || out.flags !== (Number(r.physicalScalarSaturationApplied) |
|
|
1229
|
-
Number(r.preAdcSaturationApplied) << 1 | Number(r.digitalSaturationApplied) << 2))
|
|
1196
|
+
t.flat = flatSensorStage(t, b);
|
|
1197
|
+
if (!reproducesSite(t.flat, parsed, result, photo, x, y, index, seed))
|
|
1230
1198
|
return;
|
|
1231
1199
|
t.verified = true;
|
|
1232
1200
|
}
|