@photivra/engine 2.13.0 → 2.14.1

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 (128) hide show
  1. package/CHANGELOG.md +75 -1
  2. package/CITATION.cff +1 -1
  3. package/NOTICE +5 -4
  4. package/README.md +10 -8
  5. package/SECURITY.md +1 -1
  6. package/THIRD_PARTY.md +16 -10
  7. package/dist/camera/lens-projection.js +2 -1
  8. package/dist/camera/lens-projection.js.map +1 -1
  9. package/dist/capture/dng-import.js +1 -1
  10. package/dist/capture/dng-import.js.map +1 -1
  11. package/dist/capture/host-yield-cadence.js +1 -1
  12. package/dist/capture/host-yield-cadence.js.map +1 -1
  13. package/dist/capture/native-environment-optical-stage.js +1 -1
  14. package/dist/capture/native-environment-optical-stage.js.map +1 -1
  15. package/dist/capture/native-raw.js +1 -1
  16. package/dist/capture/native-raw.js.map +1 -1
  17. package/dist/capture/packed-sensor-raw.js +3 -3
  18. package/dist/capture/packed-sensor-raw.js.map +1 -1
  19. package/dist/capture/sensor-raw-producer.js +1 -1
  20. package/dist/capture/sensor-raw-producer.js.map +1 -1
  21. package/dist/color/capture-color.js +3 -3
  22. package/dist/color/capture-color.js.map +1 -1
  23. package/dist/color/chromatic-adaptation.js +2 -2
  24. package/dist/color/chromatic-adaptation.js.map +1 -1
  25. package/dist/color/color-matching-functions.js +1 -1
  26. package/dist/color/color-matching-functions.js.map +1 -1
  27. package/dist/color/colorimetry-math.js +2 -2
  28. package/dist/color/colorimetry-math.js.map +1 -1
  29. package/dist/color/illuminants.js +3 -3
  30. package/dist/color/illuminants.js.map +1 -1
  31. package/dist/color/rgb-color-spaces.js +1 -1
  32. package/dist/color/rgb-color-spaces.js.map +1 -1
  33. package/dist/color/sensor-color-development.js +1 -1
  34. package/dist/color/sensor-color-development.js.map +1 -1
  35. package/dist/core/record-validation.js +3 -3
  36. package/dist/core/record-validation.js.map +1 -1
  37. package/dist/core/version.d.ts +1 -1
  38. package/dist/core/version.js +1 -1
  39. package/dist/core/version.js.map +1 -1
  40. package/dist/equipment/generic-prime-lenses.js +3 -3
  41. package/dist/equipment/generic-prime-lenses.js.map +1 -1
  42. package/dist/equipment/generic-tier-assets.d.ts +23 -1
  43. package/dist/equipment/generic-tier-assets.js +58 -30
  44. package/dist/equipment/generic-tier-assets.js.map +1 -1
  45. package/dist/equipment/generic-tier-presets.d.ts +6 -3
  46. package/dist/equipment/generic-tier-presets.js +26 -13
  47. package/dist/equipment/generic-tier-presets.js.map +1 -1
  48. package/dist/exposure/auto-iso-slowest-shutter.js +2 -1
  49. package/dist/exposure/auto-iso-slowest-shutter.js.map +1 -1
  50. package/dist/exposure/flash-ttl.js +1 -1
  51. package/dist/exposure/flash-ttl.js.map +1 -1
  52. package/dist/exposure/flash.js +1 -1
  53. package/dist/exposure/flash.js.map +1 -1
  54. package/dist/facade/chart-material-layers.js +2 -2
  55. package/dist/facade/chart-material-layers.js.map +1 -1
  56. package/dist/facade/chart-radiance-batch.js +1 -1
  57. package/dist/facade/chart-radiance-batch.js.map +1 -1
  58. package/dist/facade/chart-scenes.d.ts +45 -8
  59. package/dist/facade/chart-scenes.js +101 -44
  60. package/dist/facade/chart-scenes.js.map +1 -1
  61. package/dist/facade/color-patches.d.ts +129 -0
  62. package/dist/facade/color-patches.js +209 -0
  63. package/dist/facade/color-patches.js.map +1 -0
  64. package/dist/facade/display-view-gpu.js +1 -1
  65. package/dist/facade/display-view-gpu.js.map +1 -1
  66. package/dist/facade/scene-radiance.js +2 -2
  67. package/dist/facade/scene-radiance.js.map +1 -1
  68. package/dist/facade/simulate-capture.d.ts +47 -3
  69. package/dist/facade/simulate-capture.js +71 -22
  70. package/dist/facade/simulate-capture.js.map +1 -1
  71. package/dist/facade/simulate-display-view.js +2 -2
  72. package/dist/facade/simulate-display-view.js.map +1 -1
  73. package/dist/gpu/chart-composite-gpu.js +2 -2
  74. package/dist/gpu/chart-composite-gpu.js.map +1 -1
  75. package/dist/gpu/display-view-composite-material-module.js +1 -1
  76. package/dist/gpu/display-view-composite-material-module.js.map +1 -1
  77. package/dist/gpu/image-kernel-execution.js +2 -2
  78. package/dist/gpu/image-kernel-execution.js.map +1 -1
  79. package/dist/gpu/temporal-sum-gpu.js +23 -23
  80. package/dist/gpu/webgpu-runtime.js +1 -1
  81. package/dist/gpu/webgpu-runtime.js.map +1 -1
  82. package/dist/gpu/wgsl-chart-composite-kernel.js +318 -318
  83. package/dist/gpu/wgsl-chart-composite-kernel.js.map +1 -1
  84. package/dist/gpu/wgsl-chart-kernel.js +117 -117
  85. package/dist/gpu/wgsl-chart-kernel.js.map +1 -1
  86. package/dist/gpu/wgsl-display-view-quality-kernel.js +505 -505
  87. package/dist/gpu/wgsl-display-view-quality-kernel.js.map +1 -1
  88. package/dist/gpu/wgsl-display-view-speed-kernel.js +248 -248
  89. package/dist/gpu/wgsl-display-view-speed-kernel.js.map +1 -1
  90. package/dist/gpu/wgsl-kernels.js +203 -203
  91. package/dist/gpu/wgsl-kernels.js.map +1 -1
  92. package/dist/gpu/wgsl-sensor-kernel.js +302 -302
  93. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -1
  94. package/dist/index.d.ts +5 -3
  95. package/dist/index.js +4 -2
  96. package/dist/index.js.map +1 -1
  97. package/dist/motion/temporal-exposure-sum.js +1 -1
  98. package/dist/motion/temporal-exposure-sum.js.map +1 -1
  99. package/dist/optics/diffraction-psf-profile.js +4 -4
  100. package/dist/optics/diffraction-psf-profile.js.map +1 -1
  101. package/dist/optics/front-of-lens-filter.js +1 -1
  102. package/dist/optics/front-of-lens-filter.js.map +1 -1
  103. package/dist/optics/irradiance-convolution.js +1 -1
  104. package/dist/optics/irradiance-convolution.js.map +1 -1
  105. package/dist/output/native-capture-sdr.js +1 -1
  106. package/dist/output/native-capture-sdr.js.map +1 -1
  107. package/dist/output/png-encoder.js +2 -2
  108. package/dist/output/png-encoder.js.map +1 -1
  109. package/dist/output/print-contrast-reference.js +2 -2
  110. package/dist/output/print-contrast-reference.js.map +1 -1
  111. package/dist/output/print-jpeg.js +1 -1
  112. package/dist/output/print-jpeg.js.map +1 -1
  113. package/dist/sensor/fixed-pattern-noise.js +1 -1
  114. package/dist/sensor/fixed-pattern-noise.js.map +1 -1
  115. package/dist/sensor/readout-exposure-linkage.js +1 -1
  116. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  117. package/docs/API_REFERENCE.md +29 -1
  118. package/docs/QUICK_START.md +40 -5
  119. package/docs/USAGE.md +35 -1
  120. package/docs/api/core-version.md +1 -1
  121. package/docs/api/equipment-generic-tier-assets.md +41 -1
  122. package/docs/api/equipment-generic-tier-presets.md +11 -3
  123. package/docs/api/exports.json +107 -2
  124. package/docs/api/facade-chart-scenes.md +36 -5
  125. package/docs/api/facade-color-patches.md +150 -0
  126. package/docs/api/facade-simulate-capture.md +52 -2
  127. package/llms.txt +1 -0
  128. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"png-encoder.js","sourceRoot":"","sources":["../../src/output/png-encoder.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Browser-safe PNG still-image encoder for 8- and 16-bit RGB, with explicit colour signalling for wide-gamut\n * and HDR output. Independently written from the W3C PNG Specification (Third Edition, W3C Recommendation\n * 24 June 2025), RFC 1950 (zlib) and RFC 1951 (DEFLATE); no third-party encoder source and no dependency.\n *\n * - Colour: exactly one of an sRGB chunk (plus the gAMA/cHRM compatibility values the PNG specification\n * lists), an iCCP embedded ICC profile, or a cICP chunk with ITU-T H.273 code points (BT.709/sRGB,\n * Display P3, BT.2020 primaries; sRGB, BT.709 or linear transfer). PQ and HLG code points are not written:\n * those transfer functions are not part of 2.0 (see THIRD_PARTY.md).\n * - Static display metadata: mDCV (mastering display colour volume) and cLLI (MaxCLL/MaxFALL), only with cICP,\n * as defined in the W3C PNG Third Edition and ITU-T H.265 Annex D (also SMPTE ST 2086 and CTA-861.3). The\n * PNG specification allows mDCV with SDR encodings too, so both stay available for the remaining code points.\n * - Compression: zlib with stored or fixed-Huffman DEFLATE blocks and a bounded greedy LZ77 matcher.\n * Output bytes are a pure function of the input; no platform CompressionStream is used.\n *\n * The encoder writes the caller's integer code values unchanged. Converting linear light to an encoded\n * signal (for example sRGB) and choosing a gamut mapping is the caller's job.\n * @see docs/IMPORT_AND_PNG.md for chunk layouts, code points and limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { FULL_RESOLUTION_CEILING_PIXELS, resolveRaisedLimit } from \"../core/pixel-limits.js\";\n\nexport const PNG_ENCODER_ID = \"photivra-png-rgb-v1\" as const;\n/**\n * Limits, checked before allocation. 100 MP (megapixels) of 16-bit RGB is about 600 MB of filtered scanlines.\n * `maximumPixels` is the default; a request may raise it with its own `maximumPixels`, up to `ceilingPixels`.\n */\nexport const PNG_ENCODER_LIMITS = Object.freeze({ maximumDimension: 65535, maximumPixels: 100_000_000, ceilingPixels: FULL_RESOLUTION_CEILING_PIXELS,\n maximumIccProfileBytes: 4_000_000 });\n\n/** ITU-T H.273 ColourPrimaries: bt709 = 1 (also sRGB), display-p3 = 12 (P3 primaries with D65 white; W3C CSS Color 4, also SMPTE EG 432-1), bt2020 = 9 (BT.2020). */\nexport type PngCicpPrimaries = \"bt709\" | \"display-p3\" | \"bt2020\";\n/** ITU-T H.273 TransferCharacteristics: bt709 = 1, linear = 8, srgb = 13 (sRGB). PQ (16) and HLG (18) are not offered in 2.0. */\nexport type PngCicpTransfer = \"bt709\" | \"linear\" | \"srgb\";\nexport type PngColourEncoding =\n | { kind: \"srgb\"; renderingIntent: \"perceptual\" | \"relative-colorimetric\" | \"saturation\" | \"absolute-colorimetric\" }\n | { kind: \"icc\"; profileName: string; profile: Uint8Array }\n | { kind: \"cicp\"; primaries: PngCicpPrimaries; transfer: PngCicpTransfer; fullRange: boolean };\n/** Mastering display colour volume (W3C PNG mDCV; ITU-T H.265 Annex D SEI; also SMPTE ST 2086): CIE 1931 xy chromaticities and luminance in cd/m². */\nexport interface PngMasteringDisplay {\n redXy: readonly [number, number];\n greenXy: readonly [number, number];\n blueXy: readonly [number, number];\n whiteXy: readonly [number, number];\n maximumLuminanceCdPerSquareMeter: number;\n minimumLuminanceCdPerSquareMeter: number;\n}\n/** Content light level in cd/m² (W3C PNG cLLI; ITU-T H.265 content light level SEI; also CTA-861.3); 0 means unknown. */\nexport interface PngContentLightLevel {\n maximumContentLightLevelCdPerSquareMeter: number;\n maximumFrameAverageLightLevelCdPerSquareMeter: number;\n}\nexport interface PngEncodeInput {\n width: number;\n height: number;\n bitDepth: 8 | 16;\n /** Interleaved RGB code values, row-major; Uint8Array for 8-bit, Uint16Array for 16-bit. */\n samples: Uint8Array | Uint16Array;\n colourEncoding: PngColourEncoding;\n masteringDisplay?: PngMasteringDisplay;\n contentLightLevel?: PngContentLightLevel;\n /** Default \"fixed-huffman\". */\n compression?: \"stored\" | \"fixed-huffman\";\n /** PNG filter type 0..4 for every row, or the specification's minimum-sum-of-absolute-differences heuristic. Default \"adaptive\". */\n filter?: \"none\" | \"sub\" | \"up\" | \"average\" | \"paeth\" | \"adaptive\";\n /**\n * Optional opt-in pixel limit: an integer from 1 to `PNG_ENCODER_LIMITS.ceilingPixels`. Default\n * `PNG_ENCODER_LIMITS.maximumPixels` (100 000 000). It does not change the encoded bytes.\n */\n maximumPixels?: number;\n}\n\n// Maps, not plain objects: a lookup must never reach Object.prototype names such as \"constructor\" or \"toString\".\nconst PRIMARIES: ReadonlyMap<string, number> = new Map<PngCicpPrimaries, number>([[\"bt709\", 1], [\"display-p3\", 12], [\"bt2020\", 9]]);\nconst TRANSFER: ReadonlyMap<string, number> = new Map<PngCicpTransfer, number>([[\"bt709\", 1], [\"linear\", 8], [\"srgb\", 13]]);\nconst INTENT: ReadonlyMap<string, number> = new Map([[\"perceptual\", 0], [\"relative-colorimetric\", 1], [\"saturation\", 2], [\"absolute-colorimetric\", 3]]);\nconst COLOUR_ENCODING_FIELDS: Readonly<Record<string, readonly string[]>> = Object.freeze({\n srgb: [\"kind\", \"renderingIntent\"], icc: [\"kind\", \"profileName\", \"profile\"], cicp: [\"kind\", \"primaries\", \"transfer\", \"fullRange\"]\n});\nfunction fail(message: string): never { throw new InvalidConfigurationError(\"PNG encoder: \" + message); }\n\n/** Growable byte sink; doubles capacity as needed. */\nclass ByteSink {\n bytes = new Uint8Array(1 << 16); length = 0;\n reserve(count: number): void {\n if (this.length + count <= this.bytes.length) return;\n let size = this.bytes.length * 2; while (size < this.length + count) size *= 2;\n const grown = new Uint8Array(size); grown.set(this.bytes.subarray(0, this.length)); this.bytes = grown;\n }\n push(...values: number[]): void { this.reserve(values.length); for (const v of values) this.bytes[this.length++] = v; }\n append(data: Uint8Array): void { this.reserve(data.length); this.bytes.set(data, this.length); this.length += data.length; }\n u32(v: number): void { this.push(v >>> 24, (v >>> 16) & 255, (v >>> 8) & 255, v & 255); }\n result(): Uint8Array { return this.bytes.slice(0, this.length); }\n}\n\nlet crcTable: Uint32Array | undefined;\n/** CRC-32 (ISO 3309 / ITU-T V.42 polynomial 0xEDB88320, reflected), as specified for PNG chunks. */\nexport function pngCrc32(data: Uint8Array, initial = 0): number {\n const table = crcTable ??= Uint32Array.from({ length: 256 }, (_, n) => { let c = n; for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1; return c >>> 0; });\n let c = ~initial >>> 0;\n for (let i = 0; i < data.length; i++) c = table[(c ^ data[i]!) & 255]! ^ (c >>> 8);\n return ~c >>> 0;\n}\nfunction adler32(data: Uint8Array): number {\n let a = 1, b = 0;\n for (let i = 0; i < data.length;) {\n const end = Math.min(data.length, i + 5552); // largest run that cannot overflow before the modulo (RFC 1950)\n for (; i < end; i++) { a += data[i]!; b += a; }\n a %= 65521; b %= 65521;\n }\n return ((b << 16) | a) >>> 0;\n}\n\nconst LENGTH_BASE = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258];\nconst LENGTH_EXTRA = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0];\nconst DIST_BASE = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577];\nconst DIST_EXTRA = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13];\nconst DEFLATE_WINDOW = 32768;\n\n/** Huffman codes are defined MSB-first (RFC 1951 §3.1.1); the stream is LSB-first, so codes are stored bit-reversed. */\nfunction reverseBits(code: number, length: number): number { let r = 0; for (let i = 0; i < length; i++) r = (r << 1) | ((code >> i) & 1); return r; }\n\ninterface FixedHuffmanTables {\n /** Bit-reversed RFC 1951 §3.2.6 fixed literal/length codes and their lengths, symbols 0–287. */\n literalCode: Uint16Array; literalBits: Uint8Array;\n /** Per match length 3–258: reversed length code with its extra bits appended, and the total bit count. */\n lengthCode: Uint16Array; lengthBits: Uint8Array;\n /** Per distance 1–32768: reversed 5-bit distance code with its extra bits appended, and the total bit count. */\n distanceCode: Uint32Array; distanceBits: Uint8Array;\n}\nlet fixedTables: FixedHuffmanTables | undefined;\n/** Built once: the same codes the per-symbol definition gives, precomputed and pre-reversed. */\nfunction fixedHuffmanTables(): FixedHuffmanTables {\n if (fixedTables) return fixedTables;\n const literalCode = new Uint16Array(288), literalBits = new Uint8Array(288);\n for (let symbol = 0; symbol < 288; symbol++) {\n const [code, bits] = symbol < 144 ? [0x30 + symbol, 8] : symbol < 256 ? [0x190 + symbol - 144, 9] : symbol < 280 ? [symbol - 256, 7] : [0xc0 + symbol - 280, 8];\n literalCode[symbol] = reverseBits(code, bits); literalBits[symbol] = bits;\n }\n const lengthCode = new Uint16Array(259), lengthBits = new Uint8Array(259);\n for (let length = 3, l = 0; length <= 258; length++) {\n while (l < 28 && LENGTH_BASE[l + 1]! <= length) l++; // largest l with LENGTH_BASE[l] <= length\n const symbol = 257 + l, bits = literalBits[symbol]!;\n lengthCode[length] = literalCode[symbol]! | ((length - LENGTH_BASE[l]!) << bits); lengthBits[length] = bits + LENGTH_EXTRA[l]!;\n }\n const distanceCode = new Uint32Array(DEFLATE_WINDOW + 1), distanceBits = new Uint8Array(DEFLATE_WINDOW + 1);\n for (let distance = 1, d = 0; distance <= DEFLATE_WINDOW; distance++) {\n while (d < 29 && DIST_BASE[d + 1]! <= distance) d++;\n distanceCode[distance] = reverseBits(d, 5) | ((distance - DIST_BASE[d]!) << 5); distanceBits[distance] = 5 + DIST_EXTRA[d]!;\n }\n fixedTables = { literalCode, literalBits, lengthCode, lengthBits, distanceCode, distanceBits };\n return fixedTables;\n}\n\n/**\n * zlib stream (RFC 1950: CMF 0x78 = deflate with 32 KiB window, FLG 0x01, Adler-32 trailer) holding stored\n * blocks or one fixed-Huffman block. LZ77 is greedy with a 3-byte hash and at most 64 chain probes.\n */\nexport function deflateZlib(data: Uint8Array, mode: \"stored\" | \"fixed-huffman\"): Uint8Array {\n const n = data.length;\n // Exact upper bound: a fixed-Huffman literal is at most 9 bits and a match of length L >= 3 at most 25 bits\n // per 3 bytes, so the block needs at most 9 bits per input byte plus 3 header and 7 end-of-block bits.\n const capacity = 2 + 4 + (mode === \"stored\" ? n + 5 * Math.max(1, Math.ceil(n / 65535)) : Math.ceil((9 * n + 10) / 8));\n const out = new Uint8Array(capacity);\n let pos = 0;\n out[pos++] = 0x78; out[pos++] = 0x01;\n if (mode === \"stored\") {\n if (n === 0) { out[pos++] = 1; out[pos++] = 0; out[pos++] = 0; out[pos++] = 255; out[pos++] = 255; }\n for (let i = 0; i < n; i += 65535) {\n const len = Math.min(65535, n - i);\n out[pos++] = i + len >= n ? 1 : 0; out[pos++] = len & 255; out[pos++] = len >> 8; out[pos++] = ~len & 255; out[pos++] = (~len >> 8) & 255;\n out.set(data.subarray(i, i + len), pos); pos += len;\n }\n } else {\n const { literalCode, literalBits, lengthCode, lengthBits, distanceCode, distanceBits } = fixedHuffmanTables();\n // LSB-first bit accumulator; at most 7 bits stay pending, and no single write exceeds 18 bits.\n let accumulator = 0b011, bits = 3; // BFINAL = 1, BTYPE = 01 (fixed Huffman)\n const window = DEFLATE_WINDOW, mask = window - 1, head = new Int32Array(1 << 15).fill(-1), previous = new Int32Array(window).fill(-1);\n // Hash of the 3 bytes at i: ((data[i] << 10) ^ (data[i + 1] << 5) ^ data[i + 2]) & 0x7fff. It rolls exactly as\n // h(i + 1) = ((h(i) << 5) ^ data[i + 3]) & 0x7fff, because the mask drops every bit of data[i] after the shift.\n const hashed = n - 2; // positions i < hashed have three bytes to hash\n let h = n >= 2 ? ((data[0]! << 5) ^ data[1]!) & 0x7fff : 0;\n for (let i = 0; i < n;) {\n let bestLength = 0, bestDistance = 0;\n if (i < hashed) {\n h = ((h << 5) ^ data[i + 2]!) & 0x7fff;\n const limit = Math.min(258, n - i);\n for (let candidate = head[h]!, probes = 0; candidate >= 0 && i - candidate <= window && probes < 64; candidate = previous[candidate & mask]!, probes++) {\n if (candidate >= i) break;\n // A candidate that differs at index bestLength cannot be longer than the current best.\n if (data[candidate + bestLength] !== data[i + bestLength]) continue;\n let length = 0; while (length < limit && data[candidate + length] === data[i + length]) length++;\n if (length > bestLength) { bestLength = length; bestDistance = i - candidate; if (length === limit) break; }\n }\n previous[i & mask] = head[h]!; head[h] = i;\n }\n if (bestLength >= 3) {\n accumulator |= lengthCode[bestLength]! << bits; bits += lengthBits[bestLength]!;\n while (bits >= 8) { out[pos++] = accumulator & 255; accumulator >>>= 8; bits -= 8; }\n accumulator |= distanceCode[bestDistance]! << bits; bits += distanceBits[bestDistance]!;\n const end = i + bestLength;\n for (i++; i < end; i++) {\n if (i < hashed) { h = ((h << 5) ^ data[i + 2]!) & 0x7fff; previous[i & mask] = head[h]!; head[h] = i; }\n }\n } else {\n const symbol = data[i++]!;\n accumulator |= literalCode[symbol]! << bits; bits += literalBits[symbol]!;\n }\n while (bits >= 8) { out[pos++] = accumulator & 255; accumulator >>>= 8; bits -= 8; }\n }\n accumulator |= literalCode[256]! << bits; bits += literalBits[256]!;\n while (bits > 0) { out[pos++] = accumulator & 255; accumulator >>>= 8; bits -= 8; } // flush and byte-align\n }\n const adler = adler32(data);\n out[pos++] = adler >>> 24; out[pos++] = (adler >>> 16) & 255; out[pos++] = (adler >>> 8) & 255; out[pos++] = adler & 255;\n return out.slice(0, pos);\n}\n\n/** Writes PNG filter `type` (0–4, PNG specification §9.2) of `raw` against `prior` into `target`. */\nfunction filterRow(type: number, raw: Uint8Array, prior: Uint8Array, target: Uint8Array, rowBytes: number, bpp: number): void {\n const head = Math.min(bpp, rowBytes);\n switch (type) {\n case 0: target.set(raw.subarray(0, rowBytes)); return;\n case 1:\n for (let i = 0; i < head; i++) target[i] = raw[i]!;\n for (let i = bpp; i < rowBytes; i++) target[i] = (raw[i]! - raw[i - bpp]!) & 255;\n return;\n case 2: for (let i = 0; i < rowBytes; i++) target[i] = (raw[i]! - prior[i]!) & 255; return;\n case 3:\n for (let i = 0; i < head; i++) target[i] = (raw[i]! - (prior[i]! >> 1)) & 255;\n for (let i = bpp; i < rowBytes; i++) target[i] = (raw[i]! - ((raw[i - bpp]! + prior[i]!) >> 1)) & 255;\n return;\n default:\n // Paeth with a = c = 0 in the first pixel predicts b.\n for (let i = 0; i < head; i++) target[i] = (raw[i]! - prior[i]!) & 255;\n for (let i = bpp; i < rowBytes; i++) {\n const a = raw[i - bpp]!, b = prior[i]!, c = prior[i - bpp]!, p = a + b - c, pa = Math.abs(p - a), pb = Math.abs(p - b), pc = Math.abs(p - c);\n target[i] = (raw[i]! - (pa <= pb && pa <= pc ? a : pb <= pc ? b : c)) & 255;\n }\n }\n}\n\n/** |v| of a filtered byte v read as a signed byte (two's complement), for the §12.7 heuristic. */\nconst SIGNED_BYTE_MAGNITUDE = Uint8Array.from({ length: 256 }, (_, v) => (v < 128 ? v : 256 - v));\n\n/** Sum of |signed byte| of filter `type` applied to a row (PNG specification §12.7), without writing the row. */\nfunction filterCost(type: number, raw: Uint8Array, prior: Uint8Array, rowBytes: number, bpp: number): number {\n const head = Math.min(bpp, rowBytes), magnitude = SIGNED_BYTE_MAGNITUDE;\n let sum = 0;\n switch (type) {\n case 0: for (let i = 0; i < rowBytes; i++) sum += magnitude[raw[i]!]!; return sum;\n case 1:\n for (let i = 0; i < head; i++) sum += magnitude[raw[i]!]!;\n for (let i = bpp; i < rowBytes; i++) sum += magnitude[(raw[i]! - raw[i - bpp]!) & 255]!;\n return sum;\n case 2: for (let i = 0; i < rowBytes; i++) sum += magnitude[(raw[i]! - prior[i]!) & 255]!; return sum;\n case 3:\n for (let i = 0; i < head; i++) sum += magnitude[(raw[i]! - (prior[i]! >> 1)) & 255]!;\n for (let i = bpp; i < rowBytes; i++) sum += magnitude[(raw[i]! - ((raw[i - bpp]! + prior[i]!) >> 1)) & 255]!;\n return sum;\n default:\n for (let i = 0; i < head; i++) sum += magnitude[(raw[i]! - prior[i]!) & 255]!;\n for (let i = bpp; i < rowBytes; i++) {\n const a = raw[i - bpp]!, b = prior[i]!, c = prior[i - bpp]!, p = a + b - c, pa = Math.abs(p - a), pb = Math.abs(p - b), pc = Math.abs(p - c);\n sum += magnitude[(raw[i]! - (pa <= pb && pa <= pc ? a : pb <= pc ? b : c)) & 255]!;\n }\n return sum;\n }\n}\n\nfunction requireFields(value: unknown, allowed: readonly string[], name: string): void {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) fail(name + \" must be an object.\");\n for (const key of Object.keys(value)) if (!allowed.includes(key)) fail(\"unknown \" + name + \" field.\");\n}\n\nfunction finite(value: number, minimum: number, maximum: number, message: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < minimum || value > maximum) fail(message);\n return value;\n}\n\n/**\n * Encode an RGB still image as PNG (colour type 2, no interlace). Samples are written unchanged; 16-bit\n * samples are stored big-endian as PNG requires. Throws `InvalidConfigurationError` for any invalid or\n * inconsistent field before allocating the scanline buffer.\n */\nexport function serializePngImage(input: PngEncodeInput): Uint8Array {\n if (input === null || typeof input !== \"object\") fail(\"input must be an object.\");\n for (const key of Object.keys(input)) if (![\"width\", \"height\", \"bitDepth\", \"samples\", \"colourEncoding\", \"masteringDisplay\", \"contentLightLevel\", \"compression\", \"filter\", \"maximumPixels\"].includes(key)) fail(\"unknown input field.\");\n const { width, height, bitDepth, samples } = input;\n const maximumPixels = resolveRaisedLimit(input.maximumPixels, PNG_ENCODER_LIMITS.maximumPixels, PNG_ENCODER_LIMITS.ceilingPixels,\n \"PNG encoder: maximumPixels must be an integer from 1 to \" + PNG_ENCODER_LIMITS.ceilingPixels + \".\");\n if (![width, height].every((v) => Number.isSafeInteger(v) && v >= 1 && v <= PNG_ENCODER_LIMITS.maximumDimension) || width * height > maximumPixels) fail(\"dimensions are out of range.\");\n if (bitDepth !== 8 && bitDepth !== 16) fail(\"bitDepth must be 8 or 16.\");\n if (bitDepth === 8 ? !(samples instanceof Uint8Array) : !(samples instanceof Uint16Array)) fail(\"samples must be a Uint8Array for 8-bit or a Uint16Array for 16-bit.\");\n if (samples.length !== width * height * 3) fail(\"samples must hold width x height RGB triples.\");\n const compression = input.compression ?? \"fixed-huffman\", filter = input.filter ?? \"adaptive\";\n if (compression !== \"stored\" && compression !== \"fixed-huffman\") fail(\"unknown compression.\");\n const filters = [\"none\", \"sub\", \"up\", \"average\", \"paeth\", \"adaptive\"] as const;\n if (!filters.includes(filter)) fail(\"unknown filter.\");\n const colour = input.colourEncoding;\n if (colour === null || typeof colour !== \"object\") fail(\"colourEncoding is required.\");\n const colourFields = typeof colour.kind === \"string\" && Object.hasOwn(COLOUR_ENCODING_FIELDS, colour.kind) ? COLOUR_ENCODING_FIELDS[colour.kind]! : undefined;\n if (colourFields === undefined) fail(\"unknown colourEncoding kind.\");\n for (const key of Object.keys(colour)) if (!colourFields.includes(key)) fail(\"unknown colourEncoding field.\");\n if (input.masteringDisplay !== undefined) requireFields(input.masteringDisplay, [\"redXy\", \"greenXy\", \"blueXy\", \"whiteXy\", \"maximumLuminanceCdPerSquareMeter\", \"minimumLuminanceCdPerSquareMeter\"], \"masteringDisplay\");\n if (input.contentLightLevel !== undefined) requireFields(input.contentLightLevel, [\"maximumContentLightLevelCdPerSquareMeter\", \"maximumFrameAverageLightLevelCdPerSquareMeter\"], \"contentLightLevel\");\n\n const chunks: { type: string; data: Uint8Array }[] = [];\n const ihdr = new Uint8Array(13), view = new DataView(ihdr.buffer);\n view.setUint32(0, width); view.setUint32(4, height); ihdr[8] = bitDepth; ihdr[9] = 2; // colour type 2: truecolour\n chunks.push({ type: \"IHDR\", data: ihdr });\n if (colour.kind === \"cicp\") {\n const p = PRIMARIES.get(colour.primaries), t = TRANSFER.get(colour.transfer);\n if (p === undefined || t === undefined || typeof colour.fullRange !== \"boolean\") fail(\"unknown cICP primaries or transfer.\");\n // MatrixCoefficients 0 (identity/RGB) is the only value PNG permits.\n chunks.push({ type: \"cICP\", data: Uint8Array.of(p, t, 0, colour.fullRange ? 1 : 0) });\n } else if (colour.kind === \"icc\") {\n const name = colour.profileName, profile = colour.profile;\n if (typeof name !== \"string\" || !/^[\\x20-\\x7e\\xa1-\\xff]{1,79}$/.test(name) || name.startsWith(\" \") || name.endsWith(\" \") || name.includes(\" \")) fail(\"ICC profile name must be 1-79 Latin-1 characters without leading, trailing or repeated spaces.\");\n if (!(profile instanceof Uint8Array) || profile.length < 132 || profile.length > PNG_ENCODER_LIMITS.maximumIccProfileBytes ||\n new DataView(profile.buffer, profile.byteOffset, profile.byteLength).getUint32(0) !== profile.length) fail(\"ICC profile must be a complete profile whose header size matches its length.\");\n const compressed = deflateZlib(profile, compression), data = new Uint8Array(name.length + 2 + compressed.length);\n for (let i = 0; i < name.length; i++) data[i] = name.charCodeAt(i);\n data.set(compressed, name.length + 2); // NUL separator and compression method 0 are already zero\n chunks.push({ type: \"iCCP\", data });\n } else if (colour.kind === \"srgb\") {\n const intent = INTENT.get(colour.renderingIntent);\n if (intent === undefined) fail(\"unknown sRGB rendering intent.\");\n // PNG Third Edition Table 17: the only gAMA/cHRM values to accompany sRGB.\n const gama = new Uint8Array(4); new DataView(gama.buffer).setUint32(0, 45455);\n const chrm = new Uint8Array(32), c = new DataView(chrm.buffer);\n [31270, 32900, 64000, 33000, 30000, 60000, 15000, 6000].forEach((v, i) => c.setUint32(i * 4, v));\n chunks.push({ type: \"sRGB\", data: Uint8Array.of(intent) }, { type: \"gAMA\", data: gama }, { type: \"cHRM\", data: chrm });\n } else fail(\"unknown colourEncoding kind.\");\n if ((input.masteringDisplay || input.contentLightLevel) && colour.kind !== \"cicp\") fail(\"mDCV and cLLI metadata require a cICP colour encoding.\");\n if (input.masteringDisplay) {\n const m = input.masteringDisplay, data = new Uint8Array(24), d = new DataView(data.buffer);\n [m.redXy, m.greenXy, m.blueXy, m.whiteXy].forEach((xy, i) => {\n if (!Array.isArray(xy) || xy.length !== 2) fail(\"mastering chromaticities must be [x, y] pairs.\");\n // Stored value = chromaticity / 0.00002, a PNG two-byte unsigned integer.\n for (let k = 0; k < 2; k++) d.setUint16(i * 4 + k * 2, Math.round(finite(xy[k]!, 0, 1.3107, \"mastering chromaticity must be in 0..1.3107.\") * 50000));\n });\n const max = finite(m.maximumLuminanceCdPerSquareMeter, 0, 429496.7295, \"mastering luminance is out of range.\"), min = finite(m.minimumLuminanceCdPerSquareMeter, 0, 429496.7295, \"mastering luminance is out of range.\");\n if (min >= max) fail(\"mastering minimum luminance must be below the maximum.\");\n d.setUint32(16, Math.round(max * 10000)); d.setUint32(20, Math.round(min * 10000)); // divisor 0.0001 cd/m²\n chunks.push({ type: \"mDCV\", data });\n }\n if (input.contentLightLevel) {\n const l = input.contentLightLevel, data = new Uint8Array(8), d = new DataView(data.buffer);\n const cll = finite(l.maximumContentLightLevelCdPerSquareMeter, 0, 429496.7295, \"content light level is out of range.\"), fall = finite(l.maximumFrameAverageLightLevelCdPerSquareMeter, 0, 429496.7295, \"content light level is out of range.\");\n if (cll !== 0 && fall > cll) fail(\"MaxFALL cannot exceed MaxCLL.\");\n d.setUint32(0, Math.round(cll * 10000)); d.setUint32(4, Math.round(fall * 10000));\n chunks.push({ type: \"cLLI\", data });\n }\n\n // Scanlines: one filter-type byte then big-endian samples; bpp = bytes per complete pixel.\n const bpp = bitDepth === 8 ? 3 : 6, rowBytes = width * bpp;\n let raw = new Uint8Array(rowBytes), prior = new Uint8Array(rowBytes);\n const filtered = new Uint8Array(height * (rowBytes + 1)), fixedType = filters.indexOf(filter);\n for (let y = 0; y < height; y++) {\n const base = y * width * 3;\n if (bitDepth === 8) raw.set((samples as Uint8Array).subarray(base, base + width * 3));\n else for (let i = 0; i < width * 3; i++) { const v = samples[base + i]!; raw[i * 2] = v >> 8; raw[i * 2 + 1] = v & 255; }\n const row = y * (rowBytes + 1) + 1;\n let type = fixedType;\n if (filter === \"adaptive\") {\n // PNG specification §12.7 heuristic: choose the type with the minimum sum of |signed byte| (ties: lowest type).\n let best = Infinity;\n for (let t = 0; t <= 4; t++) {\n const sum = filterCost(t, raw, prior, rowBytes, bpp);\n if (sum < best) { best = sum; type = t; }\n }\n }\n filtered[row - 1] = type; filterRow(type, raw, prior, filtered.subarray(row, row + rowBytes), rowBytes, bpp);\n const done = prior; prior = raw; raw = done; // this row is the next row's prior\n }\n const idat = deflateZlib(filtered, compression);\n\n const out = new ByteSink();\n out.push(137, 80, 78, 71, 13, 10, 26, 10);\n const writeChunk = (type: string, data: Uint8Array): void => {\n const typeBytes = Uint8Array.from(type, (ch) => ch.charCodeAt(0));\n out.u32(data.length); out.append(typeBytes); out.append(data);\n out.u32(pngCrc32(data, pngCrc32(typeBytes)));\n };\n for (const chunk of chunks) writeChunk(chunk.type, chunk.data);\n for (let i = 0; i < idat.length; i += 1 << 20) writeChunk(\"IDAT\", idat.subarray(i, Math.min(idat.length, i + (1 << 20))));\n writeChunk(\"IEND\", new Uint8Array(0));\n return out.result();\n}\n"]}
1
+ {"version":3,"file":"png-encoder.js","sourceRoot":"","sources":["../../src/output/png-encoder.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Browser-safe PNG still-image encoder for 8- and 16-bit RGB, with explicit colour signalling for wide-gamut\n * and HDR output. Independently written from the W3C PNG Specification (Third Edition, W3C Recommendation\n * 24 June 2025), RFC 1950 (zlib) and RFC 1951 (DEFLATE); no third-party encoder source and no dependency.\n *\n * - Colour: exactly one of an sRGB chunk (plus the gAMA/cHRM compatibility values the PNG specification\n * lists), an iCCP embedded ICC profile, or a cICP chunk with ITU-T H.273 code points (BT.709/sRGB,\n * Display P3, BT.2020 primaries; sRGB, BT.709 or linear transfer). PQ and HLG code points are not written:\n * those transfer functions are not part of 2.0 (see THIRD_PARTY.md).\n * - Static display metadata: mDCV (mastering display colour volume) and cLLI (MaxCLL/MaxFALL), only with cICP,\n * as defined in the W3C PNG Third Edition and ITU-T H.265 Annex D (also SMPTE ST 2086 and CTA-861.3). The\n * PNG specification allows mDCV with SDR encodings too, so both stay available for the remaining code points.\n * - Compression: zlib with stored or fixed-Huffman DEFLATE blocks and a bounded greedy LZ77 matcher.\n * Output bytes are a pure function of the input; no platform CompressionStream is used.\n *\n * The encoder writes the caller's integer code values unchanged. Converting linear light to an encoded\n * signal (for example sRGB) and choosing a gamut mapping is the caller's job.\n * @see docs/IMPORT_AND_PNG.md for chunk layouts, code points and limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { FULL_RESOLUTION_CEILING_PIXELS, resolveRaisedLimit } from \"../core/pixel-limits.js\";\n\nexport const PNG_ENCODER_ID = \"photivra-png-rgb-v1\" as const;\n/**\n * Limits, checked before allocation. 100 MP (megapixels) of 16-bit RGB is about 600 MB of filtered scanlines.\n * `maximumPixels` is the default; a request may raise it with its own `maximumPixels`, up to `ceilingPixels`.\n */\nexport const PNG_ENCODER_LIMITS = /* @__PURE__ */ Object.freeze({ maximumDimension: 65535, maximumPixels: 100_000_000, ceilingPixels: FULL_RESOLUTION_CEILING_PIXELS,\n maximumIccProfileBytes: 4_000_000 });\n\n/** ITU-T H.273 ColourPrimaries: bt709 = 1 (also sRGB), display-p3 = 12 (P3 primaries with D65 white; W3C CSS Color 4, also SMPTE EG 432-1), bt2020 = 9 (BT.2020). */\nexport type PngCicpPrimaries = \"bt709\" | \"display-p3\" | \"bt2020\";\n/** ITU-T H.273 TransferCharacteristics: bt709 = 1, linear = 8, srgb = 13 (sRGB). PQ (16) and HLG (18) are not offered in 2.0. */\nexport type PngCicpTransfer = \"bt709\" | \"linear\" | \"srgb\";\nexport type PngColourEncoding =\n | { kind: \"srgb\"; renderingIntent: \"perceptual\" | \"relative-colorimetric\" | \"saturation\" | \"absolute-colorimetric\" }\n | { kind: \"icc\"; profileName: string; profile: Uint8Array }\n | { kind: \"cicp\"; primaries: PngCicpPrimaries; transfer: PngCicpTransfer; fullRange: boolean };\n/** Mastering display colour volume (W3C PNG mDCV; ITU-T H.265 Annex D SEI; also SMPTE ST 2086): CIE 1931 xy chromaticities and luminance in cd/m². */\nexport interface PngMasteringDisplay {\n redXy: readonly [number, number];\n greenXy: readonly [number, number];\n blueXy: readonly [number, number];\n whiteXy: readonly [number, number];\n maximumLuminanceCdPerSquareMeter: number;\n minimumLuminanceCdPerSquareMeter: number;\n}\n/** Content light level in cd/m² (W3C PNG cLLI; ITU-T H.265 content light level SEI; also CTA-861.3); 0 means unknown. */\nexport interface PngContentLightLevel {\n maximumContentLightLevelCdPerSquareMeter: number;\n maximumFrameAverageLightLevelCdPerSquareMeter: number;\n}\nexport interface PngEncodeInput {\n width: number;\n height: number;\n bitDepth: 8 | 16;\n /** Interleaved RGB code values, row-major; Uint8Array for 8-bit, Uint16Array for 16-bit. */\n samples: Uint8Array | Uint16Array;\n colourEncoding: PngColourEncoding;\n masteringDisplay?: PngMasteringDisplay;\n contentLightLevel?: PngContentLightLevel;\n /** Default \"fixed-huffman\". */\n compression?: \"stored\" | \"fixed-huffman\";\n /** PNG filter type 0..4 for every row, or the specification's minimum-sum-of-absolute-differences heuristic. Default \"adaptive\". */\n filter?: \"none\" | \"sub\" | \"up\" | \"average\" | \"paeth\" | \"adaptive\";\n /**\n * Optional opt-in pixel limit: an integer from 1 to `PNG_ENCODER_LIMITS.ceilingPixels`. Default\n * `PNG_ENCODER_LIMITS.maximumPixels` (100 000 000). It does not change the encoded bytes.\n */\n maximumPixels?: number;\n}\n\n// Maps, not plain objects: a lookup must never reach Object.prototype names such as \"constructor\" or \"toString\".\nconst PRIMARIES: ReadonlyMap<string, number> = new Map<PngCicpPrimaries, number>([[\"bt709\", 1], [\"display-p3\", 12], [\"bt2020\", 9]]);\nconst TRANSFER: ReadonlyMap<string, number> = new Map<PngCicpTransfer, number>([[\"bt709\", 1], [\"linear\", 8], [\"srgb\", 13]]);\nconst INTENT: ReadonlyMap<string, number> = new Map([[\"perceptual\", 0], [\"relative-colorimetric\", 1], [\"saturation\", 2], [\"absolute-colorimetric\", 3]]);\nconst COLOUR_ENCODING_FIELDS: Readonly<Record<string, readonly string[]>> = /* @__PURE__ */ Object.freeze({\n srgb: [\"kind\", \"renderingIntent\"], icc: [\"kind\", \"profileName\", \"profile\"], cicp: [\"kind\", \"primaries\", \"transfer\", \"fullRange\"]\n});\nfunction fail(message: string): never { throw new InvalidConfigurationError(\"PNG encoder: \" + message); }\n\n/** Growable byte sink; doubles capacity as needed. */\nclass ByteSink {\n bytes = new Uint8Array(1 << 16); length = 0;\n reserve(count: number): void {\n if (this.length + count <= this.bytes.length) return;\n let size = this.bytes.length * 2; while (size < this.length + count) size *= 2;\n const grown = new Uint8Array(size); grown.set(this.bytes.subarray(0, this.length)); this.bytes = grown;\n }\n push(...values: number[]): void { this.reserve(values.length); for (const v of values) this.bytes[this.length++] = v; }\n append(data: Uint8Array): void { this.reserve(data.length); this.bytes.set(data, this.length); this.length += data.length; }\n u32(v: number): void { this.push(v >>> 24, (v >>> 16) & 255, (v >>> 8) & 255, v & 255); }\n result(): Uint8Array { return this.bytes.slice(0, this.length); }\n}\n\nlet crcTable: Uint32Array | undefined;\n/** CRC-32 (ISO 3309 / ITU-T V.42 polynomial 0xEDB88320, reflected), as specified for PNG chunks. */\nexport function pngCrc32(data: Uint8Array, initial = 0): number {\n const table = crcTable ??= Uint32Array.from({ length: 256 }, (_, n) => { let c = n; for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1; return c >>> 0; });\n let c = ~initial >>> 0;\n for (let i = 0; i < data.length; i++) c = table[(c ^ data[i]!) & 255]! ^ (c >>> 8);\n return ~c >>> 0;\n}\nfunction adler32(data: Uint8Array): number {\n let a = 1, b = 0;\n for (let i = 0; i < data.length;) {\n const end = Math.min(data.length, i + 5552); // largest run that cannot overflow before the modulo (RFC 1950)\n for (; i < end; i++) { a += data[i]!; b += a; }\n a %= 65521; b %= 65521;\n }\n return ((b << 16) | a) >>> 0;\n}\n\nconst LENGTH_BASE = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258];\nconst LENGTH_EXTRA = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0];\nconst DIST_BASE = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577];\nconst DIST_EXTRA = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13];\nconst DEFLATE_WINDOW = 32768;\n\n/** Huffman codes are defined MSB-first (RFC 1951 §3.1.1); the stream is LSB-first, so codes are stored bit-reversed. */\nfunction reverseBits(code: number, length: number): number { let r = 0; for (let i = 0; i < length; i++) r = (r << 1) | ((code >> i) & 1); return r; }\n\ninterface FixedHuffmanTables {\n /** Bit-reversed RFC 1951 §3.2.6 fixed literal/length codes and their lengths, symbols 0–287. */\n literalCode: Uint16Array; literalBits: Uint8Array;\n /** Per match length 3–258: reversed length code with its extra bits appended, and the total bit count. */\n lengthCode: Uint16Array; lengthBits: Uint8Array;\n /** Per distance 1–32768: reversed 5-bit distance code with its extra bits appended, and the total bit count. */\n distanceCode: Uint32Array; distanceBits: Uint8Array;\n}\nlet fixedTables: FixedHuffmanTables | undefined;\n/** Built once: the same codes the per-symbol definition gives, precomputed and pre-reversed. */\nfunction fixedHuffmanTables(): FixedHuffmanTables {\n if (fixedTables) return fixedTables;\n const literalCode = new Uint16Array(288), literalBits = new Uint8Array(288);\n for (let symbol = 0; symbol < 288; symbol++) {\n const [code, bits] = symbol < 144 ? [0x30 + symbol, 8] : symbol < 256 ? [0x190 + symbol - 144, 9] : symbol < 280 ? [symbol - 256, 7] : [0xc0 + symbol - 280, 8];\n literalCode[symbol] = reverseBits(code, bits); literalBits[symbol] = bits;\n }\n const lengthCode = new Uint16Array(259), lengthBits = new Uint8Array(259);\n for (let length = 3, l = 0; length <= 258; length++) {\n while (l < 28 && LENGTH_BASE[l + 1]! <= length) l++; // largest l with LENGTH_BASE[l] <= length\n const symbol = 257 + l, bits = literalBits[symbol]!;\n lengthCode[length] = literalCode[symbol]! | ((length - LENGTH_BASE[l]!) << bits); lengthBits[length] = bits + LENGTH_EXTRA[l]!;\n }\n const distanceCode = new Uint32Array(DEFLATE_WINDOW + 1), distanceBits = new Uint8Array(DEFLATE_WINDOW + 1);\n for (let distance = 1, d = 0; distance <= DEFLATE_WINDOW; distance++) {\n while (d < 29 && DIST_BASE[d + 1]! <= distance) d++;\n distanceCode[distance] = reverseBits(d, 5) | ((distance - DIST_BASE[d]!) << 5); distanceBits[distance] = 5 + DIST_EXTRA[d]!;\n }\n fixedTables = { literalCode, literalBits, lengthCode, lengthBits, distanceCode, distanceBits };\n return fixedTables;\n}\n\n/**\n * zlib stream (RFC 1950: CMF 0x78 = deflate with 32 KiB window, FLG 0x01, Adler-32 trailer) holding stored\n * blocks or one fixed-Huffman block. LZ77 is greedy with a 3-byte hash and at most 64 chain probes.\n */\nexport function deflateZlib(data: Uint8Array, mode: \"stored\" | \"fixed-huffman\"): Uint8Array {\n const n = data.length;\n // Exact upper bound: a fixed-Huffman literal is at most 9 bits and a match of length L >= 3 at most 25 bits\n // per 3 bytes, so the block needs at most 9 bits per input byte plus 3 header and 7 end-of-block bits.\n const capacity = 2 + 4 + (mode === \"stored\" ? n + 5 * Math.max(1, Math.ceil(n / 65535)) : Math.ceil((9 * n + 10) / 8));\n const out = new Uint8Array(capacity);\n let pos = 0;\n out[pos++] = 0x78; out[pos++] = 0x01;\n if (mode === \"stored\") {\n if (n === 0) { out[pos++] = 1; out[pos++] = 0; out[pos++] = 0; out[pos++] = 255; out[pos++] = 255; }\n for (let i = 0; i < n; i += 65535) {\n const len = Math.min(65535, n - i);\n out[pos++] = i + len >= n ? 1 : 0; out[pos++] = len & 255; out[pos++] = len >> 8; out[pos++] = ~len & 255; out[pos++] = (~len >> 8) & 255;\n out.set(data.subarray(i, i + len), pos); pos += len;\n }\n } else {\n const { literalCode, literalBits, lengthCode, lengthBits, distanceCode, distanceBits } = fixedHuffmanTables();\n // LSB-first bit accumulator; at most 7 bits stay pending, and no single write exceeds 18 bits.\n let accumulator = 0b011, bits = 3; // BFINAL = 1, BTYPE = 01 (fixed Huffman)\n const window = DEFLATE_WINDOW, mask = window - 1, head = new Int32Array(1 << 15).fill(-1), previous = new Int32Array(window).fill(-1);\n // Hash of the 3 bytes at i: ((data[i] << 10) ^ (data[i + 1] << 5) ^ data[i + 2]) & 0x7fff. It rolls exactly as\n // h(i + 1) = ((h(i) << 5) ^ data[i + 3]) & 0x7fff, because the mask drops every bit of data[i] after the shift.\n const hashed = n - 2; // positions i < hashed have three bytes to hash\n let h = n >= 2 ? ((data[0]! << 5) ^ data[1]!) & 0x7fff : 0;\n for (let i = 0; i < n;) {\n let bestLength = 0, bestDistance = 0;\n if (i < hashed) {\n h = ((h << 5) ^ data[i + 2]!) & 0x7fff;\n const limit = Math.min(258, n - i);\n for (let candidate = head[h]!, probes = 0; candidate >= 0 && i - candidate <= window && probes < 64; candidate = previous[candidate & mask]!, probes++) {\n if (candidate >= i) break;\n // A candidate that differs at index bestLength cannot be longer than the current best.\n if (data[candidate + bestLength] !== data[i + bestLength]) continue;\n let length = 0; while (length < limit && data[candidate + length] === data[i + length]) length++;\n if (length > bestLength) { bestLength = length; bestDistance = i - candidate; if (length === limit) break; }\n }\n previous[i & mask] = head[h]!; head[h] = i;\n }\n if (bestLength >= 3) {\n accumulator |= lengthCode[bestLength]! << bits; bits += lengthBits[bestLength]!;\n while (bits >= 8) { out[pos++] = accumulator & 255; accumulator >>>= 8; bits -= 8; }\n accumulator |= distanceCode[bestDistance]! << bits; bits += distanceBits[bestDistance]!;\n const end = i + bestLength;\n for (i++; i < end; i++) {\n if (i < hashed) { h = ((h << 5) ^ data[i + 2]!) & 0x7fff; previous[i & mask] = head[h]!; head[h] = i; }\n }\n } else {\n const symbol = data[i++]!;\n accumulator |= literalCode[symbol]! << bits; bits += literalBits[symbol]!;\n }\n while (bits >= 8) { out[pos++] = accumulator & 255; accumulator >>>= 8; bits -= 8; }\n }\n accumulator |= literalCode[256]! << bits; bits += literalBits[256]!;\n while (bits > 0) { out[pos++] = accumulator & 255; accumulator >>>= 8; bits -= 8; } // flush and byte-align\n }\n const adler = adler32(data);\n out[pos++] = adler >>> 24; out[pos++] = (adler >>> 16) & 255; out[pos++] = (adler >>> 8) & 255; out[pos++] = adler & 255;\n return out.slice(0, pos);\n}\n\n/** Writes PNG filter `type` (0–4, PNG specification §9.2) of `raw` against `prior` into `target`. */\nfunction filterRow(type: number, raw: Uint8Array, prior: Uint8Array, target: Uint8Array, rowBytes: number, bpp: number): void {\n const head = Math.min(bpp, rowBytes);\n switch (type) {\n case 0: target.set(raw.subarray(0, rowBytes)); return;\n case 1:\n for (let i = 0; i < head; i++) target[i] = raw[i]!;\n for (let i = bpp; i < rowBytes; i++) target[i] = (raw[i]! - raw[i - bpp]!) & 255;\n return;\n case 2: for (let i = 0; i < rowBytes; i++) target[i] = (raw[i]! - prior[i]!) & 255; return;\n case 3:\n for (let i = 0; i < head; i++) target[i] = (raw[i]! - (prior[i]! >> 1)) & 255;\n for (let i = bpp; i < rowBytes; i++) target[i] = (raw[i]! - ((raw[i - bpp]! + prior[i]!) >> 1)) & 255;\n return;\n default:\n // Paeth with a = c = 0 in the first pixel predicts b.\n for (let i = 0; i < head; i++) target[i] = (raw[i]! - prior[i]!) & 255;\n for (let i = bpp; i < rowBytes; i++) {\n const a = raw[i - bpp]!, b = prior[i]!, c = prior[i - bpp]!, p = a + b - c, pa = Math.abs(p - a), pb = Math.abs(p - b), pc = Math.abs(p - c);\n target[i] = (raw[i]! - (pa <= pb && pa <= pc ? a : pb <= pc ? b : c)) & 255;\n }\n }\n}\n\n/** |v| of a filtered byte v read as a signed byte (two's complement), for the §12.7 heuristic. */\nconst SIGNED_BYTE_MAGNITUDE = Uint8Array.from({ length: 256 }, (_, v) => (v < 128 ? v : 256 - v));\n\n/** Sum of |signed byte| of filter `type` applied to a row (PNG specification §12.7), without writing the row. */\nfunction filterCost(type: number, raw: Uint8Array, prior: Uint8Array, rowBytes: number, bpp: number): number {\n const head = Math.min(bpp, rowBytes), magnitude = SIGNED_BYTE_MAGNITUDE;\n let sum = 0;\n switch (type) {\n case 0: for (let i = 0; i < rowBytes; i++) sum += magnitude[raw[i]!]!; return sum;\n case 1:\n for (let i = 0; i < head; i++) sum += magnitude[raw[i]!]!;\n for (let i = bpp; i < rowBytes; i++) sum += magnitude[(raw[i]! - raw[i - bpp]!) & 255]!;\n return sum;\n case 2: for (let i = 0; i < rowBytes; i++) sum += magnitude[(raw[i]! - prior[i]!) & 255]!; return sum;\n case 3:\n for (let i = 0; i < head; i++) sum += magnitude[(raw[i]! - (prior[i]! >> 1)) & 255]!;\n for (let i = bpp; i < rowBytes; i++) sum += magnitude[(raw[i]! - ((raw[i - bpp]! + prior[i]!) >> 1)) & 255]!;\n return sum;\n default:\n for (let i = 0; i < head; i++) sum += magnitude[(raw[i]! - prior[i]!) & 255]!;\n for (let i = bpp; i < rowBytes; i++) {\n const a = raw[i - bpp]!, b = prior[i]!, c = prior[i - bpp]!, p = a + b - c, pa = Math.abs(p - a), pb = Math.abs(p - b), pc = Math.abs(p - c);\n sum += magnitude[(raw[i]! - (pa <= pb && pa <= pc ? a : pb <= pc ? b : c)) & 255]!;\n }\n return sum;\n }\n}\n\nfunction requireFields(value: unknown, allowed: readonly string[], name: string): void {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) fail(name + \" must be an object.\");\n for (const key of Object.keys(value)) if (!allowed.includes(key)) fail(\"unknown \" + name + \" field.\");\n}\n\nfunction finite(value: number, minimum: number, maximum: number, message: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < minimum || value > maximum) fail(message);\n return value;\n}\n\n/**\n * Encode an RGB still image as PNG (colour type 2, no interlace). Samples are written unchanged; 16-bit\n * samples are stored big-endian as PNG requires. Throws `InvalidConfigurationError` for any invalid or\n * inconsistent field before allocating the scanline buffer.\n */\nexport function serializePngImage(input: PngEncodeInput): Uint8Array {\n if (input === null || typeof input !== \"object\") fail(\"input must be an object.\");\n for (const key of Object.keys(input)) if (![\"width\", \"height\", \"bitDepth\", \"samples\", \"colourEncoding\", \"masteringDisplay\", \"contentLightLevel\", \"compression\", \"filter\", \"maximumPixels\"].includes(key)) fail(\"unknown input field.\");\n const { width, height, bitDepth, samples } = input;\n const maximumPixels = resolveRaisedLimit(input.maximumPixels, PNG_ENCODER_LIMITS.maximumPixels, PNG_ENCODER_LIMITS.ceilingPixels,\n \"PNG encoder: maximumPixels must be an integer from 1 to \" + PNG_ENCODER_LIMITS.ceilingPixels + \".\");\n if (![width, height].every((v) => Number.isSafeInteger(v) && v >= 1 && v <= PNG_ENCODER_LIMITS.maximumDimension) || width * height > maximumPixels) fail(\"dimensions are out of range.\");\n if (bitDepth !== 8 && bitDepth !== 16) fail(\"bitDepth must be 8 or 16.\");\n if (bitDepth === 8 ? !(samples instanceof Uint8Array) : !(samples instanceof Uint16Array)) fail(\"samples must be a Uint8Array for 8-bit or a Uint16Array for 16-bit.\");\n if (samples.length !== width * height * 3) fail(\"samples must hold width x height RGB triples.\");\n const compression = input.compression ?? \"fixed-huffman\", filter = input.filter ?? \"adaptive\";\n if (compression !== \"stored\" && compression !== \"fixed-huffman\") fail(\"unknown compression.\");\n const filters = [\"none\", \"sub\", \"up\", \"average\", \"paeth\", \"adaptive\"] as const;\n if (!filters.includes(filter)) fail(\"unknown filter.\");\n const colour = input.colourEncoding;\n if (colour === null || typeof colour !== \"object\") fail(\"colourEncoding is required.\");\n const colourFields = typeof colour.kind === \"string\" && Object.hasOwn(COLOUR_ENCODING_FIELDS, colour.kind) ? COLOUR_ENCODING_FIELDS[colour.kind]! : undefined;\n if (colourFields === undefined) fail(\"unknown colourEncoding kind.\");\n for (const key of Object.keys(colour)) if (!colourFields.includes(key)) fail(\"unknown colourEncoding field.\");\n if (input.masteringDisplay !== undefined) requireFields(input.masteringDisplay, [\"redXy\", \"greenXy\", \"blueXy\", \"whiteXy\", \"maximumLuminanceCdPerSquareMeter\", \"minimumLuminanceCdPerSquareMeter\"], \"masteringDisplay\");\n if (input.contentLightLevel !== undefined) requireFields(input.contentLightLevel, [\"maximumContentLightLevelCdPerSquareMeter\", \"maximumFrameAverageLightLevelCdPerSquareMeter\"], \"contentLightLevel\");\n\n const chunks: { type: string; data: Uint8Array }[] = [];\n const ihdr = new Uint8Array(13), view = new DataView(ihdr.buffer);\n view.setUint32(0, width); view.setUint32(4, height); ihdr[8] = bitDepth; ihdr[9] = 2; // colour type 2: truecolour\n chunks.push({ type: \"IHDR\", data: ihdr });\n if (colour.kind === \"cicp\") {\n const p = PRIMARIES.get(colour.primaries), t = TRANSFER.get(colour.transfer);\n if (p === undefined || t === undefined || typeof colour.fullRange !== \"boolean\") fail(\"unknown cICP primaries or transfer.\");\n // MatrixCoefficients 0 (identity/RGB) is the only value PNG permits.\n chunks.push({ type: \"cICP\", data: Uint8Array.of(p, t, 0, colour.fullRange ? 1 : 0) });\n } else if (colour.kind === \"icc\") {\n const name = colour.profileName, profile = colour.profile;\n if (typeof name !== \"string\" || !/^[\\x20-\\x7e\\xa1-\\xff]{1,79}$/.test(name) || name.startsWith(\" \") || name.endsWith(\" \") || name.includes(\" \")) fail(\"ICC profile name must be 1-79 Latin-1 characters without leading, trailing or repeated spaces.\");\n if (!(profile instanceof Uint8Array) || profile.length < 132 || profile.length > PNG_ENCODER_LIMITS.maximumIccProfileBytes ||\n new DataView(profile.buffer, profile.byteOffset, profile.byteLength).getUint32(0) !== profile.length) fail(\"ICC profile must be a complete profile whose header size matches its length.\");\n const compressed = deflateZlib(profile, compression), data = new Uint8Array(name.length + 2 + compressed.length);\n for (let i = 0; i < name.length; i++) data[i] = name.charCodeAt(i);\n data.set(compressed, name.length + 2); // NUL separator and compression method 0 are already zero\n chunks.push({ type: \"iCCP\", data });\n } else if (colour.kind === \"srgb\") {\n const intent = INTENT.get(colour.renderingIntent);\n if (intent === undefined) fail(\"unknown sRGB rendering intent.\");\n // PNG Third Edition Table 17: the only gAMA/cHRM values to accompany sRGB.\n const gama = new Uint8Array(4); new DataView(gama.buffer).setUint32(0, 45455);\n const chrm = new Uint8Array(32), c = new DataView(chrm.buffer);\n [31270, 32900, 64000, 33000, 30000, 60000, 15000, 6000].forEach((v, i) => c.setUint32(i * 4, v));\n chunks.push({ type: \"sRGB\", data: Uint8Array.of(intent) }, { type: \"gAMA\", data: gama }, { type: \"cHRM\", data: chrm });\n } else fail(\"unknown colourEncoding kind.\");\n if ((input.masteringDisplay || input.contentLightLevel) && colour.kind !== \"cicp\") fail(\"mDCV and cLLI metadata require a cICP colour encoding.\");\n if (input.masteringDisplay) {\n const m = input.masteringDisplay, data = new Uint8Array(24), d = new DataView(data.buffer);\n [m.redXy, m.greenXy, m.blueXy, m.whiteXy].forEach((xy, i) => {\n if (!Array.isArray(xy) || xy.length !== 2) fail(\"mastering chromaticities must be [x, y] pairs.\");\n // Stored value = chromaticity / 0.00002, a PNG two-byte unsigned integer.\n for (let k = 0; k < 2; k++) d.setUint16(i * 4 + k * 2, Math.round(finite(xy[k]!, 0, 1.3107, \"mastering chromaticity must be in 0..1.3107.\") * 50000));\n });\n const max = finite(m.maximumLuminanceCdPerSquareMeter, 0, 429496.7295, \"mastering luminance is out of range.\"), min = finite(m.minimumLuminanceCdPerSquareMeter, 0, 429496.7295, \"mastering luminance is out of range.\");\n if (min >= max) fail(\"mastering minimum luminance must be below the maximum.\");\n d.setUint32(16, Math.round(max * 10000)); d.setUint32(20, Math.round(min * 10000)); // divisor 0.0001 cd/m²\n chunks.push({ type: \"mDCV\", data });\n }\n if (input.contentLightLevel) {\n const l = input.contentLightLevel, data = new Uint8Array(8), d = new DataView(data.buffer);\n const cll = finite(l.maximumContentLightLevelCdPerSquareMeter, 0, 429496.7295, \"content light level is out of range.\"), fall = finite(l.maximumFrameAverageLightLevelCdPerSquareMeter, 0, 429496.7295, \"content light level is out of range.\");\n if (cll !== 0 && fall > cll) fail(\"MaxFALL cannot exceed MaxCLL.\");\n d.setUint32(0, Math.round(cll * 10000)); d.setUint32(4, Math.round(fall * 10000));\n chunks.push({ type: \"cLLI\", data });\n }\n\n // Scanlines: one filter-type byte then big-endian samples; bpp = bytes per complete pixel.\n const bpp = bitDepth === 8 ? 3 : 6, rowBytes = width * bpp;\n let raw = new Uint8Array(rowBytes), prior = new Uint8Array(rowBytes);\n const filtered = new Uint8Array(height * (rowBytes + 1)), fixedType = filters.indexOf(filter);\n for (let y = 0; y < height; y++) {\n const base = y * width * 3;\n if (bitDepth === 8) raw.set((samples as Uint8Array).subarray(base, base + width * 3));\n else for (let i = 0; i < width * 3; i++) { const v = samples[base + i]!; raw[i * 2] = v >> 8; raw[i * 2 + 1] = v & 255; }\n const row = y * (rowBytes + 1) + 1;\n let type = fixedType;\n if (filter === \"adaptive\") {\n // PNG specification §12.7 heuristic: choose the type with the minimum sum of |signed byte| (ties: lowest type).\n let best = Infinity;\n for (let t = 0; t <= 4; t++) {\n const sum = filterCost(t, raw, prior, rowBytes, bpp);\n if (sum < best) { best = sum; type = t; }\n }\n }\n filtered[row - 1] = type; filterRow(type, raw, prior, filtered.subarray(row, row + rowBytes), rowBytes, bpp);\n const done = prior; prior = raw; raw = done; // this row is the next row's prior\n }\n const idat = deflateZlib(filtered, compression);\n\n const out = new ByteSink();\n out.push(137, 80, 78, 71, 13, 10, 26, 10);\n const writeChunk = (type: string, data: Uint8Array): void => {\n const typeBytes = Uint8Array.from(type, (ch) => ch.charCodeAt(0));\n out.u32(data.length); out.append(typeBytes); out.append(data);\n out.u32(pngCrc32(data, pngCrc32(typeBytes)));\n };\n for (const chunk of chunks) writeChunk(chunk.type, chunk.data);\n for (let i = 0; i < idat.length; i += 1 << 20) writeChunk(\"IDAT\", idat.subarray(i, Math.min(idat.length, i + (1 << 20))));\n writeChunk(\"IEND\", new Uint8Array(0));\n return out.result();\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  // castleCSF numerical model material: Copyright (c) 2023 Graphics and Displays
3
- // group - University of Cambridge. MIT terms retained in NOTICE and
4
- // docs/licenses/castleCSF-MIT.txt. Original bounded TypeScript adapter.
3
+ // group - University of Cambridge. MIT terms retained in NOTICE (the full
4
+ // licence text). Original bounded TypeScript adapter.
5
5
  /** Contrast detection threshold for a static, neutral (D65 white) Gabor patch, from the castleCSF
6
6
  * contrast sensitivity function (CSF) model. A Gabor patch is a sine grating under a Gaussian envelope.
7
7
  * It does not say whether detail in a photograph will be visible.
@@ -1 +1 @@
1
- {"version":3,"file":"print-contrast-reference.js","sourceRoot":"","sources":["../../src/output/print-contrast-reference.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n// castleCSF numerical model material: Copyright (c) 2023 Graphics and Displays\n// group - University of Cambridge. MIT terms retained in NOTICE and\n// docs/licenses/castleCSF-MIT.txt. Original bounded TypeScript adapter.\n\n/** Contrast detection threshold for a static, neutral (D65 white) Gabor patch, from the castleCSF\n * contrast sensitivity function (CSF) model. A Gabor patch is a sine grating under a Gaussian envelope.\n * It does not say whether detail in a photograph will be visible.\n * @see docs/PRINT_CONTRAST_REFERENCE.md for exact source, applicability and review gates.\n */\nimport { estimatedResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { freezeOwnedData } from \"../core/owned-data.js\";\nimport { requireAllowlistedRecord, requirePublicOpaqueId } from \"../core/record-validation.js\";\nimport { ENGINE_API_VERSION } from \"../core/version.js\";\n\nexport const PRINT_CONTRAST_REFERENCE_MODEL_VERSION = \"0.1.0\" as const;\n/** Identifies the exact MIT-licensed model source. It is not a local calibration. */\nexport const PRINT_CONTRAST_REFERENCE_UPSTREAM_REVISION = \"f4b0b722af83001d7af979281e06ca642d36e4e8\" as const;\n\n/** The narrow reference stimulus. It is separate from any measured photographic region of interest (ROI).\n * Positive values outside the model's range return \"unsupported\" instead of being extrapolated.\n */\nexport interface PrintContrastReferenceInput {\n referenceId: string;\n stimulus: \"static-neutral-d65-gabor\";\n observer: \"published-binocular-natural-pupil-reference\";\n /** Mean luminance of the uniform D65 background and grating. Not the average of a photographic ROI. */\n meanLuminanceCdPerSquareMeter: number;\n spatialFrequencyCyclesPerDegree: number;\n gaussianEnvelopeSigmaDegrees: number;\n temporalFrequencyHz: number;\n eccentricityDegrees: number;\n /** Fractional amplitude of the neutral grating before the Gaussian envelope. Not taken from ROI minimum and maximum values. */\n modulationMichelson: number;\n}\nexport interface PrintContrastReference {\n referenceId: string;\n engineApiVersion: string;\n modelVersion: typeof PRINT_CONTRAST_REFERENCE_MODEL_VERSION;\n upstreamRevision: typeof PRINT_CONTRAST_REFERENCE_UPSTREAM_REVISION;\n input: PrintContrastReferenceInput;\n status: \"model-estimate\" | \"unsupported\";\n blockers: string[];\n estimate: { contrastSensitivity: number; thresholdModulationMichelson: number; suppliedModulationToModelThresholdRatio: number } | null;\n observerApplicability: \"population-reference-unverified-for-individual\";\n naturalImageVisibility: \"unassessed\";\n printStimulusMatch: \"unassessed\";\n uncertainty: \"not-quantified\";\n overallPrintVerdict: \"not-offered\";\n}\n\n/** Strictly parses and copies the explicit reference conditions. No defaults are filled in to imply an observer. */\nexport function parsePrintContrastReferenceInput(value: unknown): PrintContrastReferenceInput {\n const r = requireAllowlistedRecord(value, [\"referenceId\", \"stimulus\", \"observer\", \"meanLuminanceCdPerSquareMeter\", \"spatialFrequencyCyclesPerDegree\",\n \"gaussianEnvelopeSigmaDegrees\", \"temporalFrequencyHz\", \"eccentricityDegrees\", \"modulationMichelson\"], \"Invalid Print contrast reference fields.\");\n const number = (key: string, positive: boolean): number => {\n const v = r[key];\n if (typeof v !== \"number\" || !Number.isFinite(v) || (positive ? v <= 0 : v < 0)) throw new InvalidConfigurationError(\"Print contrast reference quantities must be finite and in their numeric domain.\");\n return v === 0 ? 0 : v;\n };\n if (r.stimulus !== \"static-neutral-d65-gabor\" || r.observer !== \"published-binocular-natural-pupil-reference\") throw new InvalidConfigurationError(\"Unknown Print reference stimulus/observer.\");\n const modulationMichelson = number(\"modulationMichelson\", false);\n if (modulationMichelson > 1) throw new InvalidConfigurationError(\"Reference Michelson modulation must be at most one.\");\n return { referenceId: requirePublicOpaqueId(r.referenceId, \"Invalid public Print contrast reference identity.\"), stimulus: r.stimulus, observer: r.observer,\n meanLuminanceCdPerSquareMeter: number(\"meanLuminanceCdPerSquareMeter\", true), spatialFrequencyCyclesPerDegree: number(\"spatialFrequencyCyclesPerDegree\", true),\n gaussianEnvelopeSigmaDegrees: number(\"gaussianEnvelopeSigmaDegrees\", true), temporalFrequencyHz: number(\"temporalFrequencyHz\", false),\n eccentricityDegrees: number(\"eccentricityDegrees\", false), modulationMichelson };\n}\n\n// Independently written scalar evaluation of the licensed numerical model.\n// Using log1p/expm1 keeps the small hyperbolic saturation term accurate.\nfunction luminanceDependency(p: readonly number[], luminance: number): number {\n if (p.length === 2) return p[1]! * luminance ** p[0]!;\n const first = p[0]! * Math.exp(-p[2]! * Math.log1p(p[1]! / luminance));\n return p.length === 3 ? first : first * -Math.expm1(-p[4]! * Math.log1p(p[3]! / luminance));\n}\nfunction component(frequency: number, area: number, peak: number, peakFrequency: number, bandwidth: number, lowFrequencyFloor: number, a0: number, f0: number): number {\n const logDifference = Math.log10(frequency) - Math.log10(peakFrequency);\n const parabola = 10 ** (-logDifference * logDifference / 2 ** bandwidth);\n const shape = frequency < peakFrequency ? Math.max(parabola, lowFrequencyFloor) : parabola;\n const criticalArea = a0 / (1 + (frequency / f0) ** 2);\n return peak * shape * Math.sqrt(criticalArea / (1 + criticalArea / area)) * frequency;\n}\nfunction staticNeutralSensitivity(luminance: number, frequency: number): number {\n const area = Math.PI * 1.5 ** 2;\n const sustained = component(frequency, area, luminanceDependency([56.4947, 7.54726, .144532, 5.58341e-7, 9.66862e9], luminance),\n luminanceDependency([1.78119, 91.5718, .256682], luminance), .000213047, 1 - .100207, 157.103, .702338);\n const transient = component(frequency, area, luminanceDependency([.193434, 2748.09], luminance), .000316696, 2.6761, 1 - .000241177, 3.81611, 3.01389);\n const omegaPeak = Math.log10(luminance) * 2.41482 + 4.7036;\n const achromatic = sustained + transient * Math.exp(-((omegaPeak ** .1898) ** 2) / .0844836);\n const redGreen = component(frequency, area, luminanceDependency([681.434, 38.0038, .480386], luminance), .0178364, 2.42104, 1, 2816.44, .0711058);\n const yellowViolet = component(frequency, area, luminanceDependency([166.683, 62.8974, .41193], luminance), .00425753, 2.68197, 1, 2.82789e7, .000635093);\n // Modulate each cone channel of the D65 LMS background [L,M,S] by the same fraction.\n // All three mechanism responses are kept, including nonzero colour-opponent parts.\n const redGreenProjection = Math.abs(.6991 - 2.3112 * .3009);\n const yellowVioletProjection = Math.abs(-.6991 - .3009 + 50.9875 * .0198);\n return Math.hypot(achromatic, redGreenProjection * redGreen, yellowVioletProjection * yellowViolet);\n}\n\n/** Estimates the detection threshold from the published model, within its limited range. It does not claim that detail is invisible to any particular person. */\nexport function calculatePrintContrastReference(value: PrintContrastReferenceInput): CalculationResult<PrintContrastReference> {\n const input = parsePrintContrastReferenceInput(value), l = input.meanLuminanceCdPerSquareMeter, f = input.spatialFrequencyCyclesPerDegree;\n const result: PrintContrastReference = { referenceId: input.referenceId, engineApiVersion: ENGINE_API_VERSION, modelVersion: PRINT_CONTRAST_REFERENCE_MODEL_VERSION,\n upstreamRevision: PRINT_CONTRAST_REFERENCE_UPSTREAM_REVISION, input, status: \"unsupported\", blockers: [], estimate: null,\n observerApplicability: \"population-reference-unverified-for-individual\", naturalImageVisibility: \"unassessed\", printStimulusMatch: \"unassessed\",\n uncertainty: \"not-quantified\", overallPrintVerdict: \"not-offered\" };\n if (l < 1 || l > 1000 || f < .25 || f > 16 || input.gaussianEnvelopeSigmaDegrees !== 1.5 || input.temporalFrequencyHz !== 0 || input.eccentricityDegrees !== 0) result.blockers.push(\"outside-static-neutral-reference-domain\");\n else {\n const sensitivity = staticNeutralSensitivity(l, f), threshold = 1 / sensitivity, ratio = input.modulationMichelson * sensitivity;\n if (![sensitivity, threshold, ratio].every(Number.isFinite) || sensitivity <= 0 || threshold <= 0) result.blockers.push(\"contrast-reference-numeric-range-unsupported\");\n else { result.status = \"model-estimate\"; result.estimate = { contrastSensitivity: sensitivity, thresholdModulationMichelson: threshold, suppliedModulationToModelThresholdRatio: ratio }; }\n }\n return freezeOwnedData(estimatedResult(result, \"castlecsf-static-neutral-d65-reference\", PRINT_CONTRAST_REFERENCE_MODEL_VERSION,\n [\"Static foveal D65 equal-fraction LMS Gabor; Gaussian envelope sigma is exactly 1.5 degrees.\",\n \"Published population model reference; personal eyesight, natural-image masking and actual print-stimulus matching remain unassessed.\",\n \"The numerical envelope is restricted; published model-fit errors do not become an individual confidence interval or a print verdict.\"], {\n validRanges: [\n { parameterPath: \"meanLuminanceCdPerSquareMeter\", unit: \"cd/m^2\", minimum: 1, maximum: 1000, note: \"Restricted numerical reference envelope; no individual calibration.\" },\n { parameterPath: \"spatialFrequencyCyclesPerDegree\", unit: \"cycles/degree\", minimum: .25, maximum: 16 },\n { parameterPath: \"gaussianEnvelopeSigmaDegrees\", unit: \"degree\", minimum: 1.5, maximum: 1.5 },\n { parameterPath: \"temporalFrequencyHz\", unit: \"Hz\", minimum: 0, maximum: 0 },\n { parameterPath: \"eccentricityDegrees\", unit: \"degree\", minimum: 0, maximum: 0 }\n ], notes: [\"Uncertainty is not quantified; numerical conformance is distinct from stimulus/observer qualification.\"]\n }));\n}\n"]}
1
+ {"version":3,"file":"print-contrast-reference.js","sourceRoot":"","sources":["../../src/output/print-contrast-reference.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n// castleCSF numerical model material: Copyright (c) 2023 Graphics and Displays\n// group - University of Cambridge. MIT terms retained in NOTICE (the full\n// licence text). Original bounded TypeScript adapter.\n\n/** Contrast detection threshold for a static, neutral (D65 white) Gabor patch, from the castleCSF\n * contrast sensitivity function (CSF) model. A Gabor patch is a sine grating under a Gaussian envelope.\n * It does not say whether detail in a photograph will be visible.\n * @see docs/PRINT_CONTRAST_REFERENCE.md for exact source, applicability and review gates.\n */\nimport { estimatedResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { freezeOwnedData } from \"../core/owned-data.js\";\nimport { requireAllowlistedRecord, requirePublicOpaqueId } from \"../core/record-validation.js\";\nimport { ENGINE_API_VERSION } from \"../core/version.js\";\n\nexport const PRINT_CONTRAST_REFERENCE_MODEL_VERSION = \"0.1.0\" as const;\n/** Identifies the exact MIT-licensed model source. It is not a local calibration. */\nexport const PRINT_CONTRAST_REFERENCE_UPSTREAM_REVISION = \"f4b0b722af83001d7af979281e06ca642d36e4e8\" as const;\n\n/** The narrow reference stimulus. It is separate from any measured photographic region of interest (ROI).\n * Positive values outside the model's range return \"unsupported\" instead of being extrapolated.\n */\nexport interface PrintContrastReferenceInput {\n referenceId: string;\n stimulus: \"static-neutral-d65-gabor\";\n observer: \"published-binocular-natural-pupil-reference\";\n /** Mean luminance of the uniform D65 background and grating. Not the average of a photographic ROI. */\n meanLuminanceCdPerSquareMeter: number;\n spatialFrequencyCyclesPerDegree: number;\n gaussianEnvelopeSigmaDegrees: number;\n temporalFrequencyHz: number;\n eccentricityDegrees: number;\n /** Fractional amplitude of the neutral grating before the Gaussian envelope. Not taken from ROI minimum and maximum values. */\n modulationMichelson: number;\n}\nexport interface PrintContrastReference {\n referenceId: string;\n engineApiVersion: string;\n modelVersion: typeof PRINT_CONTRAST_REFERENCE_MODEL_VERSION;\n upstreamRevision: typeof PRINT_CONTRAST_REFERENCE_UPSTREAM_REVISION;\n input: PrintContrastReferenceInput;\n status: \"model-estimate\" | \"unsupported\";\n blockers: string[];\n estimate: { contrastSensitivity: number; thresholdModulationMichelson: number; suppliedModulationToModelThresholdRatio: number } | null;\n observerApplicability: \"population-reference-unverified-for-individual\";\n naturalImageVisibility: \"unassessed\";\n printStimulusMatch: \"unassessed\";\n uncertainty: \"not-quantified\";\n overallPrintVerdict: \"not-offered\";\n}\n\n/** Strictly parses and copies the explicit reference conditions. No defaults are filled in to imply an observer. */\nexport function parsePrintContrastReferenceInput(value: unknown): PrintContrastReferenceInput {\n const r = requireAllowlistedRecord(value, [\"referenceId\", \"stimulus\", \"observer\", \"meanLuminanceCdPerSquareMeter\", \"spatialFrequencyCyclesPerDegree\",\n \"gaussianEnvelopeSigmaDegrees\", \"temporalFrequencyHz\", \"eccentricityDegrees\", \"modulationMichelson\"], \"Invalid Print contrast reference fields.\");\n const number = (key: string, positive: boolean): number => {\n const v = r[key];\n if (typeof v !== \"number\" || !Number.isFinite(v) || (positive ? v <= 0 : v < 0)) throw new InvalidConfigurationError(\"Print contrast reference quantities must be finite and in their numeric domain.\");\n return v === 0 ? 0 : v;\n };\n if (r.stimulus !== \"static-neutral-d65-gabor\" || r.observer !== \"published-binocular-natural-pupil-reference\") throw new InvalidConfigurationError(\"Unknown Print reference stimulus/observer.\");\n const modulationMichelson = number(\"modulationMichelson\", false);\n if (modulationMichelson > 1) throw new InvalidConfigurationError(\"Reference Michelson modulation must be at most one.\");\n return { referenceId: requirePublicOpaqueId(r.referenceId, \"Invalid public Print contrast reference identity.\"), stimulus: r.stimulus, observer: r.observer,\n meanLuminanceCdPerSquareMeter: number(\"meanLuminanceCdPerSquareMeter\", true), spatialFrequencyCyclesPerDegree: number(\"spatialFrequencyCyclesPerDegree\", true),\n gaussianEnvelopeSigmaDegrees: number(\"gaussianEnvelopeSigmaDegrees\", true), temporalFrequencyHz: number(\"temporalFrequencyHz\", false),\n eccentricityDegrees: number(\"eccentricityDegrees\", false), modulationMichelson };\n}\n\n// Independently written scalar evaluation of the licensed numerical model.\n// Using log1p/expm1 keeps the small hyperbolic saturation term accurate.\nfunction luminanceDependency(p: readonly number[], luminance: number): number {\n if (p.length === 2) return p[1]! * luminance ** p[0]!;\n const first = p[0]! * Math.exp(-p[2]! * Math.log1p(p[1]! / luminance));\n return p.length === 3 ? first : first * -Math.expm1(-p[4]! * Math.log1p(p[3]! / luminance));\n}\nfunction component(frequency: number, area: number, peak: number, peakFrequency: number, bandwidth: number, lowFrequencyFloor: number, a0: number, f0: number): number {\n const logDifference = Math.log10(frequency) - Math.log10(peakFrequency);\n const parabola = 10 ** (-logDifference * logDifference / 2 ** bandwidth);\n const shape = frequency < peakFrequency ? Math.max(parabola, lowFrequencyFloor) : parabola;\n const criticalArea = a0 / (1 + (frequency / f0) ** 2);\n return peak * shape * Math.sqrt(criticalArea / (1 + criticalArea / area)) * frequency;\n}\nfunction staticNeutralSensitivity(luminance: number, frequency: number): number {\n const area = Math.PI * 1.5 ** 2;\n const sustained = component(frequency, area, luminanceDependency([56.4947, 7.54726, .144532, 5.58341e-7, 9.66862e9], luminance),\n luminanceDependency([1.78119, 91.5718, .256682], luminance), .000213047, 1 - .100207, 157.103, .702338);\n const transient = component(frequency, area, luminanceDependency([.193434, 2748.09], luminance), .000316696, 2.6761, 1 - .000241177, 3.81611, 3.01389);\n const omegaPeak = Math.log10(luminance) * 2.41482 + 4.7036;\n const achromatic = sustained + transient * Math.exp(-((omegaPeak ** .1898) ** 2) / .0844836);\n const redGreen = component(frequency, area, luminanceDependency([681.434, 38.0038, .480386], luminance), .0178364, 2.42104, 1, 2816.44, .0711058);\n const yellowViolet = component(frequency, area, luminanceDependency([166.683, 62.8974, .41193], luminance), .00425753, 2.68197, 1, 2.82789e7, .000635093);\n // Modulate each cone channel of the D65 LMS background [L,M,S] by the same fraction.\n // All three mechanism responses are kept, including nonzero colour-opponent parts.\n const redGreenProjection = Math.abs(.6991 - 2.3112 * .3009);\n const yellowVioletProjection = Math.abs(-.6991 - .3009 + 50.9875 * .0198);\n return Math.hypot(achromatic, redGreenProjection * redGreen, yellowVioletProjection * yellowViolet);\n}\n\n/** Estimates the detection threshold from the published model, within its limited range. It does not claim that detail is invisible to any particular person. */\nexport function calculatePrintContrastReference(value: PrintContrastReferenceInput): CalculationResult<PrintContrastReference> {\n const input = parsePrintContrastReferenceInput(value), l = input.meanLuminanceCdPerSquareMeter, f = input.spatialFrequencyCyclesPerDegree;\n const result: PrintContrastReference = { referenceId: input.referenceId, engineApiVersion: ENGINE_API_VERSION, modelVersion: PRINT_CONTRAST_REFERENCE_MODEL_VERSION,\n upstreamRevision: PRINT_CONTRAST_REFERENCE_UPSTREAM_REVISION, input, status: \"unsupported\", blockers: [], estimate: null,\n observerApplicability: \"population-reference-unverified-for-individual\", naturalImageVisibility: \"unassessed\", printStimulusMatch: \"unassessed\",\n uncertainty: \"not-quantified\", overallPrintVerdict: \"not-offered\" };\n if (l < 1 || l > 1000 || f < .25 || f > 16 || input.gaussianEnvelopeSigmaDegrees !== 1.5 || input.temporalFrequencyHz !== 0 || input.eccentricityDegrees !== 0) result.blockers.push(\"outside-static-neutral-reference-domain\");\n else {\n const sensitivity = staticNeutralSensitivity(l, f), threshold = 1 / sensitivity, ratio = input.modulationMichelson * sensitivity;\n if (![sensitivity, threshold, ratio].every(Number.isFinite) || sensitivity <= 0 || threshold <= 0) result.blockers.push(\"contrast-reference-numeric-range-unsupported\");\n else { result.status = \"model-estimate\"; result.estimate = { contrastSensitivity: sensitivity, thresholdModulationMichelson: threshold, suppliedModulationToModelThresholdRatio: ratio }; }\n }\n return freezeOwnedData(estimatedResult(result, \"castlecsf-static-neutral-d65-reference\", PRINT_CONTRAST_REFERENCE_MODEL_VERSION,\n [\"Static foveal D65 equal-fraction LMS Gabor; Gaussian envelope sigma is exactly 1.5 degrees.\",\n \"Published population model reference; personal eyesight, natural-image masking and actual print-stimulus matching remain unassessed.\",\n \"The numerical envelope is restricted; published model-fit errors do not become an individual confidence interval or a print verdict.\"], {\n validRanges: [\n { parameterPath: \"meanLuminanceCdPerSquareMeter\", unit: \"cd/m^2\", minimum: 1, maximum: 1000, note: \"Restricted numerical reference envelope; no individual calibration.\" },\n { parameterPath: \"spatialFrequencyCyclesPerDegree\", unit: \"cycles/degree\", minimum: .25, maximum: 16 },\n { parameterPath: \"gaussianEnvelopeSigmaDegrees\", unit: \"degree\", minimum: 1.5, maximum: 1.5 },\n { parameterPath: \"temporalFrequencyHz\", unit: \"Hz\", minimum: 0, maximum: 0 },\n { parameterPath: \"eccentricityDegrees\", unit: \"degree\", minimum: 0, maximum: 0 }\n ], notes: [\"Uncertainty is not quantified; numerical conformance is distinct from stimulus/observer qualification.\"]\n }));\n}\n"]}
@@ -17,7 +17,7 @@ export const PRINT_JPEG_SCHEMA_VERSION = "0.2.0";
17
17
  * `maximumPixels`, up to `ceilingPixels`. A raised limit raises the `maximumEncodedBytes` ceiling in proportion
18
18
  * (256 000 000 bytes per 24 000 000 source pixels).
19
19
  */
20
- export const PRINT_JPEG_LIMITS = Object.freeze({ maximumPixels: 24_000_000, ceilingPixels: FULL_RESOLUTION_CEILING_PIXELS, maximumDimension: 16_384,
20
+ export const PRINT_JPEG_LIMITS = /* @__PURE__ */ Object.freeze({ maximumPixels: 24_000_000, ceilingPixels: FULL_RESOLUTION_CEILING_PIXELS, maximumDimension: 16_384,
21
21
  maximumEncodedBytes: 256_000_000, maximumProviderReads: 1_000_000 });
22
22
  let srgbDecode;
23
23
  /** decodeSrgbComponent(v/255) for every 8-bit code v, computed once with the same function (identical values). */
@@ -1 +1 @@
1
- {"version":3,"file":"print-jpeg.js","sourceRoot":"","sources":["../../src/output/print-jpeg.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Print JPEG export: downsamples an SDR image by exact area averaging, then writes a baseline JPEG\n * with an ICC colour profile. Bounded in size; the encoder is written for this project.\n */\nimport { createExportJpegEncoder, encodeJpegStrip, EXPORT_JPEG_ENCODER_ID, type JpegStripBits } from \"../capture/export-jpeg.js\";\nimport { packExportJpegExif, exportTiffNumbers, exportTiffAscii, exportTiffRationals, type ExportTiffTag } from \"../capture/export-tiff.js\";\nimport { createSrgbIccProfile, SRGB_ICC_PROFILE_VERSION } from \"../color/srgb-icc.js\";\nimport { decodeSrgbComponent, encodeSrgbComponent } from \"../color/srgb-transfer.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { requireAllowlistedRecord, requirePublicOpaqueId } from \"../core/record-validation.js\";\nimport { freezeOwnedData } from \"../core/owned-data.js\";\nimport { FULL_RESOLUTION_CEILING_PIXELS, resolveRaisedLimit, scaleBudgetCeiling } from \"../core/pixel-limits.js\";\nimport type { NativeRawTaskState } from \"../capture/native-raw.js\";\nimport type { RasterRect } from \"./capture-geometry.js\";\nexport const PRINT_JPEG_SCHEMA_VERSION=\"0.2.0\" as const;\n/**\n * Admission limits. `maximumPixels` is the default source limit; a request may raise it with its own\n * `maximumPixels`, up to `ceilingPixels`. A raised limit raises the `maximumEncodedBytes` ceiling in proportion\n * (256 000 000 bytes per 24 000 000 source pixels).\n */\nexport const PRINT_JPEG_LIMITS=Object.freeze({maximumPixels:24_000_000,ceilingPixels:FULL_RESOLUTION_CEILING_PIXELS,maximumDimension:16_384,\n maximumEncodedBytes:256_000_000,maximumProviderReads:1_000_000});\nlet srgbDecode:Float64Array|undefined;\n/** decodeSrgbComponent(v/255) for every 8-bit code v, computed once with the same function (identical values). */\nfunction srgbDecodeTable():Float64Array{return srgbDecode??=Float64Array.from({length:256},(_,v)=>decodeSrgbComponent(v/255));}\nexport interface PrintJpegSource {\n captureId:string;imageStateId:string;artifactId:string;sha256:string;\n width:number;height:number;\n encoding:\"encoded-srgb-8-rgb\";\n}\nexport interface PrintJpegInput {\n source:PrintJpegSource;\n /** Integer crop in the oriented output source image, not in sensor or CFA (colour filter array) coordinates. */\n crop:RasterRect;\n outputWidth:number;outputHeight:number;\n quantizationStep:number;\n maximumEncodedBytes:number;\n /**\n * Maximum provider `readTile` calls. The task reads each crop pixel exactly once, in tiles of at most\n * 256 x 32 pixels aligned to the crop origin, so it needs ceil(crop.height/32) x ceil(crop.width/256)\n * reads; a smaller budget fails before the first read.\n */\n maximumProviderReads:number;\n /**\n * Optional physical print density in pixels per inch (1..65535) from the caller's print plan. When present,\n * EXIF IFD0 records XResolution = YResolution = this value as a RATIONAL with ResolutionUnit = 2 (inches),\n * and JFIF APP0 records units = 1 with the nearest integer density (JFIF density fields are uint16).\n * When omitted no physical size is claimed: JFIF keeps units = 0 with a 1:1 aspect ratio. Exif 2.32 makes\n * the IFD0 resolution tags mandatory and says an unknown resolution \"shall\" be recorded as 72 dpi, so IFD0\n * carries 72/1 with ResolutionUnit = 2; that is the standard's unknown-resolution marker, not a print size.\n */\n pixelsPerInch?:number;\n /**\n * Optional opt-in source pixel limit for large images: an integer from 1 to `PRINT_JPEG_LIMITS.ceilingPixels`.\n * Default `PRINT_JPEG_LIMITS.maximumPixels` (24 000 000). When given it is recorded in the XMP export plan, like the\n * other admission budgets; the image data are unchanged.\n */\n maximumPixels?:number;\n}\nexport interface PrintJpegTileRequest {source:PrintJpegSource;x:number;y:number;width:number;height:number}\nexport interface PrintJpegTile extends PrintJpegTileRequest {samples:Uint8Array}\nexport interface PrintJpegProvider {\n readTile(request:Readonly<PrintJpegTileRequest>,signal:AbortSignal):Promise<PrintJpegTile>;\n yieldControl(signal:AbortSignal):Promise<void>;\n}\nexport interface PrintJpegOutput {\n schemaVersion:typeof PRINT_JPEG_SCHEMA_VERSION;\n input:PrintJpegInput;\n mediaType:\"image/jpeg\";\n bytes:Uint8Array;\n iccProfileVersion:typeof SRGB_ICC_PROFILE_VERSION;\n width:number;height:number;\n resampling:\"exact-area-average-in-decoded-linear-light\";\n sourceStage:\"post-SDR-8-bit-quantization\";\n digitalUpscalingApplied:false;\n sourceBytesVerified:false;\n /** Provider calls made: ceil(crop.height/32) x ceil(crop.width/256) tiles, each crop pixel read once. */\n providerReads:number;\n /** Byte behaviour of the baseline encoder that produced `bytes`. */\n encoderId:typeof EXPORT_JPEG_ENCODER_ID;\n}\nexport interface PrintJpegTask {\n readonly state:NativeRawTaskState;\n run():Promise<void>;cancel():void;dispose():void;takeOutput():PrintJpegOutput;\n}\n/** Exactly n/1 for a whole-number density; otherwise the shared bounded decimal-fraction approximation. */\nfunction resolutionRational(id:number,ppi:number):ExportTiffTag {\n if(!Number.isSafeInteger(ppi))return exportTiffRationals(id,false,[ppi]);\n const data=new Uint8Array(8),view=new DataView(data.buffer);view.setUint32(0,ppi,true);view.setUint32(4,1,true);\n return {id,type:5,count:1,data};\n}\n/**\n * Exif 2.32 APP1 for a compressed primary image with every mandatory tag (CIPA DC-008-2019 Tables 17-18):\n * IFD0 Orientation, X/YResolution + ResolutionUnit, Software, YCbCrPositioning; Exif IFD ExifVersion \"0232\",\n * ComponentsConfiguration, FlashpixVersion \"0100\", ColorSpace sRGB, PixelX/YDimension. Without a planned\n * density the resolution tags carry the standard's \"unknown resolution\" value of 72 dpi.\n */\nfunction printExif(plan:PrintJpegInput):Uint8Array {\n const ppi=plan.pixelsPerInch;\n const resolution=ppi===undefined ? [] : [resolutionRational(282,ppi),resolutionRational(283,ppi),exportTiffNumbers(296,3,[2])];\n return packExportJpegExif([exportTiffNumbers(274,3,[1]),...resolution,exportTiffAscii(305,\"Photivra Print JPEG\")],\n [exportTiffNumbers(40961,3,[1])],{pixelWidth:plan.outputWidth,pixelHeight:plan.outputHeight});\n}\nfunction integer(v:unknown,min=1):number {\n if(typeof v!==\"number\"||!Number.isSafeInteger(v)||v<min)throw new InvalidConfigurationError(\"Print raster/budgets require safe integers.\");return v;\n}\n/** Validates the input only. Source detail, perception and printer suitability are checked by separate APIs. */\nexport function parsePrintJpegInput(input:PrintJpegInput):PrintJpegInput {\n const r=requireAllowlistedRecord(input,[\"source\",\"crop\",\"outputWidth\",\"outputHeight\",\"quantizationStep\",\"maximumEncodedBytes\",\"maximumProviderReads\",\"pixelsPerInch\",\"maximumPixels\"],\"Invalid Print JPEG input.\");\n const s=requireAllowlistedRecord(r.source,[\"captureId\",\"imageStateId\",\"artifactId\",\"sha256\",\"width\",\"height\",\"encoding\"],\"Invalid Print source.\");\n if(typeof s.sha256!==\"string\"||!/^[a-f0-9]{64}$/.test(s.sha256)||s.encoding!==\"encoded-srgb-8-rgb\")throw new InvalidConfigurationError(\"Print requires identified encoded sRGB source bytes.\");\n const source:PrintJpegSource={captureId:requirePublicOpaqueId(s.captureId,\"Invalid capture ID.\"),imageStateId:requirePublicOpaqueId(s.imageStateId,\"Invalid image state ID.\"),artifactId:requirePublicOpaqueId(s.artifactId,\"Invalid artifact ID.\"),sha256:s.sha256,width:integer(s.width),height:integer(s.height),encoding:s.encoding};\n const c=requireAllowlistedRecord(r.crop,[\"x\",\"y\",\"width\",\"height\"],\"Invalid Print crop.\"),crop={x:integer(c.x,0),y:integer(c.y,0),width:integer(c.width),height:integer(c.height)};\n const outputWidth=integer(r.outputWidth),outputHeight=integer(r.outputHeight),quantizationStep=integer(r.quantizationStep),maximumEncodedBytes=integer(r.maximumEncodedBytes),maximumProviderReads=integer(r.maximumProviderReads);\n const L=PRINT_JPEG_LIMITS,maximumPixels=resolveRaisedLimit(r.maximumPixels,L.maximumPixels,L.ceilingPixels,\"Print maximumPixels must be an integer from 1 to \"+L.ceilingPixels+\".\");\n const encodedBytesCeiling=r.maximumPixels===undefined?L.maximumEncodedBytes:scaleBudgetCeiling(L.maximumEncodedBytes,maximumPixels);\n if(source.width>L.maximumDimension||source.height>L.maximumDimension||source.width*source.height>maximumPixels||crop.x+crop.width>source.width||crop.y+crop.height>source.height||\n outputWidth>crop.width||outputHeight>crop.height||quantizationStep>255||maximumEncodedBytes>encodedBytesCeiling||maximumProviderReads>L.maximumProviderReads||\n Math.abs(outputWidth*crop.height-outputHeight*crop.width)>.5*(crop.width+crop.height))throw new InvalidConfigurationError(\"Print requires bounded native/downsampled aspect-preserving crop output.\");\n const ppi=r.pixelsPerInch;\n if(ppi!==undefined&&(typeof ppi!==\"number\"||!Number.isFinite(ppi)||ppi<1||ppi>65535))throw new InvalidConfigurationError(\"Print density requires finite pixels per inch from 1 to 65535.\");\n return freezeOwnedData({source,crop,outputWidth,outputHeight,quantizationStep,maximumEncodedBytes,maximumProviderReads,...(ppi===undefined ? {} : {pixelsPerInch:ppi}),\n ...(r.maximumPixels===undefined ? {} : {maximumPixels})});\n}\n/** The JPEG writer of a Print plan: its size, quantization, budget, ICC profile, EXIF, XMP plan record and density. */\nfunction printEncoder(plan:PrintJpegInput):ReturnType<typeof createExportJpegEncoder> {\n const exif=printExif(plan);\n const escaped=JSON.stringify(plan).replaceAll(\"&\",\"&amp;\").replaceAll('\"',\"&quot;\").replaceAll(\"<\",\"&lt;\").replaceAll(\">\",\"&gt;\");\n const xmp=new TextEncoder().encode('<x:xmpmeta xmlns:x=\"adobe:ns:meta/\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><rdf:Description rdf:about=\"\" xmlns:photivra=\"https://photivra.com/ns/simulation/1.0/\" photivra:PrintExportPlan=\"'+escaped+'\" photivra:SourceBytesVerified=\"False\"/></rdf:RDF></x:xmpmeta>');\n return createExportJpegEncoder({width:plan.outputWidth,height:plan.outputHeight,quantizationStep:plan.quantizationStep,maximumOutputBytes:plan.maximumEncodedBytes,icc:createSrgbIccProfile(),exif,xmp,\n ...(plan.pixelsPerInch===undefined ? {} : {densityDotsPerInch:Math.round(plan.pixelsPerInch)})});\n}\n/** At 1:1, the output code of each source code (its decoded value re-encoded and rounded). */\nfunction directCodes():Uint8Array {\n return Uint8Array.from(srgbDecodeTable(),(value)=>Math.min(255,Math.max(0,Math.round(encodeSrgbComponent(value)*255))));\n}\n/** Rows of a 1:1 Print JPEG for `createPrintJpegStrip`: crop rows `y` to `y + height` (relative to the crop), crop-wide RGB. */\nexport interface PrintJpegStripInput {y:number;height:number;samples:Uint8Array}\n/** A strip of a 1:1 Print JPEG's coded blocks (`createPrintJpegStrip`), for `composePrintJpegStrips`. */\nexport interface PrintJpegStrip {readonly y:number;readonly height:number;readonly width:number;readonly quantizationStep:number;readonly bits:JpegStripBits}\nfunction requireIdentity(plan:PrintJpegInput):void {\n if(plan.outputWidth!==plan.crop.width||plan.outputHeight!==plan.crop.height)throw new InvalidConfigurationError(\"Print JPEG strips require a 1:1 plan (output size equal to the crop).\");\n}\n/**\n * Codes rows of a 1:1 Print JPEG (output size equal to the crop) apart from the rows before them, so a large file's strips\n * can be written on separate workers. `strip.y` is a multiple of 8 and `strip.height` a multiple of 8 unless the strip ends at\n * the image's bottom; `strip.samples` are those crop rows' 8-bit sRGB RGB, crop-wide. `composePrintJpegStrips` joins strips that\n * cover the image, in order, into the bytes `createPrintJpegTask` writes for the same plan and source pixels.\n */\nexport function createPrintJpegStrip(input:PrintJpegInput,strip:PrintJpegStripInput):PrintJpegStrip {\n const plan=parsePrintJpegInput(input);requireIdentity(plan);\n const r=requireAllowlistedRecord(strip,[\"y\",\"height\",\"samples\"],\"Invalid Print JPEG strip.\");\n const y=integer(r.y,0),height=integer(r.height),width=plan.outputWidth,samples=r.samples;\n if(y%8!==0||y+height>plan.outputHeight||(height%8!==0&&y+height!==plan.outputHeight))throw new InvalidConfigurationError(\"Print JPEG strips start on a block row and cover whole block rows.\");\n if(!(samples instanceof Uint8Array)||samples.length!==width*height*3)throw new InvalidConfigurationError(\"Print JPEG strip requires the crop rows' RGB samples.\");\n const direct=directCodes(),blocksX=Math.ceil(width/8),rowBytes=width*3;\n // The same block samples as createPrintJpegTask's 1:1 path: each block's edge pixels repeated into a partial block.\n const bits=encodeJpegStrip(plan.quantizationStep,blocksX*Math.ceil(height/8),(index,out)=>{\n const bx=(index%blocksX)*8,by=Math.floor(index/blocksX)*8,bw=Math.min(8,width-bx),bh=Math.min(8,plan.outputHeight-y-by);\n for(let yy=0,o=0;yy<8;yy++){\n const row=(by+Math.min(yy,bh-1))*rowBytes+bx*3;\n for(let x=0;x<8;x++,o+=3){const i=row+Math.min(x,bw-1)*3;out[o]=direct[samples[i]!]!;out[o+1]=direct[samples[i+1]!]!;out[o+2]=direct[samples[i+2]!]!;}\n }\n });\n return Object.freeze({y,height,width,quantizationStep:plan.quantizationStep,bits});\n}\n/**\n * Joins the strips of a 1:1 Print JPEG (`createPrintJpegStrip`), covering the image top to bottom in order, into its file:\n * the same bytes `createPrintJpegTask` writes for the plan and the same source pixels. No source is read, so the output's\n * `providerReads` is 0.\n */\nexport function composePrintJpegStrips(input:PrintJpegInput,strips:readonly PrintJpegStrip[]):PrintJpegOutput {\n const plan=parsePrintJpegInput(input);requireIdentity(plan);\n if(!Array.isArray(strips)||strips.length<1)throw new InvalidConfigurationError(\"Print JPEG assembly requires strips.\");\n const encoder=printEncoder(plan);\n try{\n let next=0;\n for(const strip of strips){\n if(strip.y!==next||strip.width!==plan.outputWidth||strip.quantizationStep!==plan.quantizationStep)throw new InvalidConfigurationError(\"Print JPEG strips must cover the plan's image in order.\");\n encoder.appendStrip(strip.bits);next+=strip.height;\n }\n if(next!==plan.outputHeight)throw new InvalidConfigurationError(\"Print JPEG strips must cover the plan's image in order.\");\n const bytes=encoder.finish();\n return {schemaVersion:PRINT_JPEG_SCHEMA_VERSION,input:plan,mediaType:\"image/jpeg\",bytes,iccProfileVersion:SRGB_ICC_PROFILE_VERSION,width:plan.outputWidth,height:plan.outputHeight,resampling:\"exact-area-average-in-decoded-linear-light\",sourceStage:\"post-SDR-8-bit-quantization\",digitalUpscalingApplied:false,sourceBytesVerified:false,providerReads:0,encoderId:EXPORT_JPEG_ENCODER_ID};\n }catch(error){encoder.dispose();throw error;}\n}\n/** Creates the export task. Filtering weights each source pixel by its exact area overlap, after decoding the declared 8-bit SDR source. */\nexport function createPrintJpegTask(input:PrintJpegInput,provider:PrintJpegProvider):PrintJpegTask {\n const plan=parsePrintJpegInput(input);\n if(!provider||typeof provider.readTile!==\"function\"||typeof provider.yieldControl!==\"function\")throw new InvalidConfigurationError(\"Print export requires source reader and host yields.\");\n const read=provider.readTile.bind(provider),yieldControl=provider.yieldControl.bind(provider),abort=new AbortController();\n let state:NativeRawTaskState=\"ready\",output:PrintJpegOutput|null=null,encoder:ReturnType<typeof createExportJpegEncoder>|undefined;\n function check():void{if(abort.signal.aborted)throw new InvalidConfigurationError(\"Print export aborted.\");}\n function release():void{encoder?.dispose();encoder=undefined;output?.bytes.fill(0);output=null;}\n return {get state():NativeRawTaskState{return state;},\n async run():Promise<void>{\n if(state!==\"ready\")throw new InvalidConfigurationError(\"Print export is single-use.\");state=\"running\";\n try{\n encoder=printEncoder(plan);\n const scaleX=plan.crop.width/plan.outputWidth,scaleY=plan.crop.height/plan.outputHeight,area=scaleX*scaleY;\n const cropRight=plan.crop.x+plan.crop.width,cropBottom=plan.crop.y+plan.crop.height,rowBytes=plan.crop.width*3;\n // Every crop pixel is read exactly once, in tiles of at most 256 x 32 aligned to the crop origin.\n const tilesPerBand=Math.ceil(plan.crop.width/256),requiredReads=Math.ceil(plan.crop.height/32)*tilesPerBand;\n if(requiredReads>plan.maximumProviderReads)throw new InvalidConfigurationError(\"Print source exceeds provider-read budget.\");\n // Rolling cache of whole crop-width source rows [cacheTop, cacheBottom): at most 63 rows are retained.\n const cache=new Uint8Array(Math.min(64,plan.crop.height)*rowBytes),lut=srgbDecodeTable();\n let reads=0,blocks=0,cacheTop=plan.crop.y,cacheBottom=plan.crop.y;\n const ensureRows=async(firstRow:number,rowCount:number):Promise<void>=>{\n const keepFrom=Math.min(Math.max(cacheTop,firstRow),cacheBottom);\n if(keepFrom>cacheTop){cache.copyWithin(0,(keepFrom-cacheTop)*rowBytes,(cacheBottom-cacheTop)*rowBytes);cacheTop=keepFrom;}\n while(cacheBottom<firstRow+rowCount){\n const bandHeight=Math.min(32,cropBottom-cacheBottom);\n if((cacheBottom+bandHeight-cacheTop)*rowBytes>cache.length)throw new InvalidConfigurationError(\"Print source traversal is not monotonic.\");\n for(let sx=plan.crop.x;sx<cropRight;sx+=256){\n check();++reads;\n const request=Object.freeze({source:plan.source,x:sx,y:cacheBottom,width:Math.min(256,cropRight-sx),height:bandHeight});\n const supplied=await read(request,abort.signal);check();\n const tile=requireAllowlistedRecord(supplied,[\"source\",\"x\",\"y\",\"width\",\"height\",\"samples\"],\"Invalid Print source tile.\");\n const source=requireAllowlistedRecord(tile.source,[\"captureId\",\"imageStateId\",\"artifactId\",\"sha256\",\"width\",\"height\",\"encoding\"],\"Invalid Print tile source.\");\n for(const key of Object.keys(plan.source) as (keyof PrintJpegSource)[])if(source[key]!==plan.source[key])throw new InvalidConfigurationError(\"Print source identity mismatch.\");\n for(const key of [\"x\",\"y\",\"width\",\"height\"] as const)if(tile[key]!==request[key])throw new InvalidConfigurationError(\"Print source rectangle mismatch.\");\n const samples=tile.samples;if(!(samples instanceof Uint8Array)||!(samples.buffer instanceof ArrayBuffer)||samples.length!==request.width*request.height*3||samples.buffer.byteLength!==samples.byteLength)throw new InvalidConfigurationError(\"Print source requires exact owned bounded RGB tile storage.\");\n for(let iy=0;iy<bandHeight;iy++)cache.set(samples.subarray(iy*request.width*3,(iy+1)*request.width*3),(cacheBottom-cacheTop+iy)*rowBytes+(sx-plan.crop.x)*3);\n // One output block can cover a megapixel of source, so also yield to the host while reading the source.\n if(reads%32===0){await yieldControl(abort.signal);check();}\n }\n cacheBottom+=bandHeight;\n }\n };\n // One block's 192 samples, reused for every block: each is an integer 0–255, written before the block is coded.\n const blocksX=Math.ceil(plan.outputWidth/8),sums=new Float64Array(blocksX*192),samples=new Uint8Array(192);\n // At 1:1 every output pixel is one source pixel with weight exactly 1, so its sum is exactly lut[code] and its\n // sample is a function of the code alone: the same bytes from a 256-entry table, without the accumulation.\n const identity=scaleX===1&&scaleY===1;\n const direct=identity?directCodes():undefined;\n if(direct)for(let by=0;by<plan.outputHeight;by+=8){\n check();\n const height=Math.min(8,plan.outputHeight-by);await ensureRows(plan.crop.y+by,height);check();\n for(let bx=0;bx<plan.outputWidth;bx+=8){\n const width=Math.min(8,plan.outputWidth-bx);\n for(let y=0,o=0;y<8;y++){\n const row=(plan.crop.y+by+Math.min(y,height-1)-cacheTop)*rowBytes+bx*3;\n for(let x=0;x<8;x++,o+=3){const index=row+Math.min(x,width-1)*3;samples[o]=direct[cache[index]!]!;samples[o+1]=direct[cache[index+1]!]!;samples[o+2]=direct[cache[index+2]!]!;}\n }\n check();encoder.writeRgbBlock(samples);if(++blocks%32===0){await yieldControl(abort.signal);check();}\n }\n }\n else for(let by=0;by<plan.outputHeight;by+=8){\n check();sums.fill(0);\n const height=Math.min(8,plan.outputHeight-by),top=plan.crop.y+by*scaleY,bottom=by+height===plan.outputHeight?cropBottom:plan.crop.y+(by+height)*scaleY;\n // Accumulation order per output pixel is unchanged from the per-block reader: 32-row bands from\n // floor(top), then 256-column chunks from floor(left), then rows, then columns. Identical IEEE sums.\n for(let sy=Math.floor(top);sy<Math.ceil(bottom);sy+=32){\n const bandHeight=Math.min(32,Math.ceil(bottom)-sy);await ensureRows(sy,bandHeight);check();\n for(let bx=0,block=0;bx<plan.outputWidth;bx+=8,block++){\n const width=Math.min(8,plan.outputWidth-bx),left=plan.crop.x+bx*scaleX,right=bx+width===plan.outputWidth?cropRight:plan.crop.x+(bx+width)*scaleX,base=block*192;\n for(let sx=Math.floor(left);sx<Math.ceil(right);sx+=256){\n const chunkWidth=Math.min(256,Math.ceil(right)-sx);\n for(let iy=0;iy<bandHeight;iy++)for(let ix=0;ix<chunkWidth;ix++){\n const px=sx+ix,py=sy+iy;\n const firstX=Math.max(0,Math.floor((px-plan.crop.x)/scaleX)-bx),lastX=Math.min(width-1,Math.ceil((px+1-plan.crop.x)/scaleX)-bx-1);\n const firstY=Math.max(0,Math.floor((py-plan.crop.y)/scaleY)-by),lastY=Math.min(height-1,Math.ceil((py+1-plan.crop.y)/scaleY)-by-1);\n const index=(py-cacheTop)*rowBytes+(px-plan.crop.x)*3,r=lut[cache[index]!]!,g=lut[cache[index+1]!]!,b=lut[cache[index+2]!]!;\n for(let oy=firstY;oy<=lastY;oy++)for(let ox=firstX;ox<=lastX;ox++){\n const x0=plan.crop.x+(bx+ox)*scaleX,y0=plan.crop.y+(by+oy)*scaleY;\n const weight=Math.max(0,Math.min(px+1,x0+scaleX)-Math.max(px,x0))*Math.max(0,Math.min(py+1,y0+scaleY)-Math.max(py,y0))/area;\n const i=base+(oy*8+ox)*3;sums[i]=sums[i]!+r*weight;sums[i+1]=sums[i+1]!+g*weight;sums[i+2]=sums[i+2]!+b*weight;\n }\n }\n }\n }\n }\n for(let bx=0,block=0;bx<plan.outputWidth;bx+=8,block++){\n const width=Math.min(8,plan.outputWidth-bx),base=block*192;\n for(let y=0,o=0;y<8;y++)for(let x=0;x<8;x++)for(let c=0;c<3;c++,o++){\n const value=sums[base+(Math.min(y,height-1)*8+Math.min(x,width-1))*3+c]!;\n // Nearest code, ties up. Math.round is used because floor(x+0.5) wrongly rounds 0.49999999999999994 up.\n samples[o]=Math.min(255,Math.max(0,Math.round(encodeSrgbComponent(value)*255)));\n }\n check();encoder.writeRgbBlock(samples);if(++blocks%32===0){await yieldControl(abort.signal);check();}\n }\n }\n await yieldControl(abort.signal);check();const bytes=encoder.finish();encoder=undefined;\n output={schemaVersion:PRINT_JPEG_SCHEMA_VERSION,input:plan,mediaType:\"image/jpeg\",bytes,iccProfileVersion:SRGB_ICC_PROFILE_VERSION,width:plan.outputWidth,height:plan.outputHeight,resampling:\"exact-area-average-in-decoded-linear-light\",sourceStage:\"post-SDR-8-bit-quantization\",digitalUpscalingApplied:false,sourceBytesVerified:false,providerReads:reads,encoderId:EXPORT_JPEG_ENCODER_ID};state=\"completed\";\n }catch(error){release();if(!abort.signal.aborted){state=\"failed\";abort.abort();}throw error;}\n },cancel():void{if(state===\"ready\"||state===\"running\"||state===\"completed\"){state=\"cancelled\";abort.abort();release();}},\n dispose():void{if(state!==\"transferred\"){state=\"disposed\";abort.abort();release();}},\n takeOutput():PrintJpegOutput{if(state!==\"completed\"||!output)throw new InvalidConfigurationError(\"Print JPEG unavailable.\");const value=output;output=null;state=\"transferred\";return value;}\n };\n}\n"]}
1
+ {"version":3,"file":"print-jpeg.js","sourceRoot":"","sources":["../../src/output/print-jpeg.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Print JPEG export: downsamples an SDR image by exact area averaging, then writes a baseline JPEG\n * with an ICC colour profile. Bounded in size; the encoder is written for this project.\n */\nimport { createExportJpegEncoder, encodeJpegStrip, EXPORT_JPEG_ENCODER_ID, type JpegStripBits } from \"../capture/export-jpeg.js\";\nimport { packExportJpegExif, exportTiffNumbers, exportTiffAscii, exportTiffRationals, type ExportTiffTag } from \"../capture/export-tiff.js\";\nimport { createSrgbIccProfile, SRGB_ICC_PROFILE_VERSION } from \"../color/srgb-icc.js\";\nimport { decodeSrgbComponent, encodeSrgbComponent } from \"../color/srgb-transfer.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { requireAllowlistedRecord, requirePublicOpaqueId } from \"../core/record-validation.js\";\nimport { freezeOwnedData } from \"../core/owned-data.js\";\nimport { FULL_RESOLUTION_CEILING_PIXELS, resolveRaisedLimit, scaleBudgetCeiling } from \"../core/pixel-limits.js\";\nimport type { NativeRawTaskState } from \"../capture/native-raw.js\";\nimport type { RasterRect } from \"./capture-geometry.js\";\nexport const PRINT_JPEG_SCHEMA_VERSION=\"0.2.0\" as const;\n/**\n * Admission limits. `maximumPixels` is the default source limit; a request may raise it with its own\n * `maximumPixels`, up to `ceilingPixels`. A raised limit raises the `maximumEncodedBytes` ceiling in proportion\n * (256 000 000 bytes per 24 000 000 source pixels).\n */\nexport const PRINT_JPEG_LIMITS=/* @__PURE__ */ Object.freeze({maximumPixels:24_000_000,ceilingPixels:FULL_RESOLUTION_CEILING_PIXELS,maximumDimension:16_384,\n maximumEncodedBytes:256_000_000,maximumProviderReads:1_000_000});\nlet srgbDecode:Float64Array|undefined;\n/** decodeSrgbComponent(v/255) for every 8-bit code v, computed once with the same function (identical values). */\nfunction srgbDecodeTable():Float64Array{return srgbDecode??=Float64Array.from({length:256},(_,v)=>decodeSrgbComponent(v/255));}\nexport interface PrintJpegSource {\n captureId:string;imageStateId:string;artifactId:string;sha256:string;\n width:number;height:number;\n encoding:\"encoded-srgb-8-rgb\";\n}\nexport interface PrintJpegInput {\n source:PrintJpegSource;\n /** Integer crop in the oriented output source image, not in sensor or CFA (colour filter array) coordinates. */\n crop:RasterRect;\n outputWidth:number;outputHeight:number;\n quantizationStep:number;\n maximumEncodedBytes:number;\n /**\n * Maximum provider `readTile` calls. The task reads each crop pixel exactly once, in tiles of at most\n * 256 x 32 pixels aligned to the crop origin, so it needs ceil(crop.height/32) x ceil(crop.width/256)\n * reads; a smaller budget fails before the first read.\n */\n maximumProviderReads:number;\n /**\n * Optional physical print density in pixels per inch (1..65535) from the caller's print plan. When present,\n * EXIF IFD0 records XResolution = YResolution = this value as a RATIONAL with ResolutionUnit = 2 (inches),\n * and JFIF APP0 records units = 1 with the nearest integer density (JFIF density fields are uint16).\n * When omitted no physical size is claimed: JFIF keeps units = 0 with a 1:1 aspect ratio. Exif 2.32 makes\n * the IFD0 resolution tags mandatory and says an unknown resolution \"shall\" be recorded as 72 dpi, so IFD0\n * carries 72/1 with ResolutionUnit = 2; that is the standard's unknown-resolution marker, not a print size.\n */\n pixelsPerInch?:number;\n /**\n * Optional opt-in source pixel limit for large images: an integer from 1 to `PRINT_JPEG_LIMITS.ceilingPixels`.\n * Default `PRINT_JPEG_LIMITS.maximumPixels` (24 000 000). When given it is recorded in the XMP export plan, like the\n * other admission budgets; the image data are unchanged.\n */\n maximumPixels?:number;\n}\nexport interface PrintJpegTileRequest {source:PrintJpegSource;x:number;y:number;width:number;height:number}\nexport interface PrintJpegTile extends PrintJpegTileRequest {samples:Uint8Array}\nexport interface PrintJpegProvider {\n readTile(request:Readonly<PrintJpegTileRequest>,signal:AbortSignal):Promise<PrintJpegTile>;\n yieldControl(signal:AbortSignal):Promise<void>;\n}\nexport interface PrintJpegOutput {\n schemaVersion:typeof PRINT_JPEG_SCHEMA_VERSION;\n input:PrintJpegInput;\n mediaType:\"image/jpeg\";\n bytes:Uint8Array;\n iccProfileVersion:typeof SRGB_ICC_PROFILE_VERSION;\n width:number;height:number;\n resampling:\"exact-area-average-in-decoded-linear-light\";\n sourceStage:\"post-SDR-8-bit-quantization\";\n digitalUpscalingApplied:false;\n sourceBytesVerified:false;\n /** Provider calls made: ceil(crop.height/32) x ceil(crop.width/256) tiles, each crop pixel read once. */\n providerReads:number;\n /** Byte behaviour of the baseline encoder that produced `bytes`. */\n encoderId:typeof EXPORT_JPEG_ENCODER_ID;\n}\nexport interface PrintJpegTask {\n readonly state:NativeRawTaskState;\n run():Promise<void>;cancel():void;dispose():void;takeOutput():PrintJpegOutput;\n}\n/** Exactly n/1 for a whole-number density; otherwise the shared bounded decimal-fraction approximation. */\nfunction resolutionRational(id:number,ppi:number):ExportTiffTag {\n if(!Number.isSafeInteger(ppi))return exportTiffRationals(id,false,[ppi]);\n const data=new Uint8Array(8),view=new DataView(data.buffer);view.setUint32(0,ppi,true);view.setUint32(4,1,true);\n return {id,type:5,count:1,data};\n}\n/**\n * Exif 2.32 APP1 for a compressed primary image with every mandatory tag (CIPA DC-008-2019 Tables 17-18):\n * IFD0 Orientation, X/YResolution + ResolutionUnit, Software, YCbCrPositioning; Exif IFD ExifVersion \"0232\",\n * ComponentsConfiguration, FlashpixVersion \"0100\", ColorSpace sRGB, PixelX/YDimension. Without a planned\n * density the resolution tags carry the standard's \"unknown resolution\" value of 72 dpi.\n */\nfunction printExif(plan:PrintJpegInput):Uint8Array {\n const ppi=plan.pixelsPerInch;\n const resolution=ppi===undefined ? [] : [resolutionRational(282,ppi),resolutionRational(283,ppi),exportTiffNumbers(296,3,[2])];\n return packExportJpegExif([exportTiffNumbers(274,3,[1]),...resolution,exportTiffAscii(305,\"Photivra Print JPEG\")],\n [exportTiffNumbers(40961,3,[1])],{pixelWidth:plan.outputWidth,pixelHeight:plan.outputHeight});\n}\nfunction integer(v:unknown,min=1):number {\n if(typeof v!==\"number\"||!Number.isSafeInteger(v)||v<min)throw new InvalidConfigurationError(\"Print raster/budgets require safe integers.\");return v;\n}\n/** Validates the input only. Source detail, perception and printer suitability are checked by separate APIs. */\nexport function parsePrintJpegInput(input:PrintJpegInput):PrintJpegInput {\n const r=requireAllowlistedRecord(input,[\"source\",\"crop\",\"outputWidth\",\"outputHeight\",\"quantizationStep\",\"maximumEncodedBytes\",\"maximumProviderReads\",\"pixelsPerInch\",\"maximumPixels\"],\"Invalid Print JPEG input.\");\n const s=requireAllowlistedRecord(r.source,[\"captureId\",\"imageStateId\",\"artifactId\",\"sha256\",\"width\",\"height\",\"encoding\"],\"Invalid Print source.\");\n if(typeof s.sha256!==\"string\"||!/^[a-f0-9]{64}$/.test(s.sha256)||s.encoding!==\"encoded-srgb-8-rgb\")throw new InvalidConfigurationError(\"Print requires identified encoded sRGB source bytes.\");\n const source:PrintJpegSource={captureId:requirePublicOpaqueId(s.captureId,\"Invalid capture ID.\"),imageStateId:requirePublicOpaqueId(s.imageStateId,\"Invalid image state ID.\"),artifactId:requirePublicOpaqueId(s.artifactId,\"Invalid artifact ID.\"),sha256:s.sha256,width:integer(s.width),height:integer(s.height),encoding:s.encoding};\n const c=requireAllowlistedRecord(r.crop,[\"x\",\"y\",\"width\",\"height\"],\"Invalid Print crop.\"),crop={x:integer(c.x,0),y:integer(c.y,0),width:integer(c.width),height:integer(c.height)};\n const outputWidth=integer(r.outputWidth),outputHeight=integer(r.outputHeight),quantizationStep=integer(r.quantizationStep),maximumEncodedBytes=integer(r.maximumEncodedBytes),maximumProviderReads=integer(r.maximumProviderReads);\n const L=PRINT_JPEG_LIMITS,maximumPixels=resolveRaisedLimit(r.maximumPixels,L.maximumPixels,L.ceilingPixels,\"Print maximumPixels must be an integer from 1 to \"+L.ceilingPixels+\".\");\n const encodedBytesCeiling=r.maximumPixels===undefined?L.maximumEncodedBytes:scaleBudgetCeiling(L.maximumEncodedBytes,maximumPixels);\n if(source.width>L.maximumDimension||source.height>L.maximumDimension||source.width*source.height>maximumPixels||crop.x+crop.width>source.width||crop.y+crop.height>source.height||\n outputWidth>crop.width||outputHeight>crop.height||quantizationStep>255||maximumEncodedBytes>encodedBytesCeiling||maximumProviderReads>L.maximumProviderReads||\n Math.abs(outputWidth*crop.height-outputHeight*crop.width)>.5*(crop.width+crop.height))throw new InvalidConfigurationError(\"Print requires bounded native/downsampled aspect-preserving crop output.\");\n const ppi=r.pixelsPerInch;\n if(ppi!==undefined&&(typeof ppi!==\"number\"||!Number.isFinite(ppi)||ppi<1||ppi>65535))throw new InvalidConfigurationError(\"Print density requires finite pixels per inch from 1 to 65535.\");\n return freezeOwnedData({source,crop,outputWidth,outputHeight,quantizationStep,maximumEncodedBytes,maximumProviderReads,...(ppi===undefined ? {} : {pixelsPerInch:ppi}),\n ...(r.maximumPixels===undefined ? {} : {maximumPixels})});\n}\n/** The JPEG writer of a Print plan: its size, quantization, budget, ICC profile, EXIF, XMP plan record and density. */\nfunction printEncoder(plan:PrintJpegInput):ReturnType<typeof createExportJpegEncoder> {\n const exif=printExif(plan);\n const escaped=JSON.stringify(plan).replaceAll(\"&\",\"&amp;\").replaceAll('\"',\"&quot;\").replaceAll(\"<\",\"&lt;\").replaceAll(\">\",\"&gt;\");\n const xmp=new TextEncoder().encode('<x:xmpmeta xmlns:x=\"adobe:ns:meta/\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><rdf:Description rdf:about=\"\" xmlns:photivra=\"https://photivra.com/ns/simulation/1.0/\" photivra:PrintExportPlan=\"'+escaped+'\" photivra:SourceBytesVerified=\"False\"/></rdf:RDF></x:xmpmeta>');\n return createExportJpegEncoder({width:plan.outputWidth,height:plan.outputHeight,quantizationStep:plan.quantizationStep,maximumOutputBytes:plan.maximumEncodedBytes,icc:createSrgbIccProfile(),exif,xmp,\n ...(plan.pixelsPerInch===undefined ? {} : {densityDotsPerInch:Math.round(plan.pixelsPerInch)})});\n}\n/** At 1:1, the output code of each source code (its decoded value re-encoded and rounded). */\nfunction directCodes():Uint8Array {\n return Uint8Array.from(srgbDecodeTable(),(value)=>Math.min(255,Math.max(0,Math.round(encodeSrgbComponent(value)*255))));\n}\n/** Rows of a 1:1 Print JPEG for `createPrintJpegStrip`: crop rows `y` to `y + height` (relative to the crop), crop-wide RGB. */\nexport interface PrintJpegStripInput {y:number;height:number;samples:Uint8Array}\n/** A strip of a 1:1 Print JPEG's coded blocks (`createPrintJpegStrip`), for `composePrintJpegStrips`. */\nexport interface PrintJpegStrip {readonly y:number;readonly height:number;readonly width:number;readonly quantizationStep:number;readonly bits:JpegStripBits}\nfunction requireIdentity(plan:PrintJpegInput):void {\n if(plan.outputWidth!==plan.crop.width||plan.outputHeight!==plan.crop.height)throw new InvalidConfigurationError(\"Print JPEG strips require a 1:1 plan (output size equal to the crop).\");\n}\n/**\n * Codes rows of a 1:1 Print JPEG (output size equal to the crop) apart from the rows before them, so a large file's strips\n * can be written on separate workers. `strip.y` is a multiple of 8 and `strip.height` a multiple of 8 unless the strip ends at\n * the image's bottom; `strip.samples` are those crop rows' 8-bit sRGB RGB, crop-wide. `composePrintJpegStrips` joins strips that\n * cover the image, in order, into the bytes `createPrintJpegTask` writes for the same plan and source pixels.\n */\nexport function createPrintJpegStrip(input:PrintJpegInput,strip:PrintJpegStripInput):PrintJpegStrip {\n const plan=parsePrintJpegInput(input);requireIdentity(plan);\n const r=requireAllowlistedRecord(strip,[\"y\",\"height\",\"samples\"],\"Invalid Print JPEG strip.\");\n const y=integer(r.y,0),height=integer(r.height),width=plan.outputWidth,samples=r.samples;\n if(y%8!==0||y+height>plan.outputHeight||(height%8!==0&&y+height!==plan.outputHeight))throw new InvalidConfigurationError(\"Print JPEG strips start on a block row and cover whole block rows.\");\n if(!(samples instanceof Uint8Array)||samples.length!==width*height*3)throw new InvalidConfigurationError(\"Print JPEG strip requires the crop rows' RGB samples.\");\n const direct=directCodes(),blocksX=Math.ceil(width/8),rowBytes=width*3;\n // The same block samples as createPrintJpegTask's 1:1 path: each block's edge pixels repeated into a partial block.\n const bits=encodeJpegStrip(plan.quantizationStep,blocksX*Math.ceil(height/8),(index,out)=>{\n const bx=(index%blocksX)*8,by=Math.floor(index/blocksX)*8,bw=Math.min(8,width-bx),bh=Math.min(8,plan.outputHeight-y-by);\n for(let yy=0,o=0;yy<8;yy++){\n const row=(by+Math.min(yy,bh-1))*rowBytes+bx*3;\n for(let x=0;x<8;x++,o+=3){const i=row+Math.min(x,bw-1)*3;out[o]=direct[samples[i]!]!;out[o+1]=direct[samples[i+1]!]!;out[o+2]=direct[samples[i+2]!]!;}\n }\n });\n return Object.freeze({y,height,width,quantizationStep:plan.quantizationStep,bits});\n}\n/**\n * Joins the strips of a 1:1 Print JPEG (`createPrintJpegStrip`), covering the image top to bottom in order, into its file:\n * the same bytes `createPrintJpegTask` writes for the plan and the same source pixels. No source is read, so the output's\n * `providerReads` is 0.\n */\nexport function composePrintJpegStrips(input:PrintJpegInput,strips:readonly PrintJpegStrip[]):PrintJpegOutput {\n const plan=parsePrintJpegInput(input);requireIdentity(plan);\n if(!Array.isArray(strips)||strips.length<1)throw new InvalidConfigurationError(\"Print JPEG assembly requires strips.\");\n const encoder=printEncoder(plan);\n try{\n let next=0;\n for(const strip of strips){\n if(strip.y!==next||strip.width!==plan.outputWidth||strip.quantizationStep!==plan.quantizationStep)throw new InvalidConfigurationError(\"Print JPEG strips must cover the plan's image in order.\");\n encoder.appendStrip(strip.bits);next+=strip.height;\n }\n if(next!==plan.outputHeight)throw new InvalidConfigurationError(\"Print JPEG strips must cover the plan's image in order.\");\n const bytes=encoder.finish();\n return {schemaVersion:PRINT_JPEG_SCHEMA_VERSION,input:plan,mediaType:\"image/jpeg\",bytes,iccProfileVersion:SRGB_ICC_PROFILE_VERSION,width:plan.outputWidth,height:plan.outputHeight,resampling:\"exact-area-average-in-decoded-linear-light\",sourceStage:\"post-SDR-8-bit-quantization\",digitalUpscalingApplied:false,sourceBytesVerified:false,providerReads:0,encoderId:EXPORT_JPEG_ENCODER_ID};\n }catch(error){encoder.dispose();throw error;}\n}\n/** Creates the export task. Filtering weights each source pixel by its exact area overlap, after decoding the declared 8-bit SDR source. */\nexport function createPrintJpegTask(input:PrintJpegInput,provider:PrintJpegProvider):PrintJpegTask {\n const plan=parsePrintJpegInput(input);\n if(!provider||typeof provider.readTile!==\"function\"||typeof provider.yieldControl!==\"function\")throw new InvalidConfigurationError(\"Print export requires source reader and host yields.\");\n const read=provider.readTile.bind(provider),yieldControl=provider.yieldControl.bind(provider),abort=new AbortController();\n let state:NativeRawTaskState=\"ready\",output:PrintJpegOutput|null=null,encoder:ReturnType<typeof createExportJpegEncoder>|undefined;\n function check():void{if(abort.signal.aborted)throw new InvalidConfigurationError(\"Print export aborted.\");}\n function release():void{encoder?.dispose();encoder=undefined;output?.bytes.fill(0);output=null;}\n return {get state():NativeRawTaskState{return state;},\n async run():Promise<void>{\n if(state!==\"ready\")throw new InvalidConfigurationError(\"Print export is single-use.\");state=\"running\";\n try{\n encoder=printEncoder(plan);\n const scaleX=plan.crop.width/plan.outputWidth,scaleY=plan.crop.height/plan.outputHeight,area=scaleX*scaleY;\n const cropRight=plan.crop.x+plan.crop.width,cropBottom=plan.crop.y+plan.crop.height,rowBytes=plan.crop.width*3;\n // Every crop pixel is read exactly once, in tiles of at most 256 x 32 aligned to the crop origin.\n const tilesPerBand=Math.ceil(plan.crop.width/256),requiredReads=Math.ceil(plan.crop.height/32)*tilesPerBand;\n if(requiredReads>plan.maximumProviderReads)throw new InvalidConfigurationError(\"Print source exceeds provider-read budget.\");\n // Rolling cache of whole crop-width source rows [cacheTop, cacheBottom): at most 63 rows are retained.\n const cache=new Uint8Array(Math.min(64,plan.crop.height)*rowBytes),lut=srgbDecodeTable();\n let reads=0,blocks=0,cacheTop=plan.crop.y,cacheBottom=plan.crop.y;\n const ensureRows=async(firstRow:number,rowCount:number):Promise<void>=>{\n const keepFrom=Math.min(Math.max(cacheTop,firstRow),cacheBottom);\n if(keepFrom>cacheTop){cache.copyWithin(0,(keepFrom-cacheTop)*rowBytes,(cacheBottom-cacheTop)*rowBytes);cacheTop=keepFrom;}\n while(cacheBottom<firstRow+rowCount){\n const bandHeight=Math.min(32,cropBottom-cacheBottom);\n if((cacheBottom+bandHeight-cacheTop)*rowBytes>cache.length)throw new InvalidConfigurationError(\"Print source traversal is not monotonic.\");\n for(let sx=plan.crop.x;sx<cropRight;sx+=256){\n check();++reads;\n const request=Object.freeze({source:plan.source,x:sx,y:cacheBottom,width:Math.min(256,cropRight-sx),height:bandHeight});\n const supplied=await read(request,abort.signal);check();\n const tile=requireAllowlistedRecord(supplied,[\"source\",\"x\",\"y\",\"width\",\"height\",\"samples\"],\"Invalid Print source tile.\");\n const source=requireAllowlistedRecord(tile.source,[\"captureId\",\"imageStateId\",\"artifactId\",\"sha256\",\"width\",\"height\",\"encoding\"],\"Invalid Print tile source.\");\n for(const key of Object.keys(plan.source) as (keyof PrintJpegSource)[])if(source[key]!==plan.source[key])throw new InvalidConfigurationError(\"Print source identity mismatch.\");\n for(const key of [\"x\",\"y\",\"width\",\"height\"] as const)if(tile[key]!==request[key])throw new InvalidConfigurationError(\"Print source rectangle mismatch.\");\n const samples=tile.samples;if(!(samples instanceof Uint8Array)||!(samples.buffer instanceof ArrayBuffer)||samples.length!==request.width*request.height*3||samples.buffer.byteLength!==samples.byteLength)throw new InvalidConfigurationError(\"Print source requires exact owned bounded RGB tile storage.\");\n for(let iy=0;iy<bandHeight;iy++)cache.set(samples.subarray(iy*request.width*3,(iy+1)*request.width*3),(cacheBottom-cacheTop+iy)*rowBytes+(sx-plan.crop.x)*3);\n // One output block can cover a megapixel of source, so also yield to the host while reading the source.\n if(reads%32===0){await yieldControl(abort.signal);check();}\n }\n cacheBottom+=bandHeight;\n }\n };\n // One block's 192 samples, reused for every block: each is an integer 0–255, written before the block is coded.\n const blocksX=Math.ceil(plan.outputWidth/8),sums=new Float64Array(blocksX*192),samples=new Uint8Array(192);\n // At 1:1 every output pixel is one source pixel with weight exactly 1, so its sum is exactly lut[code] and its\n // sample is a function of the code alone: the same bytes from a 256-entry table, without the accumulation.\n const identity=scaleX===1&&scaleY===1;\n const direct=identity?directCodes():undefined;\n if(direct)for(let by=0;by<plan.outputHeight;by+=8){\n check();\n const height=Math.min(8,plan.outputHeight-by);await ensureRows(plan.crop.y+by,height);check();\n for(let bx=0;bx<plan.outputWidth;bx+=8){\n const width=Math.min(8,plan.outputWidth-bx);\n for(let y=0,o=0;y<8;y++){\n const row=(plan.crop.y+by+Math.min(y,height-1)-cacheTop)*rowBytes+bx*3;\n for(let x=0;x<8;x++,o+=3){const index=row+Math.min(x,width-1)*3;samples[o]=direct[cache[index]!]!;samples[o+1]=direct[cache[index+1]!]!;samples[o+2]=direct[cache[index+2]!]!;}\n }\n check();encoder.writeRgbBlock(samples);if(++blocks%32===0){await yieldControl(abort.signal);check();}\n }\n }\n else for(let by=0;by<plan.outputHeight;by+=8){\n check();sums.fill(0);\n const height=Math.min(8,plan.outputHeight-by),top=plan.crop.y+by*scaleY,bottom=by+height===plan.outputHeight?cropBottom:plan.crop.y+(by+height)*scaleY;\n // Accumulation order per output pixel is unchanged from the per-block reader: 32-row bands from\n // floor(top), then 256-column chunks from floor(left), then rows, then columns. Identical IEEE sums.\n for(let sy=Math.floor(top);sy<Math.ceil(bottom);sy+=32){\n const bandHeight=Math.min(32,Math.ceil(bottom)-sy);await ensureRows(sy,bandHeight);check();\n for(let bx=0,block=0;bx<plan.outputWidth;bx+=8,block++){\n const width=Math.min(8,plan.outputWidth-bx),left=plan.crop.x+bx*scaleX,right=bx+width===plan.outputWidth?cropRight:plan.crop.x+(bx+width)*scaleX,base=block*192;\n for(let sx=Math.floor(left);sx<Math.ceil(right);sx+=256){\n const chunkWidth=Math.min(256,Math.ceil(right)-sx);\n for(let iy=0;iy<bandHeight;iy++)for(let ix=0;ix<chunkWidth;ix++){\n const px=sx+ix,py=sy+iy;\n const firstX=Math.max(0,Math.floor((px-plan.crop.x)/scaleX)-bx),lastX=Math.min(width-1,Math.ceil((px+1-plan.crop.x)/scaleX)-bx-1);\n const firstY=Math.max(0,Math.floor((py-plan.crop.y)/scaleY)-by),lastY=Math.min(height-1,Math.ceil((py+1-plan.crop.y)/scaleY)-by-1);\n const index=(py-cacheTop)*rowBytes+(px-plan.crop.x)*3,r=lut[cache[index]!]!,g=lut[cache[index+1]!]!,b=lut[cache[index+2]!]!;\n for(let oy=firstY;oy<=lastY;oy++)for(let ox=firstX;ox<=lastX;ox++){\n const x0=plan.crop.x+(bx+ox)*scaleX,y0=plan.crop.y+(by+oy)*scaleY;\n const weight=Math.max(0,Math.min(px+1,x0+scaleX)-Math.max(px,x0))*Math.max(0,Math.min(py+1,y0+scaleY)-Math.max(py,y0))/area;\n const i=base+(oy*8+ox)*3;sums[i]=sums[i]!+r*weight;sums[i+1]=sums[i+1]!+g*weight;sums[i+2]=sums[i+2]!+b*weight;\n }\n }\n }\n }\n }\n for(let bx=0,block=0;bx<plan.outputWidth;bx+=8,block++){\n const width=Math.min(8,plan.outputWidth-bx),base=block*192;\n for(let y=0,o=0;y<8;y++)for(let x=0;x<8;x++)for(let c=0;c<3;c++,o++){\n const value=sums[base+(Math.min(y,height-1)*8+Math.min(x,width-1))*3+c]!;\n // Nearest code, ties up. Math.round is used because floor(x+0.5) wrongly rounds 0.49999999999999994 up.\n samples[o]=Math.min(255,Math.max(0,Math.round(encodeSrgbComponent(value)*255)));\n }\n check();encoder.writeRgbBlock(samples);if(++blocks%32===0){await yieldControl(abort.signal);check();}\n }\n }\n await yieldControl(abort.signal);check();const bytes=encoder.finish();encoder=undefined;\n output={schemaVersion:PRINT_JPEG_SCHEMA_VERSION,input:plan,mediaType:\"image/jpeg\",bytes,iccProfileVersion:SRGB_ICC_PROFILE_VERSION,width:plan.outputWidth,height:plan.outputHeight,resampling:\"exact-area-average-in-decoded-linear-light\",sourceStage:\"post-SDR-8-bit-quantization\",digitalUpscalingApplied:false,sourceBytesVerified:false,providerReads:reads,encoderId:EXPORT_JPEG_ENCODER_ID};state=\"completed\";\n }catch(error){release();if(!abort.signal.aborted){state=\"failed\";abort.abort();}throw error;}\n },cancel():void{if(state===\"ready\"||state===\"running\"||state===\"completed\"){state=\"cancelled\";abort.abort();release();}},\n dispose():void{if(state!==\"transferred\"){state=\"disposed\";abort.abort();release();}},\n takeOutput():PrintJpegOutput{if(state!==\"completed\"||!output)throw new InvalidConfigurationError(\"Print JPEG unavailable.\");const value=output;output=null;state=\"transferred\";return value;}\n };\n}\n"]}