3
3
// Utilities for browser environments
5
5
mergeInto(LibraryManager.library, {
6
$Browser__deps: ['$PATH'],
6
7
$Browser__postset: 'Module["requestFullScreen"] = function(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };\n' + // exports
7
8
'Module["requestAnimationFrame"] = function(func) { Browser.requestAnimationFrame(func) };\n' +
9
'Module["setCanvasSize"] = function(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };\n' +
8
10
'Module["pauseMainLoop"] = function() { Browser.mainLoop.pause() };\n' +
9
11
'Module["resumeMainLoop"] = function() { Browser.mainLoop.resume() };\n' +
10
12
'Module["getUserMedia"] = function() { Browser.getUserMedia() }',
50
if (Browser.initted) return;
52
if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; // needs to exist even in workers
54
if (Browser.initted || ENVIRONMENT_IS_WORKER) return;
51
55
Browser.initted = true;
54
59
Browser.hasBlobConstructor = true;
57
62
console.log("warning: no blob constructor, cannot create blobs with mimetypes");
59
64
Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null));
60
Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : console.log("warning: cannot create object URLs");
65
Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : undefined;
66
if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {
67
console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");
68
Module.noImageDecoding = true;
62
71
// Support for plugins that can process preloaded files. You can add more of these to
63
72
// your app by creating and appending to Module.preloadPlugins.
67
76
// (possibly modified) data. For example, a plugin might decompress a file, or it
68
77
// might create some side data structure for use later (like an Image element, etc.).
70
function getMimetype(name) {
79
}[name.substr(name.lastIndexOf('.')+1)];
82
if (!Module["preloadPlugins"]) Module["preloadPlugins"] = [];
84
79
var imagePlugin = {};
85
80
imagePlugin['canHandle'] = function(name) {
86
return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/.exec(name);
81
return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name);
88
83
imagePlugin['handle'] = function(byteArray, name, onload, onerror) {
90
85
if (Browser.hasBlobConstructor) {
92
b = new Blob([byteArray], { type: getMimetype(name) });
87
b = new Blob([byteArray], { type: Browser.getMimetype(name) });
88
if (b.size !== byteArray.length) { // Safari bug #118630
89
// Safari's Blob can only take an ArrayBuffer
90
b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });
94
93
Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');
388
getMimetype: function(name) {
391
'jpeg': 'image/jpeg',
397
}[name.substr(name.lastIndexOf('.')+1)];
389
400
getUserMedia: function(func) {
390
401
if(!window.getUserMedia) {
391
402
window.getUserMedia = navigator['getUserMedia'] ||
425
437
Browser.mouseMovementX = Browser.getMovementX(event);
426
438
Browser.mouseMovementY = Browser.getMovementY(event);
428
Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
429
Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
441
// check if SDL is available
442
if (typeof SDL != "undefined") {
443
Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
444
Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
446
// just add the mouse delta to the current absolut mouse position
447
// FIXME: ideally this should be clamped against the canvas size and zero
448
Browser.mouseX += Browser.mouseMovementX;
449
Browser.mouseY += Browser.mouseMovementY;
431
452
// Otherwise, calculate the movement based on the changes
432
453
// in the coordinates.
433
454
var rect = Module["canvas"].getBoundingClientRect();
434
var x = event.pageX - (window.scrollX + rect.left);
435
var y = event.pageY - (window.scrollY + rect.top);
456
if (event.type == 'touchstart' ||
457
event.type == 'touchend' ||
458
event.type == 'touchmove') {
459
var t = event.touches.item(0);
461
x = t.pageX - (window.scrollX + rect.left);
462
y = t.pageY - (window.scrollY + rect.top);
467
x = event.pageX - (window.scrollX + rect.left);
468
y = event.pageY - (window.scrollY + rect.top);
437
471
// the canvas might be CSS-scaled compared to its backbuffer;
438
472
// SDL-using content will want mouse coordinates in terms
503
537
this.windowedHeight = canvas.height;
504
538
canvas.width = screen.width;
505
539
canvas.height = screen.height;
506
var flags = {{{ makeGetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'i32', 0, 1) }}};
507
flags = flags | 0x00800000; // set SDL_FULLSCREEN flag
508
{{{ makeSetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'flags', 'i32') }}}
540
// check if SDL is available
541
if (typeof SDL != "undefined") {
542
var flags = {{{ makeGetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'i32', 0, 1) }}};
543
flags = flags | 0x00800000; // set SDL_FULLSCREEN flag
544
{{{ makeSetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'flags', 'i32') }}}
509
546
Browser.updateResizeListeners();
513
550
var canvas = Module['canvas'];
514
551
canvas.width = this.windowedWidth;
515
552
canvas.height = this.windowedHeight;
516
var flags = {{{ makeGetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'i32', 0, 1) }}};
517
flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag
518
{{{ makeSetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'flags', 'i32') }}}
553
// check if SDL is available
554
if (typeof SDL != "undefined") {
555
var flags = {{{ makeGetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'i32', 0, 1) }}};
556
flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag
557
{{{ makeSetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'flags', 'i32') }}}
519
559
Browser.updateResizeListeners();
524
564
emscripten_async_wget: function(url, file, onload, onerror) {
525
565
var _url = Pointer_stringify(url);
526
566
var _file = Pointer_stringify(file);
527
var index = _file.lastIndexOf('/');
528
567
FS.createPreloadedFile(
529
_file.substr(0, index),
530
_file.substr(index +1),
569
PATH.basename(_file),
531
570
_url, true, true,
533
572
if (onload) Runtime.dynCall('vi', onload, [file]);
602
641
var _file = Pointer_stringify(file);
603
642
var data = FS.analyzePath(_file);
604
643
if (!data.exists) return -1;
605
var index = _file.lastIndexOf('/');
606
644
FS.createPreloadedFile(
607
_file.substr(0, index),
608
_file.substr(index +1),
646
PATH.basename(_file),
609
647
new Uint8Array(data.object.contents), true, true,
611
649
if (onload) Runtime.dynCall('vi', onload, [file]);
625
663
var cname = _malloc(name.length+1);
626
664
writeStringToMemory(name, cname);
627
665
FS.createPreloadedFile(
630
668
{{{ makeHEAPView('U8', 'data', 'data + size') }}},
686
724
Module['preMainLoop']();
689
Runtime.dynCall('v', func);
728
Runtime.dynCall('v', func);
730
if (e instanceof ExitStatus) {
691
737
if (Module['postMainLoop']) {
692
738
Module['postMainLoop']();
783
829
emscripten_set_canvas_size: function(width, height) {
784
830
Browser.setCanvasSize(width, height);
833
emscripten_get_canvas_size: function(width, height, isFullscreen) {
834
var canvas = Module['canvas'];
835
{{{ makeSetValue('width', '0', 'canvas.width', 'i32') }}};
836
{{{ makeSetValue('height', '0', 'canvas.height', 'i32') }}};
837
{{{ makeSetValue('isFullscreen', '0', 'Browser.isFullScreen ? 1 : 0', 'i32') }}};
787
840
emscripten_get_now: function() {
788
if (ENVIRONMENT_IS_NODE) {
789
var t = process['hrtime']();
790
return t[0] * 1e3 + t[1] / 1e6;
792
else if (window['performance'] && window['performance']['now']) {
793
return window['performance']['now']();
841
if (!_emscripten_get_now.actual) {
842
if (ENVIRONMENT_IS_NODE) {
843
_emscripten_get_now.actual = function() {
844
var t = process['hrtime']();
845
return t[0] * 1e3 + t[1] / 1e6;
847
} else if (typeof dateNow !== 'undefined') {
848
_emscripten_get_now.actual = dateNow;
849
} else if (ENVIRONMENT_IS_WEB && window['performance'] && window['performance']['now']) {
850
_emscripten_get_now.actual = function() { return window['performance']['now'](); };
852
_emscripten_get_now.actual = Date.now;
855
return _emscripten_get_now.actual();
799
858
emscripten_create_worker: function(url) {