diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-10-29 13:46:10 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-10-29 13:46:10 -0700 |
commit | 05a26d92ef6da845cfcbff79c5fc7a2de56263bf (patch) | |
tree | 7fe7350cb6fcc32e69051f148f3479354e19c609 | |
parent | 8a1294ec809cdfd90d17cc6c0ba04525d5d4909e (diff) |
fix bug with locking an sdl surface not reading the canvas pixel data properly; fixes #664
-rw-r--r-- | src/library_sdl.js | 15 | ||||
-rwxr-xr-x | tests/runner.py | 3 | ||||
-rw-r--r-- | tests/sdl_canvas_twice.c | 26 | ||||
-rw-r--r-- | tests/sdl_canvas_twice.png | bin | 0 -> 129 bytes |
4 files changed, 36 insertions, 8 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js index 608f1738..56f6a6ef 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -722,16 +722,15 @@ var LibrarySDL = { surfData.locked++; if (surfData.locked > 1) return 0; - if (!surfData.image) { - surfData.image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height); - if (surf == SDL.screen) { - 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 - } + surfData.image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height); + if (surf == SDL.screen) { + 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.copyOnLock) { // Copy pixel data to somewhere accessible to 'C/C++' if (surfData.isFlagSet(0x00200000 /* SDL_HWPALETTE */)) { diff --git a/tests/runner.py b/tests/runner.py index 68709cc3..3e0e795f 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -9124,6 +9124,9 @@ elif 'browser' in str(sys.argv): def test_sdl_canvas_palette(self): self.btest('sdl_canvas_palette.c', reference='sdl_canvas_palette.png') + def test_sdl_canvas_twice(self): + self.btest('sdl_canvas_twice.c', reference='sdl_canvas_twice.png') + def test_sdl_maprgba(self): self.btest('sdl_maprgba.c', reference='sdl_maprgba.png', reference_slack=3) diff --git a/tests/sdl_canvas_twice.c b/tests/sdl_canvas_twice.c new file mode 100644 index 00000000..6c6e4802 --- /dev/null +++ b/tests/sdl_canvas_twice.c @@ -0,0 +1,26 @@ +#include <SDL/SDL.h> + +#if EMSCRIPTEN +#include <emscripten.h> +#endif + +int main(int argc, char **argv) { + SDL_Init(SDL_INIT_VIDEO); + SDL_Surface *screen = SDL_SetVideoMode(40, 40, 32, SDL_SWSURFACE); + + SDL_FillRect(screen, NULL, 0xff0000ff); + SDL_LockSurface(screen); + *((int*)screen->pixels + 95) = 0; + SDL_UnlockSurface(screen); + + SDL_FillRect(screen, NULL, 0x00ff00ff); // wipe out previous pixel and fill + SDL_LockSurface(screen); + *((int*)screen->pixels + 205) = 0; + SDL_UnlockSurface(screen); + + SDL_Flip(screen); + + while(1) { SDL_WaitEvent(NULL); } + + return 0; +} diff --git a/tests/sdl_canvas_twice.png b/tests/sdl_canvas_twice.png Binary files differnew file mode 100644 index 00000000..2439164e --- /dev/null +++ b/tests/sdl_canvas_twice.png |