MCPcopy Create free account
hub / github.com/LibPDF-js/core / parseBfRange

Method parseBfRange

src/fontbox/cmap/parser.ts:237–290  ·  view source on GitHub ↗
(count: number, result: CMap)

Source from the content-addressed store, hash-verified

235 }
236
237 private parseBfRange(count: number, result: CMap): void {
238 for (let i = 0; i < count; i++) {
239 const startToken = this.parseNextToken();
240
241 if (isOperator(startToken)) {
242 break;
243 }
244
245 if (!(startToken instanceof Uint8Array)) {
246 throw new Error("Expected hex string for bfrange start");
247 }
248
249 const endToken = this.parseNextToken();
250
251 if (isOperator(endToken)) {
252 break;
253 }
254
255 if (!(endToken instanceof Uint8Array)) {
256 throw new Error("Expected hex string for bfrange end");
257 }
258
259 const start = bytesToInt(startToken);
260 const end = bytesToInt(endToken);
261
262 if (end < start) {
263 // Corrupt range - skip
264 break;
265 }
266
267 const mappingToken = this.parseNextToken();
268
269 if (Array.isArray(mappingToken)) {
270 // Array of mappings
271 this.addBfRangeFromArray(result, startToken, mappingToken);
272 } else if (mappingToken instanceof Uint8Array) {
273 if (mappingToken.length > 0) {
274 // Special case: identity mapping <0000> <ffff> <0000>
275 // Handle this by breaking into 256 chunks of 256 to avoid strict mode overflow
276 if (
277 mappingToken.length === 2 &&
278 start === 0 &&
279 end === 0xffff &&
280 mappingToken[0] === 0 &&
281 mappingToken[1] === 0
282 ) {
283 this.addIdentityBfRange(result, startToken);
284 } else {
285 this.addBfRangeFromBytes(result, startToken, end - start + 1, mappingToken);
286 }
287 }
288 }
289 }
290 }
291
292 /**
293 * Handle identity bfrange <0000> <ffff> <0000> by breaking into 256 chunks.

Callers 1

parseMethod · 0.95

Calls 6

parseNextTokenMethod · 0.95
addBfRangeFromArrayMethod · 0.95
addIdentityBfRangeMethod · 0.95
addBfRangeFromBytesMethod · 0.95
isOperatorFunction · 0.85
bytesToIntFunction · 0.70

Tested by

no test coverage detected