aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library_sdl.js26
-rw-r--r--tests/hello_world_sdl.cpp8
-rwxr-xr-xtests/runner.py9
-rw-r--r--tests/sdl_canvas.c2
-rw-r--r--tests/sdl_canvas_blank.c17
-rw-r--r--tests/sdl_canvas_blank.pngbin0 -> 914 bytes
-rw-r--r--tests/sdl_canvas_twice.c4
-rw-r--r--tests/sdl_image_prepare_data.c4
-rw-r--r--tests/sdl_maprgba.c1
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
new file mode 100644
index 00000000..dc5a4a26
--- /dev/null
+++ b/tests/sdl_canvas_blank.png
Binary files differ
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;