pdf-codec 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +100 -9
  2. package/dist/assets/caladea-bold.cjs +5 -0
  3. package/dist/assets/caladea-bold.d.cts +4 -0
  4. package/dist/assets/caladea-bold.d.ts +4 -0
  5. package/dist/assets/caladea-bold.js +4 -0
  6. package/dist/assets/caladea-bolditalic.cjs +5 -0
  7. package/dist/assets/caladea-bolditalic.d.cts +4 -0
  8. package/dist/assets/caladea-bolditalic.d.ts +4 -0
  9. package/dist/assets/caladea-bolditalic.js +4 -0
  10. package/dist/assets/caladea-italic.cjs +5 -0
  11. package/dist/assets/caladea-italic.d.cts +4 -0
  12. package/dist/assets/caladea-italic.d.ts +4 -0
  13. package/dist/assets/caladea-italic.js +4 -0
  14. package/dist/assets/caladea-regular.cjs +5 -0
  15. package/dist/assets/caladea-regular.d.cts +4 -0
  16. package/dist/assets/caladea-regular.d.ts +4 -0
  17. package/dist/assets/caladea-regular.js +4 -0
  18. package/dist/assets/carlito-bold.cjs +5 -0
  19. package/dist/assets/carlito-bold.d.cts +4 -0
  20. package/dist/assets/carlito-bold.d.ts +4 -0
  21. package/dist/assets/carlito-bold.js +4 -0
  22. package/dist/assets/carlito-bolditalic.cjs +5 -0
  23. package/dist/assets/carlito-bolditalic.d.cts +4 -0
  24. package/dist/assets/carlito-bolditalic.d.ts +4 -0
  25. package/dist/assets/carlito-bolditalic.js +4 -0
  26. package/dist/assets/carlito-italic.cjs +5 -0
  27. package/dist/assets/carlito-italic.d.cts +4 -0
  28. package/dist/assets/carlito-italic.d.ts +4 -0
  29. package/dist/assets/carlito-italic.js +4 -0
  30. package/dist/assets/carlito-regular.cjs +5 -0
  31. package/dist/assets/carlito-regular.d.cts +4 -0
  32. package/dist/assets/carlito-regular.d.ts +4 -0
  33. package/dist/assets/carlito-regular.js +4 -0
  34. package/dist/cff-bounds.cjs +432 -0
  35. package/dist/cff-bounds.d.cts +9 -0
  36. package/dist/cff-bounds.d.ts +9 -0
  37. package/dist/cff-bounds.js +431 -0
  38. package/dist/cff-probe.cjs +35 -0
  39. package/dist/cff-probe.d.cts +10 -0
  40. package/dist/cff-probe.d.ts +10 -0
  41. package/dist/cff-probe.js +34 -0
  42. package/dist/cff.cjs +158 -0
  43. package/dist/cff.d.cts +17 -0
  44. package/dist/cff.d.ts +17 -0
  45. package/dist/cff.js +150 -0
  46. package/dist/cmap-table.cjs +108 -0
  47. package/dist/cmap-table.d.cts +6 -0
  48. package/dist/cmap-table.d.ts +6 -0
  49. package/dist/cmap-table.js +107 -0
  50. package/dist/content-write.cjs +34 -14
  51. package/dist/content-write.d.cts +9 -2
  52. package/dist/content-write.d.ts +9 -2
  53. package/dist/content-write.js +34 -14
  54. package/dist/embedded-font-CLedn-mT.d.cts +42 -0
  55. package/dist/embedded-font-CbqkKgBl.d.ts +42 -0
  56. package/dist/embedded-font-write.cjs +92 -0
  57. package/dist/embedded-font-write.d.cts +22 -0
  58. package/dist/embedded-font-write.d.ts +22 -0
  59. package/dist/embedded-font-write.js +90 -0
  60. package/dist/embedded-font.cjs +142 -0
  61. package/dist/embedded-font.d.cts +2 -0
  62. package/dist/embedded-font.d.ts +2 -0
  63. package/dist/embedded-font.js +138 -0
  64. package/dist/filters.cjs +45 -2
  65. package/dist/filters.d.cts +4 -3
  66. package/dist/filters.d.ts +4 -3
  67. package/dist/filters.js +45 -2
  68. package/dist/font-registry-Cn7P9lAh.d.ts +38 -0
  69. package/dist/font-registry-yby02snZ.d.cts +38 -0
  70. package/dist/font-registry.cjs +152 -0
  71. package/dist/font-registry.d.cts +2 -0
  72. package/dist/font-registry.d.ts +2 -0
  73. package/dist/font-registry.js +150 -0
  74. package/dist/font-substitutes.cjs +13 -0
  75. package/dist/font-substitutes.d.cts +5 -0
  76. package/dist/font-substitutes.d.ts +5 -0
  77. package/dist/font-substitutes.js +12 -0
  78. package/dist/font-tables.cjs +127 -0
  79. package/dist/font-tables.d.cts +43 -0
  80. package/dist/font-tables.d.ts +43 -0
  81. package/dist/font-tables.js +122 -0
  82. package/dist/fonts.cjs +1 -0
  83. package/dist/fonts.d.cts +2 -1
  84. package/dist/fonts.d.ts +2 -1
  85. package/dist/fonts.js +1 -1
  86. package/dist/formula.d.cts +1 -1
  87. package/dist/formula.d.ts +1 -1
  88. package/dist/glyf.cjs +183 -0
  89. package/dist/glyf.d.cts +33 -0
  90. package/dist/glyf.d.ts +33 -0
  91. package/dist/glyf.js +181 -0
  92. package/dist/glyph-bounds-BV_Z40KS.d.cts +10 -0
  93. package/dist/glyph-bounds-BV_Z40KS.d.ts +10 -0
  94. package/dist/glyph-bounds.cjs +12 -0
  95. package/dist/glyph-bounds.d.cts +2 -0
  96. package/dist/glyph-bounds.d.ts +2 -0
  97. package/dist/glyph-bounds.js +11 -0
  98. package/dist/{math-hmtx.cjs → hmtx-table.cjs} +3 -3
  99. package/dist/{math-hmtx.d.ts → hmtx-table.d.cts} +2 -2
  100. package/dist/{math-hmtx.d.cts → hmtx-table.d.ts} +2 -2
  101. package/dist/{math-hmtx.js → hmtx-table.js} +3 -3
  102. package/dist/image/jbig2-arith.cjs +432 -0
  103. package/dist/image/jbig2-arith.d.cts +23 -0
  104. package/dist/image/jbig2-arith.d.ts +23 -0
  105. package/dist/image/jbig2-arith.js +426 -0
  106. package/dist/image/jbig2-bitmap.cjs +80 -0
  107. package/dist/image/jbig2-bitmap.d.cts +20 -0
  108. package/dist/image/jbig2-bitmap.d.ts +20 -0
  109. package/dist/image/jbig2-bitmap.js +72 -0
  110. package/dist/image/jbig2-errors.cjs +17 -0
  111. package/dist/image/jbig2-errors.d.cts +2 -0
  112. package/dist/image/jbig2-errors.d.ts +2 -0
  113. package/dist/image/jbig2-errors.js +15 -0
  114. package/dist/image/jbig2-generic.cjs +242 -0
  115. package/dist/image/jbig2-generic.d.cts +27 -0
  116. package/dist/image/jbig2-generic.d.ts +27 -0
  117. package/dist/image/jbig2-generic.js +237 -0
  118. package/dist/image/jbig2-text.cjs +175 -0
  119. package/dist/image/jbig2-text.d.cts +58 -0
  120. package/dist/image/jbig2-text.d.ts +58 -0
  121. package/dist/image/jbig2-text.js +170 -0
  122. package/dist/image/jbig2.cjs +333 -0
  123. package/dist/image/jbig2.d.cts +15 -0
  124. package/dist/image/jbig2.d.ts +15 -0
  125. package/dist/image/jbig2.js +332 -0
  126. package/dist/image/jp2-boxes.cjs +148 -0
  127. package/dist/image/jp2-boxes.d.cts +26 -0
  128. package/dist/image/jp2-boxes.d.ts +26 -0
  129. package/dist/image/jp2-boxes.js +146 -0
  130. package/dist/image/jpeg2000-codestream.cjs +309 -0
  131. package/dist/image/jpeg2000-codestream.d.cts +78 -0
  132. package/dist/image/jpeg2000-codestream.d.ts +78 -0
  133. package/dist/image/jpeg2000-codestream.js +308 -0
  134. package/dist/image/jpeg2000-dwt.cjs +148 -0
  135. package/dist/image/jpeg2000-dwt.d.cts +34 -0
  136. package/dist/image/jpeg2000-dwt.d.ts +34 -0
  137. package/dist/image/jpeg2000-dwt.js +145 -0
  138. package/dist/image/jpeg2000-errors.cjs +17 -0
  139. package/dist/image/jpeg2000-errors.d.cts +9 -0
  140. package/dist/image/jpeg2000-errors.d.ts +9 -0
  141. package/dist/image/jpeg2000-errors.js +15 -0
  142. package/dist/image/jpeg2000-t1.cjs +254 -0
  143. package/dist/image/jpeg2000-t1.d.cts +18 -0
  144. package/dist/image/jpeg2000-t1.d.ts +18 -0
  145. package/dist/image/jpeg2000-t1.js +253 -0
  146. package/dist/image/jpeg2000-t2.cjs +316 -0
  147. package/dist/image/jpeg2000-t2.d.cts +79 -0
  148. package/dist/image/jpeg2000-t2.d.ts +79 -0
  149. package/dist/image/jpeg2000-t2.js +311 -0
  150. package/dist/image/jpeg2000-tagtree.cjs +105 -0
  151. package/dist/image/jpeg2000-tagtree.d.cts +29 -0
  152. package/dist/image/jpeg2000-tagtree.d.ts +29 -0
  153. package/dist/image/jpeg2000-tagtree.js +103 -0
  154. package/dist/image/jpeg2000.cjs +322 -0
  155. package/dist/image/jpeg2000.d.cts +54 -0
  156. package/dist/image/jpeg2000.d.ts +54 -0
  157. package/dist/image/jpeg2000.js +320 -0
  158. package/dist/images-read.cjs +78 -1
  159. package/dist/images-read.js +78 -1
  160. package/dist/index.cjs +22 -0
  161. package/dist/index.d.cts +14 -3
  162. package/dist/index.d.ts +14 -3
  163. package/dist/index.js +9 -2
  164. package/dist/jbig2-errors-Bj6MPxrx.d.cts +9 -0
  165. package/dist/jbig2-errors-Bj6MPxrx.d.ts +9 -0
  166. package/dist/math-font-write.cjs +2 -31
  167. package/dist/math-font-write.js +1 -30
  168. package/dist/math-font.cjs +50 -23
  169. package/dist/math-font.d.cts +8 -1
  170. package/dist/math-font.d.ts +8 -1
  171. package/dist/math-font.js +48 -21
  172. package/dist/math-stretch-Bwk_bxh1.d.ts +24 -0
  173. package/dist/math-stretch-DXWjs8gL.d.cts +24 -0
  174. package/dist/math-stretch.cjs +96 -0
  175. package/dist/math-stretch.d.cts +2 -0
  176. package/dist/math-stretch.d.ts +2 -0
  177. package/dist/math-stretch.js +94 -0
  178. package/dist/math-table-DhPrNoPa.d.ts +70 -0
  179. package/dist/math-table-gFNB8DmQ.d.cts +70 -0
  180. package/dist/math-table.cjs +69 -1
  181. package/dist/math-table.d.cts +2 -45
  182. package/dist/math-table.d.ts +2 -45
  183. package/dist/math-table.js +69 -1
  184. package/dist/{math-types-Ba8qAf1p.d.cts → math-types-YSQUTviw.d.cts} +2 -0
  185. package/dist/{math-types-Ba8qAf1p.d.ts → math-types-YSQUTviw.d.ts} +2 -0
  186. package/dist/math-types.d.cts +1 -1
  187. package/dist/math-types.d.ts +1 -1
  188. package/dist/measure.cjs +65 -14
  189. package/dist/measure.d.cts +8 -1
  190. package/dist/measure.d.ts +8 -1
  191. package/dist/measure.js +64 -15
  192. package/dist/sfnt-V08bb5ut.d.cts +21 -0
  193. package/dist/sfnt-V08bb5ut.d.ts +21 -0
  194. package/dist/sfnt-subset.cjs +250 -0
  195. package/dist/sfnt-subset.d.cts +11 -0
  196. package/dist/sfnt-subset.d.ts +11 -0
  197. package/dist/sfnt-subset.js +249 -0
  198. package/dist/sfnt.cjs +50 -4
  199. package/dist/sfnt.d.cts +2 -17
  200. package/dist/sfnt.d.ts +2 -17
  201. package/dist/sfnt.js +47 -5
  202. package/dist/tounicode.cjs +34 -0
  203. package/dist/tounicode.d.cts +5 -0
  204. package/dist/tounicode.d.ts +5 -0
  205. package/dist/tounicode.js +33 -0
  206. package/dist/write.cjs +80 -10
  207. package/dist/write.d.cts +6 -0
  208. package/dist/write.d.ts +6 -0
  209. package/dist/write.js +81 -11
  210. package/package.json +1 -1
  211. package/dist/math-cmap.cjs +0 -81
  212. package/dist/math-cmap.d.cts +0 -6
  213. package/dist/math-cmap.d.ts +0 -6
  214. package/dist/math-cmap.js +0 -80
@@ -0,0 +1,322 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_image_jpeg2000_errors = require("./jpeg2000-errors.cjs");
3
+ const require_image_jp2_boxes = require("./jp2-boxes.cjs");
4
+ const require_image_jpeg2000_codestream = require("./jpeg2000-codestream.cjs");
5
+ const require_image_jpeg2000_dwt = require("./jpeg2000-dwt.cjs");
6
+ const require_image_jpeg2000_t1 = require("./jpeg2000-t1.cjs");
7
+ const require_image_jpeg2000_t2 = require("./jpeg2000-t2.cjs");
8
+ //#region src/image/jpeg2000.ts
9
+ function resolveCoding(main, tile, component) {
10
+ const tileCoc = tile?.coc.get(component);
11
+ if (tileCoc !== void 0) return tileCoc;
12
+ if (tile?.cod !== void 0) return tile.cod;
13
+ const mainCoc = main.coc.get(component);
14
+ if (mainCoc !== void 0) return mainCoc;
15
+ if (main.cod === void 0) throw new require_image_jpeg2000_errors.Jpeg2000ParseError("no COD marker defines a coding style for this codestream");
16
+ return main.cod;
17
+ }
18
+ function resolveQuantization(main, tile, component) {
19
+ const tileQcc = tile?.qcc.get(component);
20
+ if (tileQcc !== void 0) return tileQcc;
21
+ if (tile?.qcd !== void 0) return tile.qcd;
22
+ const mainQcc = main.qcc.get(component);
23
+ if (mainQcc !== void 0) return mainQcc;
24
+ if (main.qcd === void 0) throw new require_image_jpeg2000_errors.Jpeg2000ParseError("no QCD marker defines a quantization for this codestream");
25
+ return main.qcd;
26
+ }
27
+ function tileDefaults(main, tile) {
28
+ if (tile?.cod !== void 0) return tile.cod;
29
+ if (main.cod === void 0) throw new require_image_jpeg2000_errors.Jpeg2000ParseError("no COD marker defines a coding style for this codestream");
30
+ return main.cod;
31
+ }
32
+ function undecodableReason(codestream) {
33
+ const main = codestream.main;
34
+ const cod = main.cod;
35
+ if (cod === void 0) return "the codestream carries no COD marker";
36
+ const headers = [main, ...codestream.tileParts.map((part) => part.header)];
37
+ for (const header of headers) {
38
+ if (header.hasProgressionChanges) return "the codestream carries a POC marker (progression order change), which this decoder does not follow";
39
+ if (header.hasRegionOfInterest) return "the codestream carries an RGN marker (region of interest), whose coefficient upshift this decoder does not undo";
40
+ if (header.hasPackedPacketHeaders) return "the codestream carries a PPT marker (packed packet headers in the tile-part header), an organisation this decoder does not reassemble";
41
+ }
42
+ for (let c = 0; c < codestream.siz.components.length; c++) {
43
+ const size = codestream.siz.components[c];
44
+ if (size === void 0) continue;
45
+ if (size.dx !== 1 || size.dy !== 1) return `component ${String(c)} is sub-sampled (${String(size.dx)}x${String(size.dy)}), which this decoder does not resample`;
46
+ for (const header of headers) {
47
+ const style = resolveCoding(main, header === main ? void 0 : header, c);
48
+ if ((style.codeBlockStyle & 1) !== 0) return "the code-block style enables selective arithmetic coding bypass, which this decoder does not read";
49
+ if ((style.codeBlockStyle & 4) !== 0) return "the code-block style terminates the arithmetic coder on every coding pass, which this decoder does not read";
50
+ }
51
+ }
52
+ for (const part of codestream.tileParts) {
53
+ if (part.partIndex !== 0) continue;
54
+ const defaults = part.header.cod ?? cod;
55
+ if (defaults.progressionOrder === "LRCP" || defaults.progressionOrder === "RLCP") continue;
56
+ const numTilesWide = Math.max(Math.ceil((codestream.siz.xsiz - codestream.siz.xtosiz) / codestream.siz.xtsiz), 1);
57
+ const codingPerComponent = codestream.siz.components.map((_, c) => resolveCoding(main, part.header, c));
58
+ if (require_image_jpeg2000_t2.tileHasSubdividedPrecincts(codestream.siz, part.tileIndex % numTilesWide, Math.floor(part.tileIndex / numTilesWide), codingPerComponent)) return `progression order ${defaults.progressionOrder} is only decoded here when every resolution level holds a single precinct, and this codestream subdivides at least one of them`;
59
+ }
60
+ const first = codestream.siz.components[0];
61
+ if (first !== void 0) {
62
+ for (const size of codestream.siz.components) if (size.bitDepth !== first.bitDepth || size.signed !== first.signed) return "the codestream mixes component bit depths or signedness, which this decoder does not combine into one image";
63
+ if (first.bitDepth > 31) return `a component bit depth of ${String(first.bitDepth)} exceeds what this decoder's own 32-bit sample arithmetic can hold`;
64
+ }
65
+ }
66
+ function readJpeg2000Metadata(data) {
67
+ const container = require_image_jp2_boxes.parseJp2Container(data);
68
+ const codestream = require_image_jpeg2000_codestream.parseJpeg2000Codestream(container.codestream);
69
+ const cod = codestream.main.cod;
70
+ const qcd = codestream.main.qcd;
71
+ if (cod === void 0 || qcd === void 0) throw new require_image_jpeg2000_errors.Jpeg2000ParseError("the codestream main header is missing its COD or QCD marker");
72
+ const reason = undecodableReason(codestream);
73
+ const siz = codestream.siz;
74
+ return {
75
+ width: siz.xsiz - siz.xosiz,
76
+ height: siz.ysiz - siz.yosiz,
77
+ components: siz.components.map((component) => ({
78
+ bitDepth: component.bitDepth,
79
+ signed: component.signed,
80
+ dx: component.dx,
81
+ dy: component.dy
82
+ })),
83
+ tileWidth: siz.xtsiz,
84
+ tileHeight: siz.ytsiz,
85
+ tilesWide: codestream.numTilesWide,
86
+ tilesHigh: codestream.numTilesHigh,
87
+ tilePartCount: codestream.tileParts.length,
88
+ decompositionLevels: cod.decompositionLevels,
89
+ transform: cod.transform,
90
+ progressionOrder: cod.progressionOrder,
91
+ layers: cod.layers,
92
+ codeBlockWidth: 2 ** cod.codeBlockWidthExp,
93
+ codeBlockHeight: 2 ** cod.codeBlockHeightExp,
94
+ codeBlockStyle: cod.codeBlockStyle,
95
+ quantizationStyle: qcd.style,
96
+ guardBits: qcd.guardBits,
97
+ multipleComponentTransform: cod.multipleComponentTransform,
98
+ usesSopMarkers: cod.useSop,
99
+ usesEphMarkers: cod.useEph,
100
+ hasIccProfile: container.iccProfile !== void 0,
101
+ channelDefinitions: container.channelDefinitions,
102
+ comments: codestream.comments,
103
+ truncated: codestream.truncated,
104
+ decodable: reason === void 0,
105
+ ...container.colourSpace !== void 0 ? { colourSpace: container.colourSpace } : {},
106
+ ...reason !== void 0 ? { undecodableReason: reason } : {}
107
+ };
108
+ }
109
+ function concatTilePartData(codestream, tileIndex) {
110
+ const parts = codestream.tileParts.filter((part) => part.tileIndex === tileIndex).sort((a, b) => a.partIndex - b.partIndex);
111
+ let total = 0;
112
+ for (const part of parts) total += part.dataEnd - part.dataStart;
113
+ const out = new Uint8Array(total);
114
+ let offset = 0;
115
+ for (const part of parts) {
116
+ out.set(codestream.bytes.subarray(part.dataStart, part.dataEnd), offset);
117
+ offset += part.dataEnd - part.dataStart;
118
+ }
119
+ return out;
120
+ }
121
+ function halveTowardZero(value) {
122
+ return value < 0 ? -(-value >> 1) : value >> 1;
123
+ }
124
+ function quantizationStep(band, componentBitDepth) {
125
+ return 2 ** (componentBitDepth + require_image_jpeg2000_t2.subbandGainLog2(band.type) - band.stepSize.exponent) * (1 + band.stepSize.mantissa / 2048);
126
+ }
127
+ function decodeSubbandBlocks(band, codeBlockStyle, data, place) {
128
+ for (const precinct of band.precincts) for (const block of precinct.codeBlocks) {
129
+ const blockWidth = block.x1 - block.x0;
130
+ const blockHeight = block.y1 - block.y0;
131
+ if (blockWidth <= 0 || blockHeight <= 0 || block.passes === 0) continue;
132
+ let coded = /* @__PURE__ */ new Uint8Array(0);
133
+ if (block.chunks.length === 1) {
134
+ const chunk = block.chunks[0];
135
+ coded = chunk === void 0 ? coded : data.subarray(chunk.start, chunk.end);
136
+ } else if (block.chunks.length > 1) {
137
+ let total = 0;
138
+ for (const chunk of block.chunks) total += chunk.end - chunk.start;
139
+ const joined = new Uint8Array(total);
140
+ let offset = 0;
141
+ for (const chunk of block.chunks) {
142
+ joined.set(data.subarray(chunk.start, chunk.end), offset);
143
+ offset += chunk.end - chunk.start;
144
+ }
145
+ coded = joined;
146
+ }
147
+ const { values } = require_image_jpeg2000_t1.decodeJpeg2000CodeBlock({
148
+ width: blockWidth,
149
+ height: blockHeight,
150
+ subband: band.type,
151
+ zeroBitPlanes: block.zeroBitPlanes,
152
+ maxBitPlanes: band.maxBitPlanes,
153
+ totalPasses: block.passes,
154
+ codeBlockStyle,
155
+ data: coded
156
+ });
157
+ for (let y = 0; y < blockHeight; y++) for (let x = 0; x < blockWidth; x++) place(block.x0 - band.x0 + x, block.y0 - band.y0 + y, values[y * blockWidth + x] ?? 0);
158
+ }
159
+ }
160
+ function decodeReversibleTileComponent(tile, componentIndex, data) {
161
+ const component = tile.components[componentIndex];
162
+ if (component === void 0) throw new require_image_jpeg2000_errors.Jpeg2000ParseError(`the tile has no component ${String(componentIndex)}`);
163
+ const bands = /* @__PURE__ */ new Map();
164
+ for (const resolution of component.resolutions) for (const band of resolution.subbands) {
165
+ const width = band.x1 - band.x0;
166
+ const samples = new Int32Array(Math.max(width * (band.y1 - band.y0), 0));
167
+ decodeSubbandBlocks(band, component.coding.codeBlockStyle, data, (x, y, value) => {
168
+ samples[y * width + x] = halveTowardZero(value);
169
+ });
170
+ bands.set(`${String(resolution.index)}:${band.type}`, samples);
171
+ }
172
+ let current = bands.get("0:LL") ?? /* @__PURE__ */ new Int32Array(0);
173
+ for (let r = 1; r < component.resolutions.length; r++) {
174
+ const resolution = component.resolutions[r];
175
+ if (resolution === void 0) break;
176
+ current = require_image_jpeg2000_dwt.inverseDwt53Level({
177
+ ll: current,
178
+ hl: bands.get(`${String(r)}:HL`) ?? /* @__PURE__ */ new Int32Array(0),
179
+ lh: bands.get(`${String(r)}:LH`) ?? /* @__PURE__ */ new Int32Array(0),
180
+ hh: bands.get(`${String(r)}:HH`) ?? /* @__PURE__ */ new Int32Array(0)
181
+ }, {
182
+ u0: resolution.x0,
183
+ u1: resolution.x1,
184
+ v0: resolution.y0,
185
+ v1: resolution.y1
186
+ });
187
+ }
188
+ return current;
189
+ }
190
+ function decodeIrreversibleTileComponent(tile, componentIndex, componentBitDepth, data) {
191
+ const component = tile.components[componentIndex];
192
+ if (component === void 0) throw new require_image_jpeg2000_errors.Jpeg2000ParseError(`the tile has no component ${String(componentIndex)}`);
193
+ const bands = /* @__PURE__ */ new Map();
194
+ for (const resolution of component.resolutions) for (const band of resolution.subbands) {
195
+ const width = band.x1 - band.x0;
196
+ const samples = new Float32Array(Math.max(width * (band.y1 - band.y0), 0));
197
+ const scale = quantizationStep(band, componentBitDepth) / 2;
198
+ decodeSubbandBlocks(band, component.coding.codeBlockStyle, data, (x, y, value) => {
199
+ samples[y * width + x] = value * scale;
200
+ });
201
+ bands.set(`${String(resolution.index)}:${band.type}`, samples);
202
+ }
203
+ let current = bands.get("0:LL") ?? /* @__PURE__ */ new Float32Array(0);
204
+ for (let r = 1; r < component.resolutions.length; r++) {
205
+ const resolution = component.resolutions[r];
206
+ if (resolution === void 0) break;
207
+ current = require_image_jpeg2000_dwt.inverseDwt97Level({
208
+ ll: current,
209
+ hl: bands.get(`${String(r)}:HL`) ?? /* @__PURE__ */ new Float32Array(0),
210
+ lh: bands.get(`${String(r)}:LH`) ?? /* @__PURE__ */ new Float32Array(0),
211
+ hh: bands.get(`${String(r)}:HH`) ?? /* @__PURE__ */ new Float32Array(0)
212
+ }, {
213
+ u0: resolution.x0,
214
+ u1: resolution.x1,
215
+ v0: resolution.y0,
216
+ v1: resolution.y1
217
+ });
218
+ }
219
+ return current;
220
+ }
221
+ function inverseReversibleComponentTransform(planes) {
222
+ const y = planes[0];
223
+ const u = planes[1];
224
+ const v = planes[2];
225
+ if (y === void 0 || u === void 0 || v === void 0) return;
226
+ for (let i = 0; i < y.length; i++) {
227
+ const green = (y[i] ?? 0) - Math.floor(((u[i] ?? 0) + (v[i] ?? 0)) / 4);
228
+ const red = (v[i] ?? 0) + green;
229
+ const blue = (u[i] ?? 0) + green;
230
+ y[i] = red;
231
+ u[i] = green;
232
+ v[i] = blue;
233
+ }
234
+ }
235
+ const ICT_RED_FROM_CR = 1.402;
236
+ const ICT_GREEN_FROM_CB = -.344136;
237
+ const ICT_GREEN_FROM_CR = -.714136;
238
+ const ICT_BLUE_FROM_CB = 1.772;
239
+ function inverseIrreversibleComponentTransform(planes) {
240
+ const y = planes[0];
241
+ const cb = planes[1];
242
+ const cr = planes[2];
243
+ if (y === void 0 || cb === void 0 || cr === void 0) return;
244
+ for (let i = 0; i < y.length; i++) {
245
+ const luma = y[i] ?? 0;
246
+ const blueDiff = cb[i] ?? 0;
247
+ const redDiff = cr[i] ?? 0;
248
+ y[i] = luma + ICT_RED_FROM_CR * redDiff;
249
+ cb[i] = luma + ICT_GREEN_FROM_CB * blueDiff + ICT_GREEN_FROM_CR * redDiff;
250
+ cr[i] = luma + ICT_BLUE_FROM_CB * blueDiff;
251
+ }
252
+ }
253
+ function decodeJpeg2000(data, options = {}) {
254
+ const onWarning = options.onWarning ?? (() => void 0);
255
+ const container = require_image_jp2_boxes.parseJp2Container(data);
256
+ const codestream = require_image_jpeg2000_codestream.parseJpeg2000Codestream(container.codestream);
257
+ const reason = undecodableReason(codestream);
258
+ if (reason !== void 0) throw new require_image_jpeg2000_errors.Jpeg2000UnsupportedError(reason);
259
+ if (codestream.truncated) onWarning("the codestream ends without an EOC marker, so it is truncated; decoding whatever packets did arrive");
260
+ const siz = codestream.siz;
261
+ const width = siz.xsiz - siz.xosiz;
262
+ const height = siz.ysiz - siz.yosiz;
263
+ const componentCount = siz.components.length;
264
+ const first = siz.components[0];
265
+ if (first === void 0) throw new require_image_jpeg2000_errors.Jpeg2000ParseError("the codestream declares no components");
266
+ const planes = Array.from({ length: componentCount }, () => new Int32Array(width * height));
267
+ const tileIndices = new Set(codestream.tileParts.map((part) => part.tileIndex));
268
+ if (tileIndices.size === 0) throw new require_image_jpeg2000_errors.Jpeg2000ParseError("the codestream carries no tile-part data");
269
+ for (const tileIndex of [...tileIndices].sort((a, b) => a - b)) {
270
+ const tileX = tileIndex % codestream.numTilesWide;
271
+ const tileY = Math.floor(tileIndex / codestream.numTilesWide);
272
+ const tileHeader = codestream.tileParts.find((part) => part.tileIndex === tileIndex && part.partIndex === 0)?.header;
273
+ const codingPerComponent = Array.from({ length: componentCount }, (_, c) => resolveCoding(codestream.main, tileHeader, c));
274
+ const quantizationPerComponent = Array.from({ length: componentCount }, (_, c) => resolveQuantization(codestream.main, tileHeader, c));
275
+ const defaults = tileDefaults(codestream.main, tileHeader);
276
+ const geometry = require_image_jpeg2000_t2.buildTileGeometry(siz, tileX, tileY, codingPerComponent, quantizationPerComponent);
277
+ const tileData = concatTilePartData(codestream, tileIndex);
278
+ const sequence = require_image_jpeg2000_t2.buildPacketSequence(geometry, defaults.progressionOrder, defaults.layers);
279
+ require_image_jpeg2000_t2.readTilePackets(tileData, 0, tileData.length, geometry, sequence, {
280
+ useSop: defaults.useSop,
281
+ useEph: defaults.useEph,
282
+ onWarning
283
+ });
284
+ const tilePlanes = [];
285
+ if (defaults.transform === "reversible-5-3") {
286
+ const reversible = Array.from({ length: componentCount }, (_, c) => decodeReversibleTileComponent(geometry, c, tileData));
287
+ if (defaults.multipleComponentTransform && componentCount >= 3) inverseReversibleComponentTransform(reversible);
288
+ tilePlanes.push(...reversible);
289
+ } else {
290
+ const irreversible = Array.from({ length: componentCount }, (_, c) => decodeIrreversibleTileComponent(geometry, c, first.bitDepth, tileData));
291
+ if (defaults.multipleComponentTransform && componentCount >= 3) inverseIrreversibleComponentTransform(irreversible);
292
+ tilePlanes.push(...irreversible);
293
+ }
294
+ for (let c = 0; c < componentCount; c++) {
295
+ const tileComponent = geometry.components[c];
296
+ const source = tilePlanes[c];
297
+ const destination = planes[c];
298
+ if (tileComponent === void 0 || source === void 0 || destination === void 0) continue;
299
+ const tileWidth = tileComponent.x1 - tileComponent.x0;
300
+ for (let y = tileComponent.y0; y < tileComponent.y1; y++) for (let x = tileComponent.x0; x < tileComponent.x1; x++) destination[(y - siz.yosiz) * width + (x - siz.xosiz)] = Math.round(source[(y - tileComponent.y0) * tileWidth + (x - tileComponent.x0)] ?? 0);
301
+ }
302
+ }
303
+ const shift = first.signed ? 0 : 1 << first.bitDepth - 1;
304
+ const minimum = first.signed ? -(1 << first.bitDepth - 1) : 0;
305
+ const maximum = first.signed ? (1 << first.bitDepth - 1) - 1 : (1 << first.bitDepth) - 1;
306
+ for (const plane of planes) for (let i = 0; i < plane.length; i++) plane[i] = Math.min(Math.max((plane[i] ?? 0) + shift, minimum), maximum);
307
+ const base = {
308
+ width,
309
+ height,
310
+ bitDepth: first.bitDepth,
311
+ signed: first.signed,
312
+ components: planes,
313
+ channelDefinitions: container.channelDefinitions
314
+ };
315
+ return container.colourSpace !== void 0 ? {
316
+ ...base,
317
+ colourSpace: container.colourSpace
318
+ } : base;
319
+ }
320
+ //#endregion
321
+ exports.decodeJpeg2000 = decodeJpeg2000;
322
+ exports.readJpeg2000Metadata = readJpeg2000Metadata;
@@ -0,0 +1,54 @@
1
+ import { Jp2ChannelDefinition, Jp2ColourSpace } from "./jp2-boxes.cjs";
2
+ import { Jpeg2000ProgressionOrder, Jpeg2000QuantizationStyle, Jpeg2000Transform } from "./jpeg2000-codestream.cjs";
3
+ //#region src/image/jpeg2000.d.ts
4
+ interface Jpeg2000ComponentMetadata {
5
+ readonly bitDepth: number;
6
+ readonly signed: boolean;
7
+ readonly dx: number;
8
+ readonly dy: number;
9
+ }
10
+ interface Jpeg2000Metadata {
11
+ readonly width: number;
12
+ readonly height: number;
13
+ readonly components: readonly Jpeg2000ComponentMetadata[];
14
+ readonly tileWidth: number;
15
+ readonly tileHeight: number;
16
+ readonly tilesWide: number;
17
+ readonly tilesHigh: number;
18
+ readonly tilePartCount: number;
19
+ readonly decompositionLevels: number;
20
+ readonly transform: Jpeg2000Transform;
21
+ readonly progressionOrder: Jpeg2000ProgressionOrder;
22
+ readonly layers: number;
23
+ readonly codeBlockWidth: number;
24
+ readonly codeBlockHeight: number;
25
+ readonly codeBlockStyle: number;
26
+ readonly quantizationStyle: Jpeg2000QuantizationStyle;
27
+ readonly guardBits: number;
28
+ readonly multipleComponentTransform: boolean;
29
+ readonly usesSopMarkers: boolean;
30
+ readonly usesEphMarkers: boolean;
31
+ readonly colourSpace?: Jp2ColourSpace;
32
+ readonly hasIccProfile: boolean;
33
+ readonly channelDefinitions: readonly Jp2ChannelDefinition[];
34
+ readonly comments: readonly string[];
35
+ readonly truncated: boolean;
36
+ readonly decodable: boolean;
37
+ readonly undecodableReason?: string;
38
+ }
39
+ interface Jpeg2000DecodeOptions {
40
+ readonly onWarning?: (message: string) => void;
41
+ }
42
+ interface Jpeg2000Image {
43
+ readonly width: number;
44
+ readonly height: number;
45
+ readonly bitDepth: number;
46
+ readonly signed: boolean;
47
+ readonly components: readonly Int32Array[];
48
+ readonly colourSpace?: Jp2ColourSpace;
49
+ readonly channelDefinitions: readonly Jp2ChannelDefinition[];
50
+ }
51
+ declare function readJpeg2000Metadata(data: Uint8Array<ArrayBuffer>): Jpeg2000Metadata;
52
+ declare function decodeJpeg2000(data: Uint8Array<ArrayBuffer>, options?: Jpeg2000DecodeOptions): Jpeg2000Image;
53
+ //#endregion
54
+ export { Jpeg2000ComponentMetadata, Jpeg2000DecodeOptions, Jpeg2000Image, Jpeg2000Metadata, decodeJpeg2000, readJpeg2000Metadata };
@@ -0,0 +1,54 @@
1
+ import { Jp2ChannelDefinition, Jp2ColourSpace } from "./jp2-boxes.js";
2
+ import { Jpeg2000ProgressionOrder, Jpeg2000QuantizationStyle, Jpeg2000Transform } from "./jpeg2000-codestream.js";
3
+ //#region src/image/jpeg2000.d.ts
4
+ interface Jpeg2000ComponentMetadata {
5
+ readonly bitDepth: number;
6
+ readonly signed: boolean;
7
+ readonly dx: number;
8
+ readonly dy: number;
9
+ }
10
+ interface Jpeg2000Metadata {
11
+ readonly width: number;
12
+ readonly height: number;
13
+ readonly components: readonly Jpeg2000ComponentMetadata[];
14
+ readonly tileWidth: number;
15
+ readonly tileHeight: number;
16
+ readonly tilesWide: number;
17
+ readonly tilesHigh: number;
18
+ readonly tilePartCount: number;
19
+ readonly decompositionLevels: number;
20
+ readonly transform: Jpeg2000Transform;
21
+ readonly progressionOrder: Jpeg2000ProgressionOrder;
22
+ readonly layers: number;
23
+ readonly codeBlockWidth: number;
24
+ readonly codeBlockHeight: number;
25
+ readonly codeBlockStyle: number;
26
+ readonly quantizationStyle: Jpeg2000QuantizationStyle;
27
+ readonly guardBits: number;
28
+ readonly multipleComponentTransform: boolean;
29
+ readonly usesSopMarkers: boolean;
30
+ readonly usesEphMarkers: boolean;
31
+ readonly colourSpace?: Jp2ColourSpace;
32
+ readonly hasIccProfile: boolean;
33
+ readonly channelDefinitions: readonly Jp2ChannelDefinition[];
34
+ readonly comments: readonly string[];
35
+ readonly truncated: boolean;
36
+ readonly decodable: boolean;
37
+ readonly undecodableReason?: string;
38
+ }
39
+ interface Jpeg2000DecodeOptions {
40
+ readonly onWarning?: (message: string) => void;
41
+ }
42
+ interface Jpeg2000Image {
43
+ readonly width: number;
44
+ readonly height: number;
45
+ readonly bitDepth: number;
46
+ readonly signed: boolean;
47
+ readonly components: readonly Int32Array[];
48
+ readonly colourSpace?: Jp2ColourSpace;
49
+ readonly channelDefinitions: readonly Jp2ChannelDefinition[];
50
+ }
51
+ declare function readJpeg2000Metadata(data: Uint8Array<ArrayBuffer>): Jpeg2000Metadata;
52
+ declare function decodeJpeg2000(data: Uint8Array<ArrayBuffer>, options?: Jpeg2000DecodeOptions): Jpeg2000Image;
53
+ //#endregion
54
+ export { Jpeg2000ComponentMetadata, Jpeg2000DecodeOptions, Jpeg2000Image, Jpeg2000Metadata, decodeJpeg2000, readJpeg2000Metadata };