From 1444a7e7947424b29df689599505b33f2b0e9382 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Sun, 9 Oct 2011 09:13:10 -0500 Subject: [PATCH 1/6] Making Type 2 font sanitazable (#631) --- fonts.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/fonts.js b/fonts.js index 2ab3a90b7..45fe9c974 100644 --- a/fonts.js +++ b/fonts.js @@ -2271,7 +2271,7 @@ CFF.prototype = { 'return': 11, 'sub': [12, 11], 'div': [12, 12], - 'pop': [1, 12, 18], + 'pop': [139, 12, 18], 'drop' : [12, 18], 'endchar': 14, 'rmoveto': 21, @@ -2287,9 +2287,11 @@ CFF.prototype = { var cmd = map[command]; assert(cmd, 'Unknow command: ' + command); - if (isArray(cmd)) + if (isArray(cmd)) { charstring.splice(i++, 1, cmd[0], cmd[1]); - else + if (cmd.length > 2) + charstring.splice(++i, 0, cmd[2]); + } else if (cmd !== null) charstring[i] = cmd; } else { // Type1 charstring use a division for number above 32000 From 030b498b6a9f5a0f8c9688c8a55dccb5ad34dbc5 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Mon, 10 Oct 2011 07:03:43 -0500 Subject: [PATCH 2/6] 1 instead of 0 --- fonts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fonts.js b/fonts.js index 45fe9c974..fa6da78e7 100644 --- a/fonts.js +++ b/fonts.js @@ -2271,7 +2271,7 @@ CFF.prototype = { 'return': 11, 'sub': [12, 11], 'div': [12, 12], - 'pop': [139, 12, 18], + 'pop': [140, 12, 18], 'drop' : [12, 18], 'endchar': 14, 'rmoveto': 21, From 2c09fed17ce039c15b093ff7b38b7f6189b879fa Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Mon, 10 Oct 2011 20:58:40 -0500 Subject: [PATCH 3/6] Implement type2 flex --- fonts.js | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/fonts.js b/fonts.js index fa6da78e7..20edc1529 100644 --- a/fonts.js +++ b/fonts.js @@ -1715,6 +1715,7 @@ var Type1Parser = function type1Parser() { var charstring = []; var lsb = 0; var width = 0; + var flexState = 0, flexPoints; var value = ''; var count = array.length; @@ -1748,8 +1749,9 @@ var Type1Parser = function type1Parser() { i++; continue; } - } else if (!kHintingEnabled && (value == 1 || value == 2)) { - charstring.push('drop', 'drop', 'drop', 'drop', 'drop', 'drop'); + } else if (escape == 17 || escape == 33) { + // pop or setcurrentpoint commands can be ignored + // since we are not doing callothersubr continue; } @@ -1775,6 +1777,31 @@ var Type1Parser = function type1Parser() { charstring.push(lsb, 'hmoveto'); continue; + } else if (value == 10) { // callsubr + if (charstring[charstring.length - 1] < 3) { // subr #0..2 + var subrNumber = charstring.pop(); + switch (subrNumber) { + case 1: + flexState = 1; // prepare for flex coordinates + flexPoints = 0; + break; + case 2: + flexState = 2; // flex in progress + flexPoints++; + break; + case 0: + // type2 flex command does not need final coords + charstring.push('exch', 'drop', 'exch', 'drop'); + charstring.push('flex'); + flexState = 0; + break; + } + continue; + } + } else if (value == 21 && flexState > 0) { + if (flexState > 1) + continue; // ignoring rmoveto + value = 5; // first segment replacing with rlineto } else if (!kHintingEnabled && (value == 1 || value == 3)) { charstring.push('drop', 'drop'); continue; @@ -2271,7 +2298,8 @@ CFF.prototype = { 'return': 11, 'sub': [12, 11], 'div': [12, 12], - 'pop': [140, 12, 18], + 'exch': [12, 28], + 'flex': [12, 35], 'drop' : [12, 18], 'endchar': 14, 'rmoveto': 21, @@ -2287,11 +2315,9 @@ CFF.prototype = { var cmd = map[command]; assert(cmd, 'Unknow command: ' + command); - if (isArray(cmd)) { + if (isArray(cmd)) charstring.splice(i++, 1, cmd[0], cmd[1]); - if (cmd.length > 2) - charstring.splice(++i, 0, cmd[2]); - } else if (cmd !== null) + else if (cmd !== null) charstring[i] = cmd; } else { // Type1 charstring use a division for number above 32000 From 25f6431607c1154936bd2ae3ca89ad965b1b4f46 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Mon, 10 Oct 2011 21:00:49 -0500 Subject: [PATCH 4/6] Cleaning up flex stuff --- fonts.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/fonts.js b/fonts.js index 20edc1529..789261ee5 100644 --- a/fonts.js +++ b/fonts.js @@ -1715,7 +1715,7 @@ var Type1Parser = function type1Parser() { var charstring = []; var lsb = 0; var width = 0; - var flexState = 0, flexPoints; + var flexState = 0; var value = ''; var count = array.length; @@ -1783,11 +1783,9 @@ var Type1Parser = function type1Parser() { switch (subrNumber) { case 1: flexState = 1; // prepare for flex coordinates - flexPoints = 0; break; case 2: flexState = 2; // flex in progress - flexPoints++; break; case 0: // type2 flex command does not need final coords @@ -2317,7 +2315,7 @@ CFF.prototype = { if (isArray(cmd)) charstring.splice(i++, 1, cmd[0], cmd[1]); - else if (cmd !== null) + else charstring[i] = cmd; } else { // Type1 charstring use a division for number above 32000 From 66074c08ebbaac0cd06c16440118aa7675f4da89 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Tue, 11 Oct 2011 07:17:45 -0500 Subject: [PATCH 5/6] returning vstem3 and hstem3 --- fonts.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fonts.js b/fonts.js index 789261ee5..3abaaa533 100644 --- a/fonts.js +++ b/fonts.js @@ -1753,6 +1753,9 @@ var Type1Parser = function type1Parser() { // pop or setcurrentpoint commands can be ignored // since we are not doing callothersubr continue; + } else if (!kHintingEnabled && (escape == 1 || escape == 2)) { + charstring.push('drop', 'drop', 'drop', 'drop', 'drop', 'drop'); + continue; } command = charStringDictionary['12'][escape]; From b45f646267cf982b7441738f554abb7d7b806cba Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Tue, 11 Oct 2011 18:26:25 -0500 Subject: [PATCH 6/6] Add fit11-talk as a eq reftest --- test/pdfs/fit11-talk.pdf.link | 1 + test/test_manifest.json | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 test/pdfs/fit11-talk.pdf.link diff --git a/test/pdfs/fit11-talk.pdf.link b/test/pdfs/fit11-talk.pdf.link new file mode 100644 index 000000000..af7107ee2 --- /dev/null +++ b/test/pdfs/fit11-talk.pdf.link @@ -0,0 +1 @@ +http://www.ccs.neu.edu/home/samth/fit11-talk.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index 43b799bad..1270cce29 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -144,6 +144,13 @@ "rounds": 1, "type": "eq" }, + { "id": "fit11-talk", + "file": "pdfs/fit11-talk.pdf", + "link": true, + "rounds": 1, + "skipPages": [12,31], + "type": "eq" + }, { "id": "fips197", "file": "pdfs/fips197.pdf", "link": true,