Merge pull request #12127 from Snuffleupagus/type3Dependencies
Improve how Type3-fonts with dependencies are handled
This commit is contained in:
commit
403816040e
@ -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.`);
|
||||
|
@ -2265,7 +2265,6 @@ class WorkerTransport {
|
||||
});
|
||||
break;
|
||||
case "FontPath":
|
||||
case "FontType3Res":
|
||||
case "Image":
|
||||
this.commonObjs.resolve(id, exportedData);
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user