]> git.parisson.com Git - pdf.js.git/commitdiff
stencil mask: height * width optimization and decode inversion
authornotmasteryet <async.processingjs@yahoo.com>
Sun, 21 Aug 2011 04:03:00 +0000 (23:03 -0500)
committernotmasteryet <async.processingjs@yahoo.com>
Sun, 21 Aug 2011 04:03:00 +0000 (23:03 -0500)
pdf.js

diff --git a/pdf.js b/pdf.js
index 325aa16d8af348d05f876f682513f9f3bf414a16..5d959c100d38271585a31db86d7ef855a486f676 100644 (file)
--- a/pdf.js
+++ b/pdf.js
@@ -4889,9 +4889,13 @@ var CanvasGraphics = (function() {
       var imgData = tmpCtx.getImageData(0, 0, w, h);
       var pixels = imgData.data;
 
-      if (imageObj.imageMask)
-        imageObj.fillUsingStencilMask(pixels, this.current.fillColor);
-      else
+      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);
+      } else
         imageObj.fillRgbaBuffer(pixels);
 
       tmpCtx.putImageData(imgData, 0, 0);
@@ -5768,27 +5772,25 @@ var PDFImage = (function() {
       }
       return buf;
     },
-    fillUsingStencilMask: function fillUsingStencilMask(buffer, cssRgb) {
+    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 width = this.width;
-      var height = this.height;
-      var imgArray = this.image.getBytes((height * width + 7) >> 3);
-      var i, j, mask;
+      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 < height; i++) {
-        for (j = 0; j < width; j++) {
-          var buf = imgArray[imgArrayPos++];
-          for (mask = 128; mask > 0; mask >>= 1) {
-            if (buf & mask) {
-              buffer[bufferPos++] = r;
-              buffer[bufferPos++] = g;
-              buffer[bufferPos++] = b;
-              buffer[bufferPos++] = 255;
-            } else {
-              buffer[bufferPos + 3] = 0;
-              bufferPos += 4;
-            }
+      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;
           }
         }
       }