aboutsummaryrefslogtreecommitdiff
path: root/src/library_sdl.js
diff options
context:
space:
mode:
authoralon@honor <none@none>2010-09-26 15:59:54 -0700
committeralon@honor <none@none>2010-09-26 15:59:54 -0700
commit7ffcdba83938c3bada5c76165f6c1216e3e9083f (patch)
tree2a758d473b4b471e4ec33ff66c1e034a1823a62d /src/library_sdl.js
parentd4221c3e1a6606ad517eca4ba8bc500ed1c0b315 (diff)
beginnings of SDL support; minor fixes for SDL; raytrace web demo
Diffstat (limited to 'src/library_sdl.js')
-rw-r--r--src/library_sdl.js65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js
new file mode 100644
index 00000000..95842271
--- /dev/null
+++ b/src/library_sdl.js
@@ -0,0 +1,65 @@
+mergeInto(Library, {
+ SDL_Init: function(what) {
+ SDL_SURFACES = {};
+ return 1;
+ },
+
+ SDL_SetVideoMode: function(width, height, depth, flags, canvas) {
+ // ^^^^^^ a 'canvas' parameter is added here; supply a canvas from JS there
+ var surf = _malloc(14*QUANTUM_SIZE); // SDL_Surface has 14 fields of quantum size
+ SDL_SURFACES[surf] = {
+ width: width,
+ height: height,
+ canvas: canvas,
+ ctx: canvas.getContext('2d'),
+ surf: surf,
+ };
+ return surf;
+ },
+
+ SDL_Quit: function() {
+ return 1;
+ },
+
+ SDL_LockSurface: function(surf) {
+ var surfData = SDL_SURFACES[surf];
+ surfData.image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height);
+ // Copy pixel data to somewhere accessible to 'C/C++'
+ var num = surfData.image.data.length;
+ surfData.buffer = _malloc(num);
+ for (var i = 0; i < num; i++) {
+ HEAP[surfData.buffer+i] = surfData.image.data[i];
+ }
+ // 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.
+ HEAP[surf + 5*QUANTUM_SIZE] = surfData.buffer;
+ },
+
+ SDL_UnlockSurface: function(surf) {
+ var surfData = SDL_SURFACES[surf];
+ // Copy pixel data to image
+ var num = surfData.image.data.length;
+ for (var i = 0; i < num; i++) {
+ surfData.image.data[i] = HEAP[surfData.buffer+i];
+ }
+ for (var i = 0; i < num/4; i++) {
+ surfData.image.data[i*4+3] = 255; // opacity, as canvases blend alpha
+ }
+ // Copy to canvas
+ surfData.ctx.putImageData(surfData.image, 0, 0);
+ // Cleanup
+ surfData.image = null;
+ _free(surfData.buffer);
+ surfData.buffer = null;
+ },
+
+ SDL_Flip: function(surf) {
+ // We actually do this in Unlock...
+ },
+
+ SDL_Delay: function(delay) {
+ // No can do... unless you were a generator...
+ },
+});
+