Add a way to disable fonts that won't load

This commit is contained in:
Vivien Nicolas 2011-06-20 21:14:33 +02:00
parent c345a4c75e
commit 2feec66b74
2 changed files with 37 additions and 7 deletions

View File

@ -25,6 +25,12 @@ var kMaxWaitForFontFace = 1000;
var fontCount = 0; var fontCount = 0;
var fontName = ""; var fontName = "";
/**
* If for some reason one want to debug without fonts activated, it just need
* to turn this pref to true/false.
*/
var kDisableFonts = false;
/** /**
* Hold a map of decoded fonts and of the standard fourteen Type1 fonts and * Hold a map of decoded fonts and of the standard fourteen Type1 fonts and
* their acronyms. * their acronyms.
@ -93,6 +99,16 @@ var Font = function(aName, aFile, aProperties) {
} }
fontCount++; fontCount++;
if (aProperties.ignore || kDisableFonts) {
Fonts[aName] = {
data: aFile,
loading: false,
properties: {},
cache: Object.create(null)
}
return;
}
switch (aProperties.type) { switch (aProperties.type) {
case "Type1": case "Type1":
var cff = new CFF(aName, aFile, aProperties); var cff = new CFF(aName, aFile, aProperties);
@ -203,19 +219,21 @@ Font.prototype = {
if (debug) if (debug)
ctx.fillText(testString, 20, 20); ctx.fillText(testString, 20, 20);
var start = Date.now();
var interval = window.setInterval(function canvasInterval(self) { var interval = window.setInterval(function canvasInterval(self) {
this.start = this.start || Date.now();
ctx.font = "bold italic 20px " + fontName + ", Symbol, Arial"; ctx.font = "bold italic 20px " + fontName + ", Symbol, Arial";
// For some reasons the font has not loaded, so mark it loaded for the // For some reasons the font has not loaded, so mark it loaded for the
// page to proceed but cry // page to proceed but cry
if ((Date.now() - start) >= kMaxWaitForFontFace) { if ((Date.now() - this.start) >= kMaxWaitForFontFace) {
window.clearInterval(interval); window.clearInterval(interval);
Fonts[fontName].loading = false; Fonts[fontName].loading = false;
warn("Is " + fontName + " for charset: " + charset + " loaded?"); warn("Is " + fontName + " for charset: " + charset + " loaded?");
this.start = 0;
} else if (textWidth != ctx.measureText(testString).width) { } else if (textWidth != ctx.measureText(testString).width) {
window.clearInterval(interval); window.clearInterval(interval);
Fonts[fontName].loading = false; Fonts[fontName].loading = false;
this.start = 0;
} }
if (debug) if (debug)
@ -747,9 +765,12 @@ var TrueType = function(aName, aFile, aProperties) {
}); });
} }
var offsetDelta = 0;
// Replace the old CMAP table // Replace the old CMAP table
var rewrittedCMAP = this._createCMAPTable(glyphs); var rewrittedCMAP = this._createCMAPTable(glyphs);
var offsetDelta = rewrittedCMAP.length - originalCMAP.data.length; offsetDelta = rewrittedCMAP.length - originalCMAP.data.length;
originalCMAP.data = rewrittedCMAP; originalCMAP.data = rewrittedCMAP;
// Rewrite the 'post' table if needed // Rewrite the 'post' table if needed

17
pdf.js
View File

@ -1900,9 +1900,16 @@ var CanvasGraphics = (function() {
error("FontFile not found for font: " + fontName); error("FontFile not found for font: " + fontName);
fontFile = xref.fetchIfRef(fontFile); fontFile = xref.fetchIfRef(fontFile);
// Fonts with an embedded cmap but without any assignment in
// it are not yet supported, so ask the fonts loader to ignore
// them to not pay a stupid one sec latence.
var ignoreFont = true;
var encodingMap = {}; var encodingMap = {};
var charset = []; var charset = [];
if (fontDict.has("Encoding")) { if (fontDict.has("Encoding")) {
ignoreFont = false;
var encoding = xref.fetchIfRef(fontDict.get("Encoding")); var encoding = xref.fetchIfRef(fontDict.get("Encoding"));
if (IsDict(encoding)) { if (IsDict(encoding)) {
// Build a map between codes and glyphs // Build a map between codes and glyphs
@ -1960,8 +1967,9 @@ var CanvasGraphics = (function() {
error("useCMap is not implemented"); error("useCMap is not implemented");
break; break;
case "begincodespacerange":
case "beginbfrange": case "beginbfrange":
ignoreFont = false;
case "begincodespacerange":
token = ""; token = "";
tokens = []; tokens = [];
break; break;
@ -2002,7 +2010,7 @@ var CanvasGraphics = (function() {
} }
} }
} }
} }
var subType = fontDict.get("Subtype"); var subType = fontDict.get("Subtype");
var bbox = descriptor.get("FontBBox"); var bbox = descriptor.get("FontBBox");
@ -2013,7 +2021,8 @@ var CanvasGraphics = (function() {
type: subType.name, type: subType.name,
encoding: encodingMap, encoding: encodingMap,
charset: charset, charset: charset,
bbox: bbox bbox: bbox,
ignore: ignoreFont
}; };
return { return {
@ -2275,7 +2284,7 @@ var CanvasGraphics = (function() {
} }
this.current.fontSize = size; this.current.fontSize = size;
this.ctx.font = this.current.fontSize +'px "' + fontName + '"'; this.ctx.font = this.current.fontSize +'px "' + fontName + '", Symbol';
}, },
setTextRenderingMode: function(mode) { setTextRenderingMode: function(mode) {
TODO("text rendering mode"); TODO("text rendering mode");