diff options
author | Alon Zakai <alonzakai@gmail.com> | 2011-05-22 14:56:33 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2011-05-22 14:56:33 -0700 |
commit | 469d4e73bf4d2bded855f063fe8dbda7a8ca9648 (patch) | |
tree | 6b5c52354ba2d1bfba280dba3a69cd5c784cb733 | |
parent | 835af26449f2d17dec47adee4bcd3d7873481b66 (diff) |
optimize canvas calls
-rw-r--r-- | src/library_sdl.js | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js index ef030e95..17479686 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -173,11 +173,18 @@ mergeInto(Library, { SDL_LockSurface: function(surf) { var surfData = SDL.surfaces[surf]; - surfData.image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height); + if (!surfData.image) { + surfData.image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height); + var data = surfData.image.data; + var num = data.length; + for (var i = 0; i < num/4; i++) { + data[i*4+3] = 255; // opacity, as canvases blend alpha + } + } if (SDL.defaults.copyScreenOnLock) { // Copy pixel data to somewhere accessible to 'C/C++' - var num = surfData.image.data.length; - for (var i = 0; i < num; i++) { + var num2 = surfData.image.data.length; + for (var i = 0; i < num2; i++) { IHEAP[surfData.buffer+i] = surfData.image.data[i]; } } @@ -194,29 +201,27 @@ mergeInto(Library, { var num = surfData.image.data.length; if (!surfData.colors) { for (var i = 0; i < num; i++) { - surfData.image.data[i] = IHEAP[surfData.buffer+i]; + surfData.image.data[i] = IHEAP[surfData.buffer+i]; // XXX - make sure alpha values are proper in your input } } else { var width = Module.canvas.width; var height = Module.canvas.height; var s = surfData.buffer; + var data = surfData.image.data; + var colors = surfData.colors; for (var y = 0; y < height; y++) { var base = y*width*4; for (var x = 0; x < width; x++) { var val = IHEAP[s++]; - //var val = unSign(IHEAP[s++], 8, 1); // XXX Optimize - var color = surfData.colors[val]; - surfData.image.data[base+x*4+0] = color[0]; - surfData.image.data[base+x*4+1] = color[1]; - surfData.image.data[base+x*4+2] = color[2]; - //surfData.image.data[base+x*4+3] = color[3]; + var color = colors[val] || [Math.floor(Math.random()*255),Math.floor(Math.random()*255),Math.floor(Math.random()*255)]; // XXX + var start = base + x*4; + data[start] = color[0]; + data[start+1] = color[1]; + data[start+2] = color[2]; } s += width*3; } } - for (var i = 0; i < num/4; i++) { - surfData.image.data[i*4+3] = 255; // opacity, as canvases blend alpha - } // Copy to canvas surfData.ctx.putImageData(surfData.image, 0, 0); // Cleanup |