From 1d1f175826aae0e468d816944d1c44e06532e985 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 29 Dec 2015 17:57:10 +0100 Subject: [PATCH] Apply Patterns, if necessary, when rendering text Currently we're not applying Patterns for text, but only for graphics. This patch is unfortunately not a complete solution, but rather a step on the way, since there are still some PDF files where the Patterns look more like a solid colour, rather than the intended gradient. I've been unable to fix these issues completely, and I've not managed to determine if the remaining issues are caused either by the pattern code, the canvas code, or perhaps both. However, given that even this simple patch improves the current situation quite a bit, I figured that it couldn't hurt to submit it as-is. - Fixes 5804. - Fixes 6130. - Improves 3988 a lot, since the text is now visible. However, it looks like the text is *one* solid colour, instead of the correct gradient. - Improves 5432, since the text is no longer gray. (This file also suffers from the same problem as the previous one.) --- src/display/canvas.js | 6 ++++++ test/pdfs/.gitignore | 2 ++ test/pdfs/ShowText-ShadingPattern.pdf | Bin 0 -> 4671 bytes test/pdfs/issue5804.pdf | Bin 0 -> 8498 bytes test/test_manifest.json | 15 +++++++++++++++ 5 files changed, 23 insertions(+) create mode 100644 test/pdfs/ShowText-ShadingPattern.pdf create mode 100644 test/pdfs/issue5804.pdf diff --git a/src/display/canvas.js b/src/display/canvas.js index 3cbf0c2c7..2e8c76607 100644 --- a/src/display/canvas.js +++ b/src/display/canvas.js @@ -1421,6 +1421,12 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { ctx.transform.apply(ctx, current.textMatrix); ctx.translate(current.x, current.y + current.textRise); + if (current.patternFill) { + // TODO: Some shading patterns are not applied correctly to text, + // e.g. issues 3988 and 5432, and ShowText-ShadingPattern.pdf. + ctx.fillStyle = current.fillColor.getPattern(ctx, this); + } + if (fontDirection > 0) { ctx.scale(textHScale, -1); } else { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 78943c4ae..e75151e55 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -25,6 +25,8 @@ !bug1200096.pdf !issue5564_reduced.pdf !canvas.pdf +!issue5804.pdf +!ShowText-ShadingPattern.pdf !complex_ttf_font.pdf !extgstate.pdf !rotation.pdf diff --git a/test/pdfs/ShowText-ShadingPattern.pdf b/test/pdfs/ShowText-ShadingPattern.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cc29f982e4c5bd8683c99fd293268f774032b43f GIT binary patch literal 4671 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 literal 0 HcmV?d00001 diff --git a/test/pdfs/issue5804.pdf b/test/pdfs/issue5804.pdf new file mode 100644 index 0000000000000000000000000000000000000000..83d2dea7733e548aa2f73a1d4d891cc40dca74ec GIT binary patch literal 8498 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