Put mask data to the canvas in small slices.

This commit is contained in:
Nicholas Nethercote 2014-02-27 21:15:38 -08:00
parent cab5d7b96f
commit 1ec3c341cc

View File

@ -532,31 +532,39 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
}
function putBinaryImageMask(ctx, imgData) {
var width = imgData.width, height = imgData.height;
var tmpImgData = ctx.createImageData(width, height);
var data = imgData.data;
var tmpImgDataPixels = tmpImgData.data;
var dataPos = 0;
var height = imgData.height, width = imgData.width;
var fullChunkHeight = 16;
var fracChunks = height / fullChunkHeight;
var fullChunks = Math.floor(fracChunks);
var totalChunks = Math.ceil(fracChunks);
var partialChunkHeight = height - fullChunks * fullChunkHeight;
// Expand the mask so it can be used by the canvas. Any required inversion
// has already been handled.
var tmpPos = 3; // alpha component offset
for (var i = 0; i < height; i++) {
var chunkImgData = ctx.createImageData(width, fullChunkHeight);
var srcPos = 0;
var src = imgData.data;
var dest = chunkImgData.data;
for (var i = 0; i < totalChunks; i++) {
var thisChunkHeight =
(i < fullChunks) ? fullChunkHeight : partialChunkHeight;
// Expand the mask so it can be used by the canvas. Any required
// inversion has already been handled.
var destPos = 3; // alpha component offset
for (var j = 0; j < thisChunkHeight; j++) {
var mask = 0;
for (var j = 0; j < width; j++) {
for (var k = 0; k < width; k++) {
if (!mask) {
var elem = data[dataPos++];
var elem = src[srcPos++];
mask = 128;
}
if (!(elem & mask)) {
tmpImgDataPixels[tmpPos] = 255;
}
tmpPos += 4;
dest[destPos] = (elem & mask) ? 0 : 255;
destPos += 4;
mask >>= 1;
}
}
ctx.putImageData(tmpImgData, 0, 0);
ctx.putImageData(chunkImgData, 0, i * fullChunkHeight);
}
}
function copyCtxState(sourceCtx, destCtx) {