@photivra/engine 2.13.0 → 2.14.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 +68 -1
- package/CITATION.cff +1 -1
- package/README.md +7 -7
- package/SECURITY.md +1 -1
- package/THIRD_PARTY.md +2 -0
- package/dist/camera/lens-projection.js +2 -1
- package/dist/camera/lens-projection.js.map +1 -1
- package/dist/capture/dng-import.js +1 -1
- package/dist/capture/dng-import.js.map +1 -1
- package/dist/capture/host-yield-cadence.js +1 -1
- package/dist/capture/host-yield-cadence.js.map +1 -1
- package/dist/capture/native-environment-optical-stage.js +1 -1
- package/dist/capture/native-environment-optical-stage.js.map +1 -1
- package/dist/capture/native-raw.js +1 -1
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/packed-sensor-raw.js +3 -3
- package/dist/capture/packed-sensor-raw.js.map +1 -1
- package/dist/capture/sensor-raw-producer.js +1 -1
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/color/capture-color.js +3 -3
- package/dist/color/capture-color.js.map +1 -1
- package/dist/color/chromatic-adaptation.js +2 -2
- package/dist/color/chromatic-adaptation.js.map +1 -1
- package/dist/color/color-matching-functions.js +1 -1
- package/dist/color/color-matching-functions.js.map +1 -1
- package/dist/color/colorimetry-math.js +2 -2
- package/dist/color/colorimetry-math.js.map +1 -1
- package/dist/color/illuminants.js +3 -3
- package/dist/color/illuminants.js.map +1 -1
- package/dist/color/rgb-color-spaces.js +1 -1
- package/dist/color/rgb-color-spaces.js.map +1 -1
- package/dist/color/sensor-color-development.js +1 -1
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/core/record-validation.js +3 -3
- package/dist/core/record-validation.js.map +1 -1
- 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-prime-lenses.js +3 -3
- package/dist/equipment/generic-prime-lenses.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +23 -1
- package/dist/equipment/generic-tier-assets.js +58 -30
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/generic-tier-presets.d.ts +6 -3
- package/dist/equipment/generic-tier-presets.js +26 -13
- package/dist/equipment/generic-tier-presets.js.map +1 -1
- package/dist/exposure/auto-iso-slowest-shutter.js +2 -1
- package/dist/exposure/auto-iso-slowest-shutter.js.map +1 -1
- package/dist/exposure/flash-ttl.js +1 -1
- package/dist/exposure/flash-ttl.js.map +1 -1
- package/dist/exposure/flash.js +1 -1
- package/dist/exposure/flash.js.map +1 -1
- package/dist/facade/chart-material-layers.js +2 -2
- package/dist/facade/chart-material-layers.js.map +1 -1
- package/dist/facade/chart-radiance-batch.js +1 -1
- package/dist/facade/chart-radiance-batch.js.map +1 -1
- package/dist/facade/chart-scenes.d.ts +45 -8
- package/dist/facade/chart-scenes.js +101 -44
- package/dist/facade/chart-scenes.js.map +1 -1
- package/dist/facade/color-patches.d.ts +129 -0
- package/dist/facade/color-patches.js +209 -0
- package/dist/facade/color-patches.js.map +1 -0
- package/dist/facade/display-view-gpu.js +1 -1
- package/dist/facade/display-view-gpu.js.map +1 -1
- package/dist/facade/scene-radiance.js +2 -2
- package/dist/facade/scene-radiance.js.map +1 -1
- package/dist/facade/simulate-capture.d.ts +47 -3
- package/dist/facade/simulate-capture.js +71 -22
- package/dist/facade/simulate-capture.js.map +1 -1
- package/dist/facade/simulate-display-view.js +2 -2
- package/dist/facade/simulate-display-view.js.map +1 -1
- package/dist/gpu/chart-composite-gpu.js +2 -2
- package/dist/gpu/chart-composite-gpu.js.map +1 -1
- package/dist/gpu/display-view-composite-material-module.js +1 -1
- package/dist/gpu/display-view-composite-material-module.js.map +1 -1
- package/dist/gpu/image-kernel-execution.js +2 -2
- package/dist/gpu/image-kernel-execution.js.map +1 -1
- package/dist/gpu/temporal-sum-gpu.js +23 -23
- package/dist/gpu/webgpu-runtime.js +1 -1
- package/dist/gpu/webgpu-runtime.js.map +1 -1
- package/dist/gpu/wgsl-chart-composite-kernel.js +318 -318
- package/dist/gpu/wgsl-chart-composite-kernel.js.map +1 -1
- package/dist/gpu/wgsl-chart-kernel.js +117 -117
- package/dist/gpu/wgsl-chart-kernel.js.map +1 -1
- package/dist/gpu/wgsl-display-view-quality-kernel.js +505 -505
- package/dist/gpu/wgsl-display-view-quality-kernel.js.map +1 -1
- package/dist/gpu/wgsl-display-view-speed-kernel.js +248 -248
- package/dist/gpu/wgsl-display-view-speed-kernel.js.map +1 -1
- package/dist/gpu/wgsl-kernels.js +203 -203
- package/dist/gpu/wgsl-kernels.js.map +1 -1
- package/dist/gpu/wgsl-sensor-kernel.js +302 -302
- package/dist/gpu/wgsl-sensor-kernel.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/motion/temporal-exposure-sum.js +1 -1
- package/dist/motion/temporal-exposure-sum.js.map +1 -1
- package/dist/optics/diffraction-psf-profile.js +4 -4
- package/dist/optics/diffraction-psf-profile.js.map +1 -1
- package/dist/optics/front-of-lens-filter.js +1 -1
- package/dist/optics/front-of-lens-filter.js.map +1 -1
- package/dist/optics/irradiance-convolution.js +1 -1
- package/dist/optics/irradiance-convolution.js.map +1 -1
- package/dist/output/native-capture-sdr.js +1 -1
- package/dist/output/native-capture-sdr.js.map +1 -1
- package/dist/output/png-encoder.js +2 -2
- package/dist/output/png-encoder.js.map +1 -1
- package/dist/output/print-jpeg.js +1 -1
- package/dist/output/print-jpeg.js.map +1 -1
- package/dist/sensor/fixed-pattern-noise.js +1 -1
- package/dist/sensor/fixed-pattern-noise.js.map +1 -1
- package/dist/sensor/readout-exposure-linkage.js +1 -1
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/docs/API_REFERENCE.md +29 -1
- package/docs/QUICK_START.md +40 -5
- package/docs/USAGE.md +35 -1
- package/docs/api/core-version.md +1 -1
- package/docs/api/equipment-generic-tier-assets.md +41 -1
- package/docs/api/equipment-generic-tier-presets.md +11 -3
- package/docs/api/exports.json +107 -2
- package/docs/api/facade-chart-scenes.md +36 -5
- package/docs/api/facade-color-patches.md +150 -0
- package/docs/api/facade-simulate-capture.md +52 -2
- package/llms.txt +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dng-import.js","sourceRoot":"","sources":["../../src/capture/dng-import.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n// This product includes DNG technology under license by Adobe.\n\n/**\n * Browser-safe reader for DNG and TIFF-EP raw files with a CFA (colour filter array) mosaic.\n *\n * It was written independently from the published TIFF 6.0 tag definitions, the Adobe Digital\n * Negative (DNG) Specification 1.7.1.0 and the Exif 2.32/3.0 CFAPattern definition (CIPA DC-008;\n * the TIFF/EP tags are also specified in ISO 12234-2). No third-party reader source was used.\n *\n * It returns the stored raw codes plus the metadata the engine's RAW development needs: CFA\n * pattern, black and white levels, active area, default crop, colour matrices, as-shot neutral,\n * calibration illuminants and orientation. It never applies linearization, black subtraction,\n * white balance, demosaicing or colour transforms.\n *\n * Input is untrusted. Every offset, count, IFD (image file directory) chain, strip or tile table\n * and decoded size is checked against the buffer and explicit limits before allocation. IFD loops,\n * IFDs that alias each other, oversized frames and over-long tag arrays fail with\n * `InvalidConfigurationError`.\n * @see docs/IMPORT_AND_PNG.md for supported subsets and limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { parseLosslessJpeg } from \"./lossless-jpeg.js\";\n\nexport const DNG_IMPORT_SCHEMA_VERSION = \"1.0.0\" as const;\n/** Upper bound for `maximumPixels`. 200 MP (megapixels) of 16-bit codes is 400 MB. */\nexport const DNG_IMPORT_LIMITS = Object.freeze({ defaultMaximumPixels: 64_000_000, maximumPixels: 200_000_000, defaultMaximumIfds: 64, maximumIfds: 1024 });\nexport interface DngImportInput {\n bytes: Uint8Array;\n /** Pixel-count limit (width x height), checked before any decode allocation. Default 64 000 000, at most 200 000 000. */\n maximumPixels?: number;\n /** Total IFDs (main chain plus SubIFDs) visited. Default 64, at most 1024. */\n maximumIfds?: number;\n}\n/** Repeating CFA pattern. Its origin is the top-left corner of `activeArea` (DNG 1.7.1.0, PhotometricInterpretation). */\nexport interface ImportedDngCfa {\n repeatRows: number;\n repeatColumns: number;\n /** Row-major plane indices into `planeColors`, length repeatRows x repeatColumns. */\n pattern: number[];\n /** CFAPlaneColor: 0 red, 1 green, 2 blue, 3 cyan, 4 magenta, 5 yellow, 6 white. Default [0, 1, 2]. */\n planeColors: number[];\n}\n/** Black level (the code for zero light) pattern, from BlackLevel, BlackLevelRepeatDim and BlackLevelDeltaH/V. Origin is the active-area top-left. */\nexport interface ImportedDngBlackLevel {\n repeatRows: number;\n repeatColumns: number;\n /** Row-column-sample order, length repeatRows x repeatColumns x samplesPerPixel. */\n values: number[];\n /** Per active-area column offset, or null when absent (all zeros). */\n deltaH: number[] | null;\n /** Per active-area row offset, or null when absent (all zeros). */\n deltaV: number[] | null;\n}\n/** Half-open raster rectangle in stored-image pixel coordinates (+X right, +Y down). */\nexport interface ImportedDngRect { x: number; y: number; width: number; height: number }\nexport interface ImportedDngRaw {\n schemaVersion: typeof DNG_IMPORT_SCHEMA_VERSION;\n byteOrder: \"little-endian\" | \"big-endian\";\n /** DNGVersion bytes, or null for a TIFF-EP file without DNG tags. */\n dngVersion: [number, number, number, number] | null;\n make: string | null;\n model: string | null;\n uniqueCameraModel: string | null;\n /** TIFF/Exif Orientation 1..8 (default 1). Codes are returned in stored, not oriented, order. */\n orientation: number;\n width: number;\n height: number;\n samplesPerPixel: number;\n bitsPerSample: number;\n compression: \"uncompressed\" | \"lossless-jpeg\";\n photometricInterpretation: \"cfa\" | \"linear-raw\";\n /** Stored raw codes, row-major then sample, length width x height x samplesPerPixel. */\n codes: Uint16Array;\n cfa: ImportedDngCfa | null;\n /** LinearizationTable when present; not applied to `codes`. */\n linearizationTable: Uint16Array | null;\n blackLevel: ImportedDngBlackLevel;\n /** WhiteLevel per sample (default 2^bitsPerSample − 1). */\n whiteLevel: number[];\n /** ActiveArea as a rectangle (default the whole image). */\n activeArea: ImportedDngRect;\n /** DefaultCropOrigin/Size relative to the active-area origin; may be fractional (RATIONAL). */\n defaultCrop: ImportedDngRect;\n /** XYZ → camera (reference) matrices, row-major colorPlanes x 3, or null. */\n colorMatrix1: number[] | null;\n colorMatrix2: number[] | null;\n /** CalibrationIlluminant1/2 (Exif LightSource code), or null when absent. */\n calibrationIlluminant1: number | null;\n calibrationIlluminant2: number | null;\n /** AsShotNeutral in camera (reference) coordinates, or null. */\n asShotNeutral: number[] | null;\n /** RawDataUniqueID as 32 lowercase hex digits, or null. */\n rawDataUniqueId: string | null;\n}\n\nconst TYPE_SIZES = [0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8, 4] as const;\ninterface Entry { type: number; count: number; at: number }\ntype Ifd = Map<number, Entry>;\nfunction fail(message: string): never { throw new InvalidConfigurationError(\"DNG import: \" + message); }\nfunction limit(value: number | undefined, fallback: number, max: number, name: string): number {\n if (value === undefined) return fallback;\n if (!Number.isSafeInteger(value) || value < 1 || value > max) fail(name + \" must be an integer from 1 to \" + max + \".\");\n return value;\n}\n\n/**\n * Parse one DNG or TIFF-EP file and decode its primary CFA or LinearRaw image (the first IFD with\n * NewSubFileType 0 and PhotometricInterpretation 32803 or 34892, in IFD-chain then SubIFD order).\n *\n * Supported raw data: Compression 1 at 8..16 bits/sample (8 bits as bytes, 16 bits in the file byte\n * order, other depths packed MSB-first with byte-aligned rows, per DNG BitsPerSample) and Compression 7\n * lossless Huffman JPEG (T.81 Annex H) in strips or tiles, chunky planar configuration only.\n * @returns Owned typed arrays and plain metadata; nothing is applied to the codes.\n */\nexport function parseDngRawImage(input: DngImportInput): ImportedDngRaw {\n if (input === null || typeof input !== \"object\") fail(\"input must be an object.\");\n for (const key of Object.keys(input)) if (![\"bytes\", \"maximumPixels\", \"maximumIfds\"].includes(key)) fail(`unknown input field. Unknown field ${JSON.stringify(key)}.`);\n const bytes = input.bytes;\n if (!(bytes instanceof Uint8Array)) fail(\"bytes must be a Uint8Array.\");\n const maximumPixels = limit(input.maximumPixels, DNG_IMPORT_LIMITS.defaultMaximumPixels, DNG_IMPORT_LIMITS.maximumPixels, \"maximumPixels\");\n const maximumIfds = limit(input.maximumIfds, DNG_IMPORT_LIMITS.defaultMaximumIfds, DNG_IMPORT_LIMITS.maximumIfds, \"maximumIfds\");\n const n = bytes.length, view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n if (n < 8) fail(\"file is too short.\");\n const little = bytes[0] === 0x49 && bytes[1] === 0x49;\n if (!little && !(bytes[0] === 0x4d && bytes[1] === 0x4d)) fail(\"missing TIFF byte-order mark.\");\n const u16 = (o: number): number => view.getUint16(o, little), u32 = (o: number): number => view.getUint32(o, little);\n if (u16(2) === 43) fail(\"BigTIFF is not supported.\");\n if (u16(2) !== 42) fail(\"missing TIFF magic number.\");\n\n const visited = new Set<number>(), ifds: Ifd[] = [];\n const readIfd = (offset: number): { ifd: Ifd; next: number } => {\n if (offset < 8 || offset % 2 !== 0 || offset + 2 > n) fail(\"IFD offset out of range.\");\n if (visited.has(offset)) fail(\"IFD loop or aliased IFD.\");\n if (visited.size >= maximumIfds) fail(\"too many IFDs.\");\n visited.add(offset);\n const count = u16(offset), end = offset + 2 + count * 12;\n if (count === 0 || end + 4 > n) fail(\"IFD exceeds the file.\");\n const ifd: Ifd = new Map();\n for (let i = 0; i < count; i++) {\n const p = offset + 2 + i * 12, id = u16(p), type = u16(p + 2), c = u32(p + 4);\n if (ifd.has(id)) fail(\"duplicate tag in one IFD.\");\n if (type < 1 || type > 13) continue; // TIFF 6.0: readers skip fields of unknown type.\n const size = TYPE_SIZES[type]! * c, at = size <= 4 ? p + 8 : u32(p + 8);\n if (at + size > n) fail(\"tag value exceeds the file.\");\n ifd.set(id, { type, count: c, at });\n }\n return { ifd, next: u32(end) };\n };\n const walk = (offset: number, depth: number): void => {\n for (let next = offset; next !== 0;) {\n const { ifd, next: following } = readIfd(next);\n ifds.push(ifd);\n const sub = ifd.get(330);\n if (sub) {\n if (depth >= 3) fail(\"SubIFD nesting is too deep.\");\n if ((sub.type !== 4 && sub.type !== 13) || sub.count > maximumIfds) fail(\"invalid SubIFDs tag.\");\n for (let i = 0; i < sub.count; i++) walk(u32(sub.at + i * 4), depth + 1);\n }\n next = following;\n }\n };\n walk(u32(4), 0);\n\n const numbers = (entry: Entry | undefined, maximumCount: number): number[] | null => {\n if (!entry) return null;\n if (entry.count > maximumCount) fail(\"tag count exceeds its expected size.\");\n const out: number[] = [], { type, at } = entry;\n for (let i = 0; i < entry.count; i++) {\n switch (type) {\n case 1: case 7: out.push(bytes[at + i]!); break;\n case 6: out.push(view.getInt8(at + i)); break;\n case 3: out.push(u16(at + i * 2)); break;\n case 8: out.push(view.getInt16(at + i * 2, little)); break;\n case 4: case 13: out.push(u32(at + i * 4)); break;\n case 9: out.push(view.getInt32(at + i * 4, little)); break;\n case 5: case 10: {\n const num = type === 5 ? u32(at + i * 8) : view.getInt32(at + i * 8, little), den = type === 5 ? u32(at + i * 8 + 4) : view.getInt32(at + i * 8 + 4, little);\n if (den === 0) fail(\"rational with zero denominator.\");\n out.push(num / den); break;\n }\n case 11: out.push(view.getFloat32(at + i * 4, little)); break;\n case 12: out.push(view.getFloat64(at + i * 8, little)); break;\n default: fail(\"unsupported tag type.\");\n }\n if (!Number.isFinite(out[i])) fail(\"non-finite tag value.\");\n }\n return out;\n };\n const integers = (entry: Entry | undefined, maximumCount: number, types: readonly number[]): number[] | null => {\n if (entry && !types.includes(entry.type)) fail(\"tag has an unsupported field type.\");\n return numbers(entry, maximumCount);\n };\n const ascii = (entry: Entry | undefined): string | null => {\n if (!entry) return null;\n if (entry.type !== 2 || entry.count > 4096) fail(\"invalid ASCII tag.\");\n let s = \"\";\n for (let i = 0; i < entry.count && bytes[entry.at + i] !== 0; i++) s += String.fromCharCode(bytes[entry.at + i]!);\n return s;\n };\n const one = (ifd: Ifd, id: number, fallback: number): number => {\n const v = integers(ifd.get(id), 1, [3, 4]);\n return v ? v[0]! : fallback;\n };\n\n const raw = ifds.find((ifd) => one(ifd, 254, 0) === 0 && [32803, 34892].includes(one(ifd, 262, -1)));\n if (!raw) fail(\"no primary CFA or LinearRaw image IFD.\");\n const ifd0 = ifds[0]!;\n // DNG places camera-level tags in IFD 0; TIFF-EP files may carry them only in the raw IFD.\n const pick = (id: number): Entry | undefined => ifd0.get(id) ?? raw.get(id);\n\n const width = one(raw, 256, 0), height = one(raw, 257, 0), spp = one(raw, 277, 1), compressionCode = one(raw, 259, 1), photometric = one(raw, 262, 0);\n if (width < 1 || height < 1 || width > 65535 * 4 || height > 65535 * 4) fail(\"invalid image dimensions.\");\n if (width * height > maximumPixels) fail(\"image exceeds the pixel limit.\");\n const cfaImage = photometric === 32803;\n if (cfaImage ? spp !== 1 : spp < 1 || spp > 4) fail(\"unsupported SamplesPerPixel.\");\n if (spp > 1 && one(raw, 284, 1) !== 1) fail(\"only chunky PlanarConfiguration is supported.\");\n const bps = integers(raw.get(258), spp, [3]) ?? [1];\n if (bps.length !== spp || bps.some((b) => b !== bps[0])) fail(\"BitsPerSample must be equal for every sample.\");\n const bitsPerSample = bps[0]!;\n if (bitsPerSample < 8 || bitsPerSample > 16) fail(\"only 8 to 16 bits per sample are supported.\");\n if (one(raw, 339, 1) !== 1) fail(\"only unsigned integer samples are supported.\");\n if (compressionCode !== 1 && compressionCode !== 7) fail(\"only uncompressed and lossless JPEG raw data are supported.\");\n const dngVersionTag = integers(ifd0.get(50706), 4, [1]);\n const dngVersion = dngVersionTag && dngVersionTag.length === 4 ? dngVersionTag as [number, number, number, number] : null;\n if (dngVersionTag && !dngVersion) fail(\"invalid DNGVersion.\");\n\n // Strip or tile layout.\n const tiled = raw.has(322) || raw.has(324);\n const tileWidth = tiled ? one(raw, 322, 0) : width, tileLength = tiled ? one(raw, 323, 0) : Math.min(height, one(raw, 278, 0xffffffff));\n if (tileWidth < 1 || tileLength < 1 || tileWidth > 65535 * 4 || tileLength > 65535 * 4 || (tiled && tileWidth * tileLength > maximumPixels)) fail(\"invalid strip or tile size.\");\n const across = Math.ceil(width / tileWidth), down = Math.ceil(height / tileLength), chunks = across * down;\n const offsets = integers(raw.get(tiled ? 324 : 273), chunks, [3, 4]), counts = integers(raw.get(tiled ? 325 : 279), chunks, [3, 4]);\n if (!offsets || !counts || offsets.length !== chunks || counts.length !== chunks) fail(\"strip or tile tables do not match the image layout.\");\n for (let i = 0; i < chunks; i++) if (offsets[i]! + counts[i]! > n) fail(\"strip or tile data exceeds the file.\");\n\n const codes = new Uint16Array(width * height * spp), maxCode = 2 ** bitsPerSample - 1;\n for (let ty = 0; ty < down; ty++) for (let tx = 0; tx < across; tx++) {\n const index = ty * across + tx, start = offsets[index]!, data = bytes.subarray(start, start + counts[index]!);\n // Strips cover whole rows (the last may be short); tiles are always full-size and clipped on copy.\n const chunkWidth = tiled ? tileWidth : width, chunkRows = tiled ? tileLength : Math.min(tileLength, height - ty * tileLength);\n const chunkSamples = chunkWidth * chunkRows * spp, x0 = tx * tileWidth, y0 = ty * tileLength;\n let samples: Uint16Array;\n if (compressionCode === 7) {\n const image = parseLosslessJpeg(data, { maximumSamples: chunkSamples, legacySixteenBitDifference: dngVersion !== null && (dngVersion[0] < 1 || (dngVersion[0] === 1 && dngVersion[1] < 1)) });\n if (image.width * image.height * image.components !== chunkSamples) fail(\"lossless JPEG sample count does not match the strip or tile.\");\n samples = image.samples;\n } else samples = unpack(data, chunkWidth * spp, chunkRows, bitsPerSample, little);\n for (let y = 0; y < chunkRows && y0 + y < height; y++) {\n const columns = Math.min(chunkWidth, width - x0) * spp, from = y * chunkWidth * spp, to = ((y0 + y) * width + x0) * spp;\n for (let i = 0; i < columns; i++) {\n const v = samples[from + i]!;\n if (v > maxCode) fail(\"raw code exceeds BitsPerSample.\");\n codes[to + i] = v;\n }\n }\n }\n\n // CFA description.\n let cfa: ImportedDngCfa | null = null, colorPlanes = spp;\n if (cfaImage) {\n const dim = integers(raw.get(33421), 2, [3]), pattern = integers(raw.get(33422), 256, [1]);\n if (!dim || dim.length !== 2 || dim[0]! < 1 || dim[1]! < 1 || !pattern || pattern.length !== dim[0]! * dim[1]!) fail(\"CFA images require CFARepeatPatternDim and a matching CFAPattern.\");\n const planeColors = integers(raw.get(50710), 16, [1]) ?? [0, 1, 2];\n if (planeColors.length < 1 || planeColors.some((c) => c > 6) || new Set(planeColors).size !== planeColors.length) fail(\"invalid CFAPlaneColor.\");\n if (pattern.some((v) => v >= planeColors.length)) fail(\"CFAPattern references an undefined plane.\");\n if (one(raw, 50711, 1) !== 1) fail(\"only rectangular CFALayout is supported.\");\n cfa = { repeatRows: dim[0]!, repeatColumns: dim[1]!, pattern, planeColors };\n colorPlanes = planeColors.length;\n }\n\n // Active area, levels and crop.\n const area = integers(raw.get(50829), 4, [3, 4]) ?? [0, 0, height, width];\n if (area.length !== 4 || area[0]! >= area[2]! || area[1]! >= area[3]! || area[2]! > height || area[3]! > width) fail(\"ActiveArea is outside the image.\");\n const activeArea = { x: area[1]!, y: area[0]!, width: area[3]! - area[1]!, height: area[2]! - area[0]! };\n const repeat = integers(raw.get(50713), 2, [3]) ?? [1, 1];\n if (repeat.length !== 2 || repeat[0]! < 1 || repeat[1]! < 1 || repeat[0]! * repeat[1]! > 1024) fail(\"invalid BlackLevelRepeatDim.\");\n const levelCount = repeat[0]! * repeat[1]! * spp;\n const black = integers(raw.get(50714), levelCount, [3, 4, 5]) ?? Array<number>(levelCount).fill(0);\n if (black.length !== levelCount) fail(\"BlackLevel count does not match BlackLevelRepeatDim.\");\n const deltaH = integers(raw.get(50715), activeArea.width, [10]), deltaV = integers(raw.get(50716), activeArea.height, [10]);\n if ((deltaH && deltaH.length !== activeArea.width) || (deltaV && deltaV.length !== activeArea.height)) fail(\"BlackLevelDelta count does not match the ActiveArea.\");\n const whiteLevel = integers(raw.get(50717), spp, [3, 4]) ?? Array<number>(spp).fill(maxCode);\n if (whiteLevel.length !== spp) fail(\"WhiteLevel count does not match SamplesPerPixel.\");\n const origin = integers(raw.get(50719), 2, [3, 4, 5]) ?? [0, 0], size = integers(raw.get(50720), 2, [3, 4, 5]) ?? [width, height];\n if (origin.length !== 2 || size.length !== 2 || size[0]! <= 0 || size[1]! <= 0 || origin[0]! < 0 || origin[1]! < 0) fail(\"invalid default crop.\");\n const linear = integers(raw.get(50712), 65536, [3]);\n\n const matrix = (id: number): number[] | null => {\n const m = integers(pick(id), colorPlanes * 3, [10]);\n if (m && m.length !== colorPlanes * 3) fail(\"ColorMatrix count does not match the colour planes.\");\n return m;\n };\n const neutral = integers(pick(50728), colorPlanes, [3, 5]);\n if (neutral && (neutral.length !== colorPlanes || neutral.some((v) => v <= 0))) fail(\"invalid AsShotNeutral.\");\n const illuminant = (id: number): number | null => { const v = integers(pick(id), 1, [3]); return v ? v[0]! : null; };\n const uniqueId = integers(pick(50781), 16, [1]);\n if (uniqueId && uniqueId.length !== 16) fail(\"RawDataUniqueID must have 16 bytes.\");\n const orientation = one(ifd0.has(274) ? ifd0 : raw, 274, 1);\n if (orientation < 1 || orientation > 8) fail(\"invalid Orientation.\");\n\n return {\n schemaVersion: DNG_IMPORT_SCHEMA_VERSION, byteOrder: little ? \"little-endian\" : \"big-endian\", dngVersion,\n make: ascii(pick(271)), model: ascii(pick(272)), uniqueCameraModel: ascii(pick(50708)), orientation,\n width, height, samplesPerPixel: spp, bitsPerSample, compression: compressionCode === 1 ? \"uncompressed\" : \"lossless-jpeg\",\n photometricInterpretation: cfaImage ? \"cfa\" : \"linear-raw\", codes, cfa,\n linearizationTable: linear ? Uint16Array.from(linear) : null,\n blackLevel: { repeatRows: repeat[0]!, repeatColumns: repeat[1]!, values: black, deltaH, deltaV },\n whiteLevel, activeArea, defaultCrop: { x: origin[0]!, y: origin[1]!, width: size[0]!, height: size[1]! },\n colorMatrix1: matrix(50721), colorMatrix2: matrix(50722),\n calibrationIlluminant1: illuminant(50778), calibrationIlluminant2: illuminant(50779), asShotNeutral: neutral,\n rawDataUniqueId: uniqueId ? uniqueId.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\") : null\n };\n}\n\n/** Unpack uncompressed rows: 8-bit bytes, 16-bit words in file byte order, other depths MSB-first with byte-aligned rows. */\nfunction unpack(data: Uint8Array, rowSamples: number, rows: number, bits: number, little: boolean): Uint16Array {\n const rowBytes = Math.ceil(rowSamples * bits / 8), out = new Uint16Array(rowSamples * rows);\n if (data.length < rowBytes * rows) fail(\"uncompressed strip or tile is truncated.\");\n for (let y = 0; y < rows; y++) {\n const base = y * rowBytes, o = y * rowSamples;\n if (bits === 8) for (let i = 0; i < rowSamples; i++) out[o + i] = data[base + i]!;\n else if (bits === 16) for (let i = 0; i < rowSamples; i++) {\n const a = data[base + i * 2]!, b = data[base + i * 2 + 1]!;\n out[o + i] = little ? a | (b << 8) : (a << 8) | b;\n } else {\n // Bit accumulator, most significant bit first. At most bits + 7 <= 23 bits are pending, well within 32-bit integer range.\n let accumulator = 0, pending = 0, next = base;\n const mask = (1 << bits) - 1;\n for (let i = 0; i < rowSamples; i++) {\n while (pending < bits) { accumulator = ((accumulator << 8) | data[next++]!) & 0xffffff; pending += 8; }\n pending -= bits;\n out[o + i] = (accumulator >>> pending) & mask;\n }\n }\n }\n return out;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dng-import.js","sourceRoot":"","sources":["../../src/capture/dng-import.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n// This product includes DNG technology under license by Adobe.\n\n/**\n * Browser-safe reader for DNG and TIFF-EP raw files with a CFA (colour filter array) mosaic.\n *\n * It was written independently from the published TIFF 6.0 tag definitions, the Adobe Digital\n * Negative (DNG) Specification 1.7.1.0 and the Exif 2.32/3.0 CFAPattern definition (CIPA DC-008;\n * the TIFF/EP tags are also specified in ISO 12234-2). No third-party reader source was used.\n *\n * It returns the stored raw codes plus the metadata the engine's RAW development needs: CFA\n * pattern, black and white levels, active area, default crop, colour matrices, as-shot neutral,\n * calibration illuminants and orientation. It never applies linearization, black subtraction,\n * white balance, demosaicing or colour transforms.\n *\n * Input is untrusted. Every offset, count, IFD (image file directory) chain, strip or tile table\n * and decoded size is checked against the buffer and explicit limits before allocation. IFD loops,\n * IFDs that alias each other, oversized frames and over-long tag arrays fail with\n * `InvalidConfigurationError`.\n * @see docs/IMPORT_AND_PNG.md for supported subsets and limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { parseLosslessJpeg } from \"./lossless-jpeg.js\";\n\nexport const DNG_IMPORT_SCHEMA_VERSION = \"1.0.0\" as const;\n/** Upper bound for `maximumPixels`. 200 MP (megapixels) of 16-bit codes is 400 MB. */\nexport const DNG_IMPORT_LIMITS = /* @__PURE__ */ Object.freeze({ defaultMaximumPixels: 64_000_000, maximumPixels: 200_000_000, defaultMaximumIfds: 64, maximumIfds: 1024 });\nexport interface DngImportInput {\n bytes: Uint8Array;\n /** Pixel-count limit (width x height), checked before any decode allocation. Default 64 000 000, at most 200 000 000. */\n maximumPixels?: number;\n /** Total IFDs (main chain plus SubIFDs) visited. Default 64, at most 1024. */\n maximumIfds?: number;\n}\n/** Repeating CFA pattern. Its origin is the top-left corner of `activeArea` (DNG 1.7.1.0, PhotometricInterpretation). */\nexport interface ImportedDngCfa {\n repeatRows: number;\n repeatColumns: number;\n /** Row-major plane indices into `planeColors`, length repeatRows x repeatColumns. */\n pattern: number[];\n /** CFAPlaneColor: 0 red, 1 green, 2 blue, 3 cyan, 4 magenta, 5 yellow, 6 white. Default [0, 1, 2]. */\n planeColors: number[];\n}\n/** Black level (the code for zero light) pattern, from BlackLevel, BlackLevelRepeatDim and BlackLevelDeltaH/V. Origin is the active-area top-left. */\nexport interface ImportedDngBlackLevel {\n repeatRows: number;\n repeatColumns: number;\n /** Row-column-sample order, length repeatRows x repeatColumns x samplesPerPixel. */\n values: number[];\n /** Per active-area column offset, or null when absent (all zeros). */\n deltaH: number[] | null;\n /** Per active-area row offset, or null when absent (all zeros). */\n deltaV: number[] | null;\n}\n/** Half-open raster rectangle in stored-image pixel coordinates (+X right, +Y down). */\nexport interface ImportedDngRect { x: number; y: number; width: number; height: number }\nexport interface ImportedDngRaw {\n schemaVersion: typeof DNG_IMPORT_SCHEMA_VERSION;\n byteOrder: \"little-endian\" | \"big-endian\";\n /** DNGVersion bytes, or null for a TIFF-EP file without DNG tags. */\n dngVersion: [number, number, number, number] | null;\n make: string | null;\n model: string | null;\n uniqueCameraModel: string | null;\n /** TIFF/Exif Orientation 1..8 (default 1). Codes are returned in stored, not oriented, order. */\n orientation: number;\n width: number;\n height: number;\n samplesPerPixel: number;\n bitsPerSample: number;\n compression: \"uncompressed\" | \"lossless-jpeg\";\n photometricInterpretation: \"cfa\" | \"linear-raw\";\n /** Stored raw codes, row-major then sample, length width x height x samplesPerPixel. */\n codes: Uint16Array;\n cfa: ImportedDngCfa | null;\n /** LinearizationTable when present; not applied to `codes`. */\n linearizationTable: Uint16Array | null;\n blackLevel: ImportedDngBlackLevel;\n /** WhiteLevel per sample (default 2^bitsPerSample − 1). */\n whiteLevel: number[];\n /** ActiveArea as a rectangle (default the whole image). */\n activeArea: ImportedDngRect;\n /** DefaultCropOrigin/Size relative to the active-area origin; may be fractional (RATIONAL). */\n defaultCrop: ImportedDngRect;\n /** XYZ → camera (reference) matrices, row-major colorPlanes x 3, or null. */\n colorMatrix1: number[] | null;\n colorMatrix2: number[] | null;\n /** CalibrationIlluminant1/2 (Exif LightSource code), or null when absent. */\n calibrationIlluminant1: number | null;\n calibrationIlluminant2: number | null;\n /** AsShotNeutral in camera (reference) coordinates, or null. */\n asShotNeutral: number[] | null;\n /** RawDataUniqueID as 32 lowercase hex digits, or null. */\n rawDataUniqueId: string | null;\n}\n\nconst TYPE_SIZES = [0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8, 4] as const;\ninterface Entry { type: number; count: number; at: number }\ntype Ifd = Map<number, Entry>;\nfunction fail(message: string): never { throw new InvalidConfigurationError(\"DNG import: \" + message); }\nfunction limit(value: number | undefined, fallback: number, max: number, name: string): number {\n if (value === undefined) return fallback;\n if (!Number.isSafeInteger(value) || value < 1 || value > max) fail(name + \" must be an integer from 1 to \" + max + \".\");\n return value;\n}\n\n/**\n * Parse one DNG or TIFF-EP file and decode its primary CFA or LinearRaw image (the first IFD with\n * NewSubFileType 0 and PhotometricInterpretation 32803 or 34892, in IFD-chain then SubIFD order).\n *\n * Supported raw data: Compression 1 at 8..16 bits/sample (8 bits as bytes, 16 bits in the file byte\n * order, other depths packed MSB-first with byte-aligned rows, per DNG BitsPerSample) and Compression 7\n * lossless Huffman JPEG (T.81 Annex H) in strips or tiles, chunky planar configuration only.\n * @returns Owned typed arrays and plain metadata; nothing is applied to the codes.\n */\nexport function parseDngRawImage(input: DngImportInput): ImportedDngRaw {\n if (input === null || typeof input !== \"object\") fail(\"input must be an object.\");\n for (const key of Object.keys(input)) if (![\"bytes\", \"maximumPixels\", \"maximumIfds\"].includes(key)) fail(`unknown input field. Unknown field ${JSON.stringify(key)}.`);\n const bytes = input.bytes;\n if (!(bytes instanceof Uint8Array)) fail(\"bytes must be a Uint8Array.\");\n const maximumPixels = limit(input.maximumPixels, DNG_IMPORT_LIMITS.defaultMaximumPixels, DNG_IMPORT_LIMITS.maximumPixels, \"maximumPixels\");\n const maximumIfds = limit(input.maximumIfds, DNG_IMPORT_LIMITS.defaultMaximumIfds, DNG_IMPORT_LIMITS.maximumIfds, \"maximumIfds\");\n const n = bytes.length, view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n if (n < 8) fail(\"file is too short.\");\n const little = bytes[0] === 0x49 && bytes[1] === 0x49;\n if (!little && !(bytes[0] === 0x4d && bytes[1] === 0x4d)) fail(\"missing TIFF byte-order mark.\");\n const u16 = (o: number): number => view.getUint16(o, little), u32 = (o: number): number => view.getUint32(o, little);\n if (u16(2) === 43) fail(\"BigTIFF is not supported.\");\n if (u16(2) !== 42) fail(\"missing TIFF magic number.\");\n\n const visited = new Set<number>(), ifds: Ifd[] = [];\n const readIfd = (offset: number): { ifd: Ifd; next: number } => {\n if (offset < 8 || offset % 2 !== 0 || offset + 2 > n) fail(\"IFD offset out of range.\");\n if (visited.has(offset)) fail(\"IFD loop or aliased IFD.\");\n if (visited.size >= maximumIfds) fail(\"too many IFDs.\");\n visited.add(offset);\n const count = u16(offset), end = offset + 2 + count * 12;\n if (count === 0 || end + 4 > n) fail(\"IFD exceeds the file.\");\n const ifd: Ifd = new Map();\n for (let i = 0; i < count; i++) {\n const p = offset + 2 + i * 12, id = u16(p), type = u16(p + 2), c = u32(p + 4);\n if (ifd.has(id)) fail(\"duplicate tag in one IFD.\");\n if (type < 1 || type > 13) continue; // TIFF 6.0: readers skip fields of unknown type.\n const size = TYPE_SIZES[type]! * c, at = size <= 4 ? p + 8 : u32(p + 8);\n if (at + size > n) fail(\"tag value exceeds the file.\");\n ifd.set(id, { type, count: c, at });\n }\n return { ifd, next: u32(end) };\n };\n const walk = (offset: number, depth: number): void => {\n for (let next = offset; next !== 0;) {\n const { ifd, next: following } = readIfd(next);\n ifds.push(ifd);\n const sub = ifd.get(330);\n if (sub) {\n if (depth >= 3) fail(\"SubIFD nesting is too deep.\");\n if ((sub.type !== 4 && sub.type !== 13) || sub.count > maximumIfds) fail(\"invalid SubIFDs tag.\");\n for (let i = 0; i < sub.count; i++) walk(u32(sub.at + i * 4), depth + 1);\n }\n next = following;\n }\n };\n walk(u32(4), 0);\n\n const numbers = (entry: Entry | undefined, maximumCount: number): number[] | null => {\n if (!entry) return null;\n if (entry.count > maximumCount) fail(\"tag count exceeds its expected size.\");\n const out: number[] = [], { type, at } = entry;\n for (let i = 0; i < entry.count; i++) {\n switch (type) {\n case 1: case 7: out.push(bytes[at + i]!); break;\n case 6: out.push(view.getInt8(at + i)); break;\n case 3: out.push(u16(at + i * 2)); break;\n case 8: out.push(view.getInt16(at + i * 2, little)); break;\n case 4: case 13: out.push(u32(at + i * 4)); break;\n case 9: out.push(view.getInt32(at + i * 4, little)); break;\n case 5: case 10: {\n const num = type === 5 ? u32(at + i * 8) : view.getInt32(at + i * 8, little), den = type === 5 ? u32(at + i * 8 + 4) : view.getInt32(at + i * 8 + 4, little);\n if (den === 0) fail(\"rational with zero denominator.\");\n out.push(num / den); break;\n }\n case 11: out.push(view.getFloat32(at + i * 4, little)); break;\n case 12: out.push(view.getFloat64(at + i * 8, little)); break;\n default: fail(\"unsupported tag type.\");\n }\n if (!Number.isFinite(out[i])) fail(\"non-finite tag value.\");\n }\n return out;\n };\n const integers = (entry: Entry | undefined, maximumCount: number, types: readonly number[]): number[] | null => {\n if (entry && !types.includes(entry.type)) fail(\"tag has an unsupported field type.\");\n return numbers(entry, maximumCount);\n };\n const ascii = (entry: Entry | undefined): string | null => {\n if (!entry) return null;\n if (entry.type !== 2 || entry.count > 4096) fail(\"invalid ASCII tag.\");\n let s = \"\";\n for (let i = 0; i < entry.count && bytes[entry.at + i] !== 0; i++) s += String.fromCharCode(bytes[entry.at + i]!);\n return s;\n };\n const one = (ifd: Ifd, id: number, fallback: number): number => {\n const v = integers(ifd.get(id), 1, [3, 4]);\n return v ? v[0]! : fallback;\n };\n\n const raw = ifds.find((ifd) => one(ifd, 254, 0) === 0 && [32803, 34892].includes(one(ifd, 262, -1)));\n if (!raw) fail(\"no primary CFA or LinearRaw image IFD.\");\n const ifd0 = ifds[0]!;\n // DNG places camera-level tags in IFD 0; TIFF-EP files may carry them only in the raw IFD.\n const pick = (id: number): Entry | undefined => ifd0.get(id) ?? raw.get(id);\n\n const width = one(raw, 256, 0), height = one(raw, 257, 0), spp = one(raw, 277, 1), compressionCode = one(raw, 259, 1), photometric = one(raw, 262, 0);\n if (width < 1 || height < 1 || width > 65535 * 4 || height > 65535 * 4) fail(\"invalid image dimensions.\");\n if (width * height > maximumPixels) fail(\"image exceeds the pixel limit.\");\n const cfaImage = photometric === 32803;\n if (cfaImage ? spp !== 1 : spp < 1 || spp > 4) fail(\"unsupported SamplesPerPixel.\");\n if (spp > 1 && one(raw, 284, 1) !== 1) fail(\"only chunky PlanarConfiguration is supported.\");\n const bps = integers(raw.get(258), spp, [3]) ?? [1];\n if (bps.length !== spp || bps.some((b) => b !== bps[0])) fail(\"BitsPerSample must be equal for every sample.\");\n const bitsPerSample = bps[0]!;\n if (bitsPerSample < 8 || bitsPerSample > 16) fail(\"only 8 to 16 bits per sample are supported.\");\n if (one(raw, 339, 1) !== 1) fail(\"only unsigned integer samples are supported.\");\n if (compressionCode !== 1 && compressionCode !== 7) fail(\"only uncompressed and lossless JPEG raw data are supported.\");\n const dngVersionTag = integers(ifd0.get(50706), 4, [1]);\n const dngVersion = dngVersionTag && dngVersionTag.length === 4 ? dngVersionTag as [number, number, number, number] : null;\n if (dngVersionTag && !dngVersion) fail(\"invalid DNGVersion.\");\n\n // Strip or tile layout.\n const tiled = raw.has(322) || raw.has(324);\n const tileWidth = tiled ? one(raw, 322, 0) : width, tileLength = tiled ? one(raw, 323, 0) : Math.min(height, one(raw, 278, 0xffffffff));\n if (tileWidth < 1 || tileLength < 1 || tileWidth > 65535 * 4 || tileLength > 65535 * 4 || (tiled && tileWidth * tileLength > maximumPixels)) fail(\"invalid strip or tile size.\");\n const across = Math.ceil(width / tileWidth), down = Math.ceil(height / tileLength), chunks = across * down;\n const offsets = integers(raw.get(tiled ? 324 : 273), chunks, [3, 4]), counts = integers(raw.get(tiled ? 325 : 279), chunks, [3, 4]);\n if (!offsets || !counts || offsets.length !== chunks || counts.length !== chunks) fail(\"strip or tile tables do not match the image layout.\");\n for (let i = 0; i < chunks; i++) if (offsets[i]! + counts[i]! > n) fail(\"strip or tile data exceeds the file.\");\n\n const codes = new Uint16Array(width * height * spp), maxCode = 2 ** bitsPerSample - 1;\n for (let ty = 0; ty < down; ty++) for (let tx = 0; tx < across; tx++) {\n const index = ty * across + tx, start = offsets[index]!, data = bytes.subarray(start, start + counts[index]!);\n // Strips cover whole rows (the last may be short); tiles are always full-size and clipped on copy.\n const chunkWidth = tiled ? tileWidth : width, chunkRows = tiled ? tileLength : Math.min(tileLength, height - ty * tileLength);\n const chunkSamples = chunkWidth * chunkRows * spp, x0 = tx * tileWidth, y0 = ty * tileLength;\n let samples: Uint16Array;\n if (compressionCode === 7) {\n const image = parseLosslessJpeg(data, { maximumSamples: chunkSamples, legacySixteenBitDifference: dngVersion !== null && (dngVersion[0] < 1 || (dngVersion[0] === 1 && dngVersion[1] < 1)) });\n if (image.width * image.height * image.components !== chunkSamples) fail(\"lossless JPEG sample count does not match the strip or tile.\");\n samples = image.samples;\n } else samples = unpack(data, chunkWidth * spp, chunkRows, bitsPerSample, little);\n for (let y = 0; y < chunkRows && y0 + y < height; y++) {\n const columns = Math.min(chunkWidth, width - x0) * spp, from = y * chunkWidth * spp, to = ((y0 + y) * width + x0) * spp;\n for (let i = 0; i < columns; i++) {\n const v = samples[from + i]!;\n if (v > maxCode) fail(\"raw code exceeds BitsPerSample.\");\n codes[to + i] = v;\n }\n }\n }\n\n // CFA description.\n let cfa: ImportedDngCfa | null = null, colorPlanes = spp;\n if (cfaImage) {\n const dim = integers(raw.get(33421), 2, [3]), pattern = integers(raw.get(33422), 256, [1]);\n if (!dim || dim.length !== 2 || dim[0]! < 1 || dim[1]! < 1 || !pattern || pattern.length !== dim[0]! * dim[1]!) fail(\"CFA images require CFARepeatPatternDim and a matching CFAPattern.\");\n const planeColors = integers(raw.get(50710), 16, [1]) ?? [0, 1, 2];\n if (planeColors.length < 1 || planeColors.some((c) => c > 6) || new Set(planeColors).size !== planeColors.length) fail(\"invalid CFAPlaneColor.\");\n if (pattern.some((v) => v >= planeColors.length)) fail(\"CFAPattern references an undefined plane.\");\n if (one(raw, 50711, 1) !== 1) fail(\"only rectangular CFALayout is supported.\");\n cfa = { repeatRows: dim[0]!, repeatColumns: dim[1]!, pattern, planeColors };\n colorPlanes = planeColors.length;\n }\n\n // Active area, levels and crop.\n const area = integers(raw.get(50829), 4, [3, 4]) ?? [0, 0, height, width];\n if (area.length !== 4 || area[0]! >= area[2]! || area[1]! >= area[3]! || area[2]! > height || area[3]! > width) fail(\"ActiveArea is outside the image.\");\n const activeArea = { x: area[1]!, y: area[0]!, width: area[3]! - area[1]!, height: area[2]! - area[0]! };\n const repeat = integers(raw.get(50713), 2, [3]) ?? [1, 1];\n if (repeat.length !== 2 || repeat[0]! < 1 || repeat[1]! < 1 || repeat[0]! * repeat[1]! > 1024) fail(\"invalid BlackLevelRepeatDim.\");\n const levelCount = repeat[0]! * repeat[1]! * spp;\n const black = integers(raw.get(50714), levelCount, [3, 4, 5]) ?? Array<number>(levelCount).fill(0);\n if (black.length !== levelCount) fail(\"BlackLevel count does not match BlackLevelRepeatDim.\");\n const deltaH = integers(raw.get(50715), activeArea.width, [10]), deltaV = integers(raw.get(50716), activeArea.height, [10]);\n if ((deltaH && deltaH.length !== activeArea.width) || (deltaV && deltaV.length !== activeArea.height)) fail(\"BlackLevelDelta count does not match the ActiveArea.\");\n const whiteLevel = integers(raw.get(50717), spp, [3, 4]) ?? Array<number>(spp).fill(maxCode);\n if (whiteLevel.length !== spp) fail(\"WhiteLevel count does not match SamplesPerPixel.\");\n const origin = integers(raw.get(50719), 2, [3, 4, 5]) ?? [0, 0], size = integers(raw.get(50720), 2, [3, 4, 5]) ?? [width, height];\n if (origin.length !== 2 || size.length !== 2 || size[0]! <= 0 || size[1]! <= 0 || origin[0]! < 0 || origin[1]! < 0) fail(\"invalid default crop.\");\n const linear = integers(raw.get(50712), 65536, [3]);\n\n const matrix = (id: number): number[] | null => {\n const m = integers(pick(id), colorPlanes * 3, [10]);\n if (m && m.length !== colorPlanes * 3) fail(\"ColorMatrix count does not match the colour planes.\");\n return m;\n };\n const neutral = integers(pick(50728), colorPlanes, [3, 5]);\n if (neutral && (neutral.length !== colorPlanes || neutral.some((v) => v <= 0))) fail(\"invalid AsShotNeutral.\");\n const illuminant = (id: number): number | null => { const v = integers(pick(id), 1, [3]); return v ? v[0]! : null; };\n const uniqueId = integers(pick(50781), 16, [1]);\n if (uniqueId && uniqueId.length !== 16) fail(\"RawDataUniqueID must have 16 bytes.\");\n const orientation = one(ifd0.has(274) ? ifd0 : raw, 274, 1);\n if (orientation < 1 || orientation > 8) fail(\"invalid Orientation.\");\n\n return {\n schemaVersion: DNG_IMPORT_SCHEMA_VERSION, byteOrder: little ? \"little-endian\" : \"big-endian\", dngVersion,\n make: ascii(pick(271)), model: ascii(pick(272)), uniqueCameraModel: ascii(pick(50708)), orientation,\n width, height, samplesPerPixel: spp, bitsPerSample, compression: compressionCode === 1 ? \"uncompressed\" : \"lossless-jpeg\",\n photometricInterpretation: cfaImage ? \"cfa\" : \"linear-raw\", codes, cfa,\n linearizationTable: linear ? Uint16Array.from(linear) : null,\n blackLevel: { repeatRows: repeat[0]!, repeatColumns: repeat[1]!, values: black, deltaH, deltaV },\n whiteLevel, activeArea, defaultCrop: { x: origin[0]!, y: origin[1]!, width: size[0]!, height: size[1]! },\n colorMatrix1: matrix(50721), colorMatrix2: matrix(50722),\n calibrationIlluminant1: illuminant(50778), calibrationIlluminant2: illuminant(50779), asShotNeutral: neutral,\n rawDataUniqueId: uniqueId ? uniqueId.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\") : null\n };\n}\n\n/** Unpack uncompressed rows: 8-bit bytes, 16-bit words in file byte order, other depths MSB-first with byte-aligned rows. */\nfunction unpack(data: Uint8Array, rowSamples: number, rows: number, bits: number, little: boolean): Uint16Array {\n const rowBytes = Math.ceil(rowSamples * bits / 8), out = new Uint16Array(rowSamples * rows);\n if (data.length < rowBytes * rows) fail(\"uncompressed strip or tile is truncated.\");\n for (let y = 0; y < rows; y++) {\n const base = y * rowBytes, o = y * rowSamples;\n if (bits === 8) for (let i = 0; i < rowSamples; i++) out[o + i] = data[base + i]!;\n else if (bits === 16) for (let i = 0; i < rowSamples; i++) {\n const a = data[base + i * 2]!, b = data[base + i * 2 + 1]!;\n out[o + i] = little ? a | (b << 8) : (a << 8) | b;\n } else {\n // Bit accumulator, most significant bit first. At most bits + 7 <= 23 bits are pending, well within 32-bit integer range.\n let accumulator = 0, pending = 0, next = base;\n const mask = (1 << bits) - 1;\n for (let i = 0; i < rowSamples; i++) {\n while (pending < bits) { accumulator = ((accumulator << 8) | data[next++]!) & 0xffffff; pending += 8; }\n pending -= bits;\n out[o + i] = (accumulator >>> pending) & mask;\n }\n }\n }\n return out;\n}\n"]}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
/** Default work budget between host yields: about half of a 60 Hz frame. */
|
|
12
12
|
export const HOST_YIELD_BUDGET_MILLISECONDS = 8;
|
|
13
|
-
export const DEFAULT_HOST_YIELD_CADENCE = Object.freeze({
|
|
13
|
+
export const DEFAULT_HOST_YIELD_CADENCE = /* @__PURE__ */ Object.freeze({
|
|
14
14
|
budgetMilliseconds: HOST_YIELD_BUDGET_MILLISECONDS,
|
|
15
15
|
now: () => performance.now()
|
|
16
16
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-yield-cadence.js","sourceRoot":"","sources":["../../src/capture/host-yield-cadence.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;GAQG;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAShD,MAAM,CAAC,MAAM,0BAA0B,GAAqB,MAAM,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"host-yield-cadence.js","sourceRoot":"","sources":["../../src/capture/host-yield-cadence.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;GAQG;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAShD,MAAM,CAAC,MAAM,0BAA0B,GAAqB,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC;IACxF,kBAAkB,EAAE,8BAA8B;IAClD,GAAG,EAAE,GAAW,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;CACrC,CAAC,CAAC;AASH,MAAM,UAAU,mBAAmB,CAAC,UAA4B,0BAA0B;IACxF,MAAM,EAAC,kBAAkB,EAAE,GAAG,EAAC,GAAG,OAAO,CAAC;IAC1C,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;IAClB,OAAO;QACL,OAAO,KAAW,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAClC,GAAG,KAAc,OAAO,kBAAkB,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,KAAK,IAAI,kBAAkB,CAAC,CAAC,CAAC;KAC1F,CAAC;AACJ,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Internal: decides how often native tile loops yield to the host (browser) event loop.\n *\n * Tiles stay small, for bounded memory and exact tile identity. But the host's `yieldControl`\n * callback is awaited only once the work since the last yield reaches a time budget, and always\n * after the final tile. This only changes when the host gets to run. Tile requests, absolute CFA\n * (colour filter array) and noise-seed indexing, and every output value are unaffected.\n * Not exported from the package.\n */\n\n/** Default work budget between host yields: about half of a 60 Hz frame. */\nexport const HOST_YIELD_BUDGET_MILLISECONDS = 8;\n\nexport interface HostYieldCadence {\n /** Yield once at least this many milliseconds (monotonic clock) have passed since the last yield. 0 yields after every tile. */\n readonly budgetMilliseconds: number;\n /** Monotonic clock in milliseconds. */\n readonly now: () => number;\n}\n\nexport const DEFAULT_HOST_YIELD_CADENCE: HostYieldCadence = /* @__PURE__ */ Object.freeze({\n budgetMilliseconds: HOST_YIELD_BUDGET_MILLISECONDS,\n now: (): number => performance.now()\n});\n\nexport interface HostYieldGate {\n /** Restarts the budget, for example at the start of a run and after each host yield finishes. */\n restart(): void;\n /** True once the budget since the last restart is spent. */\n due(): boolean;\n}\n\nexport function createHostYieldGate(cadence: HostYieldCadence = DEFAULT_HOST_YIELD_CADENCE): HostYieldGate {\n const {budgetMilliseconds, now} = cadence;\n let since = now();\n return {\n restart(): void { since = now(); },\n due(): boolean { return budgetMilliseconds <= 0 || now() - since >= budgetMilliseconds; }\n };\n}\n"]}
|
|
@@ -24,7 +24,7 @@ import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
|
24
24
|
* `fixedBytesPerSite + bytesPerTemporalSamplePerSite × temporalSampleCount` bytes of typed-array storage;
|
|
25
25
|
* distinct environment and photo templates (each about one site's input size) are capped separately.
|
|
26
26
|
*/
|
|
27
|
-
export const NATIVE_ENVIRONMENT_OPTICAL_STAGE_LIMITS = Object.freeze({
|
|
27
|
+
export const NATIVE_ENVIRONMENT_OPTICAL_STAGE_LIMITS = /* @__PURE__ */ Object.freeze({
|
|
28
28
|
/** Two one-byte template indices plus seven float64 values (site x/y, window start/end/duration, photon/electron counts). */
|
|
29
29
|
fixedBytesPerSite: 58,
|
|
30
30
|
/** Three float64 values per temporal midpoint: time, incident-photon rate, generated-electron rate. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-environment-optical-stage.js","sourceRoot":"","sources":["../../src/capture/native-environment-optical-stage.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Keeps (retains) the result of the optical stage of a native environment capture, so the sensor stage\n * can be re-run with new post-optics settings without calling the radiance callbacks again.\n *\n * Optical stage: scene radiance → optics, PSF (point-spread function) and pupil → expected photo signal\n * via EQE (external quantum efficiency). Sensor stage: dark charge → charge realization → readout.\n *\n * Reuse is exact, not approximate: the sensor stage receives a photo signal whose every number is the\n * float64 value the optical stage produced, and the same charge/noise/ADC code runs on it. Reuse is\n * refused unless the capture's optical binding and every site's environment input are strictly equal\n * to those the stage was produced from.\n * @see docs/NATIVE_RAW_AND_PRINT.md for the invariance analysis, memory bound and limits.\n */\n\nimport { createNativeRawTask, type NativeRawInput, type NativeRawPlan, type NativeRawTileRequest } from \"./native-raw.js\";\nimport type { SimulateEnvironmentSensorRawFrameInput } from \"./environment-raw-producer.js\";\nimport type { SensorRawProducerSiteInput } from \"./sensor-raw-producer.js\";\nimport { parseSensorEqeTemporalPhotoSignal, type SensorEqeTemporalPhotoSignal } from \"../sensor/temporal-photo-signal.js\";\nimport { calculateSensorDarkCurrentCharge } from \"../sensor/dark-current.js\";\nimport { requireAllowlistedRecord } from \"../core/record-validation.js\";\nimport { stringifyCanonicalJson } from \"../core/canonical-json.js\";\nimport { freezeOwnedData } from \"../core/owned-data.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\ntype EnvironmentSite = SimulateEnvironmentSensorRawFrameInput[\"sites\"][number];\ntype SiteEnvironment = EnvironmentSite[\"environment\"];\n\n/**\n * Fixed retention limits. The per-site footprint of a retained optical stage is\n * `fixedBytesPerSite + bytesPerTemporalSamplePerSite × temporalSampleCount` bytes of typed-array storage;\n * distinct environment and photo templates (each about one site's input size) are capped separately.\n */\nexport const NATIVE_ENVIRONMENT_OPTICAL_STAGE_LIMITS = Object.freeze({\n /** Two one-byte template indices plus seven float64 values (site x/y, window start/end/duration, photon/electron counts). */\n fixedBytesPerSite: 58,\n /** Three float64 values per temporal midpoint: time, incident-photon rate, generated-electron rate. */\n bytesPerTemporalSamplePerSite: 24,\n /** Distinct per-site environment inputs once the site index and integration ID are removed. */\n maximumEnvironmentTemplates: 256,\n /** Distinct photo-signal identity/evidence records once per-site numbers are removed. */\n maximumPhotoTemplates: 256\n});\n\n/** Optional request on NativeEnvironmentRawInput to keep the optical stage. The byte budget covers the typed-array storage described by the limits. */\nexport interface NativeEnvironmentOpticalStageRetention {\n maximumRetainedBytes: number;\n}\n\n/**\n * Opaque, engine-owned optical-stage result. It is valid only for captures whose optical binding and every\n * site's environment input are strictly equal to those that produced it. dispose() zeroes and releases the\n * storage; a disposed stage refuses every later use.\n */\nexport interface NativeEnvironmentOpticalStage {\n readonly kind: \"native-environment-optical-stage\";\n readonly pixelCount: number;\n readonly temporalSampleCount: number;\n /** Typed-array bytes held: pixelCount × (fixedBytesPerSite + bytesPerTemporalSamplePerSite × temporalSampleCount). */\n readonly retainedBytes: number;\n /** Radiance callbacks the producing task executed; reuse executes none. */\n readonly providerEvaluationCount: number;\n readonly disposed: boolean;\n dispose(): void;\n}\n\n/** Input for a post-optics re-run. `raw` may differ from the original capture only in post-optics fields. */\nexport interface NativeEnvironmentSensorStageInput {\n raw: NativeRawInput;\n sceneBinding: SimulateEnvironmentSensorRawFrameInput[\"sceneBinding\"];\n}\n/** Supplies the same physical site inputs as the original capture. Environments must equal the retained ones exactly. */\nexport interface NativeEnvironmentSensorStageProvider {\n readTile(request: Readonly<NativeRawTileRequest>, signal: AbortSignal): Promise<{ captureId: string; frameId: string; x: number; y: number;\n width: number; height: number; sites: SimulateEnvironmentSensorRawFrameInput[\"sites\"] }>;\n yieldControl(signal: AbortSignal): Promise<void>;\n}\n\nconst FIXED_VALUES = 7;\nconst ENVIRONMENT_SHARED_KEYS = [\"sceneBindings\", \"optics\", \"motion\", \"psf\", \"pupil\", \"fieldThroughput\"] as const;\n\nfunction canonical(value: unknown): string {\n return stringifyCanonicalJson(value, { undefinedObjectProperties: \"omit\", nonFiniteNumberMessage: \"Invalid native scene binding.\",\n unsupportedValueMessage: \"Invalid native scene binding.\" });\n}\n\nfunction isPlainRecord(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/**\n * Strict structural equality of plain data: Object.is for primitives (so 0 and -0 differ), identical own\n * key sets, arrays element by element. Anything that is not a plain record or array is unequal unless it is\n * the same reference, so an unexpected value refuses reuse instead of being treated as equal.\n */\nfunction strictlyEqual(a: unknown, b: unknown, verified: WeakMap<object, WeakSet<object>>, skip?: ReadonlySet<string>): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n if (!skip && verified.get(a)?.has(b)) return true;\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!(i in a) || !(i in b) || !strictlyEqual(a[i], b[i], verified)) return false;\n }\n } else {\n if (Array.isArray(b) || !isPlainRecord(a) || !isPlainRecord(b)) return false;\n const ak = Object.keys(a), bk = Object.keys(b);\n if (ak.length !== bk.length || Object.getOwnPropertySymbols(a).length !== 0 || Object.getOwnPropertySymbols(b).length !== 0) return false;\n for (const key of ak) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n if (skip?.has(key)) continue;\n if (!strictlyEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key], verified)) return false;\n }\n }\n if (!skip) {\n let set = verified.get(a);\n if (!set) verified.set(a, set = new WeakSet());\n set.add(b);\n }\n return true;\n}\n\n/**\n * Environment equality except the two per-site fields that are bound to the absolute native index and\n * checked separately: temporalIntegrationId and sensor.spatialSampling.site.\n */\nfunction environmentMatches(e: SiteEnvironment, t: SiteEnvironment, verified: WeakMap<object, WeakSet<object>>): boolean {\n if (typeof e !== \"object\" || e === null || typeof e.sensor !== \"object\" || e.sensor === null ||\n typeof e.sensor.spatialSampling !== \"object\" || e.sensor.spatialSampling === null) return false;\n return strictlyEqual(e, t, verified, new Set([\"temporalIntegrationId\", \"sensor\"])) &&\n strictlyEqual(e.sensor, t.sensor, verified, new Set([\"spatialSampling\"])) &&\n strictlyEqual(e.sensor.spatialSampling, t.sensor.spatialSampling, verified, new Set([\"site\"]));\n}\n\n/**\n * Post-optics capture fields: noise seed/realization/model, ISO metadata, white-balance intent, adopted white,\n * capture identity, source artifact metadata and declared models. The optical stage never reads them.\n * Everything else in the normalized plan (scene state/time, geometry including orientation, focal length,\n * aperture, shutter, focus, frame/mode/CFA/binding profiles and the exposure window) is part of the binding.\n */\nfunction opticalBinding(plan: NativeRawPlan, sceneBinding: unknown): unknown {\n const { captureId, noise, source, whiteBalanceIntent, adoptedWhiteXyz, models, exposure, ...capture } = plan.exposure;\n void captureId; void noise; void source; void whiteBalanceIntent; void adoptedWhiteXyz; void models;\n const { iso, ...opticalExposure } = exposure; void iso;\n const { capture: frameCapture, ...frame } = plan.frame; void frameCapture;\n return { capture: { ...capture, exposure: opticalExposure }, frame, exposureWindow: plan.exposureWindow ?? null, sceneBinding };\n}\n\ninterface OpticalStageState {\n pixelCount: number;\n nativeWidth: number;\n frameId: string;\n stride: number;\n temporalSampleCount: number;\n binding: unknown;\n values: Float64Array;\n environmentIndex: Uint8Array;\n photoIndex: Uint8Array;\n environments: SiteEnvironment[];\n photoTemplates: Record<string, unknown>[];\n providerEvaluationCount: number;\n disposed: boolean;\n}\nconst STAGES = new WeakMap<object, OpticalStageState>();\n\nfunction release(state: OpticalStageState): void {\n state.values.fill(0); state.environmentIndex.fill(0); state.photoIndex.fill(0);\n state.values = new Float64Array(0); state.environmentIndex = new Uint8Array(0); state.photoIndex = new Uint8Array(0);\n state.environments = []; state.photoTemplates = []; state.disposed = true;\n}\n\nfunction photoTemplate(p: SensorEqeTemporalPhotoSignal): Record<string, unknown> {\n const { temporalIntegrationId, site, startOffsetSecondsFromOpeningReference, endOffsetSecondsFromOpeningReference,\n localExposureDurationSeconds, expectedIncidentPhotonCount, expectedGeneratedElectronCount, temporalSamples, ...rest } = p;\n void temporalIntegrationId; void site; void startOffsetSecondsFromOpeningReference; void endOffsetSecondsFromOpeningReference;\n void localExposureDurationSeconds; void expectedIncidentPhotonCount; void expectedGeneratedElectronCount; void temporalSamples;\n return rest;\n}\n\n/** Shared by full acquisition and reuse so the sensor stage receives an identical site record either way. */\nexport function composeNativeEnvironmentSensorSite(site: Omit<EnvironmentSite, \"environment\">, photoSignal: SensorEqeTemporalPhotoSignal): SensorRawProducerSiteInput {\n const darkCharge = calculateSensorDarkCurrentCharge({ exposure: photoSignal, darkCurrentProfile: site.darkCurrentProfile,\n operatingTemperatureC: site.operatingTemperatureC }).value;\n return { ...site.readout, charge: { ...site.charge, photoSignal, darkCharge } } as SensorRawProducerSiteInput;\n}\n\n/** Validates the optional retention request before any provider work. */\nexport function parseNativeEnvironmentOpticalStageRetention(value: unknown): NativeEnvironmentOpticalStageRetention {\n const r = requireAllowlistedRecord(value, [\"maximumRetainedBytes\"], \"Invalid optical-stage retention request.\");\n if (typeof r.maximumRetainedBytes !== \"number\" || !Number.isSafeInteger(r.maximumRetainedBytes) || r.maximumRetainedBytes < 1) {\n throw new InvalidConfigurationError(\"Optical-stage retention requires a positive safe-integer byte budget.\");\n }\n return { maximumRetainedBytes: r.maximumRetainedBytes };\n}\n\n/** Internal recorder used by createNativeEnvironmentRawTask when retention is requested. */\nexport interface NativeEnvironmentOpticalStageRecorder {\n /** Interns one planned site before any radiance callback; throws if a limit or the byte budget would be exceeded. */\n admit(index: number, environment: SiteEnvironment, sharedCanonical: string): void;\n record(index: number, photoSignal: SensorEqeTemporalPhotoSignal): void;\n finish(providerEvaluationCount: number): NativeEnvironmentOpticalStage;\n discard(): void;\n}\n\nexport function createNativeEnvironmentOpticalStageRecorder(plan: NativeRawPlan, sceneBinding: unknown,\n retention: NativeEnvironmentOpticalStageRetention): NativeEnvironmentOpticalStageRecorder {\n const L = NATIVE_ENVIRONMENT_OPTICAL_STAGE_LIMITS;\n const state: OpticalStageState = { pixelCount: plan.pixelCount, nativeWidth: plan.exposure.geometry.nativeRaster.pixelWidth,\n frameId: plan.frame.frameId, stride: 0, temporalSampleCount: 0, binding: freezeOwnedData(structuredClone(opticalBinding(plan, sceneBinding))),\n values: new Float64Array(0), environmentIndex: new Uint8Array(0), photoIndex: new Uint8Array(0), environments: [], photoTemplates: [],\n providerEvaluationCount: 0, disposed: false };\n const environmentKeys = new Map<string, number[]>(), photoKeys = new Map<string, number[]>(), verified = new WeakMap<object, WeakSet<object>>();\n const admitted = new Uint8Array(plan.pixelCount);\n let recorded = 0;\n function residualKey(e: SiteEnvironment, sharedCanonical: string): string {\n const rest: Record<string, unknown> = { ...e, temporalIntegrationId: undefined,\n sensor: { ...e.sensor, spatialSampling: { ...e.sensor.spatialSampling, site: undefined } } };\n for (const key of ENVIRONMENT_SHARED_KEYS) rest[key] = undefined;\n return sharedCanonical+\"\\u0000\"+canonical(rest);\n }\n return {\n admit(index, environment, sharedCanonical): void {\n if (state.disposed) throw new InvalidConfigurationError(\"Optical-stage retention was released.\");\n const n = environment.temporalSampleCount;\n if (state.stride === 0) {\n const bytes = plan.pixelCount*(L.fixedBytesPerSite+L.bytesPerTemporalSamplePerSite*n);\n if (!Number.isSafeInteger(bytes) || bytes > retention.maximumRetainedBytes) throw new InvalidConfigurationError(\"Optical-stage retention exceeds its byte budget.\");\n state.temporalSampleCount = n; state.stride = FIXED_VALUES+3*n;\n state.values = new Float64Array(plan.pixelCount*state.stride);\n state.environmentIndex = new Uint8Array(plan.pixelCount); state.photoIndex = new Uint8Array(plan.pixelCount);\n } else if (n !== state.temporalSampleCount) throw new InvalidConfigurationError(\"Optical-stage retention requires one temporal sample count per event.\");\n const key = residualKey(environment, sharedCanonical), candidates = environmentKeys.get(key) ?? [];\n let found = candidates.find(i => environmentMatches(environment, state.environments[i]!, verified));\n if (found === undefined) {\n if (state.environments.length >= L.maximumEnvironmentTemplates) throw new InvalidConfigurationError(\"Optical-stage retention exceeds its distinct site-environment limit.\");\n found = state.environments.length;\n state.environments.push(environment);\n candidates.push(found); environmentKeys.set(key, candidates);\n }\n state.environmentIndex[index] = found; admitted[index] = 1;\n },\n record(index, p): void {\n if (state.disposed || admitted[index] !== 1) throw new InvalidConfigurationError(\"Optical-stage retention was released or not admitted.\");\n const samples = p.temporalSamples;\n if (samples.length !== state.temporalSampleCount) throw new InvalidConfigurationError(\"Optical-stage temporal sample count changed.\");\n const template = photoTemplate(p), key = canonical(template), candidates = photoKeys.get(key) ?? [];\n let found = candidates.find(i => strictlyEqual(template, state.photoTemplates[i]!, verified));\n if (found === undefined) {\n if (state.photoTemplates.length >= L.maximumPhotoTemplates) throw new InvalidConfigurationError(\"Optical-stage retention exceeds its distinct photo-identity limit.\");\n found = state.photoTemplates.length;\n state.photoTemplates.push(freezeOwnedData(structuredClone(template)));\n candidates.push(found); photoKeys.set(key, candidates);\n }\n state.photoIndex[index] = found;\n const v = state.values, o = index*state.stride;\n v[o] = p.site.x; v[o+1] = p.site.y; v[o+2] = p.startOffsetSecondsFromOpeningReference; v[o+3] = p.endOffsetSecondsFromOpeningReference;\n v[o+4] = p.localExposureDurationSeconds; v[o+5] = p.expectedIncidentPhotonCount; v[o+6] = p.expectedGeneratedElectronCount;\n for (let t = 0; t < samples.length; t++) {\n const s = samples[t]!, q = o+FIXED_VALUES+3*t;\n v[q] = s.timeSecondsFromOpeningReference; v[q+1] = s.incidentPhotonRatePerSecond; v[q+2] = s.expectedGeneratedElectronRatePerSecond;\n }\n admitted[index] = 2; recorded++;\n },\n finish(providerEvaluationCount): NativeEnvironmentOpticalStage {\n if (state.disposed || recorded !== plan.pixelCount) throw new InvalidConfigurationError(\"Optical-stage retention is incomplete.\");\n for (const environment of state.environments) freezeOwnedData(environment);\n state.providerEvaluationCount = providerEvaluationCount;\n const handle: NativeEnvironmentOpticalStage = Object.freeze({ kind: \"native-environment-optical-stage\" as const,\n pixelCount: state.pixelCount, temporalSampleCount: state.temporalSampleCount,\n retainedBytes: state.pixelCount*(L.fixedBytesPerSite+L.bytesPerTemporalSamplePerSite*state.temporalSampleCount),\n providerEvaluationCount, get disposed(): boolean { return state.disposed; },\n dispose(): void { if (!state.disposed) release(state); } });\n STAGES.set(handle, state);\n return handle;\n },\n discard(): void { if (!state.disposed) release(state); }\n };\n}\n\n/**\n * Internal: re-runs only the sensor stage (dark charge, charge realization, capacity, seeded noise and ADC) from a retained\n * optical stage. The capture may change post-optics settings only: noise seed/realization, ISO metadata, readout\n * regime/gain, charge sampling/capacity/completeness, dark-current profile and temperature, white-balance intent,\n * capture identity and tile width. Every optical input must be strictly equal, otherwise this refuses before\n * output: the capture binding is checked here, each site's environment as its tile is read.\n */\nexport function createSensorStageRawTask<B>(input: NativeEnvironmentSensorStageInput, opticalStage: NativeEnvironmentOpticalStage,\n provider: NativeEnvironmentSensorStageProvider, parseSceneBinding: (value: unknown) => B):\n { task: ReturnType<typeof createNativeRawTask>; sceneBinding: B } {\n const state = typeof opticalStage === \"object\" && opticalStage !== null ? STAGES.get(opticalStage) : undefined;\n if (!state) throw new InvalidConfigurationError(\"Optical-stage reuse requires an engine-produced optical stage.\");\n if (state.disposed) throw new InvalidConfigurationError(\"Optical stage was disposed.\");\n const r = requireAllowlistedRecord(input, [\"raw\", \"sceneBinding\"], \"Invalid native sensor-stage input.\");\n const sceneBinding = parseSceneBinding(r.sceneBinding);\n if (!provider || typeof provider.readTile !== \"function\" || typeof provider.yieldControl !== \"function\") {\n throw new InvalidConfigurationError(\"Sensor-stage reuse requires physical site input and host yields.\");\n }\n const read = provider.readTile.bind(provider), yieldControl = provider.yieldControl.bind(provider);\n const width = state.nativeWidth, frameId = state.frameId;\n const task = createNativeRawTask(input.raw, {\n async readTile(request, signal) {\n const supplied = await read(request, signal);\n if (signal.aborted) throw new InvalidConfigurationError(\"Native sensor-stage acquisition aborted.\");\n if (state.disposed) throw new InvalidConfigurationError(\"Optical stage was disposed.\");\n const tile = requireAllowlistedRecord(supplied, [\"captureId\", \"frameId\", \"x\", \"y\", \"width\", \"height\", \"sites\"], \"Invalid physical source tile.\");\n for (const key of Object.keys(request) as (keyof NativeRawTileRequest)[]) if (tile[key] !== request[key]) throw new InvalidConfigurationError(\"Physical source tile identity mismatch.\");\n if (!Array.isArray(tile.sites) || tile.sites.length !== request.width || Array.from({ length: request.width }, (_, i) => i in (tile.sites as unknown[])).includes(false)) {\n throw new InvalidConfigurationError(\"Physical source tile needs exact native coverage.\");\n }\n // The supplied environment is only compared, in one synchronous pass, and never used: execution uses the\n // retained stage. Only the post-optics parts the sensor stage uses are cloned. The equality cache is per\n // tile, so a caller object changed between tiles is compared again.\n const tileVerified = new WeakMap<object, WeakSet<object>>();\n const suppliedSites = tile.sites as unknown[];\n const sites = structuredClone(suppliedSites.map((value, j) => {\n const site = requireAllowlistedRecord(value, [\"environment\", \"darkCurrentProfile\", \"operatingTemperatureC\", \"charge\", \"readout\"], \"Invalid physical site input.\");\n const index = request.y*width+request.x+j, e = site.environment as SiteEnvironment;\n if (typeof e !== \"object\" || e === null || !environmentMatches(e, state.environments[state.environmentIndex[index]!]!, tileVerified) ||\n e.temporalIntegrationId !== frameId+\":native:\"+index || typeof e.sensor.spatialSampling.site !== \"object\" || e.sensor.spatialSampling.site === null ||\n !strictlyEqual(e.sensor.spatialSampling.site, { x: index%width, y: Math.floor(index/width) }, tileVerified)) {\n throw new InvalidConfigurationError(\"Site environment differs from the retained optical stage; recompute the optical stage.\");\n }\n return { temporalIntegrationId: e.temporalIntegrationId, darkCurrentProfile: site.darkCurrentProfile, operatingTemperatureC: site.operatingTemperatureC,\n charge: site.charge, readout: site.readout };\n })) as (Omit<EnvironmentSite, \"environment\"> & { temporalIntegrationId: string })[];\n const photos = sites.map((site, j) => {\n const index = request.y*width+request.x+j;\n if (site.temporalIntegrationId !== frameId+\":native:\"+index) {\n throw new InvalidConfigurationError(\"Site environment differs from the retained optical stage; recompute the optical stage.\");\n }\n const v = state.values, o = index*state.stride, template = state.photoTemplates[state.photoIndex[index]!]!;\n const temporalSamples = Array.from({ length: state.temporalSampleCount }, (_, t) => {\n const q = o+FIXED_VALUES+3*t;\n return { timeSecondsFromOpeningReference: v[q]!, incidentPhotonRatePerSecond: v[q+1]!, expectedGeneratedElectronRatePerSecond: v[q+2]! };\n });\n return freezeOwnedData(parseSensorEqeTemporalPhotoSignal({ ...template, temporalIntegrationId: site.temporalIntegrationId, site: { x: v[o]!, y: v[o+1]! },\n startOffsetSecondsFromOpeningReference: v[o+2]!, endOffsetSecondsFromOpeningReference: v[o+3]!, localExposureDurationSeconds: v[o+4]!,\n expectedIncidentPhotonCount: v[o+5]!, expectedGeneratedElectronCount: v[o+6]!, temporalSamples }));\n });\n return { ...request, sites: sites.map((site, j) => composeNativeEnvironmentSensorSite(site, photos[j]!)) };\n },\n // Host yields are time-budgeted and always follow the final tile, so a stage disposed\n // while the host runs is caught here even when no further tile would be read.\n async yieldControl(signal) {\n await yieldControl(signal);\n if (state.disposed) throw new InvalidConfigurationError(\"Optical stage was disposed.\");\n }\n });\n // The task's own accepted plan is the one compared, so nothing is planned twice and no callback has run yet.\n if (!strictlyEqual(opticalBinding(task.plan, sceneBinding), state.binding, new WeakMap())) {\n task.dispose();\n throw new InvalidConfigurationError(\"Optical stage does not match this capture's optical inputs; recompute the optical stage.\");\n }\n return { task, sceneBinding };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"native-environment-optical-stage.js","sourceRoot":"","sources":["../../src/capture/native-environment-optical-stage.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Keeps (retains) the result of the optical stage of a native environment capture, so the sensor stage\n * can be re-run with new post-optics settings without calling the radiance callbacks again.\n *\n * Optical stage: scene radiance → optics, PSF (point-spread function) and pupil → expected photo signal\n * via EQE (external quantum efficiency). Sensor stage: dark charge → charge realization → readout.\n *\n * Reuse is exact, not approximate: the sensor stage receives a photo signal whose every number is the\n * float64 value the optical stage produced, and the same charge/noise/ADC code runs on it. Reuse is\n * refused unless the capture's optical binding and every site's environment input are strictly equal\n * to those the stage was produced from.\n * @see docs/NATIVE_RAW_AND_PRINT.md for the invariance analysis, memory bound and limits.\n */\n\nimport { createNativeRawTask, type NativeRawInput, type NativeRawPlan, type NativeRawTileRequest } from \"./native-raw.js\";\nimport type { SimulateEnvironmentSensorRawFrameInput } from \"./environment-raw-producer.js\";\nimport type { SensorRawProducerSiteInput } from \"./sensor-raw-producer.js\";\nimport { parseSensorEqeTemporalPhotoSignal, type SensorEqeTemporalPhotoSignal } from \"../sensor/temporal-photo-signal.js\";\nimport { calculateSensorDarkCurrentCharge } from \"../sensor/dark-current.js\";\nimport { requireAllowlistedRecord } from \"../core/record-validation.js\";\nimport { stringifyCanonicalJson } from \"../core/canonical-json.js\";\nimport { freezeOwnedData } from \"../core/owned-data.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\ntype EnvironmentSite = SimulateEnvironmentSensorRawFrameInput[\"sites\"][number];\ntype SiteEnvironment = EnvironmentSite[\"environment\"];\n\n/**\n * Fixed retention limits. The per-site footprint of a retained optical stage is\n * `fixedBytesPerSite + bytesPerTemporalSamplePerSite × temporalSampleCount` bytes of typed-array storage;\n * distinct environment and photo templates (each about one site's input size) are capped separately.\n */\nexport const NATIVE_ENVIRONMENT_OPTICAL_STAGE_LIMITS = /* @__PURE__ */ Object.freeze({\n /** Two one-byte template indices plus seven float64 values (site x/y, window start/end/duration, photon/electron counts). */\n fixedBytesPerSite: 58,\n /** Three float64 values per temporal midpoint: time, incident-photon rate, generated-electron rate. */\n bytesPerTemporalSamplePerSite: 24,\n /** Distinct per-site environment inputs once the site index and integration ID are removed. */\n maximumEnvironmentTemplates: 256,\n /** Distinct photo-signal identity/evidence records once per-site numbers are removed. */\n maximumPhotoTemplates: 256\n});\n\n/** Optional request on NativeEnvironmentRawInput to keep the optical stage. The byte budget covers the typed-array storage described by the limits. */\nexport interface NativeEnvironmentOpticalStageRetention {\n maximumRetainedBytes: number;\n}\n\n/**\n * Opaque, engine-owned optical-stage result. It is valid only for captures whose optical binding and every\n * site's environment input are strictly equal to those that produced it. dispose() zeroes and releases the\n * storage; a disposed stage refuses every later use.\n */\nexport interface NativeEnvironmentOpticalStage {\n readonly kind: \"native-environment-optical-stage\";\n readonly pixelCount: number;\n readonly temporalSampleCount: number;\n /** Typed-array bytes held: pixelCount × (fixedBytesPerSite + bytesPerTemporalSamplePerSite × temporalSampleCount). */\n readonly retainedBytes: number;\n /** Radiance callbacks the producing task executed; reuse executes none. */\n readonly providerEvaluationCount: number;\n readonly disposed: boolean;\n dispose(): void;\n}\n\n/** Input for a post-optics re-run. `raw` may differ from the original capture only in post-optics fields. */\nexport interface NativeEnvironmentSensorStageInput {\n raw: NativeRawInput;\n sceneBinding: SimulateEnvironmentSensorRawFrameInput[\"sceneBinding\"];\n}\n/** Supplies the same physical site inputs as the original capture. Environments must equal the retained ones exactly. */\nexport interface NativeEnvironmentSensorStageProvider {\n readTile(request: Readonly<NativeRawTileRequest>, signal: AbortSignal): Promise<{ captureId: string; frameId: string; x: number; y: number;\n width: number; height: number; sites: SimulateEnvironmentSensorRawFrameInput[\"sites\"] }>;\n yieldControl(signal: AbortSignal): Promise<void>;\n}\n\nconst FIXED_VALUES = 7;\nconst ENVIRONMENT_SHARED_KEYS = [\"sceneBindings\", \"optics\", \"motion\", \"psf\", \"pupil\", \"fieldThroughput\"] as const;\n\nfunction canonical(value: unknown): string {\n return stringifyCanonicalJson(value, { undefinedObjectProperties: \"omit\", nonFiniteNumberMessage: \"Invalid native scene binding.\",\n unsupportedValueMessage: \"Invalid native scene binding.\" });\n}\n\nfunction isPlainRecord(value: object): boolean {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/**\n * Strict structural equality of plain data: Object.is for primitives (so 0 and -0 differ), identical own\n * key sets, arrays element by element. Anything that is not a plain record or array is unequal unless it is\n * the same reference, so an unexpected value refuses reuse instead of being treated as equal.\n */\nfunction strictlyEqual(a: unknown, b: unknown, verified: WeakMap<object, WeakSet<object>>, skip?: ReadonlySet<string>): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n if (!skip && verified.get(a)?.has(b)) return true;\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!(i in a) || !(i in b) || !strictlyEqual(a[i], b[i], verified)) return false;\n }\n } else {\n if (Array.isArray(b) || !isPlainRecord(a) || !isPlainRecord(b)) return false;\n const ak = Object.keys(a), bk = Object.keys(b);\n if (ak.length !== bk.length || Object.getOwnPropertySymbols(a).length !== 0 || Object.getOwnPropertySymbols(b).length !== 0) return false;\n for (const key of ak) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n if (skip?.has(key)) continue;\n if (!strictlyEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key], verified)) return false;\n }\n }\n if (!skip) {\n let set = verified.get(a);\n if (!set) verified.set(a, set = new WeakSet());\n set.add(b);\n }\n return true;\n}\n\n/**\n * Environment equality except the two per-site fields that are bound to the absolute native index and\n * checked separately: temporalIntegrationId and sensor.spatialSampling.site.\n */\nfunction environmentMatches(e: SiteEnvironment, t: SiteEnvironment, verified: WeakMap<object, WeakSet<object>>): boolean {\n if (typeof e !== \"object\" || e === null || typeof e.sensor !== \"object\" || e.sensor === null ||\n typeof e.sensor.spatialSampling !== \"object\" || e.sensor.spatialSampling === null) return false;\n return strictlyEqual(e, t, verified, new Set([\"temporalIntegrationId\", \"sensor\"])) &&\n strictlyEqual(e.sensor, t.sensor, verified, new Set([\"spatialSampling\"])) &&\n strictlyEqual(e.sensor.spatialSampling, t.sensor.spatialSampling, verified, new Set([\"site\"]));\n}\n\n/**\n * Post-optics capture fields: noise seed/realization/model, ISO metadata, white-balance intent, adopted white,\n * capture identity, source artifact metadata and declared models. The optical stage never reads them.\n * Everything else in the normalized plan (scene state/time, geometry including orientation, focal length,\n * aperture, shutter, focus, frame/mode/CFA/binding profiles and the exposure window) is part of the binding.\n */\nfunction opticalBinding(plan: NativeRawPlan, sceneBinding: unknown): unknown {\n const { captureId, noise, source, whiteBalanceIntent, adoptedWhiteXyz, models, exposure, ...capture } = plan.exposure;\n void captureId; void noise; void source; void whiteBalanceIntent; void adoptedWhiteXyz; void models;\n const { iso, ...opticalExposure } = exposure; void iso;\n const { capture: frameCapture, ...frame } = plan.frame; void frameCapture;\n return { capture: { ...capture, exposure: opticalExposure }, frame, exposureWindow: plan.exposureWindow ?? null, sceneBinding };\n}\n\ninterface OpticalStageState {\n pixelCount: number;\n nativeWidth: number;\n frameId: string;\n stride: number;\n temporalSampleCount: number;\n binding: unknown;\n values: Float64Array;\n environmentIndex: Uint8Array;\n photoIndex: Uint8Array;\n environments: SiteEnvironment[];\n photoTemplates: Record<string, unknown>[];\n providerEvaluationCount: number;\n disposed: boolean;\n}\nconst STAGES = new WeakMap<object, OpticalStageState>();\n\nfunction release(state: OpticalStageState): void {\n state.values.fill(0); state.environmentIndex.fill(0); state.photoIndex.fill(0);\n state.values = new Float64Array(0); state.environmentIndex = new Uint8Array(0); state.photoIndex = new Uint8Array(0);\n state.environments = []; state.photoTemplates = []; state.disposed = true;\n}\n\nfunction photoTemplate(p: SensorEqeTemporalPhotoSignal): Record<string, unknown> {\n const { temporalIntegrationId, site, startOffsetSecondsFromOpeningReference, endOffsetSecondsFromOpeningReference,\n localExposureDurationSeconds, expectedIncidentPhotonCount, expectedGeneratedElectronCount, temporalSamples, ...rest } = p;\n void temporalIntegrationId; void site; void startOffsetSecondsFromOpeningReference; void endOffsetSecondsFromOpeningReference;\n void localExposureDurationSeconds; void expectedIncidentPhotonCount; void expectedGeneratedElectronCount; void temporalSamples;\n return rest;\n}\n\n/** Shared by full acquisition and reuse so the sensor stage receives an identical site record either way. */\nexport function composeNativeEnvironmentSensorSite(site: Omit<EnvironmentSite, \"environment\">, photoSignal: SensorEqeTemporalPhotoSignal): SensorRawProducerSiteInput {\n const darkCharge = calculateSensorDarkCurrentCharge({ exposure: photoSignal, darkCurrentProfile: site.darkCurrentProfile,\n operatingTemperatureC: site.operatingTemperatureC }).value;\n return { ...site.readout, charge: { ...site.charge, photoSignal, darkCharge } } as SensorRawProducerSiteInput;\n}\n\n/** Validates the optional retention request before any provider work. */\nexport function parseNativeEnvironmentOpticalStageRetention(value: unknown): NativeEnvironmentOpticalStageRetention {\n const r = requireAllowlistedRecord(value, [\"maximumRetainedBytes\"], \"Invalid optical-stage retention request.\");\n if (typeof r.maximumRetainedBytes !== \"number\" || !Number.isSafeInteger(r.maximumRetainedBytes) || r.maximumRetainedBytes < 1) {\n throw new InvalidConfigurationError(\"Optical-stage retention requires a positive safe-integer byte budget.\");\n }\n return { maximumRetainedBytes: r.maximumRetainedBytes };\n}\n\n/** Internal recorder used by createNativeEnvironmentRawTask when retention is requested. */\nexport interface NativeEnvironmentOpticalStageRecorder {\n /** Interns one planned site before any radiance callback; throws if a limit or the byte budget would be exceeded. */\n admit(index: number, environment: SiteEnvironment, sharedCanonical: string): void;\n record(index: number, photoSignal: SensorEqeTemporalPhotoSignal): void;\n finish(providerEvaluationCount: number): NativeEnvironmentOpticalStage;\n discard(): void;\n}\n\nexport function createNativeEnvironmentOpticalStageRecorder(plan: NativeRawPlan, sceneBinding: unknown,\n retention: NativeEnvironmentOpticalStageRetention): NativeEnvironmentOpticalStageRecorder {\n const L = NATIVE_ENVIRONMENT_OPTICAL_STAGE_LIMITS;\n const state: OpticalStageState = { pixelCount: plan.pixelCount, nativeWidth: plan.exposure.geometry.nativeRaster.pixelWidth,\n frameId: plan.frame.frameId, stride: 0, temporalSampleCount: 0, binding: freezeOwnedData(structuredClone(opticalBinding(plan, sceneBinding))),\n values: new Float64Array(0), environmentIndex: new Uint8Array(0), photoIndex: new Uint8Array(0), environments: [], photoTemplates: [],\n providerEvaluationCount: 0, disposed: false };\n const environmentKeys = new Map<string, number[]>(), photoKeys = new Map<string, number[]>(), verified = new WeakMap<object, WeakSet<object>>();\n const admitted = new Uint8Array(plan.pixelCount);\n let recorded = 0;\n function residualKey(e: SiteEnvironment, sharedCanonical: string): string {\n const rest: Record<string, unknown> = { ...e, temporalIntegrationId: undefined,\n sensor: { ...e.sensor, spatialSampling: { ...e.sensor.spatialSampling, site: undefined } } };\n for (const key of ENVIRONMENT_SHARED_KEYS) rest[key] = undefined;\n return sharedCanonical+\"\\u0000\"+canonical(rest);\n }\n return {\n admit(index, environment, sharedCanonical): void {\n if (state.disposed) throw new InvalidConfigurationError(\"Optical-stage retention was released.\");\n const n = environment.temporalSampleCount;\n if (state.stride === 0) {\n const bytes = plan.pixelCount*(L.fixedBytesPerSite+L.bytesPerTemporalSamplePerSite*n);\n if (!Number.isSafeInteger(bytes) || bytes > retention.maximumRetainedBytes) throw new InvalidConfigurationError(\"Optical-stage retention exceeds its byte budget.\");\n state.temporalSampleCount = n; state.stride = FIXED_VALUES+3*n;\n state.values = new Float64Array(plan.pixelCount*state.stride);\n state.environmentIndex = new Uint8Array(plan.pixelCount); state.photoIndex = new Uint8Array(plan.pixelCount);\n } else if (n !== state.temporalSampleCount) throw new InvalidConfigurationError(\"Optical-stage retention requires one temporal sample count per event.\");\n const key = residualKey(environment, sharedCanonical), candidates = environmentKeys.get(key) ?? [];\n let found = candidates.find(i => environmentMatches(environment, state.environments[i]!, verified));\n if (found === undefined) {\n if (state.environments.length >= L.maximumEnvironmentTemplates) throw new InvalidConfigurationError(\"Optical-stage retention exceeds its distinct site-environment limit.\");\n found = state.environments.length;\n state.environments.push(environment);\n candidates.push(found); environmentKeys.set(key, candidates);\n }\n state.environmentIndex[index] = found; admitted[index] = 1;\n },\n record(index, p): void {\n if (state.disposed || admitted[index] !== 1) throw new InvalidConfigurationError(\"Optical-stage retention was released or not admitted.\");\n const samples = p.temporalSamples;\n if (samples.length !== state.temporalSampleCount) throw new InvalidConfigurationError(\"Optical-stage temporal sample count changed.\");\n const template = photoTemplate(p), key = canonical(template), candidates = photoKeys.get(key) ?? [];\n let found = candidates.find(i => strictlyEqual(template, state.photoTemplates[i]!, verified));\n if (found === undefined) {\n if (state.photoTemplates.length >= L.maximumPhotoTemplates) throw new InvalidConfigurationError(\"Optical-stage retention exceeds its distinct photo-identity limit.\");\n found = state.photoTemplates.length;\n state.photoTemplates.push(freezeOwnedData(structuredClone(template)));\n candidates.push(found); photoKeys.set(key, candidates);\n }\n state.photoIndex[index] = found;\n const v = state.values, o = index*state.stride;\n v[o] = p.site.x; v[o+1] = p.site.y; v[o+2] = p.startOffsetSecondsFromOpeningReference; v[o+3] = p.endOffsetSecondsFromOpeningReference;\n v[o+4] = p.localExposureDurationSeconds; v[o+5] = p.expectedIncidentPhotonCount; v[o+6] = p.expectedGeneratedElectronCount;\n for (let t = 0; t < samples.length; t++) {\n const s = samples[t]!, q = o+FIXED_VALUES+3*t;\n v[q] = s.timeSecondsFromOpeningReference; v[q+1] = s.incidentPhotonRatePerSecond; v[q+2] = s.expectedGeneratedElectronRatePerSecond;\n }\n admitted[index] = 2; recorded++;\n },\n finish(providerEvaluationCount): NativeEnvironmentOpticalStage {\n if (state.disposed || recorded !== plan.pixelCount) throw new InvalidConfigurationError(\"Optical-stage retention is incomplete.\");\n for (const environment of state.environments) freezeOwnedData(environment);\n state.providerEvaluationCount = providerEvaluationCount;\n const handle: NativeEnvironmentOpticalStage = Object.freeze({ kind: \"native-environment-optical-stage\" as const,\n pixelCount: state.pixelCount, temporalSampleCount: state.temporalSampleCount,\n retainedBytes: state.pixelCount*(L.fixedBytesPerSite+L.bytesPerTemporalSamplePerSite*state.temporalSampleCount),\n providerEvaluationCount, get disposed(): boolean { return state.disposed; },\n dispose(): void { if (!state.disposed) release(state); } });\n STAGES.set(handle, state);\n return handle;\n },\n discard(): void { if (!state.disposed) release(state); }\n };\n}\n\n/**\n * Internal: re-runs only the sensor stage (dark charge, charge realization, capacity, seeded noise and ADC) from a retained\n * optical stage. The capture may change post-optics settings only: noise seed/realization, ISO metadata, readout\n * regime/gain, charge sampling/capacity/completeness, dark-current profile and temperature, white-balance intent,\n * capture identity and tile width. Every optical input must be strictly equal, otherwise this refuses before\n * output: the capture binding is checked here, each site's environment as its tile is read.\n */\nexport function createSensorStageRawTask<B>(input: NativeEnvironmentSensorStageInput, opticalStage: NativeEnvironmentOpticalStage,\n provider: NativeEnvironmentSensorStageProvider, parseSceneBinding: (value: unknown) => B):\n { task: ReturnType<typeof createNativeRawTask>; sceneBinding: B } {\n const state = typeof opticalStage === \"object\" && opticalStage !== null ? STAGES.get(opticalStage) : undefined;\n if (!state) throw new InvalidConfigurationError(\"Optical-stage reuse requires an engine-produced optical stage.\");\n if (state.disposed) throw new InvalidConfigurationError(\"Optical stage was disposed.\");\n const r = requireAllowlistedRecord(input, [\"raw\", \"sceneBinding\"], \"Invalid native sensor-stage input.\");\n const sceneBinding = parseSceneBinding(r.sceneBinding);\n if (!provider || typeof provider.readTile !== \"function\" || typeof provider.yieldControl !== \"function\") {\n throw new InvalidConfigurationError(\"Sensor-stage reuse requires physical site input and host yields.\");\n }\n const read = provider.readTile.bind(provider), yieldControl = provider.yieldControl.bind(provider);\n const width = state.nativeWidth, frameId = state.frameId;\n const task = createNativeRawTask(input.raw, {\n async readTile(request, signal) {\n const supplied = await read(request, signal);\n if (signal.aborted) throw new InvalidConfigurationError(\"Native sensor-stage acquisition aborted.\");\n if (state.disposed) throw new InvalidConfigurationError(\"Optical stage was disposed.\");\n const tile = requireAllowlistedRecord(supplied, [\"captureId\", \"frameId\", \"x\", \"y\", \"width\", \"height\", \"sites\"], \"Invalid physical source tile.\");\n for (const key of Object.keys(request) as (keyof NativeRawTileRequest)[]) if (tile[key] !== request[key]) throw new InvalidConfigurationError(\"Physical source tile identity mismatch.\");\n if (!Array.isArray(tile.sites) || tile.sites.length !== request.width || Array.from({ length: request.width }, (_, i) => i in (tile.sites as unknown[])).includes(false)) {\n throw new InvalidConfigurationError(\"Physical source tile needs exact native coverage.\");\n }\n // The supplied environment is only compared, in one synchronous pass, and never used: execution uses the\n // retained stage. Only the post-optics parts the sensor stage uses are cloned. The equality cache is per\n // tile, so a caller object changed between tiles is compared again.\n const tileVerified = new WeakMap<object, WeakSet<object>>();\n const suppliedSites = tile.sites as unknown[];\n const sites = structuredClone(suppliedSites.map((value, j) => {\n const site = requireAllowlistedRecord(value, [\"environment\", \"darkCurrentProfile\", \"operatingTemperatureC\", \"charge\", \"readout\"], \"Invalid physical site input.\");\n const index = request.y*width+request.x+j, e = site.environment as SiteEnvironment;\n if (typeof e !== \"object\" || e === null || !environmentMatches(e, state.environments[state.environmentIndex[index]!]!, tileVerified) ||\n e.temporalIntegrationId !== frameId+\":native:\"+index || typeof e.sensor.spatialSampling.site !== \"object\" || e.sensor.spatialSampling.site === null ||\n !strictlyEqual(e.sensor.spatialSampling.site, { x: index%width, y: Math.floor(index/width) }, tileVerified)) {\n throw new InvalidConfigurationError(\"Site environment differs from the retained optical stage; recompute the optical stage.\");\n }\n return { temporalIntegrationId: e.temporalIntegrationId, darkCurrentProfile: site.darkCurrentProfile, operatingTemperatureC: site.operatingTemperatureC,\n charge: site.charge, readout: site.readout };\n })) as (Omit<EnvironmentSite, \"environment\"> & { temporalIntegrationId: string })[];\n const photos = sites.map((site, j) => {\n const index = request.y*width+request.x+j;\n if (site.temporalIntegrationId !== frameId+\":native:\"+index) {\n throw new InvalidConfigurationError(\"Site environment differs from the retained optical stage; recompute the optical stage.\");\n }\n const v = state.values, o = index*state.stride, template = state.photoTemplates[state.photoIndex[index]!]!;\n const temporalSamples = Array.from({ length: state.temporalSampleCount }, (_, t) => {\n const q = o+FIXED_VALUES+3*t;\n return { timeSecondsFromOpeningReference: v[q]!, incidentPhotonRatePerSecond: v[q+1]!, expectedGeneratedElectronRatePerSecond: v[q+2]! };\n });\n return freezeOwnedData(parseSensorEqeTemporalPhotoSignal({ ...template, temporalIntegrationId: site.temporalIntegrationId, site: { x: v[o]!, y: v[o+1]! },\n startOffsetSecondsFromOpeningReference: v[o+2]!, endOffsetSecondsFromOpeningReference: v[o+3]!, localExposureDurationSeconds: v[o+4]!,\n expectedIncidentPhotonCount: v[o+5]!, expectedGeneratedElectronCount: v[o+6]!, temporalSamples }));\n });\n return { ...request, sites: sites.map((site, j) => composeNativeEnvironmentSensorSite(site, photos[j]!)) };\n },\n // Host yields are time-budgeted and always follow the final tile, so a stage disposed\n // while the host runs is caught here even when no further tile would be read.\n async yieldControl(signal) {\n await yieldControl(signal);\n if (state.disposed) throw new InvalidConfigurationError(\"Optical stage was disposed.\");\n }\n });\n // The task's own accepted plan is the one compared, so nothing is planned twice and no callback has run yet.\n if (!strictlyEqual(opticalBinding(task.plan, sceneBinding), state.binding, new WeakMap())) {\n task.dispose();\n throw new InvalidConfigurationError(\"Optical stage does not match this capture's optical inputs; recompute the optical stage.\");\n }\n return { task, sceneBinding };\n}\n"]}
|
|
@@ -18,7 +18,7 @@ import { calculateCaptureExposureWindows } from "../sensor/exposure-window.js";
|
|
|
18
18
|
import { SENSOR_RAW_PRODUCER_NOISE_MODEL, calculateNativeRawSite, parseNativeRawProducerSite, validateNativeRawReadoutIdentity } from "./sensor-raw-producer.js";
|
|
19
19
|
export const NATIVE_RAW_SCHEMA_VERSION = "0.1.0";
|
|
20
20
|
/** `maximumPixels` is the default pixel limit; a request may raise it with its own `maximumPixels`, up to `ceilingPixels`. */
|
|
21
|
-
export const NATIVE_RAW_LIMITS = Object.freeze({ maximumPixels: 24_000_000, ceilingPixels: FULL_RESOLUTION_CEILING_PIXELS, maximumDimension: 16_384,
|
|
21
|
+
export const NATIVE_RAW_LIMITS = /* @__PURE__ */ Object.freeze({ maximumPixels: 24_000_000, ceilingPixels: FULL_RESOLUTION_CEILING_PIXELS, maximumDimension: 16_384,
|
|
22
22
|
tileWidth: 256, tileHeight: 1, outputBytesPerPixel: 7 });
|
|
23
23
|
/** Default whole-event radiance query budget ceiling of the native environment tasks; it scales with a raised `maximumPixels`. */
|
|
24
24
|
const DEFAULT_MAXIMUM_PROVIDER_EVALUATIONS = 2_000_000_000;
|