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);
}
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;
}
}
},