@photivra/engine 2.12.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.
Files changed (148) hide show
  1. package/CHANGELOG.md +144 -1
  2. package/CITATION.cff +1 -1
  3. package/README.md +7 -7
  4. package/SECURITY.md +1 -1
  5. package/THIRD_PARTY.md +3 -0
  6. package/dist/camera/lens-projection.js +2 -1
  7. package/dist/camera/lens-projection.js.map +1 -1
  8. package/dist/capture/dng-import.js +1 -1
  9. package/dist/capture/dng-import.js.map +1 -1
  10. package/dist/capture/export-jpeg.d.ts +1 -1
  11. package/dist/capture/export-jpeg.js +6 -4
  12. package/dist/capture/export-jpeg.js.map +1 -1
  13. package/dist/capture/host-yield-cadence.js +1 -1
  14. package/dist/capture/host-yield-cadence.js.map +1 -1
  15. package/dist/capture/native-environment-optical-stage.js +1 -1
  16. package/dist/capture/native-environment-optical-stage.js.map +1 -1
  17. package/dist/capture/native-raw.js +1 -1
  18. package/dist/capture/native-raw.js.map +1 -1
  19. package/dist/capture/packed-sensor-raw.js +3 -3
  20. package/dist/capture/packed-sensor-raw.js.map +1 -1
  21. package/dist/capture/sensor-raw-producer.js +1 -1
  22. package/dist/capture/sensor-raw-producer.js.map +1 -1
  23. package/dist/color/capture-color.js +3 -3
  24. package/dist/color/capture-color.js.map +1 -1
  25. package/dist/color/chromatic-adaptation.js +2 -2
  26. package/dist/color/chromatic-adaptation.js.map +1 -1
  27. package/dist/color/color-matching-functions.js +1 -1
  28. package/dist/color/color-matching-functions.js.map +1 -1
  29. package/dist/color/colorimetry-math.js +2 -2
  30. package/dist/color/colorimetry-math.js.map +1 -1
  31. package/dist/color/illuminants.js +3 -3
  32. package/dist/color/illuminants.js.map +1 -1
  33. package/dist/color/rgb-color-spaces.js +1 -1
  34. package/dist/color/rgb-color-spaces.js.map +1 -1
  35. package/dist/color/sensor-color-development.js +1 -1
  36. package/dist/color/sensor-color-development.js.map +1 -1
  37. package/dist/core/record-validation.js +3 -3
  38. package/dist/core/record-validation.js.map +1 -1
  39. package/dist/core/version.d.ts +1 -1
  40. package/dist/core/version.js +1 -1
  41. package/dist/core/version.js.map +1 -1
  42. package/dist/equipment/generic-prime-lenses.js +3 -3
  43. package/dist/equipment/generic-prime-lenses.js.map +1 -1
  44. package/dist/equipment/generic-tier-assets.d.ts +23 -1
  45. package/dist/equipment/generic-tier-assets.js +58 -30
  46. package/dist/equipment/generic-tier-assets.js.map +1 -1
  47. package/dist/equipment/generic-tier-presets.d.ts +6 -3
  48. package/dist/equipment/generic-tier-presets.js +26 -13
  49. package/dist/equipment/generic-tier-presets.js.map +1 -1
  50. package/dist/exposure/auto-iso-slowest-shutter.d.ts +120 -0
  51. package/dist/exposure/auto-iso-slowest-shutter.js +217 -0
  52. package/dist/exposure/auto-iso-slowest-shutter.js.map +1 -0
  53. package/dist/exposure/exposure-mode-resolver.d.ts +57 -1
  54. package/dist/exposure/exposure-mode-resolver.js +238 -33
  55. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  56. package/dist/exposure/flash-ttl.js +1 -1
  57. package/dist/exposure/flash-ttl.js.map +1 -1
  58. package/dist/exposure/flash.js +1 -1
  59. package/dist/exposure/flash.js.map +1 -1
  60. package/dist/facade/chart-material-layers.js +2 -2
  61. package/dist/facade/chart-material-layers.js.map +1 -1
  62. package/dist/facade/chart-radiance-batch.js +1 -1
  63. package/dist/facade/chart-radiance-batch.js.map +1 -1
  64. package/dist/facade/chart-scenes.d.ts +45 -8
  65. package/dist/facade/chart-scenes.js +101 -44
  66. package/dist/facade/chart-scenes.js.map +1 -1
  67. package/dist/facade/color-patches.d.ts +129 -0
  68. package/dist/facade/color-patches.js +209 -0
  69. package/dist/facade/color-patches.js.map +1 -0
  70. package/dist/facade/diffraction-provider.js +12 -13
  71. package/dist/facade/diffraction-provider.js.map +1 -1
  72. package/dist/facade/display-view-gpu.js +1 -1
  73. package/dist/facade/display-view-gpu.js.map +1 -1
  74. package/dist/facade/display-view.d.ts +27 -0
  75. package/dist/facade/display-view.js +234 -65
  76. package/dist/facade/display-view.js.map +1 -1
  77. package/dist/facade/scene-radiance.js +2 -2
  78. package/dist/facade/scene-radiance.js.map +1 -1
  79. package/dist/facade/simulate-capture.d.ts +139 -12
  80. package/dist/facade/simulate-capture.js +209 -36
  81. package/dist/facade/simulate-capture.js.map +1 -1
  82. package/dist/facade/simulate-display-view.js +2 -2
  83. package/dist/facade/simulate-display-view.js.map +1 -1
  84. package/dist/gpu/chart-composite-gpu.js +2 -2
  85. package/dist/gpu/chart-composite-gpu.js.map +1 -1
  86. package/dist/gpu/display-view-composite-material-module.js +1 -1
  87. package/dist/gpu/display-view-composite-material-module.js.map +1 -1
  88. package/dist/gpu/display-view-quality-gpu.d.ts +2 -1
  89. package/dist/gpu/display-view-quality-gpu.js +24 -14
  90. package/dist/gpu/display-view-quality-gpu.js.map +1 -1
  91. package/dist/gpu/image-kernel-execution.js +2 -2
  92. package/dist/gpu/image-kernel-execution.js.map +1 -1
  93. package/dist/gpu/temporal-sum-gpu.js +23 -23
  94. package/dist/gpu/webgpu-runtime.js +1 -1
  95. package/dist/gpu/webgpu-runtime.js.map +1 -1
  96. package/dist/gpu/wgsl-chart-composite-kernel.js +318 -318
  97. package/dist/gpu/wgsl-chart-composite-kernel.js.map +1 -1
  98. package/dist/gpu/wgsl-chart-kernel.js +117 -117
  99. package/dist/gpu/wgsl-chart-kernel.js.map +1 -1
  100. package/dist/gpu/wgsl-display-view-quality-kernel.d.ts +13 -1
  101. package/dist/gpu/wgsl-display-view-quality-kernel.js +522 -488
  102. package/dist/gpu/wgsl-display-view-quality-kernel.js.map +1 -1
  103. package/dist/gpu/wgsl-display-view-speed-kernel.js +248 -248
  104. package/dist/gpu/wgsl-display-view-speed-kernel.js.map +1 -1
  105. package/dist/gpu/wgsl-kernels.js +203 -203
  106. package/dist/gpu/wgsl-kernels.js.map +1 -1
  107. package/dist/gpu/wgsl-sensor-kernel.js +302 -302
  108. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -1
  109. package/dist/index.d.ts +8 -5
  110. package/dist/index.js +6 -3
  111. package/dist/index.js.map +1 -1
  112. package/dist/motion/temporal-exposure-sum.js +1 -1
  113. package/dist/motion/temporal-exposure-sum.js.map +1 -1
  114. package/dist/optics/diffraction-psf-profile.js +4 -4
  115. package/dist/optics/diffraction-psf-profile.js.map +1 -1
  116. package/dist/optics/front-of-lens-filter.js +1 -1
  117. package/dist/optics/front-of-lens-filter.js.map +1 -1
  118. package/dist/optics/irradiance-convolution.d.ts +10 -0
  119. package/dist/optics/irradiance-convolution.js +49 -14
  120. package/dist/optics/irradiance-convolution.js.map +1 -1
  121. package/dist/output/native-capture-sdr.js +1 -1
  122. package/dist/output/native-capture-sdr.js.map +1 -1
  123. package/dist/output/png-encoder.js +2 -2
  124. package/dist/output/png-encoder.js.map +1 -1
  125. package/dist/output/print-jpeg.js +13 -10
  126. package/dist/output/print-jpeg.js.map +1 -1
  127. package/dist/output/text-metadata.d.ts +22 -2
  128. package/dist/output/text-metadata.js +58 -9
  129. package/dist/output/text-metadata.js.map +1 -1
  130. package/dist/sensor/fixed-pattern-noise.js +1 -1
  131. package/dist/sensor/fixed-pattern-noise.js.map +1 -1
  132. package/dist/sensor/readout-exposure-linkage.js +1 -1
  133. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  134. package/docs/API_REFERENCE.md +49 -1
  135. package/docs/QUICK_START.md +104 -9
  136. package/docs/USAGE.md +241 -2
  137. package/docs/api/core-version.md +1 -1
  138. package/docs/api/equipment-generic-tier-assets.md +41 -1
  139. package/docs/api/equipment-generic-tier-presets.md +11 -3
  140. package/docs/api/exports.json +172 -2
  141. package/docs/api/exposure-auto-iso-slowest-shutter.md +139 -0
  142. package/docs/api/exposure-exposure-mode-resolver.md +68 -0
  143. package/docs/api/facade-chart-scenes.md +36 -5
  144. package/docs/api/facade-color-patches.md +150 -0
  145. package/docs/api/facade-simulate-capture.md +140 -9
  146. package/docs/api/output-text-metadata.md +34 -0
  147. package/llms.txt +1 -0
  148. 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"]}
@@ -64,7 +64,7 @@ export declare function createExportJpegEncoder(input: Omit<ExportJpegInput, "sa
64
64
  icc?: Uint8Array;
65
65
  densityDotsPerInch?: number;
66
66
  }): {
67
- writeRgbBlock(samples: readonly number[]): void;
67
+ writeRgbBlock(samples: readonly number[] | Uint8Array): void;
68
68
  appendStrip(strip: JpegStripBits): void;
69
69
  finish(): Uint8Array;
70
70
  dispose(): void;
@@ -307,10 +307,12 @@ export function createExportJpegEncoder(input) {
307
307
  return {
308
308
  writeRgbBlock(samples) {
309
309
  let valid = !disposed && blocks < totalBlocks && samples.length === 192;
310
- for (let i = 0; valid && i < 192; i++) {
311
- const v = samples[i];
312
- valid = Number.isInteger(v) && v >= 0 && v <= 255;
313
- }
310
+ // A Uint8Array holds only integers 0–255, so only an array's entries need the scan.
311
+ if (!(samples instanceof Uint8Array))
312
+ for (let i = 0; valid && i < 192; i++) {
313
+ const v = samples[i];
314
+ valid = Number.isInteger(v) && v >= 0 && v <= 255;
315
+ }
314
316
  if (!valid)
315
317
  throw new InvalidConfigurationError("JPEG requires complete bounded RGB coding blocks.");
316
318
  coder.transform(samples, coefficients);
@@ -1 +1 @@
1
- {"version":3,"file":"export-jpeg.js","sourceRoot":"","sources":["../../src/capture/export-jpeg.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Baseline JPEG encoder written for this project. It computes the DCT (discrete cosine transform)\n * directly and uses no third-party encoder source, default quantization tables or Huffman tables.\n * @see docs/SIMULATED_CAPTURE.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { FULL_RESOLUTION_CEILING_PIXELS, scaleBudgetCeiling } from \"../core/pixel-limits.js\";\n\n/**\n * Identifies the exact byte output of the baseline encoder.\n *\n * Version 2 (engine 2.0.0) uses the fixed cosine table below instead of runtime `Math.cos`, and rounds\n * quantized coefficients half away from zero. Compared with version 1, bytes can differ only where a\n * coefficient before rounding was within about one ULP (unit in the last place) of a half-integer, or\n * was exactly a negative half-integer. The repository's test images are unchanged.\n */\nexport const EXPORT_JPEG_ENCODER_ID = \"photivra-baseline-jpeg-444-v2\" as const;\n/**\n * C(u,x) = cos((2x+1)·u·π/16) for u,x in 0..7, row-major by u.\n *\n * Each entry is the correctly rounded IEEE-754 double of the exact cosine. They were computed offline with\n * 130-digit decimal arithmetic and checked so that no neighbouring double is closer (see\n * docs/PHOTOGRAPHIC_EXPORT.md). Hard-coding them makes the DCT independent of each JavaScript engine's\n * `Math.cos`, which differs in the last bit between engines. These are mathematical facts, not third-party data.\n */\nexport const JPEG_DCT_COSINES: Readonly<Float64Array> = Float64Array.of(\n 1,1,1,1,1,1,1,1,\n 0.9807852804032304,0.8314696123025452,0.5555702330196022,0.19509032201612828,-0.19509032201612828,-0.5555702330196022,-0.8314696123025452,-0.9807852804032304,\n 0.9238795325112867,0.3826834323650898,-0.3826834323650898,-0.9238795325112867,-0.9238795325112867,-0.3826834323650898,0.3826834323650898,0.9238795325112867,\n 0.8314696123025452,-0.19509032201612828,-0.9807852804032304,-0.5555702330196022,0.5555702330196022,0.9807852804032304,0.19509032201612828,-0.8314696123025452,\n 0.7071067811865476,-0.7071067811865476,-0.7071067811865476,0.7071067811865476,0.7071067811865476,-0.7071067811865476,-0.7071067811865476,0.7071067811865476,\n 0.5555702330196022,-0.9807852804032304,0.19509032201612828,0.8314696123025452,-0.8314696123025452,-0.19509032201612828,0.9807852804032304,-0.5555702330196022,\n 0.3826834323650898,-0.9238795325112867,0.9238795325112867,-0.3826834323650898,-0.3826834323650898,0.9238795325112867,-0.9238795325112867,0.3826834323650898,\n 0.19509032201612828,-0.5555702330196022,0.8314696123025452,-0.9807852804032304,0.9807852804032304,-0.8314696123025452,0.5555702330196022,-0.19509032201612828\n);\n/**\n * Rounds a quantized coefficient to the nearest integer, with ties going away from zero (−2.5 → −3,\n * 2.5 → 3), so positive and negative values round the same way. `Math.round` alone sends −2.5 to −2.\n */\nexport function roundJpegCoefficient(value: number): number {\n return value<0 ? -Math.round(-value) : Math.round(value);\n}\n\n/** Internal baseline JPEG settings: 8-bit YCbCr 4:4:4, one explicit constant quantization step, and uniform Huffman tables written for this project. */\nexport interface ExportJpegInput { width: number; height: number; samples: readonly number[]; quantizationStep: number; exif: Uint8Array; xmp: Uint8Array }\n/** Encodes a baseline JPEG with a directly computed DCT. Uses no third-party encoder source, default quantization tables or Huffman tables. */\nexport function encodeExportJpeg(input: ExportJpegInput): Uint8Array {\n const { width, height, samples, quantizationStep: q } = input;\n if (![width,height,q].every(Number.isSafeInteger) || width < 1 || height < 1 || width*height > 4096 ||\n q < 1 || q > 255 || samples.length !== width*height*3 || Array.from(samples).some((v) => !Number.isInteger(v) || v < 0 || v > 255)) {\n throw new InvalidConfigurationError(\"Unsupported baseline JPEG input.\");\n }\n const encoder=createExportJpegEncoder({...input,maximumOutputBytes:1_000_000});\n for(let by=0;by<height;by+=8)for(let bx=0;bx<width;bx+=8){\n const block:number[]=[];\n for(let y=0;y<8;y++)for(let x=0;x<8;x++){\n const p=(Math.min(by+y,height-1)*width+Math.min(bx+x,width-1))*3;\n block.push(samples[p]!,samples[p+1]!,samples[p+2]!);\n }\n encoder.writeRgbBlock(block);\n }\n return encoder.finish();\n}\n/**\n * The entropy-coded bits of consecutive blocks of one image, coded apart from the blocks before them (`encodeJpegStrip`):\n * the first block's quantized coefficients (3 × 64, natural order), whose DC differences need the block before; the other\n * blocks' bits, unstuffed, most-significant first; and the last block's DC values, which the next strip's first block needs.\n */\nexport interface JpegStripBits { first: Float64Array; bits: Uint8Array; bitLength: number; blockCount: number; lastDc: Float64Array }\n/**\n * The DCT, quantization and entropy coding of one 8 × 8 RGB block, shared by the whole-image writer and strips so both\n * make the same bits.\n *\n * The 8×8 DCT, computed directly, with orthonormal DC factors and one chosen quantization step.\n *\n * This is a deliberately simple 4:4:4 reference encoder. Lossy quantization means exact RGB pixels are\n * not preserved. Decoding the JPEG and comparing is an interoperability check, not an exact scientific\n * check of pixel values.\n *\n * Each coefficient is the direct 64-term sum Σ_y Σ_x (f(x,y)·C(u,x))·C(v,y), summed over y, then x.\n * The row products f(x,y)·C(u,x) are computed once per u and reused for all eight v. This reuses the\n * identical IEEE-754 products and keeps the exact order of multiplication and summation. A factored\n * row/column DCT would reorder the sum, so it is deliberately not used.\n *\n * C(u,x) comes from the fixed table `JPEG_DCT_COSINES` (correctly rounded constants), not `Math.cos`,\n * so the coefficients do not depend on the JavaScript engine's maths library. Each quantized coefficient\n * is rounded half away from zero (`roundJpegCoefficient`).\n */\nfunction createJpegBlockCoder(q:number, emit:(value:number,count:number)=>void):{\n transform(samples:ArrayLike<number>,out:Float64Array):void; code(coefficients:Float64Array,previous:number[]|Float64Array):void;\n} {\n const amplitude = (value: number, max: number): number => {\n const size=value===0 ? 0 : Math.floor(Math.log2(Math.abs(value)))+1;\n if (size>max) throw new InvalidConfigurationError(\"JPEG coefficient exceeds baseline entropy range.\");\n return size;\n };\n const coefficient = (value: number, size: number): void => { if (size) emit(value>=0 ? value : value+(1<<size)-1,size); };\n const zigzag=new Int32Array(64);\n for (let diagonal=0,i=0;diagonal<=14;diagonal++) {\n const points: number[] = [];\n for (let y=0;y<8;y++) { const x=diagonal-y; if (x>=0 && x<8) points.push(y*8+x); }\n for (const point of diagonal%2===0 ? points.reverse() : points) zigzag[i++]=point;\n }\n // Huffman symbol index of each AC (run, size) pair; equals the index of the symbol in the DHT segment's AC list.\n const ac=[0,240];\n for (let run=0;run<16;run++) for (let size=1;size<=10;size++) ac.push(run*16+size);\n const acIndex=new Int16Array(256).fill(-1);\n for (let i=ac.length-1;i>=0;i--) acIndex[ac[i]!]=i;\n const cosine=JPEG_DCT_COSINES;\n const planes=[new Float64Array(64),new Float64Array(64),new Float64Array(64)];\n const blueScale=2*(1-.114), redScale=2*(1-.299);\n return {\n transform(samples:ArrayLike<number>,out:Float64Array):void {\n const [luma,blueDifference,redDifference]=planes as [Float64Array,Float64Array,Float64Array];\n for (let i=0;i<64;i++) {\n // JPEG pads only partial 8x8 blocks (MCUs, minimum coded units). The declared image and crop size never change.\n const p=i*3;\n const red=samples[p]!, green=samples[p+1]!, blue=samples[p+2]!, luminance=.299*red+.587*green+.114*blue;\n luma[i]=luminance-128; blueDifference[i]=(blue-luminance)/blueScale; redDifference[i]=(red-luminance)/redScale;\n }\n for (let channel=0;channel<3;channel++) {\n const block=planes[channel]!, o=channel*64;\n for (let u=0;u<8;u++) {\n const uOffset=u*8;\n const uFactor=u===0 ? Math.SQRT1_2 : 1;\n // The eight v sums in one pass over (y, x): each sum still adds the same products f(x,y)·C(u,x)·C(v,y) in the same\n // order (y, then x), and each row product is the same IEEE product, formed once per (x, y) instead of stored.\n let s0=0, s1=0, s2=0, s3=0, s4=0, s5=0, s6=0, s7=0;\n for (let y=0;y<8;y++) {\n const c0=cosine[y]!, c1=cosine[8+y]!, c2=cosine[16+y]!, c3=cosine[24+y]!, c4=cosine[32+y]!, c5=cosine[40+y]!, c6=cosine[48+y]!, c7=cosine[56+y]!;\n for (let x=0;x<8;x++) {\n const r=block[y*8+x]!*cosine[uOffset+x]!;\n s0+=r*c0; s1+=r*c1; s2+=r*c2; s3+=r*c3; s4+=r*c4; s5+=r*c5; s6+=r*c6; s7+=r*c7;\n }\n }\n // Scaled as before, left to right: sum·0.25·(u factor)·(v factor)/q.\n out[o+u]=roundJpegCoefficient(s0*.25*uFactor*Math.SQRT1_2/q); out[o+8+u]=roundJpegCoefficient(s1*.25*uFactor*1/q);\n out[o+16+u]=roundJpegCoefficient(s2*.25*uFactor*1/q); out[o+24+u]=roundJpegCoefficient(s3*.25*uFactor*1/q);\n out[o+32+u]=roundJpegCoefficient(s4*.25*uFactor*1/q); out[o+40+u]=roundJpegCoefficient(s5*.25*uFactor*1/q);\n out[o+48+u]=roundJpegCoefficient(s6*.25*uFactor*1/q); out[o+56+u]=roundJpegCoefficient(s7*.25*uFactor*1/q);\n }\n }\n },\n code(coefficients:Float64Array,previous:number[]|Float64Array):void {\n for (let channel=0;channel<3;channel++) {\n const o=channel*64, difference=coefficients[o]!-previous[channel]!, size=amplitude(difference,11); emit(size,4); coefficient(difference,size); previous[channel]=coefficients[o]!;\n let zeroes=0;\n for (let i=1;i<64;i++) {\n const value=coefficients[o+zigzag[i]!]!;\n if (value===0) { zeroes++; continue; }\n while (zeroes>=16) { emit(1,8); zeroes-=16; }\n const length=amplitude(value,10), symbol=zeroes*16+length; emit(acIndex[symbol]!,8); coefficient(value,length); zeroes=0;\n }\n if (zeroes) emit(0,8);\n }\n }\n };\n}\n/**\n * Codes `blockCount` consecutive blocks of an image (`block(i, out)` writes block i's 192 RGB samples, 0–255) apart from the\n * blocks before them, for writing an image's strips on separate workers; `createExportJpegEncoder`'s `appendStrip` joins\n * them into the bytes the whole image's `writeRgbBlock` calls would have written.\n */\nexport function encodeJpegStrip(quantizationStep:number, blockCount:number, block:(index:number,out:Uint8Array)=>void):JpegStripBits {\n if(!Number.isSafeInteger(quantizationStep)||quantizationStep<1||quantizationStep>255||!Number.isSafeInteger(blockCount)||blockCount<1)\n throw new InvalidConfigurationError(\"Invalid JPEG strip plan.\");\n let storage=new Uint8Array(65_536), length=0, accumulator=0, bits=0, bitLength=0;\n // Unstuffed bits, most-significant first.\n const emit=(value:number,count:number):void=>{\n accumulator=(accumulator<<count)|(value&((1<<count)-1)); bits+=count; bitLength+=count;\n while (bits>=8) {\n bits-=8;\n if(length===storage.length){const grown=new Uint8Array(storage.length*2);grown.set(storage);storage=grown;}\n storage[length++]=(accumulator>>>bits)&255;\n }\n accumulator&=(1<<bits)-1;\n };\n const coder=createJpegBlockCoder(quantizationStep,emit), samples=new Uint8Array(192), first=new Float64Array(192), coefficients=new Float64Array(192), lastDc=new Float64Array(3);\n block(0,samples); coder.transform(samples,first);\n lastDc[0]=first[0]!; lastDc[1]=first[64]!; lastDc[2]=first[128]!;\n for(let i=1;i<blockCount;i++){block(i,samples);coder.transform(samples,coefficients);coder.code(coefficients,lastDc);}\n if(bits){if(length===storage.length){const grown=new Uint8Array(storage.length+1);grown.set(storage);storage=grown;}storage[length++]=(accumulator<<(8-bits))&255;}\n return {first,bits:storage.slice(0,length),bitLength,blockCount,lastDc};\n}\n/**\n * Largest byte budget the internal writer accepts: the Print JPEG budget ceiling at the largest opt-in source\n * (256 000 000 bytes per 24 000 000 pixels at 2^27 pixels). Each caller enforces its own smaller budget.\n */\nconst EXPORT_JPEG_MAXIMUM_OUTPUT_BYTES=scaleBudgetCeiling(256_000_000,FULL_RESOLUTION_CEILING_PIXELS);\n/**\n * Internal size-limited JPEG writer. The reference export and the scalable export use exactly the same\n * DCT and entropy-coding equations.\n *\n * When `densityDotsPerInch` is supplied, it is written to the JFIF 1.02 APP0 segment as units=1 (dots\n * per inch) with equal X and Y density. JFIF density fields are 16-bit unsigned, so it must be an integer\n * in 1..65535; callers round any fractional density and store the exact value in EXIF. When omitted,\n * APP0 keeps units=0 with a 1:1 pixel aspect ratio and states no physical size.\n */\nexport function createExportJpegEncoder(input: Omit<ExportJpegInput,\"samples\"> & {maximumOutputBytes:number;icc?:Uint8Array;densityDotsPerInch?:number}): {\n writeRgbBlock(samples:readonly number[]):void; appendStrip(strip:JpegStripBits):void; finish():Uint8Array; dispose():void;\n} {\n const {width,height,quantizationStep:q}=input;\n if(![width,height,q,input.maximumOutputBytes].every(Number.isSafeInteger)||width<1||height<1||width>65535||height>65535||q<1||q>255||input.maximumOutputBytes<1||input.maximumOutputBytes>EXPORT_JPEG_MAXIMUM_OUTPUT_BYTES)\n throw new InvalidConfigurationError(\"Invalid bounded JPEG encoding plan.\");\n const density=input.densityDotsPerInch;\n if(density!==undefined&&(!Number.isSafeInteger(density)||density<1||density>65535))\n throw new InvalidConfigurationError(\"JFIF density requires an integer from 1 to 65535 dots per inch.\");\n // Growable output. Capacity starts at min(budget, 64 KiB) and doubles, but never beyond the budget. The budget\n // check is unchanged (offset + n > maximumOutputBytes fails), so the output bytes and failures are the same as\n // with a buffer allocated at full budget up front. An old buffer is zeroed after its bytes are copied over.\n const budget=input.maximumOutputBytes;\n let storage=new Uint8Array(Math.min(budget,65_536)),offset=0,disposed=false,blocks=0;\n const reserve=(count:number):void=>{\n if(disposed||offset+count>budget)throw new InvalidConfigurationError(\"JPEG output exceeds admitted byte budget or is disposed.\");\n if(offset+count<=storage.length)return;\n const grown=new Uint8Array(Math.min(budget,Math.max(storage.length*2,offset+count)));\n grown.set(storage.subarray(0,offset));storage.fill(0,0,offset);storage=grown;\n };\n const push=(...values:number[]):void=>{reserve(values.length);storage.set(values,offset);offset+=values.length;};\n // Fast path for one entropy-coded byte: the same budget/disposal check and byte order as push(), without an array per byte.\n const pushByte=(value:number):void=>{if(disposed||offset>=storage.length)reserve(1);storage[offset++]=value;};\n push(255,216);\n const marker = (id: number, payload: readonly number[]): void => {\n if (payload.length > 65533) throw new InvalidConfigurationError(\"JPEG metadata segment exceeds the standard APP limit.\");\n push(255,id,(payload.length+2)>>8,(payload.length+2)&255,...payload);\n };\n // JFIF 1.02 APP0: identifier, version 1.02, units (0 aspect ratio only, 1 dots per inch), Xdensity, Ydensity, no thumbnail.\n marker(224,density===undefined ? [74,70,73,70,0,1,2,0,0,1,0,1,0,0] : [74,70,73,70,0,1,2,1,density>>8,density&255,density>>8,density&255,0,0]);\n marker(225,[69,120,105,102,0,0,...input.exif]);\n marker(225,[...new TextEncoder().encode(\"http://ns.adobe.com/xap/1.0/\\0\"),...input.xmp]);\n if(input.icc){\n if(input.icc.length>65519)throw new InvalidConfigurationError(\"ICC profile exceeds the single-segment encoding envelope.\");\n marker(226,[...new TextEncoder().encode(\"ICC_PROFILE\\0\"),1,1,...input.icc]);\n }\n marker(219,[0,...Array<number>(64).fill(q)]);\n marker(192,[8,height>>8,height&255,width>>8,width&255,3,1,17,0,2,17,0,3,17,0]);\n // DC categories 0..11 use 4-bit codes; AC EOB/ZRL and all baseline run/category pairs use 8-bit codes.\n // Incomplete canonical Huffman trees reserve the all-ones code, so JPEG bit padding (1-bits) can never be read as a symbol.\n const dc = Array.from({length:12},(_,i) => i), ac = [0,240];\n for (let run=0;run<16;run++) for (let size=1;size<=10;size++) ac.push(run*16+size);\n marker(196,[0,...Array.from({length:16},(_,i) => i===3 ? 12 : 0),...dc,\n 16,...Array.from({length:16},(_,i) => i===7 ? ac.length : 0),...ac]);\n marker(218,[3,1,0,2,0,3,0,0,63,0]);\n let accumulator=0, bits=0;\n // Appends the low `count` bits (count <= 16) most-significant first, emitting each completed byte with 0xFF stuffing.\n const emit = (value: number, count: number): void => {\n accumulator=(accumulator<<count)|(value&((1<<count)-1)); bits+=count;\n while (bits>=8) { bits-=8; const byte=(accumulator>>>bits)&255; pushByte(byte); if (byte===255) pushByte(0); }\n accumulator&=(1<<bits)-1;\n };\n const coder=createJpegBlockCoder(q,emit), coefficients=new Float64Array(192);\n const previous=[0,0,0];\n const totalBlocks=Math.ceil(width/8)*Math.ceil(height/8);\n return {\n writeRgbBlock(samples:readonly number[]):void {\n let valid=!disposed&&blocks<totalBlocks&&samples.length===192;\n for(let i=0;valid&&i<192;i++){const v=samples[i]!;valid=Number.isInteger(v)&&v>=0&&v<=255;}\n if(!valid)throw new InvalidConfigurationError(\"JPEG requires complete bounded RGB coding blocks.\");\n coder.transform(samples,coefficients); coder.code(coefficients,previous);\n blocks++;\n },\n appendStrip(strip:JpegStripBits):void {\n if(disposed||blocks+strip.blockCount>totalBlocks||strip.first.length!==192||strip.lastDc.length!==3||strip.bits.length*8<strip.bitLength)\n throw new InvalidConfigurationError(\"JPEG strip does not continue this encoding.\");\n // The strip's first block, coded against the DC values before it; then its other blocks' bits, which only depend on\n // values inside the strip, as written (each byte's 0xFF stuffing happens here, as in writeRgbBlock).\n coder.code(strip.first,previous);\n const whole=strip.bitLength>>3;\n for(let i=0;i<whole;i++)emit(strip.bits[i]!,8);\n if(strip.bitLength&7)emit(strip.bits[whole]!>>(8-(strip.bitLength&7)),strip.bitLength&7);\n previous[0]=strip.lastDc[0]!; previous[1]=strip.lastDc[1]!; previous[2]=strip.lastDc[2]!;\n blocks+=strip.blockCount;\n },\n finish():Uint8Array {\n if(disposed||blocks!==Math.ceil(width/8)*Math.ceil(height/8))throw new InvalidConfigurationError(\"JPEG cannot finish incomplete or disposed encoding.\");\n if(bits)emit((1<<(8-bits))-1,8-bits);\n // Only the written prefix can hold data; zero it after the copy instead of filling the whole capacity.\n push(255,217);const output=storage.slice(0,offset);storage.fill(0,0,offset);storage=new Uint8Array(0);disposed=true;return output;\n },\n dispose():void {storage.fill(0,0,offset);storage=new Uint8Array(0);disposed=true;}\n };\n}\n"]}
1
+ {"version":3,"file":"export-jpeg.js","sourceRoot":"","sources":["../../src/capture/export-jpeg.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Baseline JPEG encoder written for this project. It computes the DCT (discrete cosine transform)\n * directly and uses no third-party encoder source, default quantization tables or Huffman tables.\n * @see docs/SIMULATED_CAPTURE.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { FULL_RESOLUTION_CEILING_PIXELS, scaleBudgetCeiling } from \"../core/pixel-limits.js\";\n\n/**\n * Identifies the exact byte output of the baseline encoder.\n *\n * Version 2 (engine 2.0.0) uses the fixed cosine table below instead of runtime `Math.cos`, and rounds\n * quantized coefficients half away from zero. Compared with version 1, bytes can differ only where a\n * coefficient before rounding was within about one ULP (unit in the last place) of a half-integer, or\n * was exactly a negative half-integer. The repository's test images are unchanged.\n */\nexport const EXPORT_JPEG_ENCODER_ID = \"photivra-baseline-jpeg-444-v2\" as const;\n/**\n * C(u,x) = cos((2x+1)·u·π/16) for u,x in 0..7, row-major by u.\n *\n * Each entry is the correctly rounded IEEE-754 double of the exact cosine. They were computed offline with\n * 130-digit decimal arithmetic and checked so that no neighbouring double is closer (see\n * docs/PHOTOGRAPHIC_EXPORT.md). Hard-coding them makes the DCT independent of each JavaScript engine's\n * `Math.cos`, which differs in the last bit between engines. These are mathematical facts, not third-party data.\n */\nexport const JPEG_DCT_COSINES: Readonly<Float64Array> = Float64Array.of(\n 1,1,1,1,1,1,1,1,\n 0.9807852804032304,0.8314696123025452,0.5555702330196022,0.19509032201612828,-0.19509032201612828,-0.5555702330196022,-0.8314696123025452,-0.9807852804032304,\n 0.9238795325112867,0.3826834323650898,-0.3826834323650898,-0.9238795325112867,-0.9238795325112867,-0.3826834323650898,0.3826834323650898,0.9238795325112867,\n 0.8314696123025452,-0.19509032201612828,-0.9807852804032304,-0.5555702330196022,0.5555702330196022,0.9807852804032304,0.19509032201612828,-0.8314696123025452,\n 0.7071067811865476,-0.7071067811865476,-0.7071067811865476,0.7071067811865476,0.7071067811865476,-0.7071067811865476,-0.7071067811865476,0.7071067811865476,\n 0.5555702330196022,-0.9807852804032304,0.19509032201612828,0.8314696123025452,-0.8314696123025452,-0.19509032201612828,0.9807852804032304,-0.5555702330196022,\n 0.3826834323650898,-0.9238795325112867,0.9238795325112867,-0.3826834323650898,-0.3826834323650898,0.9238795325112867,-0.9238795325112867,0.3826834323650898,\n 0.19509032201612828,-0.5555702330196022,0.8314696123025452,-0.9807852804032304,0.9807852804032304,-0.8314696123025452,0.5555702330196022,-0.19509032201612828\n);\n/**\n * Rounds a quantized coefficient to the nearest integer, with ties going away from zero (−2.5 → −3,\n * 2.5 → 3), so positive and negative values round the same way. `Math.round` alone sends −2.5 to −2.\n */\nexport function roundJpegCoefficient(value: number): number {\n return value<0 ? -Math.round(-value) : Math.round(value);\n}\n\n/** Internal baseline JPEG settings: 8-bit YCbCr 4:4:4, one explicit constant quantization step, and uniform Huffman tables written for this project. */\nexport interface ExportJpegInput { width: number; height: number; samples: readonly number[]; quantizationStep: number; exif: Uint8Array; xmp: Uint8Array }\n/** Encodes a baseline JPEG with a directly computed DCT. Uses no third-party encoder source, default quantization tables or Huffman tables. */\nexport function encodeExportJpeg(input: ExportJpegInput): Uint8Array {\n const { width, height, samples, quantizationStep: q } = input;\n if (![width,height,q].every(Number.isSafeInteger) || width < 1 || height < 1 || width*height > 4096 ||\n q < 1 || q > 255 || samples.length !== width*height*3 || Array.from(samples).some((v) => !Number.isInteger(v) || v < 0 || v > 255)) {\n throw new InvalidConfigurationError(\"Unsupported baseline JPEG input.\");\n }\n const encoder=createExportJpegEncoder({...input,maximumOutputBytes:1_000_000});\n for(let by=0;by<height;by+=8)for(let bx=0;bx<width;bx+=8){\n const block:number[]=[];\n for(let y=0;y<8;y++)for(let x=0;x<8;x++){\n const p=(Math.min(by+y,height-1)*width+Math.min(bx+x,width-1))*3;\n block.push(samples[p]!,samples[p+1]!,samples[p+2]!);\n }\n encoder.writeRgbBlock(block);\n }\n return encoder.finish();\n}\n/**\n * The entropy-coded bits of consecutive blocks of one image, coded apart from the blocks before them (`encodeJpegStrip`):\n * the first block's quantized coefficients (3 × 64, natural order), whose DC differences need the block before; the other\n * blocks' bits, unstuffed, most-significant first; and the last block's DC values, which the next strip's first block needs.\n */\nexport interface JpegStripBits { first: Float64Array; bits: Uint8Array; bitLength: number; blockCount: number; lastDc: Float64Array }\n/**\n * The DCT, quantization and entropy coding of one 8 × 8 RGB block, shared by the whole-image writer and strips so both\n * make the same bits.\n *\n * The 8×8 DCT, computed directly, with orthonormal DC factors and one chosen quantization step.\n *\n * This is a deliberately simple 4:4:4 reference encoder. Lossy quantization means exact RGB pixels are\n * not preserved. Decoding the JPEG and comparing is an interoperability check, not an exact scientific\n * check of pixel values.\n *\n * Each coefficient is the direct 64-term sum Σ_y Σ_x (f(x,y)·C(u,x))·C(v,y), summed over y, then x.\n * The row products f(x,y)·C(u,x) are computed once per u and reused for all eight v. This reuses the\n * identical IEEE-754 products and keeps the exact order of multiplication and summation. A factored\n * row/column DCT would reorder the sum, so it is deliberately not used.\n *\n * C(u,x) comes from the fixed table `JPEG_DCT_COSINES` (correctly rounded constants), not `Math.cos`,\n * so the coefficients do not depend on the JavaScript engine's maths library. Each quantized coefficient\n * is rounded half away from zero (`roundJpegCoefficient`).\n */\nfunction createJpegBlockCoder(q:number, emit:(value:number,count:number)=>void):{\n transform(samples:ArrayLike<number>,out:Float64Array):void; code(coefficients:Float64Array,previous:number[]|Float64Array):void;\n} {\n const amplitude = (value: number, max: number): number => {\n const size=value===0 ? 0 : Math.floor(Math.log2(Math.abs(value)))+1;\n if (size>max) throw new InvalidConfigurationError(\"JPEG coefficient exceeds baseline entropy range.\");\n return size;\n };\n const coefficient = (value: number, size: number): void => { if (size) emit(value>=0 ? value : value+(1<<size)-1,size); };\n const zigzag=new Int32Array(64);\n for (let diagonal=0,i=0;diagonal<=14;diagonal++) {\n const points: number[] = [];\n for (let y=0;y<8;y++) { const x=diagonal-y; if (x>=0 && x<8) points.push(y*8+x); }\n for (const point of diagonal%2===0 ? points.reverse() : points) zigzag[i++]=point;\n }\n // Huffman symbol index of each AC (run, size) pair; equals the index of the symbol in the DHT segment's AC list.\n const ac=[0,240];\n for (let run=0;run<16;run++) for (let size=1;size<=10;size++) ac.push(run*16+size);\n const acIndex=new Int16Array(256).fill(-1);\n for (let i=ac.length-1;i>=0;i--) acIndex[ac[i]!]=i;\n const cosine=JPEG_DCT_COSINES;\n const planes=[new Float64Array(64),new Float64Array(64),new Float64Array(64)];\n const blueScale=2*(1-.114), redScale=2*(1-.299);\n return {\n transform(samples:ArrayLike<number>,out:Float64Array):void {\n const [luma,blueDifference,redDifference]=planes as [Float64Array,Float64Array,Float64Array];\n for (let i=0;i<64;i++) {\n // JPEG pads only partial 8x8 blocks (MCUs, minimum coded units). The declared image and crop size never change.\n const p=i*3;\n const red=samples[p]!, green=samples[p+1]!, blue=samples[p+2]!, luminance=.299*red+.587*green+.114*blue;\n luma[i]=luminance-128; blueDifference[i]=(blue-luminance)/blueScale; redDifference[i]=(red-luminance)/redScale;\n }\n for (let channel=0;channel<3;channel++) {\n const block=planes[channel]!, o=channel*64;\n for (let u=0;u<8;u++) {\n const uOffset=u*8;\n const uFactor=u===0 ? Math.SQRT1_2 : 1;\n // The eight v sums in one pass over (y, x): each sum still adds the same products f(x,y)·C(u,x)·C(v,y) in the same\n // order (y, then x), and each row product is the same IEEE product, formed once per (x, y) instead of stored.\n let s0=0, s1=0, s2=0, s3=0, s4=0, s5=0, s6=0, s7=0;\n for (let y=0;y<8;y++) {\n const c0=cosine[y]!, c1=cosine[8+y]!, c2=cosine[16+y]!, c3=cosine[24+y]!, c4=cosine[32+y]!, c5=cosine[40+y]!, c6=cosine[48+y]!, c7=cosine[56+y]!;\n for (let x=0;x<8;x++) {\n const r=block[y*8+x]!*cosine[uOffset+x]!;\n s0+=r*c0; s1+=r*c1; s2+=r*c2; s3+=r*c3; s4+=r*c4; s5+=r*c5; s6+=r*c6; s7+=r*c7;\n }\n }\n // Scaled as before, left to right: sum·0.25·(u factor)·(v factor)/q.\n out[o+u]=roundJpegCoefficient(s0*.25*uFactor*Math.SQRT1_2/q); out[o+8+u]=roundJpegCoefficient(s1*.25*uFactor*1/q);\n out[o+16+u]=roundJpegCoefficient(s2*.25*uFactor*1/q); out[o+24+u]=roundJpegCoefficient(s3*.25*uFactor*1/q);\n out[o+32+u]=roundJpegCoefficient(s4*.25*uFactor*1/q); out[o+40+u]=roundJpegCoefficient(s5*.25*uFactor*1/q);\n out[o+48+u]=roundJpegCoefficient(s6*.25*uFactor*1/q); out[o+56+u]=roundJpegCoefficient(s7*.25*uFactor*1/q);\n }\n }\n },\n code(coefficients:Float64Array,previous:number[]|Float64Array):void {\n for (let channel=0;channel<3;channel++) {\n const o=channel*64, difference=coefficients[o]!-previous[channel]!, size=amplitude(difference,11); emit(size,4); coefficient(difference,size); previous[channel]=coefficients[o]!;\n let zeroes=0;\n for (let i=1;i<64;i++) {\n const value=coefficients[o+zigzag[i]!]!;\n if (value===0) { zeroes++; continue; }\n while (zeroes>=16) { emit(1,8); zeroes-=16; }\n const length=amplitude(value,10), symbol=zeroes*16+length; emit(acIndex[symbol]!,8); coefficient(value,length); zeroes=0;\n }\n if (zeroes) emit(0,8);\n }\n }\n };\n}\n/**\n * Codes `blockCount` consecutive blocks of an image (`block(i, out)` writes block i's 192 RGB samples, 0–255) apart from the\n * blocks before them, for writing an image's strips on separate workers; `createExportJpegEncoder`'s `appendStrip` joins\n * them into the bytes the whole image's `writeRgbBlock` calls would have written.\n */\nexport function encodeJpegStrip(quantizationStep:number, blockCount:number, block:(index:number,out:Uint8Array)=>void):JpegStripBits {\n if(!Number.isSafeInteger(quantizationStep)||quantizationStep<1||quantizationStep>255||!Number.isSafeInteger(blockCount)||blockCount<1)\n throw new InvalidConfigurationError(\"Invalid JPEG strip plan.\");\n let storage=new Uint8Array(65_536), length=0, accumulator=0, bits=0, bitLength=0;\n // Unstuffed bits, most-significant first.\n const emit=(value:number,count:number):void=>{\n accumulator=(accumulator<<count)|(value&((1<<count)-1)); bits+=count; bitLength+=count;\n while (bits>=8) {\n bits-=8;\n if(length===storage.length){const grown=new Uint8Array(storage.length*2);grown.set(storage);storage=grown;}\n storage[length++]=(accumulator>>>bits)&255;\n }\n accumulator&=(1<<bits)-1;\n };\n const coder=createJpegBlockCoder(quantizationStep,emit), samples=new Uint8Array(192), first=new Float64Array(192), coefficients=new Float64Array(192), lastDc=new Float64Array(3);\n block(0,samples); coder.transform(samples,first);\n lastDc[0]=first[0]!; lastDc[1]=first[64]!; lastDc[2]=first[128]!;\n for(let i=1;i<blockCount;i++){block(i,samples);coder.transform(samples,coefficients);coder.code(coefficients,lastDc);}\n if(bits){if(length===storage.length){const grown=new Uint8Array(storage.length+1);grown.set(storage);storage=grown;}storage[length++]=(accumulator<<(8-bits))&255;}\n return {first,bits:storage.slice(0,length),bitLength,blockCount,lastDc};\n}\n/**\n * Largest byte budget the internal writer accepts: the Print JPEG budget ceiling at the largest opt-in source\n * (256 000 000 bytes per 24 000 000 pixels at 2^27 pixels). Each caller enforces its own smaller budget.\n */\nconst EXPORT_JPEG_MAXIMUM_OUTPUT_BYTES=scaleBudgetCeiling(256_000_000,FULL_RESOLUTION_CEILING_PIXELS);\n/**\n * Internal size-limited JPEG writer. The reference export and the scalable export use exactly the same\n * DCT and entropy-coding equations.\n *\n * When `densityDotsPerInch` is supplied, it is written to the JFIF 1.02 APP0 segment as units=1 (dots\n * per inch) with equal X and Y density. JFIF density fields are 16-bit unsigned, so it must be an integer\n * in 1..65535; callers round any fractional density and store the exact value in EXIF. When omitted,\n * APP0 keeps units=0 with a 1:1 pixel aspect ratio and states no physical size.\n */\nexport function createExportJpegEncoder(input: Omit<ExportJpegInput,\"samples\"> & {maximumOutputBytes:number;icc?:Uint8Array;densityDotsPerInch?:number}): {\n writeRgbBlock(samples:readonly number[]|Uint8Array):void; appendStrip(strip:JpegStripBits):void; finish():Uint8Array; dispose():void;\n} {\n const {width,height,quantizationStep:q}=input;\n if(![width,height,q,input.maximumOutputBytes].every(Number.isSafeInteger)||width<1||height<1||width>65535||height>65535||q<1||q>255||input.maximumOutputBytes<1||input.maximumOutputBytes>EXPORT_JPEG_MAXIMUM_OUTPUT_BYTES)\n throw new InvalidConfigurationError(\"Invalid bounded JPEG encoding plan.\");\n const density=input.densityDotsPerInch;\n if(density!==undefined&&(!Number.isSafeInteger(density)||density<1||density>65535))\n throw new InvalidConfigurationError(\"JFIF density requires an integer from 1 to 65535 dots per inch.\");\n // Growable output. Capacity starts at min(budget, 64 KiB) and doubles, but never beyond the budget. The budget\n // check is unchanged (offset + n > maximumOutputBytes fails), so the output bytes and failures are the same as\n // with a buffer allocated at full budget up front. An old buffer is zeroed after its bytes are copied over.\n const budget=input.maximumOutputBytes;\n let storage=new Uint8Array(Math.min(budget,65_536)),offset=0,disposed=false,blocks=0;\n const reserve=(count:number):void=>{\n if(disposed||offset+count>budget)throw new InvalidConfigurationError(\"JPEG output exceeds admitted byte budget or is disposed.\");\n if(offset+count<=storage.length)return;\n const grown=new Uint8Array(Math.min(budget,Math.max(storage.length*2,offset+count)));\n grown.set(storage.subarray(0,offset));storage.fill(0,0,offset);storage=grown;\n };\n const push=(...values:number[]):void=>{reserve(values.length);storage.set(values,offset);offset+=values.length;};\n // Fast path for one entropy-coded byte: the same budget/disposal check and byte order as push(), without an array per byte.\n const pushByte=(value:number):void=>{if(disposed||offset>=storage.length)reserve(1);storage[offset++]=value;};\n push(255,216);\n const marker = (id: number, payload: readonly number[]): void => {\n if (payload.length > 65533) throw new InvalidConfigurationError(\"JPEG metadata segment exceeds the standard APP limit.\");\n push(255,id,(payload.length+2)>>8,(payload.length+2)&255,...payload);\n };\n // JFIF 1.02 APP0: identifier, version 1.02, units (0 aspect ratio only, 1 dots per inch), Xdensity, Ydensity, no thumbnail.\n marker(224,density===undefined ? [74,70,73,70,0,1,2,0,0,1,0,1,0,0] : [74,70,73,70,0,1,2,1,density>>8,density&255,density>>8,density&255,0,0]);\n marker(225,[69,120,105,102,0,0,...input.exif]);\n marker(225,[...new TextEncoder().encode(\"http://ns.adobe.com/xap/1.0/\\0\"),...input.xmp]);\n if(input.icc){\n if(input.icc.length>65519)throw new InvalidConfigurationError(\"ICC profile exceeds the single-segment encoding envelope.\");\n marker(226,[...new TextEncoder().encode(\"ICC_PROFILE\\0\"),1,1,...input.icc]);\n }\n marker(219,[0,...Array<number>(64).fill(q)]);\n marker(192,[8,height>>8,height&255,width>>8,width&255,3,1,17,0,2,17,0,3,17,0]);\n // DC categories 0..11 use 4-bit codes; AC EOB/ZRL and all baseline run/category pairs use 8-bit codes.\n // Incomplete canonical Huffman trees reserve the all-ones code, so JPEG bit padding (1-bits) can never be read as a symbol.\n const dc = Array.from({length:12},(_,i) => i), ac = [0,240];\n for (let run=0;run<16;run++) for (let size=1;size<=10;size++) ac.push(run*16+size);\n marker(196,[0,...Array.from({length:16},(_,i) => i===3 ? 12 : 0),...dc,\n 16,...Array.from({length:16},(_,i) => i===7 ? ac.length : 0),...ac]);\n marker(218,[3,1,0,2,0,3,0,0,63,0]);\n let accumulator=0, bits=0;\n // Appends the low `count` bits (count <= 16) most-significant first, emitting each completed byte with 0xFF stuffing.\n const emit = (value: number, count: number): void => {\n accumulator=(accumulator<<count)|(value&((1<<count)-1)); bits+=count;\n while (bits>=8) { bits-=8; const byte=(accumulator>>>bits)&255; pushByte(byte); if (byte===255) pushByte(0); }\n accumulator&=(1<<bits)-1;\n };\n const coder=createJpegBlockCoder(q,emit), coefficients=new Float64Array(192);\n const previous=[0,0,0];\n const totalBlocks=Math.ceil(width/8)*Math.ceil(height/8);\n return {\n writeRgbBlock(samples:readonly number[]|Uint8Array):void {\n let valid=!disposed&&blocks<totalBlocks&&samples.length===192;\n // A Uint8Array holds only integers 0–255, so only an array's entries need the scan.\n if(!(samples instanceof Uint8Array))for(let i=0;valid&&i<192;i++){const v=samples[i]!;valid=Number.isInteger(v)&&v>=0&&v<=255;}\n if(!valid)throw new InvalidConfigurationError(\"JPEG requires complete bounded RGB coding blocks.\");\n coder.transform(samples,coefficients); coder.code(coefficients,previous);\n blocks++;\n },\n appendStrip(strip:JpegStripBits):void {\n if(disposed||blocks+strip.blockCount>totalBlocks||strip.first.length!==192||strip.lastDc.length!==3||strip.bits.length*8<strip.bitLength)\n throw new InvalidConfigurationError(\"JPEG strip does not continue this encoding.\");\n // The strip's first block, coded against the DC values before it; then its other blocks' bits, which only depend on\n // values inside the strip, as written (each byte's 0xFF stuffing happens here, as in writeRgbBlock).\n coder.code(strip.first,previous);\n const whole=strip.bitLength>>3;\n for(let i=0;i<whole;i++)emit(strip.bits[i]!,8);\n if(strip.bitLength&7)emit(strip.bits[whole]!>>(8-(strip.bitLength&7)),strip.bitLength&7);\n previous[0]=strip.lastDc[0]!; previous[1]=strip.lastDc[1]!; previous[2]=strip.lastDc[2]!;\n blocks+=strip.blockCount;\n },\n finish():Uint8Array {\n if(disposed||blocks!==Math.ceil(width/8)*Math.ceil(height/8))throw new InvalidConfigurationError(\"JPEG cannot finish incomplete or disposed encoding.\");\n if(bits)emit((1<<(8-bits))-1,8-bits);\n // Only the written prefix can hold data; zero it after the copy instead of filling the whole capacity.\n push(255,217);const output=storage.slice(0,offset);storage.fill(0,0,offset);storage=new Uint8Array(0);disposed=true;return output;\n },\n dispose():void {storage.fill(0,0,offset);storage=new Uint8Array(0);disposed=true;}\n };\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;IACxE,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 = 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"]}
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. */