]> git.parisson.com Git - pdf.js.git/commitdiff
Guess default width for FileFont3 using BaseFont
authornotmasteryet <async.processingjs@yahoo.com>
Thu, 22 Sep 2011 00:56:09 +0000 (19:56 -0500)
committernotmasteryet <async.processingjs@yahoo.com>
Thu, 22 Sep 2011 00:56:09 +0000 (19:56 -0500)
pdf.js

diff --git a/pdf.js b/pdf.js
index 9a0b0977a277d4c588664824347682065a90574e..7e56c309f72170cc8370d6eb4088d7f59da0b41d 100644 (file)
--- a/pdf.js
+++ b/pdf.js
@@ -4483,6 +4483,32 @@ var PartialEvaluator = (function() {
       return glyphs;
     },
 
+    getBaseFontMetrics: function(baseFontName) {
+      var map = {};
+      if (/^Symbol(-?(Bold|Italic))*$/.test(baseFontName)) {
+        // special case for symbols
+        var encoding = Encodings.symbolsEncoding;
+        for (var i = 0, n = encoding.length, j; i < n; i++) {
+          if (!(j = encoding[i]))
+            continue;
+          map[i] = GlyphsUnicode[j] || 0;
+        }
+      }
+
+      var defaultWidth = 0;
+      var widths = Metrics[stdFontMap[baseFontName] || baseFontName];
+      if (IsNum(widths)) {
+        defaultWidth = widths;
+        widths = null;
+      }
+
+      return {
+        defaultWidth: defaultWidth,
+        widths: widths || [],
+        map: map
+      };
+    },
+
     translateFont: function(dict, xref, resources) {
       var baseDict = dict;
       var type = dict.get('Subtype');
@@ -4518,30 +4544,15 @@ var PartialEvaluator = (function() {
           return null;
 
         // Using base font name as a font name.
-        baseFontName = baseFontName.name;
-        var map = {};
-        if (/^Symbol(-?(Bold|Italic))*$/.test(baseFontName)) {
-          // special case for symbols
-          var encoding = Encodings.symbolsEncoding;
-          for (var i = 0, n = encoding.length, j; i < n; i++) {
-            if (!(j = encoding[i]))
-              continue;
-            map[i] = GlyphsUnicode[j] || 0;
-          }
-        }
+        baseFontName = baseFontName.name.replace(/,/g, '_');
+        var metrics = this.getBaseFontMetrics(baseFontName);
 
-        var defaultWidth = 0;
-        var widths = Metrics[stdFontMap[baseFontName] || baseFontName];
-        if (IsNum(widths)) {
-          defaultWidth = widths;
-          widths = null;
-        }
         var properties = {
           type: type.name,
-          encoding: map,
+          encoding: metrics.map,
           differences: [],
-          widths: widths || {},
-          defaultWidth: defaultWidth,
+          widths: metrics.widths,
+          defaultWidth: metrics.defaultWidth,
           firstChar: 0,
           lastChar: 256
         };
@@ -4561,7 +4572,25 @@ var PartialEvaluator = (function() {
       // a variant.
       var firstChar = xref.fetchIfRef(dict.get('FirstChar')) || 0;
       var lastChar = xref.fetchIfRef(dict.get('LastChar')) || 256;
-      var widths = xref.fetchIfRef(dict.get('Widths')) || [];
+      var defaultWidth = 0;
+      var glyphWidths = {};
+      var encoding = {};
+      var widths = xref.fetchIfRef(dict.get('Widths'));
+      if (widths) {
+        for (var i = 0, j = firstChar; i < widths.length; i++, j++)
+          glyphWidths[j] = widths[i];
+        defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
+      } else {
+        // Trying get the BaseFont metrics (see comment above).
+        var baseFontName = dict.get('BaseFont');
+        if (IsName(baseFontName)) {
+          var metrics = this.getBaseFontMetrics(baseFontName.name);
+
+          glyphWidths = metrics.widths;
+          defaultWidth = metrics.defaultWidth;
+          encoding = metrics.map;
+        }
+      }
 
       var fontName = xref.fetchIfRef(descriptor.get('FontName'));
       assertWellFormed(IsName(fontName), 'invalid font name');
@@ -4600,17 +4629,12 @@ var PartialEvaluator = (function() {
         descent: descriptor.get('Descent'),
         xHeight: descriptor.get('XHeight'),
         capHeight: descriptor.get('CapHeight'),
-        defaultWidth: parseFloat(descriptor.get('MissingWidth')) || 0,
+        defaultWidth: defaultWidth,
         flags: descriptor.get('Flags'),
         italicAngle: descriptor.get('ItalicAngle'),
         differences: [],
-        widths: (function() {
-          var glyphWidths = {};
-          for (var i = 0; i < widths.length; i++)
-            glyphWidths[firstChar++] = widths[i];
-          return glyphWidths;
-        })(),
-        encoding: {}
+        widths: glyphWidths,
+        encoding: encoding
       };
       properties.glyphs = this.extractEncoding(dict, xref, properties);