diff --git a/pdf.js b/pdf.js index 452304d12..6f2e0710f 100644 --- a/pdf.js +++ b/pdf.js @@ -4496,8 +4496,6 @@ var CanvasGraphics = (function() { }, getAxialShading: function(sh, cs) { var coordsArr = sh.get('Coords'); - var x0 = coordsArr[0], y0 = coordsArr[1], - x1 = coordsArr[2], y1 = coordsArr[3]; var t0 = 0.0, t1 = 1.0; if (sh.has('Domain')) { @@ -4519,22 +4517,51 @@ var CanvasGraphics = (function() { error('Invalid function'); var fn = new PDFFunction(this.xref, fnObj); - var gradient = this.ctx.createLinearGradient(x0, y0, x1, y1); - // 10 samples seems good enough for now, but probably won't work // if there are sharp color changes. Ideally, we would implement // the spec faithfully and add lossless optimizations. var step = (t1 - t0) / 10; var diff = t1 - t0; + var colorStops = []; for (var i = t0; i <= t1; i += step) { var color = fn.func([i]); - var rgbColor = cs.getRgb(color); - gradient.addColorStop((i - t0) / diff, - this.makeCssRgb.apply(this, rgbColor)); + var rgbColor = this.makeCssRgb.apply(this, cs.getRgb(color)); + colorStops.push([(i - t0) / diff, rgbColor]); } + + var patternMatrix = this.ctx.mozCurrentTransform; - return gradient; + return { + patternFn : function() { + var x0 = coordsArr[0], y0 = coordsArr[1]; + var x1 = coordsArr[2], y1 = coordsArr[3]; + + // if the browser supports getting the tranform matrix, convert + // gradient coordinates from pattern space to current user space + if (patternMatrix) { + var userMatrix = this.ctx.mozCurrentTransformInverse; + + var p = this.applyTransform(x0, y0, patternMatrix); + p = this.applyTransform(p[0], p[1], userMatrix); + x0 = p[0]; + y0 = p[1]; + + var p = this.applyTransform(x1, y1, patternMatrix); + p = this.applyTransform(p[0], p[1], userMatrix); + x1 = p[0]; + y1 = p[1]; + } + + var gradient = + this.ctx.createLinearGradient(x0, y0, x1, y1); + for (var i = 0, ii = colorStops.length; i < ii; ++i) { + var c = colorStops[i]; + gradient.addColorStop(c[0], c[1]); + } + return gradient; + } + } }, getRadialShading: function(sh, cs) { var coordsArr = sh.get('Coords');