stencil mask: height * width optimization and decode inversion

This commit is contained in:
notmasteryet 2011-08-20 23:03:00 -05:00
parent 9bc76da676
commit 01e2f81a49

26
pdf.js
View File

@ -4889,9 +4889,13 @@ var CanvasGraphics = (function() {
var imgData = tmpCtx.getImageData(0, 0, w, h); var imgData = tmpCtx.getImageData(0, 0, w, h);
var pixels = imgData.data; var pixels = imgData.data;
if (imageObj.imageMask) if (imageObj.imageMask) {
imageObj.fillUsingStencilMask(pixels, this.current.fillColor); var inverseDecode = imageObj.decode && imageObj.decode[0] > 0;
else // TODO fillColor pattern support
var fillColor = this.current.fillColor;
imageObj.fillUsingStencilMask(pixels, fillColor,
inverseDecode);
} else
imageObj.fillRgbaBuffer(pixels); imageObj.fillRgbaBuffer(pixels);
tmpCtx.putImageData(imgData, 0, 0); tmpCtx.putImageData(imgData, 0, 0);
@ -5768,19 +5772,18 @@ var PDFImage = (function() {
} }
return buf; 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 m = /rgb\((\d+),(\d+),(\d+)\)/.exec(cssRgb); // parse CSS color
var r = m[1] | 0, g = m[2] | 0, b = m[3] | 0; var r = m[1] | 0, g = m[2] | 0, b = m[3] | 0;
var width = this.width; var bufferLength = this.width * this.height;
var height = this.height; var imgArray = this.image.getBytes((bufferLength + 7) >> 3);
var imgArray = this.image.getBytes((height * width + 7) >> 3); var i, mask;
var i, j, mask;
var bufferPos = 0, imgArrayPos = 0; var bufferPos = 0, imgArrayPos = 0;
for (i = 0; i < height; i++) { for (i = 0; i < bufferLength; i++) {
for (j = 0; j < width; j++) {
var buf = imgArray[imgArrayPos++]; var buf = imgArray[imgArrayPos++];
for (mask = 128; mask > 0; mask >>= 1) { for (mask = 128; mask > 0; mask >>= 1) {
if (buf & mask) { if (!(buf & mask) != inverseDecode) {
buffer[bufferPos++] = r; buffer[bufferPos++] = r;
buffer[bufferPos++] = g; buffer[bufferPos++] = g;
buffer[bufferPos++] = b; buffer[bufferPos++] = b;
@ -5791,7 +5794,6 @@ var PDFImage = (function() {
} }
} }
} }
}
}, },
fillRgbaBuffer: function fillRgbaBuffer(buffer) { fillRgbaBuffer: function fillRgbaBuffer(buffer) {
var numComps = this.numComps; var numComps = this.numComps;