aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-10-29 13:46:10 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-10-29 13:46:10 -0700
commit05a26d92ef6da845cfcbff79c5fc7a2de56263bf (patch)
tree7fe7350cb6fcc32e69051f148f3479354e19c609
parent8a1294ec809cdfd90d17cc6c0ba04525d5d4909e (diff)
fix bug with locking an sdl surface not reading the canvas pixel data properly; fixes #664
-rw-r--r--src/library_sdl.js15
-rwxr-xr-xtests/runner.py3
-rw-r--r--tests/sdl_canvas_twice.c26
-rw-r--r--tests/sdl_canvas_twice.pngbin0 -> 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
new file mode 100644
index 00000000..2439164e
--- /dev/null
+++ b/tests/sdl_canvas_twice.png
Binary files differ