From dacd239ed20865f18da915af1bb196979b10df3e Mon Sep 17 00:00:00 2001
From: notmasteryet <async.processingjs@yahoo.com>
Date: Wed, 24 Aug 2011 21:40:17 -0500
Subject: [PATCH 1/2] Add patterns to ImageMask; fix for non-multiple-8 width

---
 pdf.js | 52 ++++++++++++++++++++++++++++------------------------
 1 file changed, 28 insertions(+), 24 deletions(-)

diff --git a/pdf.js b/pdf.js
index e1fce54ce..ab3b37684 100644
--- a/pdf.js
+++ b/pdf.js
@@ -5112,15 +5112,18 @@ var CanvasGraphics = (function() {
 
       var tmpCanvas = new this.ScratchCanvas(w, h);
       var tmpCtx = tmpCanvas.getContext('2d');
+      if (imageObj.imageMask) {
+        var fillColor = this.current.fillColor;
+        tmpCtx.fillStyle = (fillColor && fillColor.type === 'Pattern') ?
+          fillColor.getPattern(ctx) : fillColor;
+        tmpCtx.fillRect(0, 0, w, h);
+      }
       var imgData = tmpCtx.getImageData(0, 0, w, h);
       var pixels = imgData.data;
 
       if (imageObj.imageMask) {
-        var inverseDecode = imageObj.decode && imageObj.decode[0] > 0;
-        // TODO fillColor pattern support
-        var fillColor = this.current.fillColor;
-        imageObj.fillUsingStencilMask(pixels, fillColor,
-                                      inverseDecode);
+        var inverseDecode = !!imageObj.decode && imageObj.decode[0] > 0;
+        imageObj.applyStencilMask(pixels, inverseDecode);
       } else
         imageObj.fillRgbaBuffer(pixels);
 
@@ -6000,26 +6003,27 @@ var PDFImage = (function() {
       }
       return buf;
     },
-    fillUsingStencilMask: function fillUsingStencilMask(buffer,
-      cssRgb, inverseDecode) {
-      var m = /rgb\((\d+),(\d+),(\d+)\)/.exec(cssRgb); // parse CSS color
-      var r = m[1] | 0, g = m[2] | 0, b = m[3] | 0;
-      var bufferLength = this.width * this.height;
-      var imgArray = this.image.getBytes((bufferLength + 7) >> 3);
-      var i, mask;
-      var bufferPos = 0, imgArrayPos = 0;
-      for (i = 0; i < bufferLength; i++) {
-        var buf = imgArray[imgArrayPos++];
-        for (mask = 128; mask > 0; mask >>= 1) {
-          if (!(buf & mask) != inverseDecode) {
-            buffer[bufferPos++] = r;
-            buffer[bufferPos++] = g;
-            buffer[bufferPos++] = b;
-            buffer[bufferPos++] = 255;
-          } else {
-            buffer[bufferPos + 3] = 0;
-            bufferPos += 4;
+    applyStencilMask: function fillUsingStencilMask(buffer,
+      inverseDecode) {
+      var width = this.width, height = this.height;
+      var bitStrideLength = (width + 7) >> 3;
+      var imgArray = this.image.getBytes(bitStrideLength * height);
+      var imgArrayPos = 0;
+      var i, j, mask, buf;
+      // removing making non-masked pixels transparent
+      var bufferPos = 3; // alpha component offset
+      for (i = 0; i < height; i++) {
+        mask = 0;
+        for (j = 0; j < width; j++) {
+          if (!mask) {
+            buf = imgArray[imgArrayPos++];
+            mask = 128;
           }
+          if (!(buf & mask) == inverseDecode) {
+            buffer[bufferPos] = 0;
+          }
+          bufferPos += 4;
+          mask >>= 1;
         }
       }
     },

From 824d6e4e71b1d6e20b5701c286c756aa1720f27c Mon Sep 17 00:00:00 2001
From: notmasteryet <async.processingjs@yahoo.com>
Date: Wed, 24 Aug 2011 22:02:44 -0500
Subject: [PATCH 2/2] using tmpCtx instead of ctx

---
 pdf.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pdf.js b/pdf.js
index ab3b37684..9739128f9 100644
--- a/pdf.js
+++ b/pdf.js
@@ -5115,7 +5115,7 @@ var CanvasGraphics = (function() {
       if (imageObj.imageMask) {
         var fillColor = this.current.fillColor;
         tmpCtx.fillStyle = (fillColor && fillColor.type === 'Pattern') ?
-          fillColor.getPattern(ctx) : fillColor;
+          fillColor.getPattern(tmpCtx) : fillColor;
         tmpCtx.fillRect(0, 0, w, h);
       }
       var imgData = tmpCtx.getImageData(0, 0, w, h);