Track loaded such that setFont doesnt need to touch xref anymore

This commit is contained in:
Julian Viereck 2011-09-05 09:26:07 -07:00
parent 3006c090ad
commit 6dd82ad5d4

56
pdf.js
View File

@ -4051,6 +4051,8 @@ var EvalState = (function() {
return constructor; return constructor;
})(); })();
var FontsMap = {};
var PartialEvaluator = (function() { var PartialEvaluator = (function() {
function constructor() { function constructor() {
this.state = new EvalState(); this.state = new EvalState();
@ -4208,17 +4210,23 @@ var PartialEvaluator = (function() {
images.bind(xobj); // monitoring image load images.bind(xobj); // monitoring image load
} }
} else if (cmd == 'Tf') { // eagerly collect all fonts } else if (cmd == 'Tf') { // eagerly collect all fonts
var fontRes = resources.get('Font'); var fontName = args[0].name;
if (fontRes) {
fontRes = xref.fetchIfRef(fontRes); // Check if this font is known already and process it otherwise.
var font = xref.fetchIfRef(fontRes.get(args[0].name)); if (!FontsMap[fontName]) {
assertWellFormed(IsDict(font)); var fontRes = resources.get('Font');
if (!font.translated) { if (fontRes) {
font.translated = this.translateFont(font, xref, resources); fontRes = xref.fetchIfRef(fontRes);
if (fonts && font.translated) { var font = xref.fetchIfRef(fontRes.get(fontName));
// keep track of each font we translated so the caller can assertWellFormed(IsDict(font));
// load them asynchronously before calling display on a page if (!font.translated) {
fonts.push(font.translated); font.translated = this.translateFont(font, xref, resources);
if (fonts && font.translated) {
// keep track of each font we translated so the caller can
// load them asynchronously before calling display on a page
fonts.push(font.translated);
FontsMap[fontName] = font;
}
} }
} }
} }
@ -4233,6 +4241,10 @@ var PartialEvaluator = (function() {
} }
} }
// Expose arrays for debugging purpose.
window.fnArray = fnArray;
window.argsArray = argsArray;
return function(gfx) { return function(gfx) {
for (var i = 0, length = argsArray.length; i < length; i++) for (var i = 0, length = argsArray.length; i < length; i++)
gfx[fnArray[i]].apply(gfx, argsArray[i]); gfx[fnArray[i]].apply(gfx, argsArray[i]);
@ -4914,16 +4926,20 @@ var CanvasGraphics = (function() {
this.current.leading = -leading; this.current.leading = -leading;
}, },
setFont: function(fontRef, size) { setFont: function(fontRef, size) {
var font = this.xref.fetchIfRef(this.res.get('Font')); // Lookup the fontObj using fontRef only.
if (!IsDict(font)) var fontRefName = fontRef.name;
return; var fontObj = FontsMap[fontRefName].fontObj;
if (!fontObj) {
throw "Can't find font for " + fontRefName;
}
var name = fontObj.loadedName;
if (!name) {
// TODO: fontDescriptor is not available, fallback to default font
name = 'sans-serif';
}
font = font.get(fontRef.name);
font = this.xref.fetchIfRef(font);
if (!font)
return;
var fontObj = font.fontObj;
this.current.font = fontObj; this.current.font = fontObj;
this.current.fontSize = size; this.current.fontSize = size;