]> git.parisson.com Git - pdf.js.git/commitdiff
cmap fixes: hex/dec numbers, arrays, cmaps, ranges
authornotmasteryet <async.processingjs@yahoo.com>
Tue, 30 Aug 2011 01:26:02 +0000 (20:26 -0500)
committernotmasteryet <async.processingjs@yahoo.com>
Tue, 30 Aug 2011 01:26:02 +0000 (20:26 -0500)
pdf.js

diff --git a/pdf.js b/pdf.js
index 201744efecac38ee1573d95ac132f1543309dea1..e4620731529ad3ea0fd68f1c67e6f8dcb68ab3c2 100644 (file)
--- a/pdf.js
+++ b/pdf.js
@@ -4307,53 +4307,78 @@ var PartialEvaluator = (function() {
 
             var tokens = [];
             var token = '';
+            var beginArrayToken = {};
 
             var cmap = cmapObj.getBytes(cmapObj.length);
             for (var i = 0; i < cmap.length; i++) {
               var byte = cmap[i];
-              if (byte == 0x20 || byte == 0x0A || byte == 0x3C ||
-                  byte == 0x3E) {
+              if (byte == 0x20 || byte == 0x0D || byte == 0x0A ||
+                  byte == 0x3C || byte == 0x5B || byte == 0x5D) {
                 switch (token) {
-                  case 'useCMap':
-                    error('useCMap is not implemented');
+                  case 'usecmap':
+                    error('usecmap is not implemented');
                     break;
 
                   case 'beginbfchar':
                   case 'beginbfrange':
-                  case 'begincodespacerange':
+                  case 'begincidchar':
+                  case 'begincidrange':
                     token = '';
                     tokens = [];
                     break;
 
-                  case 'endcodespacerange':
-                    TODO('Support CMap ranges');
-                    break;
-
+                  case 'endcidrange':
                   case 'endbfrange':
                     for (var j = 0; j < tokens.length; j += 3) {
-                      var startRange = parseInt('0x' + tokens[j]);
-                      var endRange = parseInt('0x' + tokens[j + 1]);
-                      var code = parseInt('0x' + tokens[j + 2]);
+                      var startRange = tokens[j];
+                      var endRange = tokens[j + 1];
+                      var code = tokens[j + 2];
+                      while(startRange < endRange) {
+                        encodingMap[startRange] = code++;
+                        ++startRange;
+                      }
                     }
                     break;
 
+                  case 'endcidchar':
                   case 'endbfchar':
                     for (var j = 0; j < tokens.length; j += 2) {
-                      var index = parseInt('0x' + tokens[j]);
-                      var code = parseInt('0x' + tokens[j + 1]);
+                      var index = tokens[j];
+                      var code = tokens[j + 1];
                       encodingMap[index] = code;
                     }
                     break;
 
+                  case '':
+                    break;
+
                   default:
-                    if (token.length) {
-                      tokens.push(token);
-                      token = '';
+                    if (token[0] >= '0' && token[0] <= '9')
+                      token = parseInt(token, 10); // a number
+                    tokens.push(token);
+                    token = '';
+                    break;
+                }
+                switch (byte) {
+                  case 0x5B:
+                    // begin list parsing
+                    tokens.push(beginArrayToken);
+                    break;
+                  case 0x5D:
+                    // collect array items
+                    var items = [], item;
+                    while (tokens.length && (item = tokens.pop()) != beginArrayToken) {
+                      items.unshift(item);
                     }
+                    tokens.push(items);
                     break;
                 }
-              } else if (byte == 0x5B || byte == 0x5D) {
-                error('CMAP list parsing is not implemented');
+              } else if (byte == 0x3E) {
+                if (token.length) {
+                  // parsing hex number
+                  tokens.push(parseInt(token, 16));
+                  token = '';
+                }
               } else {
                 token += String.fromCharCode(byte);
               }