From 3cba5a0c8a6bc536f71268c32d84b4a1b045a548 Mon Sep 17 00:00:00 2001 From: Brendan Dahl 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",