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,311 @@
1
+ import { Jpeg2000ParseError, Jpeg2000UnsupportedError } from "./jpeg2000-errors.js";
2
+ import { PacketBitReader, TagTree } from "./jpeg2000-tagtree.js";
3
+ //#region src/image/jpeg2000-t2.ts
4
+ const HIGHER_RESOLUTION_BANDS = [
5
+ "HL",
6
+ "LH",
7
+ "HH"
8
+ ];
9
+ const SUBBAND_GAIN_LOG2 = {
10
+ LL: 0,
11
+ HL: 1,
12
+ LH: 1,
13
+ HH: 2
14
+ };
15
+ const INITIAL_LBLOCK = 3;
16
+ function ceilDiv(value, divisor) {
17
+ return Math.ceil(value / divisor);
18
+ }
19
+ function tileBounds(siz, tileX, tileY) {
20
+ return {
21
+ x0: Math.max(siz.xtosiz + tileX * siz.xtsiz, siz.xosiz),
22
+ y0: Math.max(siz.ytosiz + tileY * siz.ytsiz, siz.yosiz),
23
+ x1: Math.min(siz.xtosiz + (tileX + 1) * siz.xtsiz, siz.xsiz),
24
+ y1: Math.min(siz.ytosiz + (tileY + 1) * siz.ytsiz, siz.ysiz)
25
+ };
26
+ }
27
+ function componentBounds(tile, dx, dy) {
28
+ return {
29
+ x0: ceilDiv(tile.x0, dx),
30
+ y0: ceilDiv(tile.y0, dy),
31
+ x1: ceilDiv(tile.x1, dx),
32
+ y1: ceilDiv(tile.y1, dy)
33
+ };
34
+ }
35
+ function resolutionBounds(component, levels, resolution) {
36
+ const scale = 2 ** (levels - resolution);
37
+ return {
38
+ x0: ceilDiv(component.x0, scale),
39
+ y0: ceilDiv(component.y0, scale),
40
+ x1: ceilDiv(component.x1, scale),
41
+ y1: ceilDiv(component.y1, scale)
42
+ };
43
+ }
44
+ function precinctGrid(bounds, ppx, ppy) {
45
+ return {
46
+ wide: bounds.x1 > bounds.x0 ? Math.ceil(bounds.x1 / 2 ** ppx) - Math.floor(bounds.x0 / 2 ** ppx) : 0,
47
+ high: bounds.y1 > bounds.y0 ? Math.ceil(bounds.y1 / 2 ** ppy) - Math.floor(bounds.y0 / 2 ** ppy) : 0
48
+ };
49
+ }
50
+ function tileHasSubdividedPrecincts(siz, tileX, tileY, codingPerComponent) {
51
+ const tile = tileBounds(siz, tileX, tileY);
52
+ for (let c = 0; c < siz.components.length; c++) {
53
+ const size = siz.components[c];
54
+ const coding = codingPerComponent[c];
55
+ if (size === void 0 || coding === void 0) continue;
56
+ const component = componentBounds(tile, size.dx, size.dy);
57
+ for (let r = 0; r <= coding.decompositionLevels; r++) {
58
+ const precinctSize = coding.precinctSizes[r];
59
+ if (precinctSize === void 0) continue;
60
+ const grid = precinctGrid(resolutionBounds(component, coding.decompositionLevels, r), precinctSize.ppx, precinctSize.ppy);
61
+ if (grid.wide * grid.high > 1) return true;
62
+ }
63
+ }
64
+ return false;
65
+ }
66
+ function bandCoordinate(componentCoordinate, levels, orientation) {
67
+ if (levels === 0) return componentCoordinate;
68
+ const half = 2 ** (levels - 1);
69
+ return Math.ceil((componentCoordinate - half * orientation) / (2 * half));
70
+ }
71
+ function quantizationIndex(resolution, bandIndex) {
72
+ return resolution === 0 ? 0 : 3 * (resolution - 1) + bandIndex + 1;
73
+ }
74
+ function stepSizeFor(quantization, resolution, bandIndex) {
75
+ if (quantization.style === "derived") {
76
+ const base = quantization.stepSizes[0];
77
+ if (base === void 0) throw new Jpeg2000ParseError("a QCD/QCC marker declares derived quantization but carries no step size");
78
+ return {
79
+ exponent: Math.max(base.exponent - Math.max(resolution - 1, 0), 0),
80
+ mantissa: base.mantissa
81
+ };
82
+ }
83
+ const index = quantizationIndex(resolution, bandIndex);
84
+ const step = quantization.stepSizes[index];
85
+ if (step === void 0) throw new Jpeg2000ParseError(`a QCD/QCC marker carries no step size for subband ${String(index)}, which its own decomposition level count requires`);
86
+ return step;
87
+ }
88
+ function buildPrecinct(band, precinctX, precinctY, bandPpx, bandPpy, codeBlockWidthExp, codeBlockHeightExp) {
89
+ const precinctWidth = 2 ** bandPpx;
90
+ const precinctHeight = 2 ** bandPpy;
91
+ const originX = (Math.floor(band.x0 / precinctWidth) + precinctX) * precinctWidth;
92
+ const originY = (Math.floor(band.y0 / precinctHeight) + precinctY) * precinctHeight;
93
+ const px0 = Math.max(originX, band.x0);
94
+ const py0 = Math.max(originY, band.y0);
95
+ const px1 = Math.min(originX + precinctWidth, band.x1);
96
+ const py1 = Math.min(originY + precinctHeight, band.y1);
97
+ const cbWidth = 2 ** Math.min(codeBlockWidthExp, bandPpx);
98
+ const cbHeight = 2 ** Math.min(codeBlockHeightExp, bandPpy);
99
+ const gridX0 = Math.floor(px0 / cbWidth);
100
+ const gridY0 = Math.floor(py0 / cbHeight);
101
+ const gridX1 = px1 > px0 ? Math.ceil(px1 / cbWidth) : gridX0;
102
+ const gridY1 = py1 > py0 ? Math.ceil(py1 / cbHeight) : gridY0;
103
+ const gridWidth = gridX1 - gridX0;
104
+ const gridHeight = gridY1 - gridY0;
105
+ const codeBlocks = [];
106
+ for (let gy = 0; gy < gridHeight; gy++) for (let gx = 0; gx < gridWidth; gx++) {
107
+ const cellX = (gridX0 + gx) * cbWidth;
108
+ const cellY = (gridY0 + gy) * cbHeight;
109
+ codeBlocks.push({
110
+ x0: Math.max(cellX, px0),
111
+ y0: Math.max(cellY, py0),
112
+ x1: Math.min(cellX + cbWidth, px1),
113
+ y1: Math.min(cellY + cbHeight, py1),
114
+ gridX: gx,
115
+ gridY: gy,
116
+ included: false,
117
+ lblock: INITIAL_LBLOCK,
118
+ zeroBitPlanes: 0,
119
+ passes: 0,
120
+ chunks: []
121
+ });
122
+ }
123
+ return {
124
+ inclusion: new TagTree(gridWidth, gridHeight),
125
+ zeroBitPlaneTree: new TagTree(gridWidth, gridHeight),
126
+ codeBlocks
127
+ };
128
+ }
129
+ function buildTileGeometry(siz, tileX, tileY, codingPerComponent, quantizationPerComponent) {
130
+ const tile = tileBounds(siz, tileX, tileY);
131
+ const components = [];
132
+ for (let c = 0; c < siz.components.length; c++) {
133
+ const componentSize = siz.components[c];
134
+ const coding = codingPerComponent[c];
135
+ const quantization = quantizationPerComponent[c];
136
+ if (componentSize === void 0 || coding === void 0 || quantization === void 0) throw new Jpeg2000ParseError(`no coding style or quantization is defined for component ${String(c)}`);
137
+ const bounds = componentBounds(tile, componentSize.dx, componentSize.dy);
138
+ const levels = coding.decompositionLevels;
139
+ const resolutions = [];
140
+ for (let r = 0; r <= levels; r++) {
141
+ const level = resolutionBounds(bounds, levels, r);
142
+ const { x0: rx0, y0: ry0, x1: rx1, y1: ry1 } = level;
143
+ const precinctSize = coding.precinctSizes[r];
144
+ if (precinctSize === void 0) throw new Jpeg2000ParseError(`the coding style declares ${String(levels)} decomposition levels but no precinct size for resolution ${String(r)}`);
145
+ const { ppx, ppy } = precinctSize;
146
+ if (r > 0 && (ppx === 0 || ppy === 0)) throw new Jpeg2000ParseError(`resolution level ${String(r)} declares a precinct exponent of zero, which ISO/IEC 15444-1 B.6 permits only at resolution level 0`);
147
+ const { wide: precinctsWide, high: precinctsHigh } = precinctGrid(level, ppx, ppy);
148
+ const bandPpx = r === 0 ? ppx : ppx - 1;
149
+ const bandPpy = r === 0 ? ppy : ppy - 1;
150
+ const bandTypes = r === 0 ? ["LL"] : HIGHER_RESOLUTION_BANDS;
151
+ const subbands = [];
152
+ for (let b = 0; b < bandTypes.length; b++) {
153
+ const type = bandTypes[b] ?? "LL";
154
+ const bandLevels = r === 0 ? levels : levels - r + 1;
155
+ const xob = type === "HL" || type === "HH" ? 1 : 0;
156
+ const yob = type === "LH" || type === "HH" ? 1 : 0;
157
+ const bx0 = bandCoordinate(bounds.x0, bandLevels, xob);
158
+ const by0 = bandCoordinate(bounds.y0, bandLevels, yob);
159
+ const bx1 = bandCoordinate(bounds.x1, bandLevels, xob);
160
+ const by1 = bandCoordinate(bounds.y1, bandLevels, yob);
161
+ const stepSize = stepSizeFor(quantization, r, b);
162
+ const precincts = [];
163
+ for (let py = 0; py < precinctsHigh; py++) for (let px = 0; px < precinctsWide; px++) precincts.push(buildPrecinct({
164
+ x0: bx0,
165
+ y0: by0,
166
+ x1: bx1,
167
+ y1: by1
168
+ }, px, py, bandPpx, bandPpy, coding.codeBlockWidthExp, coding.codeBlockHeightExp));
169
+ subbands.push({
170
+ type,
171
+ x0: bx0,
172
+ y0: by0,
173
+ x1: bx1,
174
+ y1: by1,
175
+ stepSize,
176
+ maxBitPlanes: stepSize.exponent + quantization.guardBits - 1,
177
+ precincts
178
+ });
179
+ }
180
+ resolutions.push({
181
+ index: r,
182
+ x0: rx0,
183
+ y0: ry0,
184
+ x1: rx1,
185
+ y1: ry1,
186
+ precinctsWide,
187
+ precinctsHigh,
188
+ subbands
189
+ });
190
+ }
191
+ components.push({
192
+ ...bounds,
193
+ coding,
194
+ quantization,
195
+ resolutions
196
+ });
197
+ }
198
+ return {
199
+ ...tile,
200
+ components
201
+ };
202
+ }
203
+ function subbandGainLog2(type) {
204
+ return SUBBAND_GAIN_LOG2[type];
205
+ }
206
+ function readCodingPasses(reader) {
207
+ if (reader.readBit() === 0) return 1;
208
+ if (reader.readBit() === 0) return 2;
209
+ const twoBit = reader.readBits(2);
210
+ if (twoBit < 3) return 3 + twoBit;
211
+ const fiveBit = reader.readBits(5);
212
+ if (fiveBit < 31) return 6 + fiveBit;
213
+ return 37 + reader.readBits(7);
214
+ }
215
+ function buildPacketSequence(tile, order, layers) {
216
+ const maxResolutions = Math.max(...tile.components.map((component) => component.resolutions.length));
217
+ const precinctCount = (component, resolution) => {
218
+ const level = (tile.components[component]?.resolutions)?.[resolution];
219
+ return level === void 0 ? 0 : level.precinctsWide * level.precinctsHigh;
220
+ };
221
+ const packets = [];
222
+ const push = (layer, resolution, component, precinct) => {
223
+ packets.push({
224
+ layer,
225
+ resolution,
226
+ component,
227
+ precinct
228
+ });
229
+ };
230
+ if (order === "LRCP") {
231
+ for (let l = 0; l < layers; l++) for (let r = 0; r < maxResolutions; r++) for (let c = 0; c < tile.components.length; c++) for (let p = 0; p < precinctCount(c, r); p++) push(l, r, c, p);
232
+ return packets;
233
+ }
234
+ if (order === "RLCP") {
235
+ for (let r = 0; r < maxResolutions; r++) for (let l = 0; l < layers; l++) for (let c = 0; c < tile.components.length; c++) for (let p = 0; p < precinctCount(c, r); p++) push(l, r, c, p);
236
+ return packets;
237
+ }
238
+ for (let c = 0; c < tile.components.length; c++) for (let r = 0; r < maxResolutions; r++) if (precinctCount(c, r) > 1) throw new Jpeg2000UnsupportedError(`progression order ${order} is only decoded here when every resolution level holds a single precinct, and this codestream subdivides at least one of them`);
239
+ if (order === "RPCL") {
240
+ for (let r = 0; r < maxResolutions; r++) for (let c = 0; c < tile.components.length; c++) for (let l = 0; l < layers; l++) if (precinctCount(c, r) > 0) push(l, r, c, 0);
241
+ return packets;
242
+ }
243
+ if (order === "PCRL") {
244
+ for (let c = 0; c < tile.components.length; c++) for (let r = 0; r < maxResolutions; r++) for (let l = 0; l < layers; l++) if (precinctCount(c, r) > 0) push(l, r, c, 0);
245
+ return packets;
246
+ }
247
+ for (let c = 0; c < tile.components.length; c++) for (let r = 0; r < maxResolutions; r++) for (let l = 0; l < layers; l++) if (precinctCount(c, r) > 0) push(l, r, c, 0);
248
+ return packets;
249
+ }
250
+ const MARKER_SOP_HIGH = 255;
251
+ const MARKER_SOP_LOW = 145;
252
+ const MARKER_EPH_LOW = 146;
253
+ const SOP_SEGMENT_BYTES = 6;
254
+ const EPH_MARKER_BYTES = 2;
255
+ function readTilePackets(data, start, end, tile, sequence, options) {
256
+ let position = start;
257
+ for (let packetIndex = 0; packetIndex < sequence.length; packetIndex++) {
258
+ const packet = sequence[packetIndex];
259
+ if (packet === void 0) break;
260
+ if (position >= end) {
261
+ options.onWarning(`the tile's coded data ended after ${String(packetIndex)} of ${String(sequence.length)} packets; the rest of the image is reconstructed from what did arrive`);
262
+ return position;
263
+ }
264
+ if (options.useSop && position + SOP_SEGMENT_BYTES <= end && data[position] === MARKER_SOP_HIGH && data[position + 1] === MARKER_SOP_LOW) position += SOP_SEGMENT_BYTES;
265
+ const component = tile.components[packet.component];
266
+ const resolution = component?.resolutions[packet.resolution];
267
+ if (component === void 0 || resolution === void 0) throw new Jpeg2000ParseError("the progression sequence names a resolution level the tile does not have");
268
+ const reader = new PacketBitReader(data, position, end);
269
+ const included = [];
270
+ const lengths = [];
271
+ if (reader.readBit() === 1) for (const band of resolution.subbands) {
272
+ const precinct = band.precincts[packet.precinct];
273
+ if (precinct === void 0) continue;
274
+ for (const block of precinct.codeBlocks) {
275
+ if (!(block.included ? reader.readBit() === 1 : precinct.inclusion.decode(reader, block.gridX, block.gridY, packet.layer + 1))) continue;
276
+ if (!block.included) {
277
+ block.included = true;
278
+ let threshold = 1;
279
+ while (!precinct.zeroBitPlaneTree.decode(reader, block.gridX, block.gridY, threshold)) threshold++;
280
+ block.zeroBitPlanes = threshold - 1;
281
+ }
282
+ const passes = readCodingPasses(reader);
283
+ while (reader.readBit() === 1) block.lblock++;
284
+ const lengthBits = block.lblock + Math.floor(Math.log2(passes));
285
+ const length = reader.readBits(lengthBits);
286
+ block.passes += passes;
287
+ included.push(block);
288
+ lengths.push(length);
289
+ }
290
+ }
291
+ reader.alignToByte();
292
+ position = reader.offset;
293
+ if (options.useEph && position + EPH_MARKER_BYTES <= end && data[position] === MARKER_SOP_HIGH && data[position + 1] === MARKER_EPH_LOW) position += EPH_MARKER_BYTES;
294
+ for (let i = 0; i < included.length; i++) {
295
+ const block = included[i];
296
+ const length = lengths[i] ?? 0;
297
+ if (block === void 0) continue;
298
+ const chunkEnd = Math.min(position + length, end);
299
+ if (chunkEnd < position + length) options.onWarning("a code-block declares more coded bytes than the tile carries; decoding it from the bytes that did arrive");
300
+ block.chunks.push({
301
+ start: position,
302
+ end: chunkEnd
303
+ });
304
+ position += length;
305
+ if (position > end) return end;
306
+ }
307
+ }
308
+ return position;
309
+ }
310
+ //#endregion
311
+ export { buildPacketSequence, buildTileGeometry, readTilePackets, subbandGainLog2, tileHasSubdividedPrecincts };
@@ -0,0 +1,105 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_image_jpeg2000_errors = require("./jpeg2000-errors.cjs");
3
+ //#region src/image/jpeg2000-tagtree.ts
4
+ var PacketBitReader = class {
5
+ data;
6
+ end;
7
+ position;
8
+ buffer = 0;
9
+ available = 0;
10
+ previousByte = 0;
11
+ constructor(data, start, end) {
12
+ this.data = data;
13
+ this.end = end;
14
+ this.position = start;
15
+ }
16
+ get offset() {
17
+ return this.position;
18
+ }
19
+ nextByte() {
20
+ if (this.position >= this.end) {
21
+ this.previousByte = 0;
22
+ return 0;
23
+ }
24
+ const byte = this.data[this.position] ?? 0;
25
+ this.position++;
26
+ return byte;
27
+ }
28
+ readBit() {
29
+ if (this.available === 0) {
30
+ const stuffed = this.previousByte === 255;
31
+ const byte = this.nextByte();
32
+ if (stuffed && (byte & 128) !== 0) throw new require_image_jpeg2000_errors.Jpeg2000ParseError("a packet header byte following 0xFF has its stuffed bit set, which ISO/IEC 15444-1 B.10.1 forbids");
33
+ this.buffer = byte;
34
+ this.previousByte = byte;
35
+ this.available = stuffed ? 7 : 8;
36
+ }
37
+ this.available--;
38
+ return this.buffer >> this.available & 1;
39
+ }
40
+ readBits(count) {
41
+ let value = 0;
42
+ for (let i = 0; i < count; i++) value = value * 2 + this.readBit();
43
+ return value;
44
+ }
45
+ alignToByte() {
46
+ if (this.previousByte === 255) this.nextByte();
47
+ this.available = 0;
48
+ this.previousByte = 0;
49
+ }
50
+ };
51
+ var TagTree = class {
52
+ width;
53
+ height;
54
+ levelOffsets = [];
55
+ levelWidths = [];
56
+ levelHeights = [];
57
+ value;
58
+ low;
59
+ constructor(width, height) {
60
+ this.width = width;
61
+ this.height = height;
62
+ let w = Math.max(width, 1);
63
+ let h = Math.max(height, 1);
64
+ let total = 0;
65
+ for (;;) {
66
+ this.levelOffsets.push(total);
67
+ this.levelWidths.push(w);
68
+ this.levelHeights.push(h);
69
+ total += w * h;
70
+ if (w === 1 && h === 1) break;
71
+ w = Math.ceil(w / 2);
72
+ h = Math.ceil(h / 2);
73
+ }
74
+ this.value = new Int32Array(total).fill(SENTINEL_VALUE);
75
+ this.low = new Int32Array(total);
76
+ }
77
+ decode(reader, x, y, threshold) {
78
+ const path = [];
79
+ let levelX = x;
80
+ let levelY = y;
81
+ for (let level = 0; level < this.levelOffsets.length; level++) {
82
+ path.push((this.levelOffsets[level] ?? 0) + levelY * (this.levelWidths[level] ?? 1) + levelX);
83
+ levelX = levelX >> 1;
84
+ levelY = levelY >> 1;
85
+ }
86
+ let low = 0;
87
+ for (let i = path.length - 1; i >= 0; i--) {
88
+ const node = path[i] ?? 0;
89
+ if (low > (this.low[node] ?? 0)) this.low[node] = low;
90
+ else low = this.low[node] ?? 0;
91
+ while (low < threshold && low < (this.value[node] ?? SENTINEL_VALUE)) if (reader.readBit() === 1) this.value[node] = low;
92
+ else low++;
93
+ this.low[node] = low;
94
+ }
95
+ const leaf = path[0] ?? 0;
96
+ return (this.value[leaf] ?? SENTINEL_VALUE) < threshold;
97
+ }
98
+ valueAt(x, y) {
99
+ return this.value[y * (this.levelWidths[0] ?? 1) + x] ?? SENTINEL_VALUE;
100
+ }
101
+ };
102
+ const SENTINEL_VALUE = 2147483647;
103
+ //#endregion
104
+ exports.PacketBitReader = PacketBitReader;
105
+ exports.TagTree = TagTree;
@@ -0,0 +1,29 @@
1
+ //#region src/image/jpeg2000-tagtree.d.ts
2
+ declare class PacketBitReader {
3
+ private readonly data;
4
+ private readonly end;
5
+ private position;
6
+ private buffer;
7
+ private available;
8
+ private previousByte;
9
+ constructor(data: Uint8Array<ArrayBuffer>, start: number, end: number);
10
+ get offset(): number;
11
+ private nextByte;
12
+ readBit(): number;
13
+ readBits(count: number): number;
14
+ alignToByte(): void;
15
+ }
16
+ declare class TagTree {
17
+ readonly width: number;
18
+ readonly height: number;
19
+ private readonly levelOffsets;
20
+ private readonly levelWidths;
21
+ private readonly levelHeights;
22
+ private readonly value;
23
+ private readonly low;
24
+ constructor(width: number, height: number);
25
+ decode(reader: PacketBitReader, x: number, y: number, threshold: number): boolean;
26
+ valueAt(x: number, y: number): number;
27
+ }
28
+ //#endregion
29
+ export { PacketBitReader, TagTree };
@@ -0,0 +1,29 @@
1
+ //#region src/image/jpeg2000-tagtree.d.ts
2
+ declare class PacketBitReader {
3
+ private readonly data;
4
+ private readonly end;
5
+ private position;
6
+ private buffer;
7
+ private available;
8
+ private previousByte;
9
+ constructor(data: Uint8Array<ArrayBuffer>, start: number, end: number);
10
+ get offset(): number;
11
+ private nextByte;
12
+ readBit(): number;
13
+ readBits(count: number): number;
14
+ alignToByte(): void;
15
+ }
16
+ declare class TagTree {
17
+ readonly width: number;
18
+ readonly height: number;
19
+ private readonly levelOffsets;
20
+ private readonly levelWidths;
21
+ private readonly levelHeights;
22
+ private readonly value;
23
+ private readonly low;
24
+ constructor(width: number, height: number);
25
+ decode(reader: PacketBitReader, x: number, y: number, threshold: number): boolean;
26
+ valueAt(x: number, y: number): number;
27
+ }
28
+ //#endregion
29
+ export { PacketBitReader, TagTree };
@@ -0,0 +1,103 @@
1
+ import { Jpeg2000ParseError } from "./jpeg2000-errors.js";
2
+ //#region src/image/jpeg2000-tagtree.ts
3
+ var PacketBitReader = class {
4
+ data;
5
+ end;
6
+ position;
7
+ buffer = 0;
8
+ available = 0;
9
+ previousByte = 0;
10
+ constructor(data, start, end) {
11
+ this.data = data;
12
+ this.end = end;
13
+ this.position = start;
14
+ }
15
+ get offset() {
16
+ return this.position;
17
+ }
18
+ nextByte() {
19
+ if (this.position >= this.end) {
20
+ this.previousByte = 0;
21
+ return 0;
22
+ }
23
+ const byte = this.data[this.position] ?? 0;
24
+ this.position++;
25
+ return byte;
26
+ }
27
+ readBit() {
28
+ if (this.available === 0) {
29
+ const stuffed = this.previousByte === 255;
30
+ const byte = this.nextByte();
31
+ if (stuffed && (byte & 128) !== 0) throw new Jpeg2000ParseError("a packet header byte following 0xFF has its stuffed bit set, which ISO/IEC 15444-1 B.10.1 forbids");
32
+ this.buffer = byte;
33
+ this.previousByte = byte;
34
+ this.available = stuffed ? 7 : 8;
35
+ }
36
+ this.available--;
37
+ return this.buffer >> this.available & 1;
38
+ }
39
+ readBits(count) {
40
+ let value = 0;
41
+ for (let i = 0; i < count; i++) value = value * 2 + this.readBit();
42
+ return value;
43
+ }
44
+ alignToByte() {
45
+ if (this.previousByte === 255) this.nextByte();
46
+ this.available = 0;
47
+ this.previousByte = 0;
48
+ }
49
+ };
50
+ var TagTree = class {
51
+ width;
52
+ height;
53
+ levelOffsets = [];
54
+ levelWidths = [];
55
+ levelHeights = [];
56
+ value;
57
+ low;
58
+ constructor(width, height) {
59
+ this.width = width;
60
+ this.height = height;
61
+ let w = Math.max(width, 1);
62
+ let h = Math.max(height, 1);
63
+ let total = 0;
64
+ for (;;) {
65
+ this.levelOffsets.push(total);
66
+ this.levelWidths.push(w);
67
+ this.levelHeights.push(h);
68
+ total += w * h;
69
+ if (w === 1 && h === 1) break;
70
+ w = Math.ceil(w / 2);
71
+ h = Math.ceil(h / 2);
72
+ }
73
+ this.value = new Int32Array(total).fill(SENTINEL_VALUE);
74
+ this.low = new Int32Array(total);
75
+ }
76
+ decode(reader, x, y, threshold) {
77
+ const path = [];
78
+ let levelX = x;
79
+ let levelY = y;
80
+ for (let level = 0; level < this.levelOffsets.length; level++) {
81
+ path.push((this.levelOffsets[level] ?? 0) + levelY * (this.levelWidths[level] ?? 1) + levelX);
82
+ levelX = levelX >> 1;
83
+ levelY = levelY >> 1;
84
+ }
85
+ let low = 0;
86
+ for (let i = path.length - 1; i >= 0; i--) {
87
+ const node = path[i] ?? 0;
88
+ if (low > (this.low[node] ?? 0)) this.low[node] = low;
89
+ else low = this.low[node] ?? 0;
90
+ while (low < threshold && low < (this.value[node] ?? SENTINEL_VALUE)) if (reader.readBit() === 1) this.value[node] = low;
91
+ else low++;
92
+ this.low[node] = low;
93
+ }
94
+ const leaf = path[0] ?? 0;
95
+ return (this.value[leaf] ?? SENTINEL_VALUE) < threshold;
96
+ }
97
+ valueAt(x, y) {
98
+ return this.value[y * (this.levelWidths[0] ?? 1) + x] ?? SENTINEL_VALUE;
99
+ }
100
+ };
101
+ const SENTINEL_VALUE = 2147483647;
102
+ //#endregion
103
+ export { PacketBitReader, TagTree };