From e475d03675f5a7dc12807803c1bb45322a6b015c Mon Sep 17 00:00:00 2001 From: Vivien Nicolas <21@vingtetun.org> Date: Fri, 17 Jun 2011 20:29:34 +0200 Subject: [PATCH] Do not assume charset is defined and move some fonts timing to the right place --- pdf.js | 77 ++++++++++++++++++++++++++++++--------------------------- test.js | 55 +++++++++++++++++++++++++---------------- 2 files changed, 75 insertions(+), 57 deletions(-) diff --git a/pdf.js b/pdf.js index b8f32226b..1a1714647 100644 --- a/pdf.js +++ b/pdf.js @@ -1729,52 +1729,57 @@ var CanvasGraphics = (function() { var fontName = descriptor.get("FontName").name; fontName = fontName.replace("+", "_"); - var font = Fonts[fontName]; - if (!font) { - var fontFile = descriptor.get2("FontFile", "FontFile2"); - fontFile = xref.fetchIfRef(fontFile); + var fontFile = descriptor.get2("FontFile", "FontFile2"); + if (!fontFile) + errort("FontFile not found for font: " + fontName); + fontFile = xref.fetchIfRef(fontFile); - // Generate the custom cmap of the font if needed - var encodingMap = {}; - if (fontDict.has("Encoding")) { + // Generate the custom cmap of the font if needed + var encodingMap = {}; + if (fontDict.has("Encoding")) { + var encoding = xref.fetchIfRef(fontDict.get("Encoding")); + if (IsDict(encoding)) { + // Build an map between codes and glyphs + var differences = encoding.get("Differences"); + var index = 0; + for (var j = 0; j < differences.length; j++) { + var data = differences[j]; + IsNum(data) ? index = data : encodingMap[index++] = data; + } - var encoding = xref.fetchIfRef(fontDict.get("Encoding")); - if (IsDict(encoding)) { - // Build an map between codes and glyphs - var differences = encoding.get("Differences"); - var index = 0; - for (var j = 0; j < differences.length; j++) { - var data = differences[j]; - IsNum(data) ? index = data : encodingMap[index++] = data; - } + // Get the font charset if any + var charset = descriptor.get("CharSet"); + if (charset) + charset = charset.split("/"); - // Get the font charset - var charset = descriptor.get("CharSet").split("/"); + } else if (IsName(encoding)) { + var encoding = Encodings[encoding]; + var widths = xref.fetchIfRef(fontDict.get("Widths")); + var firstchar = xref.fetchIfRef(fontDict.get("FirstChar")); - } else if (IsName(encoding)) { - var encoding = Encodings[encoding]; - var widths = xref.fetchIfRef(fontDict.get("Widths")); - var firstchar = xref.fetchIfRef(fontDict.get("FirstChar")); + var charset = []; + for (var j = 0; j < widths.length; j++) { + var index = widths[j]; + if (!index) + continue; - var charset = []; - for (var j = 0; j < widths.length; j++) { - var index = widths[j]; - if (!index) - continue; - charset.push(encoding[j + firstchar]); - } - } - } + charset.push(encoding[j + firstchar]); + } + } + } - var properties = { + var properties = { type: fontDict.get("Subtype").name, encoding: encodingMap, charset: charset, bbox: descriptor.get("FontBBox") - }; - new Font(fontName, fontFile, properties); - } - return Fonts[fontName]; + }; + + return { + name: fontName, + file: fontFile, + properties: properties + } }, beginDrawing: function(mediaBox) { diff --git a/test.js b/test.js index cbfd70c65..59d8167a2 100644 --- a/test.js +++ b/test.js @@ -74,30 +74,43 @@ function displayPage(num) { page.compile(gfx, fonts); var t2 = Date.now(); - var interval = 0; - for (var i = 0; i < fonts.length; i++) { - if (fonts[i].loading) { - interval = 10; - break; + var fontsReady = true; + + // Inspect fonts and translate the missing one + var count = fonts.length; + for (var i = 0; i < count; i++) { + var font = fonts[i]; + if (Fonts[font.name]) { + fontsReady = fontsReady && !Fonts[font.name].loading; + continue; } + + new Font(font.name, font.file, font.properties); + fontsReady = false; + } + + function delayLoadFont() { + for (var i = 0; i < count; i++) { + if (Fonts[font.name].loading) + return; + } + clearInterval(pageInterval); + + var t3 = Date.now(); + + page.display(gfx); + + var t4 = Date.now(); + + var infoDisplay = document.getElementById("info"); + infoDisplay.innerHTML = "Time to load/compile/fonts/render: "+ (t1 - t0) + "/" + (t2 - t1) + "/" + (t3 - t2) + "/" + (t4 - t3) + " ms"; }; - // FIXME This need to be replaced by an event - pageInterval = setInterval(function() { - for (var i = 0; i < fonts.length; i++) { - if (fonts[i].loading) - return; - } - var t3 = Date.now(); - - clearInterval(pageInterval); - page.display(gfx); - - var t4 = Date.now(); - - var infoDisplay = document.getElementById("info"); - infoDisplay.innerHTML = "Time to load/compile/fonts/render: "+ (t1 - t0) + "/" + (t2 - t1) + "/" + (t3 - t2) + "/" + (t4 - t3) + " ms"; - }, interval); + if (fontsReady) { + delayLoadFont(); + } else { + pageInterval = setInterval(delayLoadFont, 10); + } } function nextPage() {