From f21a30dfb4c7812e4b31acbb15206f24611ae58b Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Mon, 22 Jan 2024 12:44:32 +0100 Subject: [PATCH] Convert the `PartialEvaluator.readToUnicode` method to be async --- src/core/evaluator.js | 100 +++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 4c0b29543..68ab49bb0 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -3765,70 +3765,70 @@ class PartialEvaluator { return new IdentityToUnicodeMap(properties.firstChar, properties.lastChar); } - readToUnicode(cmapObj) { + async readToUnicode(cmapObj) { if (!cmapObj) { - return Promise.resolve(null); + return null; } if (cmapObj instanceof Name) { - return CMapFactory.create({ + const cmap = await CMapFactory.create({ encoding: cmapObj, fetchBuiltInCMap: this._fetchBuiltInCMapBound, useCMap: null, - }).then(function (cmap) { + }); + + if (cmap instanceof IdentityCMap) { + return new IdentityToUnicodeMap(0, 0xffff); + } + return new ToUnicodeMap(cmap.getMap()); + } + if (cmapObj instanceof BaseStream) { + try { + const cmap = await CMapFactory.create({ + encoding: cmapObj, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null, + }); + if (cmap instanceof IdentityCMap) { return new IdentityToUnicodeMap(0, 0xffff); } - return new ToUnicodeMap(cmap.getMap()); - }); - } else if (cmapObj instanceof BaseStream) { - return CMapFactory.create({ - encoding: cmapObj, - fetchBuiltInCMap: this._fetchBuiltInCMapBound, - useCMap: null, - }).then( - function (cmap) { - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xffff); + const map = new Array(cmap.length); + // Convert UTF-16BE + // NOTE: cmap can be a sparse array, so use forEach instead of + // `for(;;)` to iterate over all keys. + cmap.forEach(function (charCode, token) { + // Some cmaps contain *only* CID characters (fixes issue9367.pdf). + if (typeof token === "number") { + map[charCode] = String.fromCodePoint(token); + return; } - const map = new Array(cmap.length); - // Convert UTF-16BE - // NOTE: cmap can be a sparse array, so use forEach instead of - // `for(;;)` to iterate over all keys. - cmap.forEach(function (charCode, token) { - // Some cmaps contain *only* CID characters (fixes issue9367.pdf). - if (typeof token === "number") { - map[charCode] = String.fromCodePoint(token); - return; + const str = []; + for (let k = 0; k < token.length; k += 2) { + const w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); + if ((w1 & 0xf800) !== 0xd800) { + // w1 < 0xD800 || w1 > 0xDFFF + str.push(w1); + continue; } - const str = []; - for (let k = 0; k < token.length; k += 2) { - const w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - if ((w1 & 0xf800) !== 0xd800) { - // w1 < 0xD800 || w1 > 0xDFFF - str.push(w1); - continue; - } - k += 2; - const w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); - } - map[charCode] = String.fromCodePoint(...str); - }); - return new ToUnicodeMap(map); - }, - reason => { - if (reason instanceof AbortException) { - return null; + k += 2; + const w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); + str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); } - if (this.options.ignoreErrors) { - warn(`readToUnicode - ignoring ToUnicode data: "${reason}".`); - return null; - } - throw reason; + map[charCode] = String.fromCodePoint(...str); + }); + return new ToUnicodeMap(map); + } catch (reason) { + if (reason instanceof AbortException) { + return null; } - ); + if (this.options.ignoreErrors) { + warn(`readToUnicode - ignoring ToUnicode data: "${reason}".`); + return null; + } + throw reason; + } } - return Promise.resolve(null); + return null; } readCidToGidMap(glyphsData, toUnicode) {