From ee0d522187999eb4ce89cd113c982a30172295bf Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Mon, 7 Dec 2015 22:30:09 +0100 Subject: [PATCH] Use `adjustWidths` for TrueType fonts if we handle them as OpenType (issue 5027, issue 5084, issue 6556, bug 1204903) In `Font_checkAndRepair` we can decide that a font isn't TrueType, and instead parse it as CFF. In that case it's quite possible that the `fontMatrix` will be changed, and without calling `adjustWidths` we're failing to update the glyph widths correctly. Fixes 5027. Fixes 5084. Fixes 6556. Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1204903. --- src/core/fonts.js | 7 +++++++ test/pdfs/.gitignore | 1 + test/pdfs/issue5084.pdf | Bin 0 -> 15526 bytes test/test_manifest.json | 7 +++++++ 4 files changed, 15 insertions(+) create mode 100644 test/pdfs/issue5084.pdf diff --git a/src/core/fonts.js b/src/core/fonts.js index 45a984e1d..cfb1f1c44 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -2133,6 +2133,9 @@ function reverseIfRtl(chars) { } function adjustWidths(properties) { + if (!properties.fontMatrix) { + return; + } if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) { return; } @@ -2647,6 +2650,8 @@ var Font = (function FontClosure() { // view of the sanitizer data = this.checkAndRepair(name, file, properties); if (this.isOpenType) { + adjustWidths(properties); + type = 'OpenType'; } break; @@ -4079,6 +4084,8 @@ var Font = (function FontClosure() { cffFile = new Stream(tables['CFF '].data); cff = new CFFFont(cffFile, properties); + adjustWidths(properties); + return this.convert(name, cff, properties); } diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 290cea977..00fa955b9 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -46,6 +46,7 @@ !issue6413.pdf !issue4630.pdf !issue4909.pdf +!issue5084.pdf !issue5202.pdf !issue5280.pdf !issue5677.pdf diff --git a/test/pdfs/issue5084.pdf b/test/pdfs/issue5084.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d35ee160d2db1858406dfe10808b4c2dfb4702a0 GIT binary patch literal 15526 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 um^I>aYs*+z*gyom&&?!j?4