From 7008d07fde21ab4b630708805796dc6e807b5b9a Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Thu, 29 Mar 2012 08:53:51 -0700 Subject: [PATCH] Fix gradients for fill and stroke. --- src/canvas.js | 5 ++-- src/evaluator.js | 7 +++-- src/pattern.js | 53 ++++++++++++++++++++----------------- test/pdfs/.gitignore | 2 ++ test/pdfs/gradientfill.pdf | Bin 0 -> 1444 bytes test/test_manifest.json | 6 +++++ 6 files changed, 42 insertions(+), 31 deletions(-) create mode 100644 test/pdfs/gradientfill.pdf diff --git a/src/canvas.js b/src/canvas.js index 7bf94a642..979bd1888 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -924,7 +924,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { } var pattern = new TilingPattern(IR, color, this.ctx, this.objs); } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') { - var pattern = Pattern.shadingFromIR(this.ctx, IR); + var pattern = Pattern.shadingFromIR(IR); } else { error('Unkown IR type ' + IR[0]); } @@ -1008,7 +1008,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var ctx = this.ctx; this.save(); - ctx.fillStyle = Pattern.shadingFromIR(ctx, patternIR); + var pattern = Pattern.shadingFromIR(patternIR); + ctx.fillStyle = pattern.getPattern(ctx); var inv = ctx.mozCurrentTransformInverse; if (inv) { diff --git a/src/evaluator.js b/src/evaluator.js index 0a4db37e8..68ca9f640 100644 --- a/src/evaluator.js +++ b/src/evaluator.js @@ -305,8 +305,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { else if (typeNum == SHADING_PATTERN) { var shading = xref.fetchIfRef(dict.get('Shading')); var matrix = dict.get('Matrix'); - var pattern = Pattern.parseShading(shading, matrix, xref, res, - null /*ctx*/); + var pattern = Pattern.parseShading(shading, matrix, xref, + res); args = pattern.getIR(); } else { error('Unkown PatternType ' + typeNum); @@ -377,8 +377,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { if (!shading) error('No shading object found'); - var shadingFill = Pattern.parseShading(shading, null, xref, res, - null); + var shadingFill = Pattern.parseShading(shading, null, xref, res); var patternIR = shadingFill.getIR(); args = [patternIR]; fn = 'shadingFill'; diff --git a/src/pattern.js b/src/pattern.js index 80ba159e7..e31fdbe3f 100644 --- a/src/pattern.js +++ b/src/pattern.js @@ -22,12 +22,11 @@ var Pattern = (function PatternClosure() { } }; - Pattern.shadingFromIR = function pattern_shadingFromIR(ctx, raw) { - return Shadings[raw[0]].fromIR(ctx, raw); + Pattern.shadingFromIR = function pattern_shadingFromIR(raw) { + return Shadings[raw[0]].fromIR(raw); }; - Pattern.parseShading = function pattern_shading(shading, matrix, xref, - res, ctx) { + Pattern.parseShading = function pattern_shading(shading, matrix, xref, res) { var dict = isStream(shading) ? shading.dict : shading; var type = dict.get('ShadingType'); @@ -36,7 +35,7 @@ var Pattern = (function PatternClosure() { case PatternType.AXIAL: case PatternType.RADIAL: // Both radial and axial shadings are handled by RadialAxial shading. - return new Shadings.RadialAxial(dict, matrix, xref, res, ctx); + return new Shadings.RadialAxial(dict, matrix, xref, res); default: return new Shadings.Dummy(); } @@ -102,36 +101,40 @@ Shadings.RadialAxial = (function RadialAxialClosure() { this.colorStops = colorStops; } - RadialAxial.fromIR = function radialAxialShadingGetIR(ctx, raw) { + RadialAxial.fromIR = function radialAxialShadingGetIR(raw) { var type = raw[1]; var colorStops = raw[2]; var p0 = raw[3]; var p1 = raw[4]; var r0 = raw[5]; var r1 = raw[6]; + return { + type: 'Pattern', + getPattern: function(ctx) { + var curMatrix = ctx.mozCurrentTransform; + if (curMatrix) { + var userMatrix = ctx.mozCurrentTransformInverse; - var curMatrix = ctx.mozCurrentTransform; - if (curMatrix) { - var userMatrix = ctx.mozCurrentTransformInverse; + p0 = Util.applyTransform(p0, curMatrix); + p0 = Util.applyTransform(p0, userMatrix); - p0 = Util.applyTransform(p0, curMatrix); - p0 = Util.applyTransform(p0, userMatrix); + p1 = Util.applyTransform(p1, curMatrix); + p1 = Util.applyTransform(p1, userMatrix); + } - p1 = Util.applyTransform(p1, curMatrix); - p1 = Util.applyTransform(p1, userMatrix); - } + var grad; + if (type == PatternType.AXIAL) + grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]); + else if (type == PatternType.RADIAL) + grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1); - var grad; - if (type == PatternType.AXIAL) - grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]); - else if (type == PatternType.RADIAL) - grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1); - - for (var i = 0, ii = colorStops.length; i < ii; ++i) { - var c = colorStops[i]; - grad.addColorStop(c[0], c[1]); - } - return grad; + for (var i = 0, ii = colorStops.length; i < ii; ++i) { + var c = colorStops[i]; + grad.addColorStop(c[0], c[1]); + } + return grad; + } + }; }; RadialAxial.prototype = { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index c8b008d71..2a7c27875 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -30,3 +30,5 @@ !zerowidthline.pdf !issue1002.pdf !issue925.pdf +!gradientfill.pdf + diff --git a/test/pdfs/gradientfill.pdf b/test/pdfs/gradientfill.pdf new file mode 100644 index 0000000000000000000000000000000000000000..170c05f73346df05cf2c25c02a435d0207ba58ab GIT binary patch literal 1444 zcma)6KX21O6h{mQd4Y-fEsW`GV4lg@w<+ zz+8!?8w($RfdQ58fV%MsSa^4~Q#WDY6xqJtyL*3rzxPt>wmWOYrdI9C@3TLa4=#w; zZ>(k$oF_aTsu9!?>RABbbds^+65nH{c$>#!z^(OlD^rrQBWw2Q-mkj{=eM@+ukNgU z?{C}B&K>vZ%HEIu`F_2-?Ob?u|EEu%yR>n=_s#0uI6b-eaB6+++_+k$xeVunvl z7Y+H-=`w}&q~^?o0@a0T8~%zIjd=`k4vr@r@XnB%cwHuWs?cT0&MqG$Y(vc81wt;+ zh}vF2X;6o-PV6v@f`Gs)bGIc@g_kqXbm!b|Nim&NQqQ9qw5+C&IY^df6CF7|F5wp9 zZT>cid2ee&gGF^co{6c9c?O!PUZtu4_oc|4X&S3Uq$ZwcvTKVYmZYYPdBSe7b;}9} z0=o7R*aK3Dps6e)l)M?PO@M;;O2}QNWMY`JL*sPKH6KgN^+#-wq{E_iEpCBaI@8Ld z_AN0MvOi%ligtybxn0OXhE@0;wF6T3qB{7YZwHa9g{q(p>e+t7BcY!cUpQE%sW4zC zV*8+HC8s=p7}*PR$v9{kjQD7{(si2GMfQd~Gu%B+OwzhBd!-g)svEIFzvi%X(8A$V zLc&VS5-EV#gxDUejFg%@aBwIP97;ABC2?j8Ib2=MC6Zz=jd9rj|Jvo$M3wNl`Yoo| zSQy#N1ZBnCT;7>UerUNsT+5v=Xi(}?ID`_52-d9^q;rgf%a}{B0T<6TmN6P3Qw!(3 zfB2&qaq(OfqD)us65>|;Dan#Cm*%gupPX=A8!GMegixR<$_IZZJrtk?GZUIACY9lW NkcMm3YMc8V>n}j3Y+(QZ literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index a4c6defcc..159e222e6 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -558,5 +558,11 @@ "rounds": 1, "link": true, "type": "eq" + }, + { "id": "gradientfill", + "file": "pdfs/gradientfill.pdf", + "md5": "cbc1988e4803f647fa83467a85f0e231", + "rounds": 1, + "type": "eq" } ]