Merge pull request #378 from notmasteryet/stancil-pattern

Add patterns to ImageMask (#348); fix for non-multiple-8 width
This commit is contained in:
Chris Jones 2011-08-24 20:49:17 -07:00
commit 9c6561993c

52
pdf.js
View File

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