From d7edbe28e97a0be7d951f9111f27fbd4baf00265 Mon Sep 17 00:00:00 2001
From: Vivien Nicolas <21@vingtetun.org>
Date: Mon, 20 Jun 2011 21:14:33 +0200
Subject: [PATCH] Add a way to disable fonts that won't load

---
 fonts.js | 27 ++++++++++++++++++++++++---
 pdf.js   | 17 +++++++++++++----
 2 files changed, 37 insertions(+), 7 deletions(-)

diff --git a/fonts.js b/fonts.js
index 172d6fa3c..273ef5ea6 100644
--- a/fonts.js
+++ b/fonts.js
@@ -25,6 +25,12 @@ var kMaxWaitForFontFace = 1000;
 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.
@@ -93,6 +99,16 @@ var Font = function(aName, aFile, aProperties) {
   }
   fontCount++;
 
+  if (aProperties.ignore || kDisableFonts) {
+    Fonts[aName] = {
+      data: aFile,
+      loading: false,
+      properties: {},
+      cache: Object.create(null)
+    }
+    return;
+  }
+
   switch (aProperties.type) {
     case "Type1":
       var cff = new CFF(aName, aFile, aProperties);
@@ -203,19 +219,21 @@ Font.prototype = {
     if (debug)
       ctx.fillText(testString, 20, 20);
 
-    var start = Date.now();
     var interval = window.setInterval(function canvasInterval(self) {
+      this.start = this.start || Date.now();
       ctx.font = "bold italic 20px " + fontName + ", Symbol, Arial";
 
       // For some reasons the font has not loaded, so mark it loaded for the
       // page to proceed but cry
-      if ((Date.now() - start) >= kMaxWaitForFontFace) {
+      if ((Date.now() - this.start) >= kMaxWaitForFontFace) {
         window.clearInterval(interval);
         Fonts[fontName].loading = false;
         warn("Is " + fontName + " for charset: " + charset + " loaded?");
+        this.start = 0;
       } else if (textWidth != ctx.measureText(testString).width) {
         window.clearInterval(interval);
         Fonts[fontName].loading = false;
+        this.start = 0;
       }
 
       if (debug)
@@ -747,9 +765,12 @@ var TrueType = function(aName, aFile, aProperties) {
       });
     }
 
+
+    var offsetDelta = 0;
+
     // Replace the old CMAP table
     var rewrittedCMAP = this._createCMAPTable(glyphs);
-    var offsetDelta = rewrittedCMAP.length - originalCMAP.data.length;
+    offsetDelta = rewrittedCMAP.length - originalCMAP.data.length;
     originalCMAP.data = rewrittedCMAP;
 
     // Rewrite the 'post' table if needed
diff --git a/pdf.js b/pdf.js
index cc84115cf..d39579f74 100644
--- a/pdf.js
+++ b/pdf.js
@@ -1900,9 +1900,16 @@ var CanvasGraphics = (function() {
                 error("FontFile not found for font: " + fontName);
             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 charset = [];
             if (fontDict.has("Encoding")) {
+                ignoreFont = false;
+
                 var encoding = xref.fetchIfRef(fontDict.get("Encoding"));
                 if (IsDict(encoding)) {
                     // Build a map between codes and glyphs
@@ -1960,8 +1967,9 @@ var CanvasGraphics = (function() {
                             error("useCMap is not implemented");
                             break;
 
-                          case "begincodespacerange":
                           case "beginbfrange":
+                            ignoreFont = false;
+                          case "begincodespacerange":
                             token = "";
                             tokens = [];
                             break;
@@ -2002,7 +2010,7 @@ var CanvasGraphics = (function() {
                     }
                   }
                }
-            } 
+            }
 
             var subType = fontDict.get("Subtype");
             var bbox = descriptor.get("FontBBox");
@@ -2013,7 +2021,8 @@ var CanvasGraphics = (function() {
                 type: subType.name,
                 encoding: encodingMap,
                 charset: charset,
-                bbox: bbox
+                bbox: bbox,
+                ignore: ignoreFont
             };
 
             return {
@@ -2275,7 +2284,7 @@ var CanvasGraphics = (function() {
             }
 
             this.current.fontSize = size;
-            this.ctx.font = this.current.fontSize +'px "' + fontName + '"';
+            this.ctx.font = this.current.fontSize +'px "' + fontName + '", Symbol';
         },
         setTextRenderingMode: function(mode) {
             TODO("text rendering mode");