diff options
Diffstat (limited to 'src/library_browser.js')
-rw-r--r-- | src/library_browser.js | 134 |
1 files changed, 129 insertions, 5 deletions
diff --git a/src/library_browser.js b/src/library_browser.js index 9c3057b8..299e8a72 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -3,10 +3,131 @@ // Utilities for browser environments mergeInto(LibraryManager.library, { + emscripten_set_main_loop: function(func, fps) { + fps = fps || 60; // TODO: use requestAnimationFrame + _emscripten_set_main_loop.cancel = false; + var jsFunc = FUNCTION_TABLE[func]; + function doOne() { + if (_emscripten_set_main_loop.cancel) return; + jsFunc(); + setTimeout(doOne, 1000/fps); // doing this each time means that on exception, we stop + } + setTimeout(doOne, 1000/fps); + }, + + emscripten_cancel_main_loop: function(func) { + _emscripten_set_main_loop.cancel = true; + }, + + emscripten_async_call: function(func, millis) { + // TODO: cache these to avoid generating garbage + setTimeout(function() { + FUNCTION_TABLE[func](); + }, millis); + }, + $Browser: { + createContext: function(canvas, useWebGL) { +#if !USE_TYPED_ARRAYS + if (useWebGL) { + Module.print('(USE_TYPED_ARRAYS needs to be enabled for WebGL)'); + return null; + } +#endif + try { + var ctx = canvas.getContext(useWebGL ? 'experimental-webgl' : '2d'); + if (!ctx) throw ':('; + } catch (e) { + Module.print('Could not create canvas - ' + e); + return null; + } + if (useWebGL) { +#if GL_DEBUG + // Useful to debug native webgl apps: var Module = { printErr: function(x) { console.log(x) } }; + var tempCtx = ctx; + var wrapper = {}; + wrapper.objectMap = new WeakMap(); + wrapper.objectCounter = 1; + for (var prop in tempCtx) { + (function(prop) { + switch (typeof tempCtx[prop]) { + case 'function': { + wrapper[prop] = function() { + var printArgs = Array.prototype.slice.call(arguments).map(function(arg) { + if (typeof arg == 'undefined') return '!UNDEFINED!'; + if (!arg) return arg; + if (wrapper.objectMap[arg]) return '<' + arg + '|' + wrapper.objectMap[arg] + '>'; + if (arg.toString() == '[object HTMLImageElement]') { + return arg + '\n\n'; + } + if (arg.byteLength) { + return '{' + Array.prototype.slice.call(arg, 0, Math.min(arg.length, 40)) + '}'; // Useful for correct arrays, less so for compiled arrays, see the code below for that + var buf = new ArrayBuffer(32); + var i8buf = new Int8Array(buf); + var i16buf = new Int16Array(buf); + var f32buf = new Float32Array(buf); + switch(arg.toString()) { + case '[object Uint8Array]': + i8buf.set(arg.subarray(0, 32)); + break; + case '[object Float32Array]': + f32buf.set(arg.subarray(0, 5)); + break; + case '[object Uint16Array]': + i16buf.set(arg.subarray(0, 16)); + break; + default: + alert('unknown array for debugging: ' + arg); + throw 'see alert'; + } + var ret = '{' + arg.byteLength + ':\n'; + var arr = Array.prototype.slice.call(i8buf); + ret += 'i8:' + arr.toString().replace(/,/g, ',') + '\n'; + arr = Array.prototype.slice.call(f32buf, 0, 8); + ret += 'f32:' + arr.toString().replace(/,/g, ',') + '}'; + return ret; + } + return arg; + }); + console.log('[gl_f:' + prop + ':' + printArgs + ']'); + var ret = tempCtx[prop].apply(tempCtx, arguments); + var printRet = ret; + if (typeof ret == 'object') { + wrapper.objectMap[ret] = wrapper.objectCounter++; + printRet = '<' + ret + '|' + wrapper.objectMap[ret] + '>'; + } + if (typeof printRet != 'undefined') console.log('[ gl:' + prop + ':return:' + printRet + ']'); + return ret; + } + break; + } + case 'number': case 'string': { + wrapper.__defineGetter__(prop, function() { + //console.log('[gl_g:' + prop + ':' + tempCtx[prop] + ']'); + return tempCtx[prop]; + }); + wrapper.__defineSetter__(prop, function(value) { + console.log('[gl_s:' + prop + ':' + value + ']'); + tempCtx[prop] = value; + }); + break; + } + } + })(prop); + } + ctx = wrapper; +#endif + // Set the background of the WebGL canvas to black + canvas.style.backgroundColor = "black"; + } + return ctx; + }, + // Given binary data for an image, in a format like PNG or JPG, we convert it // to flat pixel data. We do so using the browser's native code. - decodeImage: function(pixels, format) { + // This is deprecated, it is preferred to load binary files, createObjectURL, etc., + // see the sdl_* tests. + /*decodeImage: function(pixels, format) { function encodeBase64(data) { var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var PAD = '='; @@ -31,14 +152,17 @@ mergeInto(LibraryManager.library, { } return ret; } - var img = new Image(); + var image = new Image(); + image.src = 'data:image/' + format + ';base64,' + encodeBase64(pixels); + assert(image.complete, 'Image could not be decoded'); // page reload might fix it, decoding is async... need .onload handler... var canvas = document.createElement('canvas'); - img.src = 'data:image/' + format + ';base64,' + encodeBase64(pixels); + canvas.width = image.width; + canvas.height = image.height; var ctx = canvas.getContext('2d'); - ctx.drawImage(img, 0, 0); + ctx.drawImage(image, 0, 0); var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); return imageData; - }, + },*/ } }); |