var LibraryBrowser = {
$Browser__deps: [
'$callUserCallback',
'$getFullscreenElement',
'$safeSetTimeout',
'$warnOnce',
#if FILESYSTEM
'$preloadPlugins',
#if MAIN_MODULE
'$preloadedWasm',
#endif
#endif
],
$Browser: {
useWebGL: false,
isFullscreen: false,
pointerLock: false,
moduleContextCreatedCallbacks: [],
workers: [],
preloadedImages: {},
preloadedAudios: {},
getCanvas: () => Module['canvas'],
init() {
if (Browser.initted) return;
Browser.initted = true;
#if FILESYSTEM
var imagePlugin = {};
imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {
return !Module['noImageDecoding'] && /\.(jpg|jpeg|png|bmp|webp)$/i.test(name);
};
imagePlugin['handle'] = async function imagePlugin_handle(byteArray, name) {
var b = new Blob([byteArray], { type: Browser.getMimetype(name) });
if (b.size !== byteArray.length) {
b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });
}
var url = URL.createObjectURL(b);
return new Promise((resolve, reject) => {
var img = new Image();
img.onload = () => {
#if ASSERTIONS
assert(img.complete, `Image ${name} could not be decoded`);
#endif
var canvas = (document.createElement('canvas'));
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
Browser.preloadedImages[name] = canvas;
URL.revokeObjectURL(url);
resolve(byteArray);
};
img.onerror = (event) => {
err(`Image ${url} could not be decoded`);
reject();
};
img.src = url;
});
};
preloadPlugins.push(imagePlugin);
var audioPlugin = {};
audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {
return !Module['noAudioDecoding'] && name.slice(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };
};
audioPlugin['handle'] = async function audioPlugin_handle(byteArray, name) {
return new Promise((resolve, reject) => {
var done = false;
function finish(audio) {
if (done) return;
done = true;
Browser.preloadedAudios[name] = audio;
resolve(byteArray);
}
var b = new Blob([byteArray], { type: Browser.getMimetype(name) });
var url = URL.createObjectURL(b);
var audio = new Audio();
audio.addEventListener('canplaythrough', () => finish(audio), false);
audio.onerror = function audio_onerror(event) {
if (done) return;
err(`warning: browser could not fully decode audio ${name}, trying slower base64 approach`);
function encode64(data) {
var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var PAD = '=';
var ret = '';
var leftchar = 0;
var leftbits = 0;
for (var i = 0; i < data.length; i++) {
leftchar = (leftchar << 8) | data[i];
leftbits += 8;
while (leftbits >= 6) {
var curr = (leftchar >> (leftbits-6)) & 0x3f;
leftbits -= 6;
ret += BASE[curr];
}
}
if (leftbits == 2) {
ret += BASE[(leftchar&3) << 4];
ret += PAD + PAD;
} else if (leftbits == 4) {
ret += BASE[(leftchar&0xf) << 2];
ret += PAD;
}
return ret;
}
audio.src = 'data:audio/x-' + name.slice(-3) + ';base64,' + encode64(byteArray);
finish(audio);
};
audio.src = url;
safeSetTimeout(() => {
finish(audio);
}, 10000);
});
};
preloadPlugins.push(audioPlugin);
#endif
function pointerLockChange() {
var canvas = Browser.getCanvas();
Browser.pointerLock = document.pointerLockElement === canvas;
}
var canvas = Browser.getCanvas();
if (canvas) {
document.addEventListener('pointerlockchange', pointerLockChange, false);
if (Module['elementPointerLock']) {
canvas.addEventListener("click", (ev) => {
if (!Browser.pointerLock && Browser.getCanvas().requestPointerLock) {
Browser.getCanvas().requestPointerLock();
ev.preventDefault();
}
}, false);
}
}
},
createContext( canvas, useWebGL, setInModule, webGLContextAttributes) {
if (useWebGL && Module['ctx'] && canvas == Browser.getCanvas()) return Module['ctx'];
var ctx;
var contextHandle;
if (useWebGL) {
var contextAttributes = {
antialias: false,
alpha: false,
#if MIN_WEBGL_VERSION >= 2
majorVersion: 2,
#elif MAX_WEBGL_VERSION >= 2
majorVersion: (typeof WebGL2RenderingContext != 'undefined') ? 2 : 1,
#else
majorVersion: 1,
#endif
};
if (webGLContextAttributes) {
for (var attribute in webGLContextAttributes) {
contextAttributes[attribute] = webGLContextAttributes[attribute];
}
}
if (typeof GL != 'undefined') {
contextHandle = GL.createContext(canvas, contextAttributes);
if (contextHandle) {
ctx = GL.getContext(contextHandle).GLctx;
}
}
} else {
ctx = canvas.getContext('2d');
}
if (!ctx) return null;
if (setInModule) {
#if ASSERTIONS
if (!useWebGL) assert(typeof GLctx == 'undefined', 'cannot set in module if GLctx is used, but we are a non-GL context that would replace it');
#endif
Module['ctx'] = ctx;
if (useWebGL) GL.makeContextCurrent(contextHandle);
Browser.useWebGL = useWebGL;
Browser.moduleContextCreatedCallbacks.forEach((callback) => callback());
Browser.init();
}
return ctx;
},
fullscreenHandlersInstalled: false,
lockPointer: undefined,
resizeCanvas: undefined,
requestFullscreen(lockPointer, resizeCanvas) {
Browser.lockPointer = lockPointer;
Browser.resizeCanvas = resizeCanvas;
if (typeof Browser.lockPointer == 'undefined') Browser.lockPointer = true;
if (typeof Browser.resizeCanvas == 'undefined') Browser.resizeCanvas = false;
var canvas = Browser.getCanvas();
function fullscreenChange() {
Browser.isFullscreen = false;
var canvasContainer = canvas.parentNode;
if (getFullscreenElement() === canvasContainer) {
canvas.exitFullscreen = Browser.exitFullscreen;
if (Browser.lockPointer) canvas.requestPointerLock();
Browser.isFullscreen = true;
if (Browser.resizeCanvas) {
Browser.setFullscreenCanvasSize();
} else {
Browser.updateCanvasDimensions(canvas);
}
} else {
canvasContainer.parentNode.insertBefore(canvas, canvasContainer);
canvasContainer.parentNode.removeChild(canvasContainer);
if (Browser.resizeCanvas) {
Browser.setWindowedCanvasSize();
} else {
Browser.updateCanvasDimensions(canvas);
}
}
Module['onFullScreen']?.(Browser.isFullscreen);
Module['onFullscreen']?.(Browser.isFullscreen);
}
if (!Browser.fullscreenHandlersInstalled) {
Browser.fullscreenHandlersInstalled = true;
document.addEventListener('fullscreenchange', fullscreenChange, false);
document.addEventListener('mozfullscreenchange', fullscreenChange, false);
document.addEventListener('webkitfullscreenchange', fullscreenChange, false);
document.addEventListener('MSFullscreenChange', fullscreenChange, false);
}
var canvasContainer = document.createElement("div");
canvas.parentNode.insertBefore(canvasContainer, canvas);
canvasContainer.appendChild(canvas);
canvasContainer.requestFullscreen = canvasContainer['requestFullscreen'] ||
canvasContainer['mozRequestFullScreen'] ||
canvasContainer['msRequestFullscreen'] ||
(canvasContainer['webkitRequestFullscreen'] ? () => canvasContainer['webkitRequestFullscreen'](Element['ALLOW_KEYBOARD_INPUT']) : null) ||
(canvasContainer['webkitRequestFullScreen'] ? () => canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) : null);
canvasContainer.requestFullscreen();
},
#if ASSERTIONS
requestFullScreen() {
abort('Module.requestFullScreen has been replaced by Module.requestFullscreen (without a capital S)');
},
#endif
exitFullscreen() {
if (!Browser.isFullscreen) {
return false;
}
var CFS = document['exitFullscreen'] ||
document['cancelFullScreen'] ||
document['mozCancelFullScreen'] ||
document['msExitFullscreen'] ||
document['webkitCancelFullScreen'] ||
(() => {});
CFS.apply(document, []);
return true;
},
safeSetTimeout(func, timeout) {
return safeSetTimeout(func, timeout);
},
getMimetype(name) {
return {
'jpg': 'image/jpeg',
'jpeg': 'image/jpeg',
'png': 'image/png',
'bmp': 'image/bmp',
'ogg': 'audio/ogg',
'wav': 'audio/wav',
'mp3': 'audio/mpeg'
}[name.slice(name.lastIndexOf('.')+1)];
},
getUserMedia(func) {
window.getUserMedia ||= navigator['getUserMedia'] ||
navigator['mozGetUserMedia'];
window.getUserMedia(func);
},
getMovementX(event) {
return event['movementX'] ||
event['mozMovementX'] ||
event['webkitMovementX'] ||
0;
},
getMovementY(event) {
return event['movementY'] ||
event['mozMovementY'] ||
event['webkitMovementY'] ||
0;
},
getMouseWheelDelta(event) {
var delta = 0;
switch (event.type) {
case 'DOMMouseScroll':
delta = event.detail / 3;
break;
case 'mousewheel':
delta = event.wheelDelta / 120;
break;
case 'wheel':
delta = event.deltaY
switch (event.deltaMode) {
case 0:
delta /= 100;
break;
case 1:
delta /= 3;
break;
case 2:
delta *= 80;
break;
default:
throw 'unrecognized mouse wheel delta mode: ' + event.deltaMode;
}
break;
default:
throw 'unrecognized mouse wheel event: ' + event.type;
}
return delta;
},
mouseX: 0,
mouseY: 0,
mouseMovementX: 0,
mouseMovementY: 0,
touches: {},
lastTouches: {},
calculateMouseCoords(pageX, pageY) {
var canvas = Browser.getCanvas();
var rect = canvas.getBoundingClientRect();
var scrollX = ((typeof window.scrollX != 'undefined') ? window.scrollX : window.pageXOffset);
var scrollY = ((typeof window.scrollY != 'undefined') ? window.scrollY : window.pageYOffset);
#if ASSERTIONS
assert((typeof scrollX != 'undefined') && (typeof scrollY != 'undefined'), 'Unable to retrieve scroll position, mouse positions likely broken.');
#endif
var adjustedX = pageX - (scrollX + rect.left);
var adjustedY = pageY - (scrollY + rect.top);
adjustedX = adjustedX * (canvas.width / rect.width);
adjustedY = adjustedY * (canvas.height / rect.height);
return { x: adjustedX, y: adjustedY };
},
setMouseCoords(pageX, pageY) {
const {x, y} = Browser.calculateMouseCoords(pageX, pageY);
Browser.mouseMovementX = x - Browser.mouseX;
Browser.mouseMovementY = y - Browser.mouseY;
Browser.mouseX = x;
Browser.mouseY = y;
},
calculateMouseEvent(event) {
if (Browser.pointerLock) {
if (event.type != 'mousemove' &&
('mozMovementX' in event)) {
Browser.mouseMovementX = Browser.mouseMovementY = 0;
} else {
Browser.mouseMovementX = Browser.getMovementX(event);
Browser.mouseMovementY = Browser.getMovementY(event);
}
Browser.mouseX += Browser.mouseMovementX;
Browser.mouseY += Browser.mouseMovementY;
} else {
if (event.type === 'touchstart' || event.type === 'touchend' || event.type === 'touchmove') {
var touch = event.touch;
if (touch === undefined) {
return;
}
var coords = Browser.calculateMouseCoords(touch.pageX, touch.pageY);
if (event.type === 'touchstart') {
Browser.lastTouches[touch.identifier] = coords;
Browser.touches[touch.identifier] = coords;
} else if (event.type === 'touchend' || event.type === 'touchmove') {
var last = Browser.touches[touch.identifier];
last ||= coords;
Browser.lastTouches[touch.identifier] = last;
Browser.touches[touch.identifier] = coords;
}
return;
}
Browser.setMouseCoords(event.pageX, event.pageY);
}
},
resizeListeners: [],
updateResizeListeners() {
var canvas = Browser.getCanvas();
Browser.resizeListeners.forEach((listener) => listener(canvas.width, canvas.height));
},
setCanvasSize(width, height, noUpdates) {
var canvas = Browser.getCanvas();
Browser.updateCanvasDimensions(canvas, width, height);
if (!noUpdates) Browser.updateResizeListeners();
},
windowedWidth: 0,
windowedHeight: 0,
setFullscreenCanvasSize() {
if (typeof SDL != "undefined") {
var flags = {{{ makeGetValue('SDL.screen', '0', 'u32') }}};
flags = flags | 0x00800000;
{{{ makeSetValue('SDL.screen', '0', 'flags', 'i32') }}};
}
Browser.updateCanvasDimensions(Browser.getCanvas());
Browser.updateResizeListeners();
},
setWindowedCanvasSize() {
if (typeof SDL != "undefined") {
var flags = {{{ makeGetValue('SDL.screen', '0', 'u32') }}};
flags = flags & ~0x00800000;
{{{ makeSetValue('SDL.screen', '0', 'flags', 'i32') }}};
}
Browser.updateCanvasDimensions(Browser.getCanvas());
Browser.updateResizeListeners();
},
updateCanvasDimensions(canvas, wNative, hNative) {
if (wNative && hNative) {
canvas.widthNative = wNative;
canvas.heightNative = hNative;
} else {
wNative = canvas.widthNative;
hNative = canvas.heightNative;
}
var w = wNative;
var h = hNative;
if (Module['forcedAspectRatio'] > 0) {
if (w/h < Module['forcedAspectRatio']) {
w = Math.round(h * Module['forcedAspectRatio']);
} else {
h = Math.round(w / Module['forcedAspectRatio']);
}
}
if ((getFullscreenElement() === canvas.parentNode) && (typeof screen != 'undefined')) {
var factor = Math.min(screen.width / w, screen.height / h);
w = Math.round(w * factor);
h = Math.round(h * factor);
}
if (Browser.resizeCanvas) {
if (canvas.width != w) canvas.width = w;
if (canvas.height != h) canvas.height = h;
if (typeof canvas.style != 'undefined') {
canvas.style.removeProperty( "width");
canvas.style.removeProperty("height");
}
} else {
if (canvas.width != wNative) canvas.width = wNative;
if (canvas.height != hNative) canvas.height = hNative;
if (typeof canvas.style != 'undefined') {
if (w != wNative || h != hNative) {
canvas.style.setProperty( "width", w + "px", "important");
canvas.style.setProperty("height", h + "px", "important");
} else {
canvas.style.removeProperty( "width");
canvas.style.removeProperty("height");
}
}
}
},
},
$requestFullscreen: 'Browser.requestFullscreen',
#if ASSERTIONS
$requestFullScreen: 'Browser.requestFullScreen',
#endif
$setCanvasSize: 'Browser.setCanvasSize',
$getUserMedia: 'Browser.getUserMedia',
$createContext: 'Browser.createContext',
emscripten_run_preload_plugins__deps: ['$PATH'],
emscripten_run_preload_plugins__proxy: 'sync',
emscripten_run_preload_plugins: (file, onload, onerror) => {
{{{ runtimeKeepalivePush() }}}
var _file = UTF8ToString(file);
var data = FS.analyzePath(_file);
if (!data.exists) return -1;
FS.createPreloadedFile(
PATH.dirname(_file),
PATH.basename(_file),
new Uint8Array(data.object.contents), true, true,
() => {
{{{ runtimeKeepalivePop() }}}
if (onload) {{{ makeDynCall('vp', 'onload') }}}(file);
},
() => {
{{{ runtimeKeepalivePop() }}}
if (onerror) {{{ makeDynCall('vp', 'onerror') }}}(file);
},
true
);
return 0;
},
$Browser_asyncPrepareDataCounter: 0,
emscripten_run_preload_plugins_data__proxy: 'sync',
emscripten_run_preload_plugins_data__deps: ['$stringToNewUTF8', '$Browser_asyncPrepareDataCounter'],
emscripten_run_preload_plugins_data: (data, size, suffix, arg, onload, onerror) => {
{{{ runtimeKeepalivePush() }}}
var _suffix = UTF8ToString(suffix);
var name = 'prepare_data_' + (Browser_asyncPrepareDataCounter++) + '.' + _suffix;
var cname = stringToNewUTF8(name);
FS.createPreloadedFile(
'/',
name,
{{{ makeHEAPView('U8', 'data', 'data + size') }}},
true, true,
() => {
{{{ runtimeKeepalivePop() }}}
if (onload) {{{ makeDynCall('vpp', 'onload') }}}(arg, cname);
},
() => {
{{{ runtimeKeepalivePop() }}}
if (onerror) {{{ makeDynCall('vp', 'onerror') }}}(arg);
},
true
);
},
emscripten_async_run_script__deps: ['emscripten_run_script', '$safeSetTimeout'],
emscripten_async_run_script: (script, millis) => {
safeSetTimeout(() => _emscripten_run_script(script), millis);
},
emscripten_async_load_script__deps: ['$UTF8ToString'],
emscripten_async_load_script: async (url, onload, onerror) => {
url = UTF8ToString(url);
#if PTHREADS
if (ENVIRONMENT_IS_PTHREAD) {
err(`emscripten_async_load_script("${url}") failed, emscripten_async_load_script is currently not available in pthreads!`);
onerror && {{{ makeDynCall('v', 'onerror') }}}();
return;
}
#endif
#if ASSERTIONS
assert(runDependencies === 0, 'async_load_script must be run when no other dependencies are active');
#endif
{{{ runtimeKeepalivePush() }}}
var loadDone = () => {
{{{ runtimeKeepalivePop() }}}
if (onload) {
var onloadCallback = () => callUserCallback({{{ makeDynCall('v', 'onload') }}});
if (runDependencies > 0) {
dependenciesFulfilled = onloadCallback;
} else {
onloadCallback();
}
}
}
var loadError = () => {
{{{ runtimeKeepalivePop() }}}
if (onerror) {
callUserCallback({{{ makeDynCall('v', 'onerror') }}});
}
};
#if ENVIRONMENT_MAY_BE_NODE && DYNAMIC_EXECUTION
if (ENVIRONMENT_IS_NODE) {
try {
var data = await readAsync(url, false);
eval(data);
loadDone();
} catch (e) {
err(e);
loadError();
}
return;
}
#endif
var script = document.createElement('script');
script.onload = loadDone;
script.onerror = loadError;
script.src = url;
document.body.appendChild(script);
},
emscripten_get_window_title__proxy: 'sync',
emscripten_get_window_title: () => {
var buflen = 256;
if (!_emscripten_get_window_title.buffer) {
_emscripten_get_window_title.buffer = _malloc(buflen);
}
stringToUTF8(document.title, _emscripten_get_window_title.buffer, buflen);
return _emscripten_get_window_title.buffer;
},
emscripten_set_window_title__proxy: 'sync',
emscripten_set_window_title: (title) => document.title = UTF8ToString(title),
emscripten_get_screen_size__proxy: 'sync',
emscripten_get_screen_size: (width, height) => {
{{{ makeSetValue('width', '0', 'screen.width', 'i32') }}};
{{{ makeSetValue('height', '0', 'screen.height', 'i32') }}};
},
emscripten_hide_mouse__proxy: 'sync',
emscripten_hide_mouse: () => {
var styleSheet = document.styleSheets[0];
var rules = styleSheet.cssRules;
for (var i = 0; i < rules.length; i++) {
if (rules[i].cssText.startsWith('canvas')) {
styleSheet.deleteRule(i);
i--;
}
}
styleSheet.insertRule('canvas.emscripten { border: 1px solid black; cursor: none; }', 0);
},
emscripten_set_canvas_size__proxy: 'sync',
emscripten_set_canvas_size: (width, height) => Browser.setCanvasSize(width, height),
emscripten_get_canvas_size__proxy: 'sync',
emscripten_get_canvas_size: (width, height, isFullscreen) => {
var canvas = Browser.getCanvas();
{{{ makeSetValue('width', '0', 'canvas.width', 'i32') }}};
{{{ makeSetValue('height', '0', 'canvas.height', 'i32') }}};
{{{ makeSetValue('isFullscreen', '0', 'Browser.isFullscreen ? 1 : 0', 'i32') }}};
},
emscripten_create_worker__proxy: 'sync',
emscripten_create_worker__deps: ['$UTF8ToString', 'realloc'],
emscripten_create_worker: (url) => {
url = UTF8ToString(url);
var id = Browser.workers.length;
var info = {
worker: new Worker(url),
callbacks: [],
awaited: 0,
buffer: 0,
};
info.worker.onmessage = function info_worker_onmessage(msg) {
if (ABORT) return;
var info = Browser.workers[id];
if (!info) return;
var callbackId = msg.data['callbackId'];
var callbackInfo = info.callbacks[callbackId];
if (!callbackInfo) return;
if (msg.data['finalResponse']) {
info.awaited--;
info.callbacks[callbackId] = null;
{{{ runtimeKeepalivePop() }}}
}
var data = msg.data['data'];
if (data) {
if (!data.byteLength) data = new Uint8Array(data);
info.buffer = _realloc(info.buffer, data.length);
HEAPU8.set(data, info.buffer);
callbackInfo.func(info.buffer, data.length, callbackInfo.arg);
} else {
callbackInfo.func(0, 0, callbackInfo.arg);
}
};
Browser.workers.push(info);
return id;
},
emscripten_destroy_worker__deps: ['free'],
emscripten_destroy_worker__proxy: 'sync',
emscripten_destroy_worker: (id) => {
var info = Browser.workers[id];
info.worker.terminate();
_free(info.buffer);
Browser.workers[id] = null;
},
emscripten_call_worker__proxy: 'sync',
emscripten_call_worker: (id, funcName, data, size, callback, arg) => {
funcName = UTF8ToString(funcName);
var info = Browser.workers[id];
var callbackId = -1;
if (callback) {
{{{ runtimeKeepalivePush() }}}
callbackId = info.callbacks.length;
info.callbacks.push({
func: {{{ makeDynCall('vpip', 'callback') }}},
arg
});
info.awaited++;
}
var transferObject = {
'funcName': funcName,
'callbackId': callbackId,
'data': data ? new Uint8Array({{{ makeHEAPView('U8', 'data', 'data + size') }}}) : 0
};
if (data) {
info.worker.postMessage(transferObject, [transferObject.data.buffer]);
} else {
info.worker.postMessage(transferObject);
}
},
#if BUILD_AS_WORKER
emscripten_worker_respond_provisionally__proxy: 'sync',
emscripten_worker_respond_provisionally: (data, size) => {
if (workerResponded) throw 'already responded with final response!';
var transferObject = {
'callbackId': workerCallbackId,
'finalResponse': false,
'data': data ? new Uint8Array({{{ makeHEAPView('U8', 'data', 'data + size') }}}) : 0
};
if (data) {
postMessage(transferObject, [transferObject.data.buffer]);
} else {
postMessage(transferObject);
}
},
emscripten_worker_respond__proxy: 'sync',
emscripten_worker_respond: (data, size) => {
if (workerResponded) throw 'already responded with final response!';
workerResponded = true;
var transferObject = {
'callbackId': workerCallbackId,
'finalResponse': true,
'data': data ? new Uint8Array({{{ makeHEAPView('U8', 'data', 'data + size') }}}) : 0
};
if (data) {
postMessage(transferObject, [transferObject.data.buffer]);
} else {
postMessage(transferObject);
}
},
#endif
emscripten_get_worker_queue_size__proxy: 'sync',
emscripten_get_worker_queue_size: (id) => {
var info = Browser.workers[id];
if (!info) return -1;
return info.awaited;
},
emscripten_get_preloaded_image_data__deps: ['$getPreloadedImageData', '$UTF8ToString'],
emscripten_get_preloaded_image_data__proxy: 'sync',
emscripten_get_preloaded_image_data: (path, w, h) => getPreloadedImageData(UTF8ToString(path), w, h),
$getPreloadedImageData__internal: true,
$getPreloadedImageData__data: ['$PATH_FS', 'malloc'],
$getPreloadedImageData: (path, w, h) => {
path = PATH_FS.resolve(path);
var canvas = (Browser.preloadedImages[path]);
if (!canvas) return 0;
var ctx = canvas.getContext("2d");
var image = ctx.getImageData(0, 0, canvas.width, canvas.height);
var buf = _malloc(canvas.width * canvas.height * 4);
HEAPU8.set(image.data, buf);
{{{ makeSetValue('w', '0', 'canvas.width', 'i32') }}};
{{{ makeSetValue('h', '0', 'canvas.height', 'i32') }}};
return buf;
},
#if !WASMFS
emscripten_get_preloaded_image_data_from_FILE__deps: ['$getPreloadedImageData', 'fileno'],
emscripten_get_preloaded_image_data_from_FILE__proxy: 'sync',
emscripten_get_preloaded_image_data_from_FILE: (file, w, h) => {
var fd = _fileno(file);
var stream = FS.getStream(fd);
if (stream) {
return getPreloadedImageData(stream.path, w, h);
}
return 0;
}
#endif
};
autoAddDeps(LibraryBrowser, '$Browser');
addToLibrary(LibraryBrowser);