From 06d083b04bfea8e94cb7c804e16e31a0754d204d Mon Sep 17 00:00:00 2001 From: Jani Pehkonen Date: Tue, 28 Nov 2017 19:40:22 +0200 Subject: [PATCH] Fix pattern-filled text --- src/core/evaluator.js | 3 ++- src/display/canvas.js | 33 ++++++++++++++--------- test/pdfs/.gitignore | 1 + test/pdfs/pattern_text_embedded_font.pdf | Bin 0 -> 2662 bytes test/test_manifest.json | 6 +++++ 5 files changed, 30 insertions(+), 13 deletions(-) create mode 100644 test/pdfs/pattern_text_embedded_font.pdf diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 6e47bda46..b3974a5a4 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -586,7 +586,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { var glyphs = font.charsToGlyphs(chars); var isAddToPathSet = !!(state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); - if (font.data && (isAddToPathSet || this.options.disableFontFace)) { + if (font.data && (isAddToPathSet || this.options.disableFontFace || + state.fillColorSpace.name === 'Pattern')) { var buildPath = (fontChar) => { if (!font.renderer.hasBuiltPath(fontChar)) { var path = font.renderer.getPathJs(fontChar); diff --git a/src/display/canvas.js b/src/display/canvas.js index 19863ac96..6467f23d1 100644 --- a/src/display/canvas.js +++ b/src/display/canvas.js @@ -1355,7 +1355,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { this.moveText(0, this.current.leading); }, - paintChar: function CanvasGraphics_paintChar(character, x, y) { + paintChar(character, x, y, patternTransform) { var ctx = this.ctx; var current = this.current; var font = current.font; @@ -1365,17 +1365,21 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { TextRenderingMode.FILL_STROKE_MASK; var isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); + let patternFill = current.patternFill && font.data; var addToPath; - if (font.disableFontFace || isAddToPathSet) { + if (font.disableFontFace || isAddToPathSet || patternFill) { addToPath = font.getPathGenerator(this.commonObjs, character); } - if (font.disableFontFace) { + if (font.disableFontFace || patternFill) { ctx.save(); ctx.translate(x, y); ctx.beginPath(); addToPath(ctx, fontSize); + if (patternTransform) { + ctx.setTransform.apply(ctx, patternTransform); + } if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { ctx.fill(); @@ -1451,18 +1455,22 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var simpleFillText = current.textRenderingMode === TextRenderingMode.FILL && - !font.disableFontFace; + !font.disableFontFace && !current.patternFill; ctx.save(); + let patternTransform; + if (current.patternFill) { + // TODO: Patterns are not applied correctly to text if a non-embedded + // font is used. E.g. issue 8111 and ShowText-ShadingPattern.pdf. + ctx.save(); + let pattern = current.fillColor.getPattern(ctx, this); + patternTransform = ctx.mozCurrentTransform; + ctx.restore(); + ctx.fillStyle = pattern; + } 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 { @@ -1544,11 +1552,12 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { // common case ctx.fillText(character, scaledX, scaledY); } else { - this.paintChar(character, scaledX, scaledY); + this.paintChar(character, scaledX, scaledY, patternTransform); if (accent) { scaledAccentX = scaledX + accent.offset.x / fontSizeScale; scaledAccentY = scaledY - accent.offset.y / fontSizeScale; - this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY); + this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, + patternTransform); } } } diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index bed1b9c37..592d6acb5 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -124,6 +124,7 @@ !issue5954.pdf !issue6612.pdf !alphatrans.pdf +!pattern_text_embedded_font.pdf !devicen.pdf !cmykjpeg.pdf !issue840.pdf diff --git a/test/pdfs/pattern_text_embedded_font.pdf b/test/pdfs/pattern_text_embedded_font.pdf new file mode 100644 index 0000000000000000000000000000000000000000..96d895022739b29d45080982b2d00a5bcecf0514 GIT binary patch literal 2662 zcmbVOYit|E7G5`Xz3g=!ZE!&)BtvO1ZJO-EUfZckA#t2i+R)$xD1;I=_Qu)Z?3&$8 znqDF0$K~;33K2pOK^sv~Q79lDg{rhPJbnNYDuRMUc?l$55(2I+f0(T{S8!%yr%nQY zSWD}jbIzQZ^PMx_na1vp&StSC$~Aub-G`rW2_zt6V3^yynd7?^+g44zcW*&O636!p zDOpX=fd(PIb5zgRnxT6m7m|3eY8beV*KyoBb|EV)RHEyeVwr^0$TPpJ2o;Ydb4YQ}9WK_OG z9n&&udTToe&Uxyy6dV=6WE!$u7W&Ov)*iC@cKG`ELN zL$^7;U9nX9#do*uN^RfS)MJdA8MQ~zt!~q3Za4B-j^CkJc5+BDktjeWQhLUqso-zc z^fuknN@K{;=zvY5qalhM->I3!c`+GAutw1FH1>39 zuiZ*cwK&MasBS~*&cjCCl%{#eE?kD=x7kWw%e3jayov;lZ?iHgxQNSif3TzWc4NG+ zIfj}=3CZzR6c;0~Ce>W8j6k0L9+Vzi9k~e*0jEi&aILE4hQO~Ff!TQ_XQ2o{Mg4SY zc{KudUc68Xa~o(D<6zmPSr#DaU>~3R6S=8AyGDuD!Ps3RH&Tfs*ab(t#+(QST1=#dnHG1YPf-H|iFVmC@K&fbNJ})~N-ot)3%9tHVhPiXEyxAU8po$q%d061MdvU`0xFOM3(*+U zbk8Qu39SGab*WiRp;@7b$*ppW6qjQt5fxh!iPpsKGKf4(OA8h;O3-{PsKaC#WnQLt@+!$GQMSukJ;czFgubqrHe$9%oAj)~MQ z`*{^pLG3%4e#S}~g}tU%1(F~N8xg!E)CPweGPBo$YO&BZI67v*Fcn+PwxG6r9;N97 z3js!|IR?VN+8Cmz@UIjMJZqVC%oR+MNikcQ0Nu;w%mDK$^Np{=_p;A@7tc7U8Q;td zd26O(X0@}B&87lX2ge9c0zNWKo(%1O&p&Gz^p#(uOgRCkXmOGsr8*8O%*4|ry?h&bcS58;@bt5XA3K8CcMsn#H4gOeYA~_!@Lh-4g^L^|P2eaDj>*1|8~buSsjhz= zpL*(r7g)O9-H+T#f*7B>0UTrZs)w%jYtIco(Tmx&SFCqq4W#LT&`-yXpR7NOpZU*I z7VGv0YEN0i=ER+tO%EUcwV^6}aLidr0{zT%o7z4{&fI$oJNeMvH?ULO*T|jfE{c=~y z>^${BCznyKlAHHN*$;S3Xc6b-36v;G=~rpAG(gHpivpaxV*n%4;M0^VyCv{Izv+f3 zsTZ#y5Oqlmnj#HSK+b!FzExs2uRkRfXh=qm<98NRz0JGD%(XgTWX&$8H*VZi2O&mL zHn>PLSh(;-a}iqRh@V73h$rcjw#I(Rbz1lP~U>`XzeoJ^#sLhfYpIBU&ng l>PZ_0+yp%I`5x`xP-5P-z_Jz7_JETjkqFn=nA+LN{RyW@MV$Zu literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index 17b2d882e..434f91054 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -2704,6 +2704,12 @@ "rounds": 1, "type": "eq" }, + { "id": "pattern_text_embedded_font", + "file": "pdfs/pattern_text_embedded_font.pdf", + "md5": "763b1b9efaecb2b5aefea71c39233f56", + "rounds": 1, + "type": "eq" + }, { "id": "issue6113", "file": "pdfs/issue6113.pdf", "md5": "365fa2d369c51ee3ff195dae907b6e25",