diff --git a/.gitignore b/.gitignore index 95de9fb8e..9e2d0f211 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +*~ pdf.pdf intelisa.pdf openweb_tm-PRINT.pdf +local.mk diff --git a/Makefile b/Makefile index c6971d025..9b2817fc4 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,9 @@ BUILD_DIR := build DEFAULT_BROWSERS := test/resources/browser_manifests/browser_manifest.json DEFAULT_TESTS := test/test_manifest.json +# Let folks define custom rules for their clones. +-include local.mk + # JS files needed for pdf.js. # This list doesn't account for the 'worker' directory. PDF_JS_FILES = \ @@ -156,5 +159,5 @@ clean: help: @echo "Read the comments in the Makefile for guidance."; -.PHONY: all test browser-test font-test shell-test \ +.PHONY:: all test browser-test font-test shell-test \ shell-msg lint clean web compiler help server diff --git a/fonts.js b/fonts.js index 9b3b01dc0..19ea747b4 100755 --- a/fonts.js +++ b/fonts.js @@ -2,7 +2,6 @@ /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 'use strict'; - var isWorker = (typeof window == 'undefined'); /** @@ -15,20 +14,6 @@ var kMaxFontFileSize = 40000; */ var kMaxWaitForFontFace = 1000; -/** - * Useful for debugging when you want to certains operations depending on how - * many fonts are loaded. - */ -var fontCount = 0; -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 * their acronyms. @@ -37,91 +22,33 @@ var kDisableFonts = false; */ var Fonts = (function Fonts() { - var kScalePrecision = 40; - var fonts = Object.create(null); - - if (!isWorker) { - var ctx = document.createElement('canvas').getContext('2d'); - ctx.scale(1 / kScalePrecision, 1); - } - - function Font(name, data, properties) { + var fonts = []; + var fontCount = 0; + + function FontInfo(name, data, properties) { this.name = name; this.data = data; this.properties = properties; + this.id = fontCount++; this.loading = true; - this.charsCache = Object.create(null); this.sizes = []; } var current; - var charsCache; - var measureCache; return { registerFont: function fonts_registerFont(fontName, data, properties) { - fonts[fontName] = new Font(fontName, data, properties); + var font = new FontInfo(fontName, data, properties); + fonts.push(font); + return font.id; }, blacklistFont: function fonts_blacklistFont(fontName) { - registerFont(fontName, null, {}); + var id = registerFont(fontName, null, {}); markLoaded(fontName); + return id; }, - lookup: function fonts_lookup(fontName) { - return fonts[fontName]; - }, - setActive: function fonts_setActive(fontName, size) { - // |current| can be null is fontName is a built-in font - // (e.g. "sans-serif") - if ((current = fonts[fontName])) { - charsCache = current.charsCache; - var sizes = current.sizes; - if (!(measureCache = sizes[size])) - measureCache = sizes[size] = Object.create(null); - } - ctx.font = (size * kScalePrecision) + 'px "' + fontName + '"'; - }, - charsToUnicode: function fonts_chars2Unicode(chars) { - if (!charsCache) - return chars; - - // if we translated this string before, just grab it from the cache - var str = charsCache[chars]; - if (str) - return str; - - // translate the string using the font's encoding - var encoding = current ? current.properties.encoding : null; - if (!encoding) - return chars; - - str = ''; - for (var i = 0; i < chars.length; ++i) { - var charcode = chars.charCodeAt(i); - var unicode = encoding[charcode]; - - // Check if the glyph has already been converted - if (!IsNum(unicode)) - unicode = encoding[unicode] = GlyphsUnicode[unicode.name]; - - // Handle surrogate pairs - if (unicode > 0xFFFF) { - str += String.fromCharCode(unicode & 0xFFFF); - unicode >>= 16; - } - str += String.fromCharCode(unicode); - } - - // Enter the translated string into the cache - return charsCache[chars] = str; - }, - measureText: function fonts_measureText(text) { - var width; - if (measureCache && (width = measureCache[text])) - return width; - width = ctx.measureText(text).width / kScalePrecision; - if (measureCache) - measureCache[text] = width; - return width; + lookupById: function fonts_lookupById(id) { + return fonts[id]; } }; })(); @@ -131,9 +58,9 @@ var FontLoader = { bind: function(fonts, callback) { function checkFontsLoaded() { - for (var i = 0; i < fonts.length; i++) { - var font = fonts[i]; - if (Fonts.lookup(font.name).loading) { + for (var i = 0; i < allIds.length; i++) { + var id = allIds[i]; + if (Fonts.lookupById(id).loading) { return false; } } @@ -145,30 +72,35 @@ var FontLoader = { return true; } - var rules = [], names = []; + var allIds = []; + var rules = [], names = [], ids = []; + for (var i = 0; i < fonts.length; i++) { var font = fonts[i]; - if (!Fonts.lookup(font.name)) { - var obj = new Font(font.name, font.file, font.properties); - var str = ''; - var data = Fonts.lookup(font.name).data; - var length = data.length; - for (var j = 0; j < length; j++) - str += String.fromCharCode(data[j]); + var obj = new Font(font.name, font.file, font.properties); + font.fontDict.fontObj = obj; + allIds.push(obj.id); - var rule = isWorker ? obj.bindWorker(str) : obj.bindDOM(str); - if (rule) { - rules.push(rule); - names.push(font.name); - } + var str = ''; + var data = Fonts.lookupById(obj.id).data; + var length = data.length; + for (var j = 0; j < length; j++) + str += String.fromCharCode(data[j]); + + var rule = isWorker ? obj.bindWorker(str) : obj.bindDOM(str); + if (rule) { + rules.push(rule); + names.push(obj.loadedName); + ids.push(obj.id); } } + this.listeningForFontLoad = false; if (!isWorker && rules.length) { - FontLoader.prepareFontLoadEvent(rules, names); + FontLoader.prepareFontLoadEvent(rules, names, ids); } - + if (!checkFontsLoaded()) { document.documentElement.addEventListener( 'pdfjsFontLoad', checkFontsLoaded, false); @@ -181,7 +113,7 @@ var FontLoader = { // loaded in a subdocument. It's expected that the load of |rules| // has already started in this (outer) document, so that they should // be ordered before the load in the subdocument. - prepareFontLoadEvent: function(rules, names) { + prepareFontLoadEvent: function(rules, names, ids) { /** Hack begin */ // There's no event when a font has finished downloading so the // following code is a dirty hack to 'guess' when a font is @@ -217,13 +149,13 @@ var FontLoader = { div.innerHTML = html; document.body.appendChild(div); - if (!this.listeneningForFontLoad) { + if (!this.listeningForFontLoad) { window.addEventListener( 'message', function(e) { var fontNames = JSON.parse(e.data); for (var i = 0; i < fontNames.length; ++i) { - var font = Fonts.lookup(fontNames[i]); + var font = Fonts.lookupById(fontNames[i].substring(7) | 0); font.loading = false; } var evt = document.createEvent('Events'); @@ -231,7 +163,7 @@ var FontLoader = { document.documentElement.dispatchEvent(evt); }, false); - this.listeneningForFontLoad = true; + this.listeningForFontLoad = true; } // XXX we should have a time-out here too, and maybe fire @@ -253,7 +185,7 @@ var FontLoader = { src += ' }'; src += '
'; for (var i = 0; i < names.length; ++i) { - src += 'Hi
'; + src += 'Hi
'; } src += '