]> git.parisson.com Git - pdf.js.git/commitdiff
Fix gradients for fill and stroke.
authorBrendan Dahl <brendan.dahl@gmail.com>
Thu, 29 Mar 2012 15:53:51 +0000 (08:53 -0700)
committerBrendan Dahl <brendan.dahl@gmail.com>
Thu, 29 Mar 2012 15:53:51 +0000 (08:53 -0700)
src/canvas.js
src/evaluator.js
src/pattern.js
test/pdfs/.gitignore
test/pdfs/gradientfill.pdf [new file with mode: 0644]
test/test_manifest.json

index 7bf94a642bac14a01d96336bf32f792c0d5836bd..979bd188882522efd04849d491e0b29298c648de 100644 (file)
@@ -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) {
index 0a4db37e82423807d4bbbf9ca0b815b7ef808462..68ca9f6409c11cff55f6854a5a8c3f70e11190be 100644 (file)
@@ -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';
index 80ba159e71c3faf1360d08b17364100468e7e97d..e31fdbe3f8310914340a2246c9b679ea7924f2bf 100644 (file)
@@ -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];
-
-    var curMatrix = ctx.mozCurrentTransform;
-    if (curMatrix) {
-      var userMatrix = ctx.mozCurrentTransformInverse;
-
-      p0 = Util.applyTransform(p0, curMatrix);
-      p0 = Util.applyTransform(p0, 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);
-
-    for (var i = 0, ii = colorStops.length; i < ii; ++i) {
-      var c = colorStops[i];
-      grad.addColorStop(c[0], c[1]);
-    }
-    return grad;
+    return {
+      type: 'Pattern',
+      getPattern: function(ctx) {
+        var curMatrix = ctx.mozCurrentTransform;
+        if (curMatrix) {
+          var userMatrix = ctx.mozCurrentTransformInverse;
+
+          p0 = Util.applyTransform(p0, curMatrix);
+          p0 = Util.applyTransform(p0, 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);
+
+        for (var i = 0, ii = colorStops.length; i < ii; ++i) {
+          var c = colorStops[i];
+          grad.addColorStop(c[0], c[1]);
+        }
+        return grad;
+      }
+    };
   };
 
   RadialAxial.prototype = {
index c8b008d716527f7c779e7621496cd7a6b1303c3d..2a7c278752ca94ef7d99d5f7146fe4bf16dd30e6 100644 (file)
@@ -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 (file)
index 0000000..170c05f
Binary files /dev/null and b/test/pdfs/gradientfill.pdf differ
index a4c6defccd9325f2d364d2541384a5c91dfd6950..159e222e60bd9b5e1dd0ad9551880b095cb7b337 100644 (file)
       "rounds": 1,
       "link": true,
       "type": "eq"
+    },
+    {  "id": "gradientfill",
+      "file": "pdfs/gradientfill.pdf",
+      "md5": "cbc1988e4803f647fa83467a85f0e231",
+      "rounds": 1,
+      "type": "eq"
     }
 ]