diff options
author | Anthony Pesch <inolen@gmail.com> | 2014-02-04 02:37:27 -0800 |
---|---|---|
committer | Anthony Pesch <inolen@gmail.com> | 2014-02-04 02:37:27 -0800 |
commit | 7d8756c66664ad4b060ed76db0603a560e6b6f88 (patch) | |
tree | 27579b443b916969616171514eb8c269a515be07 | |
parent | e057f87907726a2a129f0567ae19f5bcc30c3499 (diff) |
lazily initialize SDL surface buffer
-rw-r--r-- | src/library_sdl.js | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js index 80734d95..5d41618b 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -215,7 +215,6 @@ var LibrarySDL = { makeSurface: function(width, height, flags, usePageCanvas, source, rmask, gmask, bmask, amask) { flags = flags || 0; var surf = _malloc({{{ C_STRUCTS.SDL_Surface.__size__ }}}); // SDL_Surface has 15 fields of quantum size - var buffer = _malloc(width*height*4); // TODO: only allocate when locked the first time var pixelFormat = _malloc({{{ C_STRUCTS.SDL_PixelFormat.__size__ }}}); flags |= 1; // SDL_HWSURFACE - this tells SDL_MUSTLOCK that this needs to be locked @@ -229,7 +228,7 @@ var LibrarySDL = { {{{ makeSetValue('surf', C_STRUCTS.SDL_Surface.h, 'height', 'i32') }}}; // SDL_Surface.h {{{ makeSetValue('surf', C_STRUCTS.SDL_Surface.pitch, 'width * bpp', 'i32') }}}; // SDL_Surface.pitch, assuming RGBA or indexed for now, // since that is what ImageData gives us in browsers - {{{ makeSetValue('surf', C_STRUCTS.SDL_Surface.pixels, 'buffer', 'void*') }}}; // SDL_Surface.pixels + {{{ makeSetValue('surf', C_STRUCTS.SDL_Surface.pixels, '0', 'void*') }}}; // SDL_Surface.pixels, lazily initialized inside of SDL_LockSurface {{{ makeSetValue('surf', C_STRUCTS.SDL_Surface.clip_rect, '0', 'i32*') }}}; // SDL_Surface.offset {{{ makeSetValue('surf', C_STRUCTS.SDL_Surface.refcount, '1', 'i32') }}}; @@ -274,7 +273,7 @@ var LibrarySDL = { canvas: canvas, ctx: ctx, surf: surf, - buffer: buffer, + buffer: 0, pixelFormat: pixelFormat, alpha: 255, flags: flags, @@ -337,7 +336,7 @@ var LibrarySDL = { var info = SDL.surfaces[surf]; if (!info.usePageCanvas && info.canvas) SDL.canvasPool.push(info.canvas); - _free(info.buffer); + if (info.buffer) _free(info.buffer); _free(info.pixelFormat); _free(surf); SDL.surfaces[surf] = null; @@ -986,6 +985,11 @@ var LibrarySDL = { surfData.locked++; if (surfData.locked > 1) return 0; + if (!surfData.buffer) { + surfData.buffer = _malloc(surfData.width * surfData.height * 4); + {{{ makeSetValue('surf', C_STRUCTS.SDL_Surface.pixels, 'surfData.buffer', 'void*') }}}; + } + // Mark in C/C++-accessible SDL structure // SDL_Surface has the following fields: Uint32 flags, SDL_PixelFormat *format; int w, h; Uint16 pitch; void *pixels; ... // So we have fields all of the same size, and 5 of them before us. |