diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-06-18 20:25:40 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-06-18 20:25:40 -0700 |
commit | ad01a1896200d9ab8eff3f8485a99e70e72530c4 (patch) | |
tree | e204d6cde21933e39981f5ddd09cef4eb4cd3018 | |
parent | 3963031492acab163f8fa440aaf50661d954506b (diff) | |
parent | 9ee4ca4af663921dace9aa6bcdd206825adf145e (diff) |
Merge pull request #1304 from int3/sdl
Fix SDL color encoding
-rw-r--r-- | src/library_sdl.js | 26 | ||||
-rw-r--r-- | tests/hello_world_sdl.cpp | 8 | ||||
-rwxr-xr-x | tests/runner.py | 9 | ||||
-rw-r--r-- | tests/sdl_canvas.c | 2 | ||||
-rw-r--r-- | tests/sdl_canvas_blank.c | 17 | ||||
-rw-r--r-- | tests/sdl_canvas_blank.png | bin | 0 -> 914 bytes | |||
-rw-r--r-- | tests/sdl_canvas_twice.c | 4 | ||||
-rw-r--r-- | tests/sdl_image_prepare_data.c | 4 | ||||
-rw-r--r-- | tests/sdl_maprgba.c | 1 |
9 files changed, 46 insertions, 25 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js index 5aaddb3b..356c9746 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -242,7 +242,7 @@ var LibrarySDL = { }, translateColorToCSSRGBA: function(rgba) { - return 'rgba(' + ((rgba >> 24)&255) + ',' + ((rgba >> 16)&255) + ',' + ((rgba >> 8)&255) + ',' + ((rgba&255)/255) + ')'; + return 'rgba(' + (rgba&0xff) + ',' + (rgba>>8 & 0xff) + ',' + (rgba>>16 & 0xff) + ',' + (rgba>>>24)/0xff + ')'; }, translateRGBAToCSSRGBA: function(r, g, b, a) { @@ -250,7 +250,7 @@ var LibrarySDL = { }, translateRGBAToColor: function(r, g, b, a) { - return (r << 24) + (g << 16) + (b << 8) + a; + return r | g << 8 | b << 16 | a << 24; }, makeSurface: function(width, height, flags, usePageCanvas, source, rmask, gmask, bmask, amask) { @@ -819,7 +819,6 @@ var LibrarySDL = { if (surfData.isFlagSet(0x00200000 /* SDL_HWPALETTE */)) { SDL.copyIndexedColorData(surfData); } else if (!surfData.colors) { - var num = surfData.image.data.length; var data = surfData.image.data; var buffer = surfData.buffer; #if USE_TYPED_ARRAYS == 2 @@ -827,17 +826,14 @@ var LibrarySDL = { var src = buffer >> 2; var dst = 0; var isScreen = surf == SDL.screen; + var data32 = new Uint32Array(data.buffer); + var num = data32.length; while (dst < num) { - // TODO: access underlying data buffer and write in 32-bit chunks or more - var val = HEAP32[src]; // This is optimized. Instead, we could do {{{ makeGetValue('buffer', 'dst', 'i32') }}}; - data[dst ] = val & 0xff; - data[dst+1] = (val >> 8) & 0xff; - data[dst+2] = (val >> 16) & 0xff; - data[dst+3] = isScreen ? 0xff : ((val >> 24) & 0xff); - src++; - dst += 4; + // HEAP32[src++] is an optimization. Instead, we could do {{{ makeGetValue('buffer', 'dst', 'i32') }}}; + data32[dst++] = HEAP32[src++] | (isScreen ? 0xff000000 : 0); } #else + var num = surfData.image.data.length; for (var i = 0; i < num; i++) { // We may need to correct signs here. Potentially you can hardcode a write of 255 to alpha, say, and // the compiler may decide to write -1 in the llvm bitcode... @@ -1120,13 +1116,13 @@ var LibrarySDL = { }, SDL_MapRGB: function(fmt, r, g, b) { - // Canvas screens are always RGBA - return 0xff+((b&0xff)<<8)+((g&0xff)<<16)+((r&0xff)<<24) + // Canvas screens are always RGBA. We assume the machine is little-endian. + return r&0xff|(g&0xff)<<8|(b&0xff)<<16|0xff000000; }, SDL_MapRGBA: function(fmt, r, g, b, a) { - // Canvas screens are always RGBA - return (a&0xff)+((b&0xff)<<8)+((g&0xff)<<16)+((r&0xff)<<24) + // Canvas screens are always RGBA. We assume the machine is little-endian. + return r&0xff|(g&0xff)<<8|(b&0xff)<<16|(a&0xff)<<24; }, SDL_GetAppState: function() { diff --git a/tests/hello_world_sdl.cpp b/tests/hello_world_sdl.cpp index b6401995..eeaad0cd 100644 --- a/tests/hello_world_sdl.cpp +++ b/tests/hello_world_sdl.cpp @@ -2,7 +2,7 @@ #include <SDL/SDL.h> -int main() { +extern "C" int main(int argc, char** argv) { printf("hello, world!\n"); SDL_Init(SDL_INIT_VIDEO); @@ -11,10 +11,8 @@ int main() { if (SDL_MUSTLOCK(screen)) SDL_LockSurface(screen); for (int i = 0; i < 256; i++) { for (int j = 0; j < 256; j++) { - *((char*)screen->pixels + i*256*4 + j*4 + 0) = i; - *((char*)screen->pixels + i*256*4 + j*4 + 1) = j; - *((char*)screen->pixels + i*256*4 + j*4 + 2) = 255-i; - *((char*)screen->pixels + i*256*4 + j*4 + 3) = (i+j)%255; // actually ignored, since this is to the screen + // alpha component is actually ignored, since this is to the screen + *((Uint32*)screen->pixels + i * 256 + j) = SDL_MapRGBA(screen->format, i, j, 255-i, (i+j) % 255); } } if (SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); diff --git a/tests/runner.py b/tests/runner.py index 5796240d..553c7b4d 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -11542,6 +11542,9 @@ elif 'browser' in str(sys.argv): result = q.get() s.wfile.write(result) s.wfile.close() + def log_request(code=0, size=0): + # don't log; too noisy + pass httpd = BaseHTTPServer.HTTPServer(('localhost', 9999), TestServerHandler) httpd.serve_forever() # test runner will kill us @@ -11562,6 +11565,9 @@ elif 'browser' in str(sys.argv): s.send_response(500) s.send_header("Content-type", "text/html") s.end_headers() + def log_request(code=0, size=0): + # don't log; too noisy + pass os.chdir(dir) httpd = BaseHTTPServer.HTTPServer(('localhost', 8888), TestServerHandler) httpd.serve_forever() # test runner will kill us @@ -12836,6 +12842,9 @@ elif 'browser' in str(sys.argv): def test_cube_explosion(self): self.btest('cube_explosion.c', expected=['667220544', '-1543354600', '-1485258415']) + def test_sdl_canvas_blank(self): + self.btest('sdl_canvas_blank.c', reference='sdl_canvas_blank.png') + def test_sdl_canvas_palette(self): self.btest('sdl_canvas_palette.c', reference='sdl_canvas_palette.png') diff --git a/tests/sdl_canvas.c b/tests/sdl_canvas.c index 97cd1348..10044ff4 100644 --- a/tests/sdl_canvas.c +++ b/tests/sdl_canvas.c @@ -38,7 +38,7 @@ int main(int argc, char **argv) { // fill stuff SDL_Rect rect = { 200, 200, 175, 125 }; - SDL_FillRect(screen, &rect, 0x2222ffff); + SDL_FillRect(screen, &rect, SDL_MapRGBA(screen->format, 0x22, 0x22, 0xff, 0xff)); SDL_Flip(screen); diff --git a/tests/sdl_canvas_blank.c b/tests/sdl_canvas_blank.c new file mode 100644 index 00000000..0e7607a6 --- /dev/null +++ b/tests/sdl_canvas_blank.c @@ -0,0 +1,17 @@ +#include <stdio.h> +#include <SDL/SDL.h> + + +int main() { + SDL_Init(SDL_INIT_VIDEO); + SDL_Surface *screen = SDL_SetVideoMode(256, 256, 32, SDL_SWSURFACE); + + if (SDL_MUSTLOCK(screen)) SDL_LockSurface(screen); + if (SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); + SDL_Flip(screen); + + SDL_Quit(); + + return 0; +} + diff --git a/tests/sdl_canvas_blank.png b/tests/sdl_canvas_blank.png Binary files differnew file mode 100644 index 00000000..dc5a4a26 --- /dev/null +++ b/tests/sdl_canvas_blank.png diff --git a/tests/sdl_canvas_twice.c b/tests/sdl_canvas_twice.c index 6c6e4802..28a7a01c 100644 --- a/tests/sdl_canvas_twice.c +++ b/tests/sdl_canvas_twice.c @@ -8,12 +8,12 @@ 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_FillRect(screen, NULL, SDL_MapRGBA(screen->format, 0xff, 0, 0, 0xff)); SDL_LockSurface(screen); *((int*)screen->pixels + 95) = 0; SDL_UnlockSurface(screen); - SDL_FillRect(screen, NULL, 0x00ff00ff); // wipe out previous pixel and fill + SDL_FillRect(screen, NULL, SDL_MapRGBA(screen->format, 0, 0xff, 0, 0xff)); // wipe out previous pixel and fill SDL_LockSurface(screen); *((int*)screen->pixels + 205) = 0; SDL_UnlockSurface(screen); diff --git a/tests/sdl_image_prepare_data.c b/tests/sdl_image_prepare_data.c index 87e33399..d45a2e60 100644 --- a/tests/sdl_image_prepare_data.c +++ b/tests/sdl_image_prepare_data.c @@ -1,4 +1,6 @@ #include <stdio.h> +#include <stdlib.h> +#include <string.h> #include <SDL/SDL.h> #include <SDL/SDL_image.h> #include <assert.h> @@ -43,7 +45,7 @@ void ready(void *arg, const char *fileName) { testImage(seenName); - free(seenName); // As the API docs say, we are responsible for freeing the 'fake' names we are given + free((void*)seenName); // As the API docs say, we are responsible for freeing the 'fake' names we are given SDL_Flip(screen); } diff --git a/tests/sdl_maprgba.c b/tests/sdl_maprgba.c index c87c7524..4b5c0026 100644 --- a/tests/sdl_maprgba.c +++ b/tests/sdl_maprgba.c @@ -1,6 +1,5 @@ #include <stdio.h> #include <SDL/SDL.h> -#include <emscripten.h> int main() { Uint32 c; |