aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-05-15 16:26:57 -0700
committerAlon Zakai <alonzakai@gmail.com>2011-05-15 16:26:57 -0700
commit798e635cf912d778f08f8107d6d59fcd11b20082 (patch)
treeb4627e55014a017c02d952c92feda76d745415ee
parent3afb3d53d70c6d9a3e84e488cfa986b8cd7b2733 (diff)
support for reading files synchronously
-rw-r--r--src/library.js9
-rw-r--r--src/library_browser.js12
-rw-r--r--src/library_gl.js5
-rw-r--r--src/library_sdl.js4
-rw-r--r--src/preamble.js24
-rw-r--r--tests/files.cpp9
-rw-r--r--tests/runner.py7
7 files changed, 55 insertions, 15 deletions
diff --git a/src/library.js b/src/library.js
index e3b6f964..eaa2332d 100644
--- a/src/library.js
+++ b/src/library.js
@@ -290,7 +290,14 @@ var Library = {
},
open: function(filename) {
var stream = _STDIO.filenames[filename];
- if (!stream) return -1; // assert(false, 'No information for file: ' + filename);
+ if (!stream) {
+ // Not already cached; try to load it right now
+ try {
+ return _STDIO.prepare(filename, readBinary(filename));
+ } catch(e) {
+ return 0;
+ }
+ }
var info = _STDIO.streams[stream];
info.position = info.error = info.eof = 0;
return stream;
diff --git a/src/library_browser.js b/src/library_browser.js
index 08d206ae..d24854f9 100644
--- a/src/library_browser.js
+++ b/src/library_browser.js
@@ -2,18 +2,6 @@
mergeInto(Library, {
$Browser: {
- syncLoad: function(url) {
- var xhr = new XMLHttpRequest();
- xhr.open("GET", url, false);
- xhr.overrideMimeType('text/plain; charset=x-user-defined');
- xhr.send(null);
- var ret = new Uint8Array(xhr.responseText.length);
- for (var i = 0; i < xhr.responseText.length; i++) {
- ret[i] = xhr.responseText.charCodeAt(i);
- }
- return ret;
- },
-
// 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) {
diff --git a/src/library_gl.js b/src/library_gl.js
index 8e4159af..d1c21fa1 100644
--- a/src/library_gl.js
+++ b/src/library_gl.js
@@ -59,12 +59,17 @@ var LibraryGL = {
}
Module.ctxGL.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
},
+
+ glBindTexture: function(target, texture) {
+ Module.ctxGL.bindTexture(target, GL.textures[texture]);
+ },
};
// Simple pass-through functions
[[0, 'shadeModel fogi fogfv'],
[1, 'clearDepth depthFunc enable disable frontFace cullFace'],
[2, 'pixelStorei'],
+ [3, 'texParameteri texParameterf'],
[4, 'viewport clearColor']].forEach(function(data) {
var num = data[0];
var names = data[1];
diff --git a/src/library_sdl.js b/src/library_sdl.js
index 648f0014..ca477a1b 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -57,6 +57,8 @@ mergeInto(Library, {
return 0; // success
},
+ SDL_WasInit: function() { return 0 }, // TODO
+
SDL_GetVideoInfo: function() {
// %struct.SDL_VideoInfo = type { i32, i32, %struct.SDL_PixelFormat*, i32, i32 } - 5 fields of quantum size
var ret = _malloc(5*QUANTUM_SIZE);
@@ -176,7 +178,7 @@ mergeInto(Library, {
IMG_Load: function(filename) {
filename = Pointer_stringify(filename);
var format = filename.split('.').slice(-1)[0];
- var data = Browser.syncLoad(filename);
+ var data = readBinary(filename);
var raw = Browser.decodeImage(data, format);
var surf = SDL.makeSurface(raw.width, raw.height, 0);
// XXX Extremely inefficient!
diff --git a/src/preamble.js b/src/preamble.js
index 44f5c876..6babdfda 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -383,5 +383,29 @@ function intArrayToString(array) {
var unSign = {{{ unSign.toString() }}}
var reSign = {{{ reSign.toString() }}}
+// Use console read if available, otherwise we are in a browser, use an XHR
+try {
+ read;
+} catch(e) {
+ this['read'] = function(url) {
+ // TODO: use mozResponseArrayBuffer/responseStream/etc. if available
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", url, false);
+ xhr.overrideMimeType('text/plain; charset=x-user-defined'); // ask for binary data
+ xhr.send(null);
+ return xhr.responseText;
+ }
+}
+
+function readBinary(filename) {
+ var stringy = read(filename);
+ var data = new Array(stringy.length+1);
+ for (var i = 0; i < stringy.length; i++) {
+ data[i] = stringy.charCodeAt(i) & 0xff;
+ }
+ data[stringy.length] = 0;
+ return data;
+}
+
// === Body ===
diff --git a/tests/files.cpp b/tests/files.cpp
index 5d915e01..99eddec5 100644
--- a/tests/files.cpp
+++ b/tests/files.cpp
@@ -46,6 +46,15 @@ int main()
fclose(inf);
printf("%d : %d,%d,%d,%d,%d\n", num, data2[0], data2[1], data2[2], data2[3], data2[4]);
+ // Test reading a file that has not been cached
+
+ FILE *other = fopen("test.file", "r");
+ assert(other);
+ char otherData[1000];
+ fread(otherData, 1, 10, other);
+ fclose(other);
+ printf("other=%s.\n", otherData);
+
return 0;
}
diff --git a/tests/runner.py b/tests/runner.py
index a2864aac..7bb5f5ab 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -1650,8 +1650,13 @@ if 'benchmark' not in sys.argv:
'''this._STDIO.prepare('somefile.binary', [100, 200, 50, 25, 10, 77, 123]);''' # 200 becomes -56, since signed chars are used in memory
)
open(filename, 'w').write(src)
+
+ other = open(os.path.join(self.get_dir(), 'test.file'), 'w')
+ other.write('some data');
+ other.close()
+
src = open(path_from_root('tests', 'files.cpp'), 'r').read()
- self.do_test(src, 'size: 7\ndata: 100,-56,50,25,10,77,123\ntexto\ntexte\n5 : 10,30,20,11,88\n', post_build=post)
+ self.do_test(src, 'size: 7\ndata: 100,-56,50,25,10,77,123\ntexto\ntexte\n5 : 10,30,20,11,88\nother=some data.\n', post_build=post)
### 'Big' tests