From a8aed7443127cb023f95853d5a9c91ff3ed754a5 Mon Sep 17 00:00:00 2001
From: vyv03354 <VYV03354@nifty.ne.jp>
Date: Wed, 30 Jan 2013 02:46:17 +0900
Subject: [PATCH] Add Hankaku-Latin cid to Unicode mappings

---
 src/cidmaps.js                   |   9 +++++----
 src/fonts.js                     |  30 +++++++++++++++++++++++++-----
 test/pdfs/noembed-identity-2.pdf | Bin 2123 -> 2147 bytes
 test/test_manifest.json          |   2 +-
 4 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/src/cidmaps.js b/src/cidmaps.js
index 1b654756c..500b35a88 100644
--- a/src/cidmaps.js
+++ b/src/cidmaps.js
@@ -28,7 +28,8 @@ var CIDToUnicodeMaps = {
     174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192},
     {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0,
     {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194,
-    {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288],
+    {f: 59, c: 33}, 165, {f: 31, c: 93}, 65512, {f: 2, c: 125}, 0,
+    {f: 63, c: 65377}, {s: 243}, [8195, 12288],
     {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281,
     {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541},
     {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295,
@@ -780,9 +781,9 @@ var CIDToUnicodeMaps = {
     37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707,
     38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013,
     {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794,
-    39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636},
-    8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256,
-    298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304,
+    39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, 0, 92,
+    {s: 634}, 8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275,
+    333, 256, 298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304,
     {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0,
     467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593,
     8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0,
diff --git a/src/fonts.js b/src/fonts.js
index 215105b78..99605dbc9 100644
--- a/src/fonts.js
+++ b/src/fonts.js
@@ -413,6 +413,19 @@ var CMapConverterList = {
   '90msp-RKSJ-V': sjisToUnicode
 };
 
+// CMaps using Hankaku (Halfwidth) Latin glyphs instead of proportional one.
+// We need to distinguish them to get correct widths from CIDFont dicts.
+var HalfwidthCMaps = {
+  'H': true,
+  'V': true,
+  'EUC-H': true,
+  'EUC-V': true,
+  '90ms-RKSJ-H': true,
+  '90ms-RKSJ-V': true,
+  'UniJIS-UCS2-HW-H': true,
+  'UniJIS-UCS2-HW-V': true
+};
+
 var decodeBytes;
 if (typeof TextDecoder !== 'undefined') {
   decodeBytes = function(bytes, encoding) {
@@ -4141,14 +4154,18 @@ var Font = (function FontClosure() {
       if (!cidToUnicode)
         return; // identity encoding
 
+      var cidEncoding = properties.cidEncoding;
+      var overwrite = HalfwidthCMaps[cidEncoding];
       var cid = 1, i, j, k, ii;
       for (i = 0, ii = cidToUnicode.length; i < ii; ++i) {
         var unicode = cidToUnicode[i];
         if (isArray(unicode)) {
           var length = unicode.length;
           for (j = 0; j < length; j++) {
-            cidToUnicodeMap[cid] = unicode[j];
-            unicodeToCIDMap[unicode[j]] = cid;
+            cidToUnicodeMap[cid] = k = unicode[j];
+            if (!unicodeToCIDMap[k] || overwrite) {
+              unicodeToCIDMap[k] = cid;
+            }
           }
           cid++;
         } else if (typeof unicode === 'object') {
@@ -4157,7 +4174,9 @@ var Font = (function FontClosure() {
             k = unicode.c;
             for (j = 0; j < fillLength; ++j) {
               cidToUnicodeMap[cid] = k;
-              unicodeToCIDMap[k] = cid;
+              if (!unicodeToCIDMap[k] || overwrite) {
+                unicodeToCIDMap[k] = cid;
+              }
               cid++;
               k++;
             }
@@ -4165,13 +4184,14 @@ var Font = (function FontClosure() {
             cid += unicode.s;
         } else if (unicode) {
           cidToUnicodeMap[cid] = unicode;
-          unicodeToCIDMap[unicode] = cid;
+          if (!unicodeToCIDMap[unicode] || overwrite) {
+            unicodeToCIDMap[unicode] = cid;
+          }
           cid++;
         } else
           cid++;
       }
 
-      var cidEncoding = properties.cidEncoding;
       if (!cidEncoding) {
         return;
       }
diff --git a/test/pdfs/noembed-identity-2.pdf b/test/pdfs/noembed-identity-2.pdf
index 5bc89bea6236d943f8ac899a397c4618a4018f1f..5692a262ad195b4e77ba337c9d08cfe1a5a71cfd 100644
GIT binary patch
delta 87
zcmX>t@K|8OVP<Y4V?zaFBU1%a1B1<nn13-bSsF~<#}>k4VBlsB#1=qoIa!GPf|#YT
jf&mC9<neNW83u;thGvt0uzPTu8S!$ds=E5S@p1tGCD|3m

delta 62
zcmaDXa9Uu)Vdl-}nSU}dnOjUg#TGJIi~WL_g`t802q@(7a)B8JhUNw)lLa_DxQ#7%
Mxl~nM{oQ!E0C?39TmS$7

diff --git a/test/test_manifest.json b/test/test_manifest.json
index 319e2ab60..abbd696cf 100644
--- a/test/test_manifest.json
+++ b/test/test_manifest.json
@@ -833,7 +833,7 @@
     },
     {  "id": "noembed-identity-2",
       "file": "pdfs/noembed-identity-2.pdf",
-      "md5": "5549571a910814a9c53a1761b27fd028",
+      "md5": "13b7d9ab9579d45c10bc8d499d087f21",
       "rounds": 1,
       "type": "eq"
     },