Skip to content

Commit

Permalink
Merge pull request #12127 from Snuffleupagus/type3Dependencies
Browse files Browse the repository at this point in the history
Improve how Type3-fonts with dependencies are handled
  • Loading branch information
timvandermeij authored Jul 27, 2020
2 parents c7eb79c + 835b5ff commit 4038160
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 34 deletions.
51 changes: 18 additions & 33 deletions src/core/evaluator.js
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand Down Expand Up @@ -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,
Expand All @@ -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, {
Expand Down Expand Up @@ -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 => {
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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();
Expand All @@ -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.`);
Expand Down
1 change: 0 additions & 1 deletion src/display/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -2265,7 +2265,6 @@ class WorkerTransport {
});
break;
case "FontPath":
case "FontType3Res":
case "Image":
this.commonObjs.resolve(id, exportedData);
break;
Expand Down

0 comments on commit 4038160

Please sign in to comment.