aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-07-07 13:10:06 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-07-07 13:10:06 -0700
commitf30049631089d40f4591a1b24ef5f5d75777ee3c (patch)
tree6271e2d4accfdd3f8c06a660cfc45585d5112d10
parent096822bc57b688a957b81656878e570d9269f4ea (diff)
refactor tex[Sub]Image2D
-rw-r--r--src/library_gl.js176
1 files changed, 67 insertions, 109 deletions
diff --git a/src/library_gl.js b/src/library_gl.js
index 72918e5a..d5ce4aaa 100644
--- a/src/library_gl.js
+++ b/src/library_gl.js
@@ -107,6 +107,64 @@ var LibraryGL = {
((height - 1) * alignedRowSize + plainRowSize);
},
+ getTexPixelData: function(type, format, width, height, pixels, internalFormat) {
+ var sizePerPixel;
+ switch (type) {
+ case 0x1401 /* GL_UNSIGNED_BYTE */:
+ switch (format) {
+ case 0x1906 /* GL_ALPHA */:
+ case 0x1909 /* GL_LUMINANCE */:
+ sizePerPixel = 1;
+ break;
+ case 0x1907 /* GL_RGB */:
+ sizePerPixel = 3;
+ break;
+ case 0x1908 /* GL_RGBA */:
+ sizePerPixel = 4;
+ break;
+ case 0x190A /* GL_LUMINANCE_ALPHA */:
+ sizePerPixel = 2;
+ break;
+ default:
+ throw 'Invalid format (' + format + ')';
+ }
+ break;
+ case 0x8363 /* GL_UNSIGNED_SHORT_5_6_5 */:
+ case 0x8033 /* GL_UNSIGNED_SHORT_4_4_4_4 */:
+ case 0x8034 /* GL_UNSIGNED_SHORT_5_5_5_1 */:
+ sizePerPixel = 2;
+ break;
+ case 0x1406 /* GL_FLOAT */:
+ assert(GL.floatExt, 'Must have OES_texture_float to use float textures');
+ switch (format) {
+ case 0x1907 /* GL_RGB */:
+ sizePerPixel = 3*4;
+ break;
+ case 0x1908 /* GL_RGBA */:
+ sizePerPixel = 4*4;
+ break;
+ default:
+ throw 'Invalid format (' + format + ')';
+ }
+ internalFormat = Module.ctx.RGBA;
+ break;
+ default:
+ throw 'Invalid type (' + type + ')';
+ }
+ var bytes = GL.computeImageSize(width, height, sizePerPixel, GL.unpackAlignment);
+ if (type == 0x1401 /* GL_UNSIGNED_BYTE */) {
+ pixels = {{{ makeHEAPView('U8', 'pixels', 'pixels+bytes') }}};
+ } else if (type == 0x1406 /* GL_FLOAT */) {
+ pixels = {{{ makeHEAPView('F32', 'pixels', 'pixels+bytes') }}};
+ } else {
+ pixels = {{{ makeHEAPView('U16', 'pixels', 'pixels+bytes') }}};
+ }
+ return {
+ pixels: pixels,
+ internalFormat: internalFormat
+ }
+ },
+
initExtensions: function() {
if (GL.initExtensions.done) return;
GL.initExtensions.done = true;
@@ -293,14 +351,14 @@ var LibraryGL = {
}
},
- glCompressedTexImage2D: function(target, level, internalformat, width, height, border, imageSize, data) {
+ glCompressedTexImage2D: function(target, level, internalFormat, width, height, border, imageSize, data) {
assert(GL.compressionExt);
if (data) {
data = {{{ makeHEAPView('U8', 'data', 'data+imageSize') }}};
} else {
data = null;
}
- Module.ctx['compressedTexImage2D'](target, level, internalformat, width, height, border, data);
+ Module.ctx['compressedTexImage2D'](target, level, internalFormat, width, height, border, data);
},
glCompressedTexSubImage2D: function(target, level, xoffset, yoffset, width, height, format, imageSize, data) {
@@ -313,119 +371,19 @@ var LibraryGL = {
Module.ctx['compressedTexSubImage2D'](target, level, xoffset, yoffset, width, height, data);
},
- glTexImage2D: function(target, level, internalformat, width, height, border, format, type, pixels) {
+ glTexImage2D: function(target, level, internalFormat, width, height, border, format, type, pixels) {
if (pixels) {
- var sizePerPixel;
- switch (type) {
- case 0x1401 /* GL_UNSIGNED_BYTE */:
- switch (format) {
- case 0x1906 /* GL_ALPHA */:
- case 0x1909 /* GL_LUMINANCE */:
- sizePerPixel = 1;
- break;
- case 0x1907 /* GL_RGB */:
- sizePerPixel = 3;
- break;
- case 0x1908 /* GL_RGBA */:
- sizePerPixel = 4;
- break;
- case 0x190A /* GL_LUMINANCE_ALPHA */:
- sizePerPixel = 2;
- break;
- default:
- throw 'Invalid format (' + format + ') passed to glTexImage2D';
- }
- break;
- case 0x8363 /* GL_UNSIGNED_SHORT_5_6_5 */:
- case 0x8033 /* GL_UNSIGNED_SHORT_4_4_4_4 */:
- case 0x8034 /* GL_UNSIGNED_SHORT_5_5_5_1 */:
- sizePerPixel = 2;
- break;
- case 0x1406 /* GL_FLOAT */:
- assert(GL.floatExt, 'Must have OES_texture_float to use float textures');
- switch (format) {
- case 0x1907 /* GL_RGB */:
- sizePerPixel = 3*4;
- break;
- case 0x1908 /* GL_RGBA */:
- sizePerPixel = 4*4;
- break;
- default:
- throw 'Invalid format (' + format + ') passed to glTexImage2D';
- }
- internalformat = Module.ctx.RGBA; // XXX
- break;
- default:
- throw 'Invalid type (' + type + ') passed to glTexImage2D';
- }
- var bytes = GL.computeImageSize(width, height, sizePerPixel, GL.unpackAlignment);
- if (type == 0x1401 /* GL_UNSIGNED_BYTE */) {
- pixels = {{{ makeHEAPView('U8', 'pixels', 'pixels+bytes') }}};
- } else if (type == 0x1406 /* GL_FLOAT */) {
- pixels = {{{ makeHEAPView('F32', 'pixels', 'pixels+bytes') }}};
- } else {
- pixels = {{{ makeHEAPView('U16', 'pixels', 'pixels+bytes') }}};
- }
- } else {
- pixels = null;
+ var data = GL.getTexPixelData(type, format, width, height, pixels, internalFormat);
+ pixels = data.pixels;
+ internalFormat = data.internalFormat;
}
- Module.ctx.texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+ Module.ctx.texImage2D(target, level, internalFormat, width, height, border, format, type, pixels);
},
glTexSubImage2D: function(target, level, xoffset, yoffset, width, height, format, type, pixels) {
if (pixels) {
- var sizePerPixel;
- switch (type) {
- case 0x1401 /* GL_UNSIGNED_BYTE */:
- switch (format) {
- case 0x1906 /* GL_ALPHA */:
- case 0x1909 /* GL_LUMINANCE */:
- sizePerPixel = 1;
- break;
- case 0x1907 /* GL_RGB */:
- sizePerPixel = 3;
- break;
- case 0x1908 /* GL_RGBA */:
- sizePerPixel = 4;
- break;
- case 0x190A /* GL_LUMINANCE_ALPHA */:
- sizePerPixel = 2;
- break;
- default:
- throw 'Invalid format (' + format + ') passed to glTexSubImage2D';
- }
- break;
- case 0x8363 /* GL_UNSIGNED_SHORT_5_6_5 */:
- case 0x8033 /* GL_UNSIGNED_SHORT_4_4_4_4 */:
- case 0x8034 /* GL_UNSIGNED_SHORT_5_5_5_1 */:
- sizePerPixel = 2;
- break;
- case 0x1406 /* GL_FLOAT */:
- assert(GL.floatExt, 'Must have OES_texture_float to use float textures');
- switch (format) {
- case 0x1907 /* GL_RGB */:
- sizePerPixel = 3*4;
- break;
- case 0x1908 /* GL_RGBA */:
- sizePerPixel = 4*4;
- break;
- default:
- throw 'Invalid format (' + format + ') passed to glTexSubImage2D';
- }
- break;
- default:
- throw 'Invalid type (' + type + ') passed to glTexSubImage2D';
- }
- var bytes = GL.computeImageSize(width, height, sizePerPixel, GL.unpackAlignment);
- if (type == 0x1401 /* GL_UNSIGNED_BYTE */) {
- pixels = {{{ makeHEAPView('U8', 'pixels', 'pixels+bytes') }}};
- } else if (type == 0x1406 /* GL_FLOAT */) {
- pixels = {{{ makeHEAPView('F32', 'pixels', 'pixels+bytes') }}};
- } else {
- pixels = {{{ makeHEAPView('U16', 'pixels', 'pixels+bytes') }}};
- }
- } else {
- pixels = null;
+ var data = GL.getTexPixelData(type, format, width, height, pixels, -1);
+ pixels = data.pixels;
}
Module.ctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
},