diff --git a/src/core/evaluator.js b/src/core/evaluator.js index a67ad4ef5..dd69ef65e 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -455,14 +455,7 @@ class PartialEvaluator { _sendImgData(objId, imgData, cacheGlobally = false) { const transfers = imgData ? [imgData.data.buffer] : null; - if (this.parsingType3Font) { - return this.handler.sendWithPromise( - "commonobj", - [objId, "FontType3Res", imgData], - transfers - ); - } - if (cacheGlobally) { + if (this.parsingType3Font || cacheGlobally) { return this.handler.send( "commonobj", [objId, "Image", imgData], @@ -581,7 +574,7 @@ class PartialEvaluator { operatorList.addDependency(objId); args = [objId, w, h]; - const imgPromise = PDFImage.buildImage({ + PDFImage.buildImage({ xref: this.xref, res: resources, image, @@ -600,13 +593,6 @@ class PartialEvaluator { return this._sendImgData(objId, /* imgData = */ null, cacheGlobally); }); - if (this.parsingType3Font) { - // In the very rare case where a Type3 image resource is being parsed, - // wait for the image to be both decoded *and* sent to simplify the - // rendering code on the main-thread (see issue10717.pdf). - await imgPromise; - } - operatorList.addOp(OPS.paintImageXObject, args); if (cacheKey) { localImageCache.set(cacheKey, imageRef, { @@ -741,8 +727,12 @@ class PartialEvaluator { return translated; } return translated - .loadType3Data(this, resources, operatorList, task) + .loadType3Data(this, resources, task) .then(function () { + // Add the dependencies to the parent operatorList so they are + // resolved before Type3 operatorLists are executed synchronously. + operatorList.addDependencies(translated.type3Dependencies); + return translated; }) .catch(reason => { @@ -3354,6 +3344,7 @@ class TranslatedFont { this.dict = dict; this._extraProperties = extraProperties; this.type3Loaded = null; + this.type3Dependencies = font.isType3Font ? new Set() : null; this.sent = false; } @@ -3386,35 +3377,29 @@ class TranslatedFont { PartialEvaluator.buildFontPaths(this.font, glyphs, handler); } - loadType3Data(evaluator, resources, parentOperatorList, task) { - if (!this.font.isType3Font) { - throw new Error("Must be a Type3 font."); - } - + loadType3Data(evaluator, resources, task) { if (this.type3Loaded) { return this.type3Loaded; } + if (!this.font.isType3Font) { + throw new Error("Must be a Type3 font."); + } // When parsing Type3 glyphs, always ignore them if there are errors. // Compared to the parsing of e.g. an entire page, it doesn't really // make sense to only be able to render a Type3 glyph partially. - // - // Also, ensure that any Type3 image resources (which should be very rare - // in practice) are completely decoded on the worker-thread, to simplify - // the rendering code on the main-thread (see issue10717.pdf). var type3Options = Object.create(evaluator.options); type3Options.ignoreErrors = false; var type3Evaluator = evaluator.clone(type3Options); type3Evaluator.parsingType3Font = true; - var translatedFont = this.font; + const translatedFont = this.font, + type3Dependencies = this.type3Dependencies; var loadCharProcsPromise = Promise.resolve(); var charProcs = this.dict.get("CharProcs"); var fontResources = this.dict.get("Resources") || resources; - var charProcKeys = charProcs.getKeys(); var charProcOperatorList = Object.create(null); - for (var i = 0, n = charProcKeys.length; i < n; ++i) { - const key = charProcKeys[i]; + for (const key of charProcs.getKeys()) { loadCharProcsPromise = loadCharProcsPromise.then(function () { var glyphStream = charProcs.get(key); var operatorList = new OperatorList(); @@ -3428,9 +3413,9 @@ class TranslatedFont { .then(function () { charProcOperatorList[key] = operatorList.getIR(); - // Add the dependencies to the parent operator list so they are - // resolved before sub operator list is executed synchronously. - parentOperatorList.addDependencies(operatorList.dependencies); + for (const dependency of operatorList.dependencies) { + type3Dependencies.add(dependency); + } }) .catch(function (reason) { warn(`Type3 font resource "${key}" is not available.`); diff --git a/src/display/api.js b/src/display/api.js index b1fb4ba61..140dafc49 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -2265,7 +2265,6 @@ class WorkerTransport { }); break; case "FontPath": - case "FontType3Res": case "Image": this.commonObjs.resolve(id, exportedData); break;