From 1ec3c341cc4416a35714ccecfb9e9e6a4bc1d283 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote <nnethercote@mozilla.com> Date: Thu, 27 Feb 2014 21:15:38 -0800 Subject: [PATCH] Put mask data to the canvas in small slices. --- src/display/canvas.js | 50 +++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/src/display/canvas.js b/src/display/canvas.js index 7381aa691..f94483b47 100644 --- a/src/display/canvas.js +++ b/src/display/canvas.js @@ -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 mask = 0; - for (var j = 0; j < width; j++) { - if (!mask) { - var elem = data[dataPos++]; - mask = 128; + 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 k = 0; k < width; k++) { + if (!mask) { + var elem = src[srcPos++]; + mask = 128; + } + dest[destPos] = (elem & mask) ? 0 : 255; + destPos += 4; + mask >>= 1; } - if (!(elem & mask)) { - tmpImgDataPixels[tmpPos] = 255; - } - tmpPos += 4; - mask >>= 1; } + ctx.putImageData(chunkImgData, 0, i * fullChunkHeight); } - - ctx.putImageData(tmpImgData, 0, 0); } function copyCtxState(sourceCtx, destCtx) {