aboutsummaryrefslogtreecommitdiff
path: root/tools/file_packager.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/file_packager.py')
-rw-r--r--tools/file_packager.py97
1 files changed, 13 insertions, 84 deletions
diff --git a/tools/file_packager.py b/tools/file_packager.py
index 8c1e0a43..b02eac24 100644
--- a/tools/file_packager.py
+++ b/tools/file_packager.py
@@ -92,27 +92,10 @@ for arg in sys.argv[1:]:
code = '''
function assert(check, msg) {
- if (!check) throw msg;
+ if (!check) throw msg + new Error().stack;
}
'''
-if has_preloaded:
- code += '''
- var BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : console.log("warning: cannot build blobs"));
- var URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : console.log("warning: cannot create object URLs");
- var hasBlobConstructor;
- try {
- new Blob();
- hasBlobConstructor = true;
- } catch(e) {
- hasBlobConstructor = false;
- console.log("warning: no blob constructor, cannot create blobs with mimetypes");
- }
-'''
-
- code += 'Module["preloadedImages"] = {}; // maps url to image data\n'
- code += 'Module["preloadedAudios"] = {}; // maps url to audio data\n'
-
# Expand directories into individual files
def add(mode, dirname, names):
for name in names:
@@ -244,67 +227,12 @@ for file_ in data_files:
# Preload
varname = 'filePreload%d' % counter
counter += 1
- image = filename.endswith(IMAGE_SUFFIXES)
- audio = filename.endswith(AUDIO_SUFFIXES)
dds = crunch and filename.endswith(CRUNCH_INPUT_SUFFIX)
prepare = ''
- finish = "Module['removeRunDependency']();\n"
-
- if image:
- finish = '''
- var bb = new BlobBuilder();
- bb.append(byteArray.buffer);
- var b = bb.getBlob();
- var url = URLObject.createObjectURL(b);
- var img = new Image();
- img.onload = function() {
- assert(img.complete, 'Image %(filename)s could not be decoded');
- var canvas = document.createElement('canvas');
- canvas.width = img.width;
- canvas.height = img.height;
- var ctx = canvas.getContext('2d');
- ctx.drawImage(img, 0, 0);
- Module["preloadedImages"]['%(filename)s'] = canvas;
- URLObject.revokeObjectURL(url);
- Module['removeRunDependency']();
- };
- img.onerror = function(event) {
- console.log('Image %(filename)s could not be decoded');
- };
- img.src = url;
-''' % { 'filename': filename }
- elif audio:
- # Need actual blob constructor here, to set the mimetype or else audios fail to decode
- finish = '''
- if (hasBlobConstructor) {
- var b = new Blob([byteArray.buffer], { type: '%(mimetype)s' });
- var url = URLObject.createObjectURL(b); // XXX we never revoke this!
- var audio = new Audio();
- audio.removedDependency = false;
- audio['oncanplaythrough'] = function() { // XXX string for closure
- audio['oncanplaythrough'] = null;
- Module["preloadedAudios"]['%(filename)s'] = audio;
- if (!audio.removedDependency) {
- Module['removeRunDependency']();
- audio.removedDependency = true;
- }
- };
- audio.onerror = function(event) {
- if (!audio.removedDependency) {
- console.log('Audio %(filename)s could not be decoded or timed out trying to decode');
- Module['removeRunDependency']();
- audio.removedDependency = true;
- }
- };
- setTimeout(audio.onerror, 2000); // workaround for chromium bug 124926 (still no audio with this, but at least we don't hang)
- audio.src = url;
- } else {
- Module["preloadedAudios"]['%(filename)s'] = new Audio(); // empty shim
- Module['removeRunDependency']();
- }
-''' % { 'filename': filename, 'mimetype': AUDIO_MIMETYPES[suffix(filename)] }
- elif dds:
+ finish = "Module['removeRunDependency']('fp %s');\n" % filename
+
+ if dds:
# decompress crunch format into dds
prepare = '''
var ddsHeader = byteArray.subarray(0, %(dds_header_size)d);
@@ -314,8 +242,7 @@ for file_ in data_files:
byteArray.set(ddsData, %(dds_header_size)d);
''' % { 'filename': filename, 'dds_header_size': DDS_HEADER_SIZE }
- finish = '''
- Module['removeRunDependency']();
+ finish += '''
});
'''
@@ -328,10 +255,11 @@ for file_ in data_files:
assert(arrayBuffer, 'Loading file %(filename)s failed.');
var byteArray = arrayBuffer.byteLength ? new Uint8Array(arrayBuffer) : arrayBuffer;
%(prepare)s
- Module['FS_createDataFile']('/%(dirname)s', '%(basename)s', byteArray, true, true);
- %(finish)s
+ Module['FS_createPreloadedFile']('/%(dirname)s', '%(basename)s', byteArray, true, true, function() {
+ %(finish)s
+ }%(fail)s);
};
- Module['addRunDependency']();
+ Module['addRunDependency']('fp %(filename)s');
%(varname)s.send(null);
''' % {
'request': 'DataRequest', # In the past we also supported XHRs here
@@ -340,7 +268,8 @@ for file_ in data_files:
'dirname': os.path.dirname(filename),
'basename': os.path.basename(filename),
'prepare': prepare,
- 'finish': finish
+ 'finish': finish,
+ 'fail': '' if filename[-4:] not in AUDIO_SUFFIXES else ''', function() { Module['removeRunDependency']('fp %s') }''' % filename # workaround for chromium bug 124926 (still no audio with this, but at least we don't hang)
}
else:
assert 0
@@ -355,7 +284,7 @@ if has_preloaded:
curr.response = byteArray.subarray(%d,%d);
curr.onload();
''' % (file_['name'], file_['data_start'], file_['data_end'])
- use_data += " Module['removeRunDependency']();\n"
+ use_data += " Module['removeRunDependency']('datafile');\n"
if Compression.on:
use_data = '''
@@ -376,7 +305,7 @@ if has_preloaded:
var curr;
%s
};
- Module['addRunDependency']();
+ Module['addRunDependency']('datafile');
dataFile.send(null);
if (Module['setStatus']) Module['setStatus']('Downloading...');
''' % (Compression.compressed_name(data_target) if Compression.on else data_target, use_data)