From 3cba5a0c8a6bc536f71268c32d84b4a1b045a548 Mon Sep 17 00:00:00 2001 From: Brendan Dahl <brendan.dahl@gmail.com> Date: Mon, 15 Apr 2013 16:14:07 -0700 Subject: [PATCH] Normalize CFF CID sub matrices to work on windows. --- src/fonts.js | 29 ++++++++++++++++++++++++++++- src/util.js | 12 ++++++++++++ test/pdfs/issue3061.pdf | Bin 0 -> 17022 bytes test/test_manifest.json | 7 +++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 test/pdfs/issue3061.pdf diff --git a/src/fonts.js b/src/fonts.js index 3cfdba094..330210b28 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -17,7 +17,7 @@ /* globals assert, bytesToString, CIDToUnicodeMaps, error, ExpertCharset, ExpertSubsetCharset, FileReaderSync, globalScope, GlyphsUnicode, info, isArray, isNum, ISOAdobeCharset, isWorker, PDFJS, Stream, - stringToBytes, TextDecoder, TODO, warn, Lexer */ + stringToBytes, TextDecoder, TODO, warn, Lexer, Util */ 'use strict'; @@ -6696,6 +6696,33 @@ var CFFCompiler = (function CFFCompilerClosure() { var nameIndex = this.compileNameIndex(cff.names); output.add(nameIndex); + if (cff.isCIDFont) { + // The spec is unclear on how font matrices should relate to each other + // when there is one in the main top dict and the sub top dicts. + // Windows handles this differently than linux and osx so we have to + // normalize to work on all. + // Rules based off of some mailing list discussions: + // - If main font has a matrix and subfont doesn't, use the main matrix. + // - If no main font matrix and there is a subfont matrix, use the + // subfont matrix. + // - If both have matrices, concat together. + // - If neither have matrices, use default. + // To make this work on all platforms we move the top matrix into each + // sub top dict and concat if necessary. + if (cff.topDict.hasName('FontMatrix')) { + var base = cff.topDict.getByName('FontMatrix'); + cff.topDict.removeByName('FontMatrix'); + for (var i = 0, ii = cff.fdArray.length; i < ii; i++) { + var subDict = cff.fdArray[i]; + var matrix = base.slice(0); + if (subDict.hasName('FontMatrix')) { + matrix = Util.transform(matrix, subDict.getByName('FontMatrix')); + } + subDict.setByName('FontMatrix', matrix); + } + } + } + var compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont); diff --git a/src/util.js b/src/util.js index c29699f7d..8706b27fb 100644 --- a/src/util.js +++ b/src/util.js @@ -223,6 +223,18 @@ var Util = PDFJS.Util = (function UtilClosure() { return Util.makeCssCmyk(cmyk); }; + // Concatenates two transformation matrices together and returns the result. + Util.transform = function Util_transform(m1, m2) { + return [ + m1[0] * m2[0] + m1[2] * m2[1], + m1[1] * m2[0] + m1[3] * m2[1], + m1[0] * m2[2] + m1[2] * m2[3], + m1[1] * m2[2] + m1[3] * m2[3], + m1[0] * m2[4] + m1[2] * m2[5] + m1[4], + m1[1] * m2[4] + m1[3] * m2[5] + m1[5] + ]; + }; + // For 2d affine transforms Util.applyTransform = function Util_applyTransform(p, m) { var xt = p[0] * m[0] + p[1] * m[2] + m[4]; diff --git a/test/pdfs/issue3061.pdf b/test/pdfs/issue3061.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4c16f7c58f7606f9d01fe43120668eff9f680d0a GIT binary patch literal 17022 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 literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index 68fbc7009..a1ce04f51 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -883,6 +883,13 @@ "lastPage": 4, "type": "load" }, + { "id": "issue3061", + "file": "pdfs/issue3061.pdf", + "md5": "696a7cb1b194d095ca3f7861779a606b", + "rounds": 1, + "type": "eq", + "about": "CFF CID font with font matrices in main top dict and sub top dict." + }, { "id": "issue1878", "file": "pdfs/issue1878.pdf", "md5": "b4fb0ce7c19368e7104dce3d0d34bcb3",