|
|
@ -21,47 +21,18 @@ var kMaxWaitForFontFace = 1000; |
|
|
|
* http://cgit.freedesktop.org/poppler/poppler/tree/poppler/GfxFont.cc#n65
|
|
|
|
* http://cgit.freedesktop.org/poppler/poppler/tree/poppler/GfxFont.cc#n65
|
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
var Fonts = (function Fonts() { |
|
|
|
var FontMeasure = (function FontMeasure() { |
|
|
|
var kScalePrecision = 40; |
|
|
|
var kScalePrecision = 40; |
|
|
|
var fonts = []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!isWorker) { |
|
|
|
var ctx = document.createElement('canvas').getContext('2d'); |
|
|
|
var ctx = document.createElement('canvas').getContext('2d'); |
|
|
|
ctx.scale(1 / kScalePrecision, 1); |
|
|
|
ctx.scale(1 / kScalePrecision, 1); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var fontCount = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function FontInfo(name, data, properties) { |
|
|
|
|
|
|
|
this.name = name; |
|
|
|
|
|
|
|
this.data = data; |
|
|
|
|
|
|
|
this.properties = properties; |
|
|
|
|
|
|
|
this.id = fontCount++; |
|
|
|
|
|
|
|
this.loading = true; |
|
|
|
|
|
|
|
this.sizes = []; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var current; |
|
|
|
var current; |
|
|
|
var measureCache; |
|
|
|
var measureCache; |
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
|
return { |
|
|
|
registerFont: function fonts_registerFont(fontName, data, properties) { |
|
|
|
setActive: function fonts_setActive(font, size) { |
|
|
|
var font = new FontInfo(fontName, data, properties); |
|
|
|
if (current = font) { |
|
|
|
fonts.push(font); |
|
|
|
|
|
|
|
return font.id; |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
blacklistFont: function fonts_blacklistFont(fontName) { |
|
|
|
|
|
|
|
var id = registerFont(fontName, null, {}); |
|
|
|
|
|
|
|
markLoaded(fontName); |
|
|
|
|
|
|
|
return id; |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
lookupById: function fonts_lookupById(id) { |
|
|
|
|
|
|
|
return fonts[id]; |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
setActive: function fonts_setActive(fontName, fontObj, size) { |
|
|
|
|
|
|
|
// |current| can be null is fontName is a built-in font
|
|
|
|
|
|
|
|
// (e.g. "sans-serif")
|
|
|
|
|
|
|
|
if (fontObj && (current = fonts[fontObj.id])) { |
|
|
|
|
|
|
|
var sizes = current.sizes; |
|
|
|
var sizes = current.sizes; |
|
|
|
if (!(measureCache = sizes[size])) |
|
|
|
if (!(measureCache = sizes[size])) |
|
|
|
measureCache = sizes[size] = Object.create(null); |
|
|
|
measureCache = sizes[size] = Object.create(null); |
|
|
@ -69,7 +40,7 @@ var Fonts = (function Fonts() { |
|
|
|
measureCache = null |
|
|
|
measureCache = null |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ctx.font = (size * kScalePrecision) + 'px "' + fontName + '"'; |
|
|
|
ctx.font = (size * kScalePrecision) + 'px "' + font.loadedName + '"'; |
|
|
|
}, |
|
|
|
}, |
|
|
|
measureText: function fonts_measureText(text) { |
|
|
|
measureText: function fonts_measureText(text) { |
|
|
|
var width; |
|
|
|
var width; |
|
|
@ -88,9 +59,9 @@ var FontLoader = { |
|
|
|
|
|
|
|
|
|
|
|
bind: function(fonts, callback) { |
|
|
|
bind: function(fonts, callback) { |
|
|
|
function checkFontsLoaded() { |
|
|
|
function checkFontsLoaded() { |
|
|
|
for (var i = 0; i < allIds.length; i++) { |
|
|
|
for (var i = 0; i < objs.length; i++) { |
|
|
|
var id = allIds[i]; |
|
|
|
var fontObj = objs[i]; |
|
|
|
if (Fonts.lookupById(id).loading) { |
|
|
|
if (fontObj.loading) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -102,18 +73,17 @@ var FontLoader = { |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var allIds = []; |
|
|
|
var rules = [], names = [], objs = []; |
|
|
|
var rules = [], names = [], ids = []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < fonts.length; i++) { |
|
|
|
for (var i = 0; i < fonts.length; i++) { |
|
|
|
var font = fonts[i]; |
|
|
|
var font = fonts[i]; |
|
|
|
|
|
|
|
|
|
|
|
var obj = new Font(font.name, font.file, font.properties); |
|
|
|
var obj = new Font(font.name, font.file, font.properties); |
|
|
|
font.fontDict.fontObj = obj; |
|
|
|
obj.loading = true; |
|
|
|
allIds.push(obj.id); |
|
|
|
objs.push(obj); |
|
|
|
|
|
|
|
|
|
|
|
var str = ''; |
|
|
|
var str = ''; |
|
|
|
var data = Fonts.lookupById(obj.id).data; |
|
|
|
var data = obj.data; |
|
|
|
var length = data.length; |
|
|
|
var length = data.length; |
|
|
|
for (var j = 0; j < length; j++) |
|
|
|
for (var j = 0; j < length; j++) |
|
|
|
str += String.fromCharCode(data[j]); |
|
|
|
str += String.fromCharCode(data[j]); |
|
|
@ -122,13 +92,12 @@ var FontLoader = { |
|
|
|
if (rule) { |
|
|
|
if (rule) { |
|
|
|
rules.push(rule); |
|
|
|
rules.push(rule); |
|
|
|
names.push(obj.loadedName); |
|
|
|
names.push(obj.loadedName); |
|
|
|
ids.push(obj.id); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
this.listeningForFontLoad = false; |
|
|
|
this.listeningForFontLoad = false; |
|
|
|
if (!isWorker && rules.length) { |
|
|
|
if (!isWorker && rules.length) { |
|
|
|
FontLoader.prepareFontLoadEvent(rules, names, ids); |
|
|
|
FontLoader.prepareFontLoadEvent(rules, names, objs); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!checkFontsLoaded()) { |
|
|
|
if (!checkFontsLoaded()) { |
|
|
@ -136,14 +105,14 @@ var FontLoader = { |
|
|
|
'pdfjsFontLoad', checkFontsLoaded, false); |
|
|
|
'pdfjsFontLoad', checkFontsLoaded, false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return; |
|
|
|
return objs; |
|
|
|
}, |
|
|
|
}, |
|
|
|
// Set things up so that at least one pdfjsFontLoad event is
|
|
|
|
// Set things up so that at least one pdfjsFontLoad event is
|
|
|
|
// dispatched when all the @font-face |rules| for |names| have been
|
|
|
|
// dispatched when all the @font-face |rules| for |names| have been
|
|
|
|
// loaded in a subdocument. It's expected that the load of |rules|
|
|
|
|
// loaded in a subdocument. It's expected that the load of |rules|
|
|
|
|
// has already started in this (outer) document, so that they should
|
|
|
|
// has already started in this (outer) document, so that they should
|
|
|
|
// be ordered before the load in the subdocument.
|
|
|
|
// be ordered before the load in the subdocument.
|
|
|
|
prepareFontLoadEvent: function(rules, names, ids) { |
|
|
|
prepareFontLoadEvent: function(rules, names, objs) { |
|
|
|
/** Hack begin */ |
|
|
|
/** Hack begin */ |
|
|
|
// There's no event when a font has finished downloading so the
|
|
|
|
// There's no event when a font has finished downloading so the
|
|
|
|
// following code is a dirty hack to 'guess' when a font is
|
|
|
|
// following code is a dirty hack to 'guess' when a font is
|
|
|
@ -184,8 +153,8 @@ var FontLoader = { |
|
|
|
'message', |
|
|
|
'message', |
|
|
|
function(e) { |
|
|
|
function(e) { |
|
|
|
var fontNames = JSON.parse(e.data); |
|
|
|
var fontNames = JSON.parse(e.data); |
|
|
|
for (var i = 0; i < fontNames.length; ++i) { |
|
|
|
for (var i = 0; i < objs.length; ++i) { |
|
|
|
var font = Fonts.lookupById(fontNames[i].substring(7) | 0); |
|
|
|
var font = objs[i]; |
|
|
|
font.loading = false; |
|
|
|
font.loading = false; |
|
|
|
} |
|
|
|
} |
|
|
|
var evt = document.createEvent('Events'); |
|
|
|
var evt = document.createEvent('Events'); |
|
|
@ -377,12 +346,12 @@ var Font = (function() { |
|
|
|
this.name = name; |
|
|
|
this.name = name; |
|
|
|
this.textMatrix = properties.textMatrix || IDENTITY_MATRIX; |
|
|
|
this.textMatrix = properties.textMatrix || IDENTITY_MATRIX; |
|
|
|
this.encoding = properties.encoding; |
|
|
|
this.encoding = properties.encoding; |
|
|
|
|
|
|
|
this.sizes = []; |
|
|
|
|
|
|
|
|
|
|
|
// If the font is to be ignored, register it like an already loaded font
|
|
|
|
// If the font is to be ignored, register it like an already loaded font
|
|
|
|
// to avoid the cost of waiting for it be be loaded by the platform.
|
|
|
|
// to avoid the cost of waiting for it be be loaded by the platform.
|
|
|
|
if (properties.ignore) { |
|
|
|
if (properties.ignore) { |
|
|
|
this.id = Fonts.blacklistFont(name); |
|
|
|
this.loadedName = 'Arial'; |
|
|
|
this.loadedName = 'pdfFont' + this.id; |
|
|
|
|
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -412,11 +381,15 @@ var Font = (function() { |
|
|
|
} |
|
|
|
} |
|
|
|
this.data = data; |
|
|
|
this.data = data; |
|
|
|
this.type = properties.type; |
|
|
|
this.type = properties.type; |
|
|
|
this.id = Fonts.registerFont(name, data, properties); |
|
|
|
this.loadedName = getUniqueName(); |
|
|
|
this.loadedName = 'pdfFont' + this.id; |
|
|
|
|
|
|
|
this.compositeFont = properties.compositeFont; |
|
|
|
this.compositeFont = properties.compositeFont; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var numFonts = 0; |
|
|
|
|
|
|
|
function getUniqueName() { |
|
|
|
|
|
|
|
return 'pdfFont' + numFonts++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function stringToArray(str) { |
|
|
|
function stringToArray(str) { |
|
|
|
var array = []; |
|
|
|
var array = []; |
|
|
|
for (var i = 0; i < str.length; ++i) |
|
|
|
for (var i = 0; i < str.length; ++i) |
|
|
|