From b907e15a904de6989ab528bea9fb4a310f18a3a4 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sat, 3 May 2014 17:28:30 +0200 Subject: [PATCH] Build paths for glyph accents when drawing text as curves --- src/core/evaluator.js | 21 ++++++++++++++++----- src/display/canvas.js | 2 +- test/pdfs/.gitignore | 1 + test/pdfs/glyph_accent.pdf | Bin 0 -> 5490 bytes test/test_manifest.json | 8 ++++++++ 5 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 test/pdfs/glyph_accent.pdf diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 5f9c30312..70fcc6ad3 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -290,11 +290,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { var isAddToPathSet = !!(state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); if (font.data && (isAddToPathSet || PDFJS.disableFontFace)) { - for (var i = 0; i < glyphs.length; i++) { - if (glyphs[i] === null) { - continue; - } - var fontChar = glyphs[i].fontChar; + var buildPath = function (fontChar) { if (!font.renderer.hasBuiltPath(fontChar)) { var path = font.renderer.getPathJs(fontChar); this.handler.send('commonobj', [ @@ -303,6 +299,21 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { path ]); } + }.bind(this); + + for (var i = 0, ii = glyphs.length; i < ii; i++) { + var glyph = glyphs[i]; + if (glyph === null) { + continue; + } + buildPath(glyph.fontChar); + + // If the glyph has an accent we need to build a path for its + // fontChar too, otherwise CanvasGraphics_paintChar will fail. + var accent = glyph.accent; + if (accent && accent.fontChar) { + buildPath(accent.fontChar); + } } } diff --git a/src/display/canvas.js b/src/display/canvas.js index cb568032e..646f8a343 100644 --- a/src/display/canvas.js +++ b/src/display/canvas.js @@ -1253,7 +1253,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { } }, - paintChar: function (character, x, y) { + paintChar: function CanvasGraphics_paintChar(character, x, y) { var ctx = this.ctx; var current = this.current; var font = current.font; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 353e93993..efd18259a 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -43,6 +43,7 @@ !type4psfunc.pdf !issue1350.pdf !S2.pdf +!glyph_accent.pdf !personwithdog.pdf !helloworld-bad.pdf !zerowidthline.pdf diff --git a/test/pdfs/glyph_accent.pdf b/test/pdfs/glyph_accent.pdf new file mode 100644 index 0000000000000000000000000000000000000000..23aa1d714c0755647a33a0bc002a428a585cfe9c GIT binary patch literal 5490 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