[Pkg-javascript-commits] [pdf.js] 88/119: Attempt to infer if a CMap file actually contains just a standard `Identity-H`/`Identity-V` map

David Prévot taffit at moszumanska.debian.org
Wed May 13 21:27:45 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository pdf.js.

commit 7c7d05e7a350447139fe62227f03283ff0c81a36
Author: Jonas Jenwald <jonas.jenwald at gmail.com>
Date:   Fri Mar 6 15:01:26 2015 +0100

    Attempt to infer if a CMap file actually contains just a standard `Identity-H`/`Identity-V` map
---
 src/core/cmap.js       | 36 ++++++++++++++++++++++++++++++++++--
 src/core/evaluator.js  |  6 +++++-
 test/unit/cmap_spec.js | 23 +++++++++++++++++++++--
 3 files changed, 60 insertions(+), 5 deletions(-)

diff --git a/src/core/cmap.js b/src/core/cmap.js
index 5d69d17..d97c34d 100644
--- a/src/core/cmap.js
+++ b/src/core/cmap.js
@@ -204,6 +204,7 @@ var CMap = (function CMapClosure() {
     // - bf chars are variable-length byte sequences, stored as strings, with
     //   one byte per character.
     this._map = [];
+    this.name = '';
     this.vertical = false;
     this.useCMap = null;
     this.builtInCMap = builtInCMap;
@@ -303,13 +304,28 @@ var CMap = (function CMapClosure() {
       }
       out.charcode = 0;
       out.length = 1;
+    },
+
+    get isIdentityCMap() {
+      if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) {
+        return false;
+      }
+      if (this._map.length !== 0x10000) {
+        return false;
+      }
+      for (var i = 0; i < 0x10000; i++) {
+        if (this._map[i] !== i) {
+          return false;
+        }
+      }
+      return true;
     }
   };
   return CMap;
 })();
 
 // A special case of CMap, where the _map array implicitly has a length of
-// 65535 and each element is equal to its index.
+// 65536 and each element is equal to its index.
 var IdentityCMap = (function IdentityCMapClosure() {
   function IdentityCMap(vertical, n) {
     CMap.call(this);
@@ -364,7 +380,11 @@ var IdentityCMap = (function IdentityCMapClosure() {
       return map;
     },
 
-    readCharCode: CMap.prototype.readCharCode
+    readCharCode: CMap.prototype.readCharCode,
+
+    get isIdentityCMap() {
+      error('should not access .isIdentityCMap');
+    }
   };
 
   return IdentityCMap;
@@ -829,6 +849,13 @@ var CMapFactory = (function CMapFactoryClosure() {
     }
   }
 
+  function parseCMapName(cMap, lexer) {
+    var obj = lexer.getObj();
+    if (isName(obj) && isString(obj.name)) {
+      cMap.name = obj.name;
+    }
+  }
+
   function parseCMap(cMap, lexer, builtInCMapParams, useCMap) {
     var previous;
     var embededUseCMap;
@@ -839,6 +866,8 @@ var CMapFactory = (function CMapFactoryClosure() {
       } else if (isName(obj)) {
         if (obj.name === 'WMode') {
           parseWMode(cMap, lexer);
+        } else if (obj.name === 'CMapName') {
+          parseCMapName(cMap, lexer);
         }
         previous = obj;
       } else if (isCmd(obj)) {
@@ -948,6 +977,9 @@ var CMapFactory = (function CMapFactoryClosure() {
         } catch (e) {
           warn('Invalid CMap data. ' + e);
         }
+        if (cMap.isIdentityCMap) {
+          return createBuiltInCMap(cMap.name, builtInCMapParams);
+        }
         return cMap;
       }
       error('Encoding required.');
diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index 418ef0d..8bd7959 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -1339,7 +1339,11 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
         return new ToUnicodeMap(cmap.getMap());
       } else if (isStream(cmapObj)) {
         cmap = CMapFactory.create(cmapObj,
-          { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).getMap();
+          { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);
+        if (cmap instanceof IdentityCMap) {
+          return new IdentityToUnicodeMap(0, 0xFFFF);
+        }
+        cmap = cmap.getMap();
         // Convert UTF-16BE
         // NOTE: cmap can be a sparse array, so use forEach instead of for(;;)
         // to iterate over all keys.
diff --git a/test/unit/cmap_spec.js b/test/unit/cmap_spec.js
index 8da3000..f83f92a 100644
--- a/test/unit/cmap_spec.js
+++ b/test/unit/cmap_spec.js
@@ -1,6 +1,7 @@
 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/* globals expect, it, describe, StringStream, CMapFactory, Name */
+/* globals expect, it, describe, StringStream, CMapFactory, Name, CMap,
+           IdentityCMap */
 
 'use strict';
 
@@ -92,8 +93,16 @@ describe('cmap', function() {
     var stream = new StringStream(str);
     var cmap = CMapFactory.create(stream,
                                   { url: cMapUrl, packed: cMapPacked }, null);
+    expect(cmap instanceof CMap).toEqual(true);
     expect(cmap.useCMap).not.toBeNull();
-    expect(cmap.builtInCMap).toBeUndefined();
+    expect(cmap.builtInCMap).toBeFalsy();
+    expect(cmap.isIdentityCMap).toEqual(false);
+  });
+  it('parses cmapname', function() {
+    var str = '/CMapName /Identity-H def\n';
+    var stream = new StringStream(str);
+    var cmap = CMapFactory.create(stream);
+    expect(cmap.name).toEqual('Identity-H');
   });
   it('parses wmode', function() {
     var str = '/WMode 1 def\n';
@@ -104,7 +113,17 @@ describe('cmap', function() {
   it('loads built in cmap', function() {
     var cmap = CMapFactory.create(new Name('Adobe-Japan1-1'),
                                   { url: cMapUrl, packed: cMapPacked }, null);
+    expect(cmap instanceof CMap).toEqual(true);
     expect(cmap.useCMap).toBeNull();
     expect(cmap.builtInCMap).toBeTruthy();
+    expect(cmap.isIdentityCMap).toEqual(false);
+  });
+  it('loads built in identity cmap', function() {
+    var cmap = CMapFactory.create(new Name('Identity-H'),
+                                  { url: cMapUrl, packed: cMapPacked }, null);
+    expect(cmap instanceof IdentityCMap).toEqual(true);
+    expect(cmap.vertical).toEqual(false);
+    expect(function() { return cmap.isIdentityCMap; }).toThrow(
+      new Error('should not access .isIdentityCMap'));
   });
 });

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/pdf.js.git



More information about the Pkg-javascript-commits mailing list