From 7cf4523106a4f75532e1cf5a073b242f5304566b Mon Sep 17 00:00:00 2001 From: "C. Scott Ananian" Date: Sun, 4 Dec 2011 10:04:29 -0500 Subject: [PATCH 01/11] Import v8-typed-array from https://github.com/cscott/v8-gl. --- v8-typed-array/README.md | 59 ++++++++++ v8-typed-array/package.json | 16 +++ v8-typed-array/typed-array.cc | 199 ++++++++++++++++++++++++++++++++++ v8-typed-array/wscript | 20 ++++ 4 files changed, 294 insertions(+) create mode 100644 v8-typed-array/README.md create mode 100644 v8-typed-array/package.json create mode 100644 v8-typed-array/typed-array.cc create mode 100755 v8-typed-array/wscript diff --git a/v8-typed-array/README.md b/v8-typed-array/README.md new file mode 100644 index 0000000..da34d4a --- /dev/null +++ b/v8-typed-array/README.md @@ -0,0 +1,59 @@ +v8-typed-array +============== + +Typed Array implementation for V8 and Node.js. Works well enough to run jslinux but otherwise has not been tested. Many missing APIs. + +* ArrayBuffer +* Int8Array +* Uint8Array +* Int16Array +* Uint16Array +* Int32Array +* Uint32Array +* Float32Array + +Based Editor's Draft 28 April 2011: http://www.khronos.org/registry/typedarray/specs/latest/ + +Build +----- + + node-waf configure build + +Or install using NPM (npm install typed-array) + +Credits +------- + +Inspired by: + +* https://github.com/pufuwozu/node-webgl +* http://v8.googlecode.com/svn/trunk/samples/shell.cc + +TODO +---- + +* Implement the rest of the API +* Bridge to Node's Buffers? + +License +------- + +Copyright (C) 2011 by Thomas Robinson (http://tlrobinson.net/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/v8-typed-array/package.json b/v8-typed-array/package.json new file mode 100644 index 0000000..cf812ba --- /dev/null +++ b/v8-typed-array/package.json @@ -0,0 +1,16 @@ +{ + "name": "typed-array", + "description": "Typed Array implementation for V8 and Node.js", + "version": "0.0.2", + "repository": { + "type": "git", + "url": "https://github.com/tlrobinson/v8-typed-array.git" + }, + "keywords": ["buffer", "typed array", "webgl"], + "author": "Tom Robinson (http://tlrobinson.net/)", + "main": "build/default/typed-array.node", + "scripts": { "install": "node-waf configure build" }, + "engines": { + "node": "*" + } +} \ No newline at end of file diff --git a/v8-typed-array/typed-array.cc b/v8-typed-array/typed-array.cc new file mode 100644 index 0000000..40f1a72 --- /dev/null +++ b/v8-typed-array/typed-array.cc @@ -0,0 +1,199 @@ +#include + +#include +#include + +using namespace v8; + +#define DEFINE_ARRAY_BUFFER_VIEW(name, type, element_size) \ + Handle name(const Arguments& args) {\ + return CreateArrayBufferView(args, type, element_size);\ + } + +#define INIT_ARRAY_BUFFER_VIEW(name, type, element_size) {\ + Local t = FunctionTemplate::New(name); \ + t->InstanceTemplate()->SetInternalFieldCount(1); \ + Local f = t->GetFunction();\ + f->Set(String::New("BYTES_PER_ELEMENT"), Int32::New(element_size), ReadOnly);\ + target->Set(String::New(#name), f);} + +void ExternalArrayWeakCallback(Persistent object, void* data) { + free(data); + object.Dispose(); +} + +Persistent array_buffer_constructor_template; + +Handle ArrayBuffer(const Arguments& args) { + if (args.Length() != 1 || !args[0]->IsNumber()) { + return ThrowException(String::New("Invalid ArrayBuffer arguments.")); + } + + unsigned long length = args[0]->Uint32Value(); + void* data = malloc(length); + memset(data, 0, length); + + Persistent persistentHandle = Persistent::New(args.This()); + persistentHandle.MakeWeak(data, ExternalArrayWeakCallback); + + args.This()->SetPointerInInternalField(0, data); + args.This()->SetPointerInInternalField(1, (void*)length); + args.This()->Set(String::New("byteLength"), Int32::New(length), ReadOnly); + + return args.This(); +} + +Handle ArrayBufferViewSet(const Arguments& args) { + Local arrayBuffer = args.This()->Get(String::New("buffer"))->ToObject(); + + if (args.Length() >= 1 && args[0]->IsArray()) { + Local source = Local::Cast(args[0]); + unsigned int offset = 0; + + if (args.Length() >= 2 && args[1]->IsUint32()) { + offset = args[1]->Uint32Value(); + } + + unsigned int dataLength = args.This()->GetIndexedPropertiesExternalArrayDataLength(); + if (offset + source->Length() > dataLength) { + return ThrowException(String::New("INDEX_SIZE_ERR: array too large")); + } + + for (unsigned int index = 0; index < source->Length(); index++) { + args.This()->Set(offset + index, source->Get(index)); + } + } else { + return ThrowException(String::New("Invalid ArrayBufferView::set arguments.")); + } + + return Undefined(); +} + +Handle ArrayBufferViewSubarray(const Arguments& args) { + return ThrowException(String::New("ArrayBufferView::subarray not yet implemented.")); +} + +Handle CreateArrayBufferView(const Arguments& args, ExternalArrayType type, int element_size) { + Local arrayBuffer = Local(); + Local initData = Local(); + unsigned long elements = 0; + unsigned long byteOffset = 0; + unsigned long arrayBufferLength = 0; + + if (!args.IsConstructCall()) + return ThrowException(String::New("Typed Array constructor cannot be called as a function.")); + + if (args.Length() == 1 && args[0]->IsUint32()) { + // TypedArray(unsigned long length) + elements = args[0]->Uint32Value(); + } else if (args.Length() >= 1 && args[0]->IsObject() && + !((Handle::Cast(args[0]))->FindInstanceInPrototypeChain + (array_buffer_constructor_template).IsEmpty())) { + // TypedArray(ArrayBuffer buffer, optional unsigned long byteOffset, optional unsigned long length) + arrayBuffer = args[0]->ToObject(); + arrayBufferLength = (unsigned long) + arrayBuffer->GetPointerFromInternalField(1); + + if (args.Length() > 1) { + byteOffset = args[1]->Uint32Value(); + } + if (args.Length() > 2) { + elements = args[2]->Uint32Value(); + } else { + if ((arrayBufferLength - byteOffset) % element_size != 0) { + return ThrowException(String::New("Length of the ArrayBuffer minus the byteOffset must be a multiple of the element size.")); + } + elements = (arrayBufferLength - byteOffset) / element_size; + } + + } else if (args.Length() == 1 && args[0]->IsArray()) { + // TypedArray(type[] array) + initData = Local::Cast(args[0]); + elements = Handle::Cast(initData)->Length(); + } else if (args.Length() == 1 && args[0]->IsObject() && + Handle::Cast(args[0])->HasIndexedPropertiesInExternalArrayData()) { + // TypedArray(TypedArray array) + initData = Local::Cast(args[0]); + elements = initData->GetIndexedPropertiesExternalArrayDataLength(); + } else { + return ThrowException(String::New("Invalid ArrayBufferView arguments.")); + } + + if (arrayBuffer.IsEmpty()) { + Local arg = Int32::New(elements * element_size); + arrayBuffer = array_buffer_constructor_template->GetFunction()->NewInstance(1, &arg); + arrayBufferLength = (unsigned long) + arrayBuffer->GetPointerFromInternalField(1); + } + + void* arrayBufferData = arrayBuffer->GetPointerFromInternalField(0); + + if (byteOffset + elements * element_size > arrayBufferLength) { + return ThrowException(String::New("Given byteOffset and length references an area beyond the end of the ArrayBuffer.")); + } + + args.This()->SetIndexedPropertiesToExternalArrayData(((int8_t*)arrayBufferData) + byteOffset, type, elements); + + // Initialize + if (!initData.IsEmpty()) { + if (initData->HasIndexedPropertiesInExternalArrayData() && + initData->GetIndexedPropertiesExternalArrayDataType() == type) { + // fast path + void *source = initData->GetIndexedPropertiesExternalArrayData(); + memcpy(((int8_t*)arrayBufferData) + byteOffset, source, + elements * element_size); + } else { + // slow path + for (unsigned int index = 0; index < elements; index++) { + args.This()->Set(index, initData->Get(index)); + } + } + } + + // ArrayBufferView properties + args.This()->Set(String::New("buffer"), arrayBuffer, ReadOnly); + args.This()->Set(String::New("byteLength"), Int32::New(elements * element_size), ReadOnly); + args.This()->Set(String::New("byteOffset"), Int32::New(byteOffset), ReadOnly); + + // TypedArray properties + args.This()->Set(String::New("BYTES_PER_ELEMENT"), Int32::New(element_size), ReadOnly); + args.This()->Set(String::New("length"), Int32::New(elements), ReadOnly); + + // TypedArray methods (TODO: move to prototype) + args.This()->Set(String::New("set"), FunctionTemplate::New(ArrayBufferViewSet)->GetFunction()); + args.This()->Set(String::New("subarray"), FunctionTemplate::New(ArrayBufferViewSubarray)->GetFunction()); + + return args.This(); +} + +DEFINE_ARRAY_BUFFER_VIEW(Int8Array, kExternalByteArray, sizeof(int8_t)); +DEFINE_ARRAY_BUFFER_VIEW(Uint8Array, kExternalUnsignedByteArray, sizeof(uint8_t)); +DEFINE_ARRAY_BUFFER_VIEW(Int16Array, kExternalShortArray, sizeof(int16_t)); +DEFINE_ARRAY_BUFFER_VIEW(Uint16Array, kExternalUnsignedShortArray, sizeof(uint16_t)); +DEFINE_ARRAY_BUFFER_VIEW(Int32Array, kExternalIntArray, sizeof(int32_t)); +DEFINE_ARRAY_BUFFER_VIEW(Uint32Array, kExternalUnsignedIntArray, sizeof(uint32_t)); +DEFINE_ARRAY_BUFFER_VIEW(Float32Array, kExternalFloatArray, sizeof(float)); +// DEFINE_ARRAY_BUFFER_VIEW(Float64Array, kExternalDoubleArray, sizeof(double)); +// DEFINE_ARRAY_BUFFER_VIEW(PixelArray, kExternalPixelArray, sizeof(uint8_t)); + +extern "C" void +init (Handle target) { + HandleScope scope; + + { + array_buffer_constructor_template = Persistent::New(FunctionTemplate::New(ArrayBuffer)); + array_buffer_constructor_template->InstanceTemplate()->SetInternalFieldCount(2); + Local f = array_buffer_constructor_template->GetFunction(); + target->Set(String::New("ArrayBuffer"), f); + } + + INIT_ARRAY_BUFFER_VIEW(Int8Array, kExternalByteArray, sizeof(int8_t)); + INIT_ARRAY_BUFFER_VIEW(Uint8Array, kExternalUnsignedByteArray, sizeof(uint8_t)); + INIT_ARRAY_BUFFER_VIEW(Int16Array, kExternalShortArray, sizeof(int16_t)); + INIT_ARRAY_BUFFER_VIEW(Uint16Array, kExternalUnsignedShortArray, sizeof(uint16_t)); + INIT_ARRAY_BUFFER_VIEW(Int32Array, kExternalIntArray, sizeof(int32_t)); + INIT_ARRAY_BUFFER_VIEW(Uint32Array, kExternalUnsignedIntArray, sizeof(uint32_t)); + INIT_ARRAY_BUFFER_VIEW(Float32Array, kExternalFloatArray, sizeof(float)); + // INIT_ARRAY_BUFFER_VIEW(Float64Array, kExternalDoubleArray, sizeof(double)); + // INIT_ARRAY_BUFFER_VIEW(PixelArray, kExternalPixelArray, sizeof(uint8_t)); +} diff --git a/v8-typed-array/wscript b/v8-typed-array/wscript new file mode 100755 index 0000000..7138ce3 --- /dev/null +++ b/v8-typed-array/wscript @@ -0,0 +1,20 @@ +from os import mkdir +from os import symlink +from os import remove +from os.path import lexists + +srcdir = '.' +blddir = 'build' +VERSION = '0.0.2' + +def set_options(opt): + opt.tool_options('compiler_cxx') + +def configure(conf): + conf.check_tool('compiler_cxx') + conf.check_tool('node_addon') + +def build(bld): + obj = bld.new_task_gen('cxx', 'shlib', 'node_addon') + obj.target = 'typed-array' + obj.source = 'typed-array.cc' From ef34aef627d902c8541dd40bdadf28b76fefbc0a Mon Sep 17 00:00:00 2001 From: "C. Scott Ananian" Date: Sun, 4 Dec 2011 10:07:41 -0500 Subject: [PATCH 02/11] Hook up v8-typed-array to v8-gl. --- Makefile | 3 ++- v8-gl.cpp | 5 +++++ v8-typed-array/typed-array.cc | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 3b6ad4b..bfde101 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,8 @@ BUILD_GLES_BINDINGS=1 BUILD_GLU_BINDINGS=1 BUILD_GLUT_BINDINGS=1 -SRCS = main.cpp imageloader.cpp utils.cpp v8-gl.cpp +SRCS = main.cpp imageloader.cpp utils.cpp v8-gl.cpp \ + v8-typed-array/typed-array.cc ifdef BUILD_GL_BINDINGS SRCS += glbindings/glbind.cpp diff --git a/v8-gl.cpp b/v8-gl.cpp index 78a44f3..79cdd73 100755 --- a/v8-gl.cpp +++ b/v8-gl.cpp @@ -9,6 +9,9 @@ #include #include +extern "C" void +v8_typed_array_init (Handle target); + Persistent V8GL::context; //UTILITY FUNCTIONS @@ -204,6 +207,8 @@ bool V8GL::initialize(int* pargc, char** argv, string scriptname) { // Enter the new context so all the following operations take place // within it. Context::Scope context_scope(context); + // hook up typed array support + v8_typed_array_init(context->Global()); //Append *this* as Gl static variable so we can do dot-this-dot-that stuff #ifdef BUILD_GL_BINDINGS diff --git a/v8-typed-array/typed-array.cc b/v8-typed-array/typed-array.cc index 40f1a72..cecf79a 100644 --- a/v8-typed-array/typed-array.cc +++ b/v8-typed-array/typed-array.cc @@ -177,7 +177,7 @@ DEFINE_ARRAY_BUFFER_VIEW(Float32Array, kExternalFloatArray, sizeof(float)); // DEFINE_ARRAY_BUFFER_VIEW(PixelArray, kExternalPixelArray, sizeof(uint8_t)); extern "C" void -init (Handle target) { +v8_typed_array_init (Handle target) { HandleScope scope; { From 530e1355e0249c5d77a55f014a234643272c4996 Mon Sep 17 00:00:00 2001 From: "C. Scott Ananian" Date: Sun, 4 Dec 2011 02:03:31 -0500 Subject: [PATCH 03/11] Handle Typed Array arguments to the Gles.bufferData method. --- glesbindings/glesbind.cpp | 43 +++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/glesbindings/glesbind.cpp b/glesbindings/glesbind.cpp index c6012f9..1a06733 100755 --- a/glesbindings/glesbind.cpp +++ b/glesbindings/glesbind.cpp @@ -276,18 +276,51 @@ Handle GLESglDrawElementsCallback(const Arguments& args) { return res; } +static int _ExternalArrayTypeToElementSize(ExternalArrayType type) { + switch (type) { + case kExternalByteArray: return sizeof(int8_t); + case kExternalUnsignedByteArray: return sizeof(uint8_t); + case kExternalShortArray: return sizeof(int16_t); + case kExternalUnsignedShortArray: return sizeof(uint16_t); + case kExternalIntArray: return sizeof(int32_t); + case kExternalUnsignedIntArray: return sizeof(uint32_t); + case kExternalFloatArray: return sizeof(float); + case kExternalDoubleArray: return sizeof(double); + case kExternalPixelArray: return sizeof(uint8_t); + default: return 0; + } +} + //Accepts GL_UNSIGNED_SHORT and GL_FLOAT as types //TODO(nico): deal with interleaved data Handle GLESglBufferDataCallback(const Arguments& args) { - if (args.Length() != 4 || !args[1]->IsArray()) - return v8::Undefined(); + if (args.Length() != 4 || !args[1]->IsObject()) + return ThrowException(String::New("Bad arguments to bufferData")); unsigned int target = args[0]->Uint32Value(); unsigned int type = args[2]->Uint32Value(); unsigned int usage = args[3]->Uint32Value(); - Handle data = Handle::Cast(args[1]); - unsigned int len = data->Length(); + Handle source = Handle::Cast(args[1]); + + if (source->HasIndexedPropertiesInExternalArrayData()) { + const void *data = source->GetIndexedPropertiesExternalArrayData(); + int len = source->GetIndexedPropertiesExternalArrayDataLength(); + int element_size= _ExternalArrayTypeToElementSize + (source->GetIndexedPropertiesExternalArrayDataType()); + if (element_size==0) + return ThrowException(String::New("unknown array type")); + glBufferData((GLenum)target, (GLsizeiptr) (len * element_size), + data, (GLenum)usage); + + Handle res(GlesFactory::self_); + return res; + } + + if (!source->IsArray()) + return ThrowException(String::New("Second argument not an array")); + Handle data = Handle::Cast(source); + unsigned int len = data->Length(); if (type == GL_FLOAT) { GLfloat* arg1 = new GLfloat[len]; for (unsigned j = 0; j < len; j++) { @@ -310,6 +343,8 @@ Handle GLESglBufferDataCallback(const Arguments& args) { (const void*)arg1, (GLenum)usage); delete[] arg1; + } else { + return ThrowException(String::New("Unsupported type")); } Handle res(GlesFactory::self_); From 7602942b225df3bb66a79426a995b04b717d8008 Mon Sep 17 00:00:00 2001 From: "C. Scott Ananian" Date: Thu, 8 Dec 2011 13:23:07 -0500 Subject: [PATCH 04/11] Set root path to reflect the current javascript file when using load(). This helps us use consistent relative paths in library code. --- utils.cpp | 14 ++++++++++++++ utils.h | 3 +++ v8-gl.cpp | 11 ++++++++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/utils.cpp b/utils.cpp index 92b8ec0..842d462 100644 --- a/utils.cpp +++ b/utils.cpp @@ -32,6 +32,20 @@ namespace V8GLUtils { delete[] tmp_js_path; } + char *pushRootPath(char *new_path) { + char *old_path = root_path; + char *pch = strrchr(new_path, V8GLUtils::separator); + int last_index = pch ? (pch - new_path + 1) : 2; + root_path = new char[last_index + 1]; + strncpy(root_path, pch ? new_path : "./", last_index); + root_path[last_index] = '\0'; + return old_path; + } + void popRootPath(char *old_path) { + delete[] root_path; + root_path = old_path; + } + char* getRootPath(void) { return V8GLUtils::root_path; } diff --git a/utils.h b/utils.h index 8930307..d9ea53e 100644 --- a/utils.h +++ b/utils.h @@ -6,6 +6,9 @@ namespace V8GLUtils { char* getRootPath(void); char* getRealPath(char* file_path); + + char *pushRootPath(char *new_path); + void popRootPath(char *old_path); }; #endif diff --git a/v8-gl.cpp b/v8-gl.cpp index 79cdd73..8e7433c 100755 --- a/v8-gl.cpp +++ b/v8-gl.cpp @@ -146,10 +146,15 @@ Handle load(const Arguments& args) { //get argument String::Utf8Value value0(args[i]); char* arg0 = *value0; - string str(V8GLUtils::getRealPath(arg0)); - if(!exec(str)) { + char* filepath = V8GLUtils::getRealPath(arg0); + + char *old_path = V8GLUtils::pushRootPath(filepath); + bool success = exec(string(filepath)); + V8GLUtils::popRootPath(old_path); + + if(!success) { fprintf(stderr, "Error reading '%s'.\n", arg0); - return v8::Undefined(); + return ThrowException(String::New("Failed to load script")); } } From 7b06957e2e2aa17e100d2944f926b61162b5b147 Mon Sep 17 00:00:00 2001 From: "C. Scott Ananian" Date: Fri, 2 Dec 2011 15:25:52 -0500 Subject: [PATCH 05/11] Add 'read' built-in to get file contents as a string. --- v8-gl.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/v8-gl.cpp b/v8-gl.cpp index 8e7433c..414060c 100755 --- a/v8-gl.cpp +++ b/v8-gl.cpp @@ -128,6 +128,23 @@ Handle log(const Arguments& args) { return v8::Undefined(); } +//loads a text file +Handle read(const Arguments& args) { + if (args.Length() < 1) return v8::Undefined(); + //define handle scope + HandleScope scope; + //get arguments + String::Utf8Value value0(args[0]); + char* arg0 = *value0; + string str(V8GLUtils::getRealPath(arg0)); + Handle result = ReadFile(str); + if (result.IsEmpty()) { + fprintf(stderr, "Error reading '%s'.\n", str.c_str()); + return ThrowException(String::New("Could not open file.")); + } + return scope.Close(result); +} + //loads a js file Handle load(const Arguments& args) { //if less that nbr of formal parameters then do nothing @@ -197,6 +214,7 @@ bool V8GL::initialize(int* pargc, char** argv, string scriptname) { #endif global->Set(String::New("log"), FunctionTemplate::New(log)); global->Set(String::New("load"), FunctionTemplate::New(load)); + global->Set(String::New("read"), FunctionTemplate::New(read)); Handle context = Context::New(NULL, global); From ec4661ce2ee3bbafc18d240a98ba145020f82389 Mon Sep 17 00:00:00 2001 From: "C. Scott Ananian" Date: Sun, 4 Dec 2011 03:42:52 -0500 Subject: [PATCH 06/11] Improve error checking in glesbind.cpp. Throw an exception if arguments are bad, instead of silently ignoring the requested GL command. --- glesbindings/glesbind.cpp | 529 +++++++++++++++++++++++--------------- 1 file changed, 323 insertions(+), 206 deletions(-) diff --git a/glesbindings/glesbind.cpp b/glesbindings/glesbind.cpp index 1a06733..b8ee10c 100755 --- a/glesbindings/glesbind.cpp +++ b/glesbindings/glesbind.cpp @@ -25,8 +25,9 @@ Persistent GlesFactory::self_; Persistent GlesFactory::gles_persistent_context; // glGenBuffers uses an output parameter to return an array of ints. Handle GLESglGenBuffersCallback(const Arguments& args) { - if (args.Length() != 1) - return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsNumber()) + return ThrowException(String::New("Bad arguments")); GLsizei num_buffers = args[0]->Int32Value(); @@ -46,8 +47,9 @@ Handle GLESglGenBuffersCallback(const Arguments& args) { Handle GLESglGenRenderbuffersCallback(const Arguments& args) { - if (args.Length() != 1) - return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsNumber()) + return ThrowException(String::New("Bad arguments")); GLsizei num_buffers = args[0]->Int32Value(); @@ -67,8 +69,9 @@ Handle GLESglGenRenderbuffersCallback(const Arguments& args) { Handle GLESglGenFramebuffersCallback(const Arguments& args) { - if (args.Length() != 1) - return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsNumber()) + return ThrowException(String::New("Bad arguments")); GLsizei num_buffers = args[0]->Int32Value(); @@ -87,8 +90,9 @@ Handle GLESglGenFramebuffersCallback(const Arguments& args) { } Handle GLESglGenTexturesCallback(const Arguments& args) { - if (args.Length() != 1) - return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsNumber()) + return ThrowException(String::New("Bad arguments")); GLsizei num_textures = args[0]->Int32Value(); @@ -108,8 +112,9 @@ Handle GLESglGenTexturesCallback(const Arguments& args) { // glGetShaderiv uses an output parameter to return an int. Handle GLESglGetShaderivCallback(const Arguments& args) { - if (args.Length() < 2) - return v8::Undefined(); + if (args.Length() != 2 || !args[0]->IsUint32() || !args[1]->IsNumber()) + return ThrowException(String::New("Bad arguments")); + unsigned int arg0 = args[0]->Uint32Value(); int arg1 = args[1]->IntegerValue(); @@ -122,8 +127,8 @@ Handle GLESglGetShaderivCallback(const Arguments& args) { // We expect to be called with a shader id and a single string. Handle GLESglShaderSourceCallback(const Arguments& args) { - if (args.Length() != 2) - return v8::Undefined(); + if (args.Length() != 2 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); GLuint shader_id = args[0]->Uint32Value(); // GLSL source is defined as an ASCII subset. @@ -141,9 +146,10 @@ Handle GLESglShaderSourceCallback(const Arguments& args) { Handle GLESglVertexAttribPointerCallback(const Arguments& args) { - if (args.Length() != 6) - return v8::Undefined(); - + if (args.Length() != 6 || !args[0]->IsUint32() || !args[1]->IsUint32() || + !args[2]->IsUint32() || !args[3]->IsUint32() || + !args[4]->IsNumber()) + return ThrowException(String::New("Bad arguments")); unsigned int index = args[0]->Uint32Value(); unsigned int size = args[1]->Uint32Value(); @@ -217,7 +223,8 @@ Handle GLESglVertexAttribPointerCallback(const Arguments& args) { // } // break; - default: return v8::Undefined(); + default: + return ThrowException(String::New("Unsupported array type")); } } else { ans = (void *)args[5]->IntegerValue(); @@ -237,8 +244,9 @@ Handle GLESglVertexAttribPointerCallback(const Arguments& args) { } Handle GLESglDrawElementsCallback(const Arguments& args) { - if (args.Length() != 4) - return v8::Undefined(); + if (args.Length() != 4 || !args[0]->IsUint32() || !args[1]->IsNumber() || + !args[2]->IsUint32()) + return ThrowException(String::New("Bad arguments")); unsigned int mode = args[0]->Uint32Value(); int count = args[1]->IntegerValue(); @@ -259,7 +267,8 @@ Handle GLESglDrawElementsCallback(const Arguments& args) { } break; - default: return v8::Undefined(); + default: + return ThrowException(String::New("Unsupported array type")); } } else { ans = (void *)args[3]->IntegerValue(); @@ -294,8 +303,10 @@ static int _ExternalArrayTypeToElementSize(ExternalArrayType type) { //Accepts GL_UNSIGNED_SHORT and GL_FLOAT as types //TODO(nico): deal with interleaved data Handle GLESglBufferDataCallback(const Arguments& args) { - if (args.Length() != 4 || !args[1]->IsObject()) - return ThrowException(String::New("Bad arguments to bufferData")); + if (args.Length() != 4 || !args[0]->IsUint32() || + !args[1]->IsObject() || !args[2]->IsUint32() || + !args[3]->IsUint32()) + return ThrowException(String::New("Bad arguments")); unsigned int target = args[0]->Uint32Value(); unsigned int type = args[2]->Uint32Value(); @@ -355,8 +366,10 @@ Handle GLESglBufferDataCallback(const Arguments& args) { //Accepts GL_UNSIGNED_SHORT and GL_FLOAT as types //TODO(nico): deal with interleaved data Handle GLESglBufferSubDataCallback(const Arguments& args) { - if (args.Length() != 4) - return v8::Undefined(); + if (args.Length() != 4 || !args[0]->IsUint32() || + !args[1]->IsUint32() || !args[2]->IsObject() || + !args[3]->IsUint32()) + return ThrowException(String::New("Bad arguments")); unsigned int target = args[0]->Uint32Value(); unsigned int offset = args[1]->Uint32Value(); @@ -406,8 +419,11 @@ Handle GLESglBufferSubDataCallback(const Arguments& args) { } Handle GLESglReadPixelsCallback(const Arguments& args) { - if (args.Length() != 6) - return v8::Undefined(); + if (args.Length() != 6 || + !args[0]->IsNumber() || !args[1]->IsNumber() || + !args[2]->IsUint32() || !args[3]->IsUint32() || + !args[4]->IsUint32() || !args[5]->IsUint32()) + return ThrowException(String::New("Bad arguments")); int x = args[0]->IntegerValue(); int y = args[1]->IntegerValue(); @@ -440,9 +456,9 @@ Handle GLESglReadPixelsCallback(const Arguments& args) { } Handle GLESglGetActiveAttribCallback(const Arguments& args) { - if (args.Length() != 2) - return v8::Undefined(); - + if (args.Length() != 2 || + !args[0]->IsUint32() || !args[1]->IsUint32()) + return ThrowException(String::New("Bad arguments")); unsigned program = args[0]->Uint32Value(); unsigned index = args[1]->Uint32Value(); @@ -468,8 +484,9 @@ Handle GLESglGetActiveAttribCallback(const Arguments& args) { } Handle GLESglGetActiveUniformCallback(const Arguments& args) { - if (args.Length() != 2) - return v8::Undefined(); + if (args.Length() != 2 || + !args[0]->IsUint32() || !args[1]->IsUint32()) + return ThrowException(String::New("Bad arguments")); unsigned program = args[0]->Uint32Value(); unsigned index = args[1]->Uint32Value(); @@ -497,8 +514,9 @@ Handle GLESglGetActiveUniformCallback(const Arguments& args) { } Handle GLESglGetAttachedShadersCallback(const Arguments& args) { - if (args.Length() != 1) - return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); unsigned program = args[0]->Uint32Value(); @@ -523,7 +541,7 @@ Handle GLESglGetAttachedShadersCallback(const Arguments& args) { Handle GLESglGetBufferParameterivCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned target = args[0]->IntegerValue(); unsigned pname = args[1]->IntegerValue(); @@ -538,8 +556,10 @@ Handle GLESglGetBufferParameterivCallback(const Arguments& args) { //GetBooleanv, GetIntegerv, GetString, GetFloatv, GetDoublev should map here. Handle GLESglGetParameterCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned pname = args[0]->Uint32Value(); @@ -961,13 +981,13 @@ Handle GLESglGetParameterCallback(const Arguments& args) { } } - return v8::Undefined(); + return ThrowException(String::New("Unknown parameter")); } Handle GLESglGetProgramivCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() != 2) return v8::Undefined(); + if (args.Length() != 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned program = args[0]->Uint32Value(); unsigned pname = args[1]->Uint32Value(); @@ -982,7 +1002,7 @@ Handle GLESglGetProgramivCallback(const Arguments& args) { Handle GLESglGetProgramInfoLogCallback(const Arguments& args) { - if (args.Length() != 1) return v8::Undefined(); + if (args.Length() != 1) return ThrowException(String::New("Bad arguments")); //get arguments unsigned program = args[0]->Uint32Value(); @@ -998,7 +1018,7 @@ Handle GLESglGetProgramInfoLogCallback(const Arguments& args) { Handle GLESglGetTexParameterCallback(const Arguments& args) { - if (args.Length() != 2) return v8::Undefined(); + if (args.Length() != 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned target = args[0]->Uint32Value(); unsigned pname = args[1]->Uint32Value(); @@ -1047,12 +1067,12 @@ Handle GLESglGetTexParameterCallback(const Arguments& args) { #endif } - return v8::Undefined(); + return ThrowException(String::New("Bad arguments")); } Handle GLESglGetVertexAttribCallback(const Arguments& args) { - if (args.Length() != 2) return v8::Undefined(); + if (args.Length() != 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned index = args[0]->Uint32Value(); unsigned pname = args[1]->Uint32Value(); @@ -1095,14 +1115,14 @@ Handle GLESglGetVertexAttribCallback(const Arguments& args) { } } - return v8::Undefined(); + return ThrowException(String::New("Bad arguments")); } Handle GLESglTexImage2DCallback(const Arguments& args) { - if (args.Length() != 9) return v8::Undefined(); + if (args.Length() != 9) return ThrowException(String::New("Bad arguments")); //get arguments unsigned target = args[0]->Uint32Value(); int level = args[1]->IntegerValue(); @@ -1134,6 +1154,8 @@ Handle GLESglTexImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); + } else if( type == GL_BYTE ) { GLbyte* pixels = new GLbyte[arr_handle->Length()]; for (unsigned j = 0; j < arr_handle->Length(); j++) { @@ -1152,6 +1174,7 @@ Handle GLESglTexImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); #ifdef DESKTOP_GL } else if( type == GL_BITMAP ) { @@ -1172,6 +1195,7 @@ Handle GLESglTexImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); #endif } else if( type == GL_UNSIGNED_SHORT ) { @@ -1192,6 +1216,7 @@ Handle GLESglTexImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } else if( type == GL_SHORT ) { GLshort* pixels = new GLshort[arr_handle->Length()]; @@ -1211,6 +1236,7 @@ Handle GLESglTexImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } else if( type == GL_UNSIGNED_INT ) { GLuint* pixels = new GLuint[arr_handle->Length()]; @@ -1230,6 +1256,7 @@ Handle GLESglTexImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } else if( type == GL_INT ) { GLint* pixels = new GLint[arr_handle->Length()]; @@ -1249,6 +1276,7 @@ Handle GLESglTexImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } else if( type == GL_FLOAT ) { GLfloat* pixels = new GLfloat[arr_handle->Length()]; @@ -1268,15 +1296,16 @@ Handle GLESglTexImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } } - return v8::Undefined(); + return ThrowException(String::New("Bad arguments")); } Handle GLESglTexImage2DFileCallback(const Arguments& args) { - if (args.Length() != 1) return v8::Undefined(); + if (args.Length() != 1) return ThrowException(String::New("Bad arguments")); //get arguments String::Utf8Value value(args[0]); char* filepath_str = *value; @@ -1297,13 +1326,13 @@ Handle GLESglTexImage2DFileCallback(const Arguments& args) { delete[] filename; - return v8::Undefined(); + return ThrowException(String::New("Bad arguments")); } Handle GLESglTexSubImage2DCallback(const Arguments& args) { - if (args.Length() != 9) return v8::Undefined(); + if (args.Length() != 9) return ThrowException(String::New("Bad arguments")); //get arguments unsigned target = args[0]->Uint32Value(); int level = args[1]->IntegerValue(); @@ -1337,8 +1366,8 @@ Handle GLESglTexSubImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } - break; case GL_BYTE: { @@ -1359,8 +1388,8 @@ Handle GLESglTexSubImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } - break; #ifdef DESKTOP_GL case GL_BITMAP: @@ -1382,8 +1411,8 @@ Handle GLESglTexSubImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } - break; #endif case GL_UNSIGNED_SHORT: @@ -1405,8 +1434,8 @@ Handle GLESglTexSubImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } - break; case GL_SHORT: { @@ -1427,8 +1456,8 @@ Handle GLESglTexSubImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } - break; case GL_UNSIGNED_INT: { @@ -1449,8 +1478,8 @@ Handle GLESglTexSubImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } - break; case GL_INT: { @@ -1471,8 +1500,8 @@ Handle GLESglTexSubImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } - break; case GL_FLOAT: { @@ -1493,18 +1522,18 @@ Handle GLESglTexSubImage2DCallback(const Arguments& args) { (const void*)pixels); delete[] pixels; + return v8::Undefined(); } - break; } } - return v8::Undefined(); + return ThrowException(String::New("Bad arguments")); } Handle GLESglGetRenderbufferParameterCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() != 2) return v8::Undefined(); + if (args.Length() != 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned target = args[0]->Uint32Value(); unsigned pname = args[1]->Uint32Value(); @@ -1527,12 +1556,12 @@ Handle GLESglGetRenderbufferParameterCallback(const Arguments& args) { } } - return v8::Undefined(); + return ThrowException(String::New("Bad arguments")); } Handle GLESglGetFramebufferAttachmentParameterCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() != 2) return v8::Undefined(); + if (args.Length() != 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned target = args[0]->Uint32Value(); unsigned attachment = args[1]->Uint32Value(); @@ -1554,12 +1583,12 @@ Handle GLESglGetFramebufferAttachmentParameterCallback(const Arguments& a // } // } - return v8::Undefined(); + return ThrowException(String::New("Bad arguments")); } Handle GLESglGetShaderInfoLogCallback(const Arguments& args) { - if (args.Length() != 1) return v8::Undefined(); + if (args.Length() != 1) return ThrowException(String::New("Bad arguments")); //get arguments unsigned shader = args[0]->Uint32Value(); @@ -1575,7 +1604,7 @@ Handle GLESglGetShaderInfoLogCallback(const Arguments& args) { Handle GLESglGetShaderSourceCallback(const Arguments& args) { - if (args.Length() != 1) return v8::Undefined(); + if (args.Length() != 1) return ThrowException(String::New("Bad arguments")); //get arguments unsigned shader = args[0]->Uint32Value(); @@ -1592,7 +1621,7 @@ Handle GLESglGetShaderSourceCallback(const Arguments& args) { // We expect to be called with a shader id and a single string. Handle GLESglShaderSourceFileCallback(const Arguments& args) { if (args.Length() != 2) - return v8::Undefined(); + return ThrowException(String::New("Bad arguments")); GLuint shader_id = args[0]->Uint32Value(); // GLSL source is defined as an ASCII subset. @@ -1629,8 +1658,10 @@ Handle GLESglShaderSourceFileCallback(const Arguments& args) { Handle GLESglActiveTextureCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -1645,7 +1676,7 @@ Handle GLESglActiveTextureCallback(const Arguments& args) { Handle GLESglAttachShaderCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -1661,7 +1692,7 @@ Handle GLESglAttachShaderCallback(const Arguments& args) { Handle GLESglBindAttribLocationCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -1679,7 +1710,7 @@ Handle GLESglBindAttribLocationCallback(const Arguments& args) { Handle GLESglBindBufferCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -1695,7 +1726,7 @@ Handle GLESglBindBufferCallback(const Arguments& args) { Handle GLESglBindFramebufferCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -1711,7 +1742,7 @@ Handle GLESglBindFramebufferCallback(const Arguments& args) { Handle GLESglBindRenderbufferCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -1727,7 +1758,7 @@ Handle GLESglBindRenderbufferCallback(const Arguments& args) { Handle GLESglBindTextureCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -1743,7 +1774,7 @@ Handle GLESglBindTextureCallback(const Arguments& args) { Handle GLESglBlendColorCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments double arg0 = args[0]->NumberValue(); double arg1 = args[1]->NumberValue(); @@ -1760,8 +1791,10 @@ Handle GLESglBlendColorCallback(const Arguments& args) { Handle GLESglBlendEquationCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -1776,7 +1809,7 @@ Handle GLESglBlendEquationCallback(const Arguments& args) { Handle GLESglBlendEquationSeparateCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -1792,7 +1825,7 @@ Handle GLESglBlendEquationSeparateCallback(const Arguments& args) { Handle GLESglBlendFuncCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -1808,7 +1841,7 @@ Handle GLESglBlendFuncCallback(const Arguments& args) { Handle GLESglBlendFuncSeparateCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -1825,8 +1858,10 @@ Handle GLESglBlendFuncSeparateCallback(const Arguments& args) { Handle GLESglCheckFramebufferStatusCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -1838,8 +1873,10 @@ Handle GLESglCheckFramebufferStatusCallback(const Arguments& args) { Handle GLESglClearCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -1854,7 +1891,9 @@ Handle GLESglClearCallback(const Arguments& args) { Handle GLESglClearColorCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4 || !args[0]->IsNumber() || !args[1]->IsNumber() || + !args[2]->IsNumber() || !args[3]->IsNumber()) + return ThrowException(String::New("Bad arguments")); //get arguments double arg0 = args[0]->NumberValue(); double arg1 = args[1]->NumberValue(); @@ -1872,9 +1911,12 @@ Handle GLESglClearColorCallback(const Arguments& args) { Handle GLESglClearDepthCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + if (args.Length() < 1 || !args[0]->IsNumber()) + return ThrowException(String::New("Bad arguments")); //get arguments double arg0 = args[0]->NumberValue(); + if (arg0 < 0) arg0 = 0; + if (arg0 > 1) arg0 = 1; //make call glClearDepthf((GLclampf) arg0); @@ -1887,7 +1929,8 @@ Handle GLESglClearDepthCallback(const Arguments& args) { Handle GLESglClearStencilCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + if (args.Length() < 1 || !args[0]->IsNumber()) + return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); @@ -1902,7 +1945,7 @@ Handle GLESglClearStencilCallback(const Arguments& args) { Handle GLESglColorMaskCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -1919,8 +1962,10 @@ Handle GLESglColorMaskCallback(const Arguments& args) { Handle GLESglCompileShaderCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -1935,7 +1980,8 @@ Handle GLESglCompileShaderCallback(const Arguments& args) { Handle GLESglCopyTexImage2DCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 8) return v8::Undefined(); + if (args.Length() < 8) return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); int arg1 = args[1]->IntegerValue(); @@ -1957,7 +2003,7 @@ Handle GLESglCopyTexImage2DCallback(const Arguments& args) { Handle GLESglCopyTexSubImage2DCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 8) return v8::Undefined(); + if (args.Length() < 8) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); int arg1 = args[1]->IntegerValue(); @@ -1979,7 +2025,7 @@ Handle GLESglCopyTexSubImage2DCallback(const Arguments& args) { Handle GLESglCreateProgramCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 0) return v8::Undefined(); + if (args.Length() != 0) return ThrowException(String::New("Bad arguments")); //get arguments //make call @@ -1990,8 +2036,10 @@ Handle GLESglCreateProgramCallback(const Arguments& args) { Handle GLESglCreateShaderCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2003,8 +2051,10 @@ Handle GLESglCreateShaderCallback(const Arguments& args) { Handle GLESglCullFaceCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2019,7 +2069,7 @@ Handle GLESglCullFaceCallback(const Arguments& args) { Handle GLESglDeleteBuffersCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); @@ -2044,7 +2094,7 @@ Handle GLESglDeleteBuffersCallback(const Arguments& args) { Handle GLESglDeleteFramebuffersCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); @@ -2068,8 +2118,10 @@ Handle GLESglDeleteFramebuffersCallback(const Arguments& args) { Handle GLESglDeleteProgramCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2084,7 +2136,7 @@ Handle GLESglDeleteProgramCallback(const Arguments& args) { Handle GLESglDeleteRenderbuffersCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); @@ -2108,8 +2160,10 @@ Handle GLESglDeleteRenderbuffersCallback(const Arguments& args) { Handle GLESglDeleteShaderCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2124,7 +2178,7 @@ Handle GLESglDeleteShaderCallback(const Arguments& args) { Handle GLESglDeleteTexturesCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); @@ -2148,8 +2202,10 @@ Handle GLESglDeleteTexturesCallback(const Arguments& args) { Handle GLESglDepthFuncCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2163,8 +2219,10 @@ Handle GLESglDepthFuncCallback(const Arguments& args) { Handle GLESglDepthMaskCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2179,7 +2237,9 @@ Handle GLESglDepthMaskCallback(const Arguments& args) { Handle GLESglDepthRangefCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2 || !args[0]->IsNumber() || !args[1]->IsNumber()) + return ThrowException(String::New("Bad arguments")); + //get arguments double arg0 = args[0]->NumberValue(); double arg1 = args[1]->NumberValue(); @@ -2195,7 +2255,9 @@ Handle GLESglDepthRangefCallback(const Arguments& args) { Handle GLESglDetachShaderCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() != 2 || !args[0]->IsUint32() || !args[1]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2210,8 +2272,10 @@ Handle GLESglDetachShaderCallback(const Arguments& args) { Handle GLESglDisableCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2225,8 +2289,10 @@ Handle GLESglDisableCallback(const Arguments& args) { Handle GLESglDisableVertexAttribArrayCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2240,8 +2306,11 @@ Handle GLESglDisableVertexAttribArrayCallback(const Arguments& args) { Handle GLESglDrawArraysCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 3 || !args[0]->IsUint32() || !args[1]->IsNumber() || + !args[2]->IsNumber()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); int arg1 = args[1]->IntegerValue(); @@ -2257,8 +2326,10 @@ Handle GLESglDrawArraysCallback(const Arguments& args) { Handle GLESglEnableCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2272,8 +2343,10 @@ Handle GLESglEnableCallback(const Arguments& args) { Handle GLESglEnableVertexAttribArrayCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2287,8 +2360,9 @@ Handle GLESglEnableVertexAttribArrayCallback(const Arguments& args) { Handle GLESglFinishCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 0) return v8::Undefined(); + if (args.Length() != 0) + return ThrowException(String::New("Extra arguments to finish")); + //get arguments //make call @@ -2301,8 +2375,9 @@ Handle GLESglFinishCallback(const Arguments& args) { Handle GLESglFlushCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 0) return v8::Undefined(); + if (args.Length() != 0) + return ThrowException(String::New("Bad arguments")); + //get arguments //make call @@ -2315,8 +2390,11 @@ Handle GLESglFlushCallback(const Arguments& args) { Handle GLESglFramebufferRenderbufferCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() < 4 || !args[0]->IsUint32() || !args[1]->IsUint32() || + !args[2]->IsUint32() || !args[3]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2333,8 +2411,11 @@ Handle GLESglFramebufferRenderbufferCallback(const Arguments& args) { Handle GLESglFramebufferTexture2DCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 5) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() < 5 || !args[0]->IsUint32() || !args[1]->IsUint32() || + !args[2]->IsUint32() || !args[3]->IsUint32() || !args[4]->IsNumber()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2352,8 +2433,10 @@ Handle GLESglFramebufferTexture2DCallback(const Arguments& args) { Handle GLESglFrontFaceCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2367,8 +2450,10 @@ Handle GLESglFrontFaceCallback(const Arguments& args) { Handle GLESglGenerateMipmapCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2382,8 +2467,10 @@ Handle GLESglGenerateMipmapCallback(const Arguments& args) { Handle GLESglGetAttribLocationCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 2 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); String::Utf8Value value1(args[1]); @@ -2397,8 +2484,10 @@ Handle GLESglGetAttribLocationCallback(const Arguments& args) { Handle GLESglGetBooleanvCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 2 || !args[0]->IsUint32() || !args[1]->IsArray()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2423,7 +2512,7 @@ Handle GLESglGetBooleanvCallback(const Arguments& args) { Handle GLESglGetErrorCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 0) return v8::Undefined(); + if (args.Length() != 0) return ThrowException(String::New("Bad arguments")); //get arguments //make call @@ -2435,7 +2524,7 @@ Handle GLESglGetErrorCallback(const Arguments& args) { Handle GLESglGetFloatvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2460,7 +2549,7 @@ Handle GLESglGetFloatvCallback(const Arguments& args) { Handle GLESglGetFramebufferAttachmentParameterivCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2487,7 +2576,7 @@ Handle GLESglGetFramebufferAttachmentParameterivCallback(const Arguments& Handle GLESglGetIntegervCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2512,7 +2601,7 @@ Handle GLESglGetIntegervCallback(const Arguments& args) { Handle GLESglGetUniformivCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); int arg1 = args[1]->IntegerValue(); @@ -2538,7 +2627,8 @@ Handle GLESglGetUniformivCallback(const Arguments& args) { Handle GLESglGetUniformLocationCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); String::Utf8Value value1(args[1]); @@ -2553,7 +2643,8 @@ Handle GLESglGetUniformLocationCallback(const Arguments& args) { Handle GLESglHintCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2 || !args[0]->IsUint32() || !args[1]->IsUint32()) + return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2568,8 +2659,10 @@ Handle GLESglHintCallback(const Arguments& args) { Handle GLESglIsBufferCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2581,8 +2674,10 @@ Handle GLESglIsBufferCallback(const Arguments& args) { Handle GLESglIsEnabledCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2594,8 +2689,10 @@ Handle GLESglIsEnabledCallback(const Arguments& args) { Handle GLESglIsFramebufferCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2607,8 +2704,10 @@ Handle GLESglIsFramebufferCallback(const Arguments& args) { Handle GLESglIsProgramCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2620,8 +2719,10 @@ Handle GLESglIsProgramCallback(const Arguments& args) { Handle GLESglIsRenderbufferCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2633,8 +2734,10 @@ Handle GLESglIsRenderbufferCallback(const Arguments& args) { Handle GLESglIsShaderCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2646,8 +2749,10 @@ Handle GLESglIsShaderCallback(const Arguments& args) { Handle GLESglIsTextureCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2660,7 +2765,7 @@ Handle GLESglIsTextureCallback(const Arguments& args) { Handle GLESglLineWidthCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + if (args.Length() < 1) return ThrowException(String::New("Bad arguments")); //get arguments double arg0 = args[0]->NumberValue(); @@ -2674,8 +2779,10 @@ Handle GLESglLineWidthCallback(const Arguments& args) { Handle GLESglLinkProgramCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2690,7 +2797,7 @@ Handle GLESglLinkProgramCallback(const Arguments& args) { Handle GLESglPixelStoreiCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); int arg1 = args[1]->IntegerValue(); @@ -2706,7 +2813,7 @@ Handle GLESglPixelStoreiCallback(const Arguments& args) { Handle GLESglPolygonOffsetCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments double arg0 = args[0]->NumberValue(); double arg1 = args[1]->NumberValue(); @@ -2722,7 +2829,7 @@ Handle GLESglPolygonOffsetCallback(const Arguments& args) { Handle GLESglRenderbufferStorageCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2740,7 +2847,7 @@ Handle GLESglRenderbufferStorageCallback(const Arguments& args) { Handle GLESglSampleCoverageCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments double arg0 = args[0]->NumberValue(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2756,7 +2863,7 @@ Handle GLESglSampleCoverageCallback(const Arguments& args) { Handle GLESglScissorCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -2774,7 +2881,7 @@ Handle GLESglScissorCallback(const Arguments& args) { Handle GLESglStencilFuncCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); int arg1 = args[1]->IntegerValue(); @@ -2791,7 +2898,7 @@ Handle GLESglStencilFuncCallback(const Arguments& args) { Handle GLESglStencilFuncSeparateCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2808,8 +2915,10 @@ Handle GLESglStencilFuncSeparateCallback(const Arguments& args) { Handle GLESglStencilMaskCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsNumber()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -2824,7 +2933,7 @@ Handle GLESglStencilMaskCallback(const Arguments& args) { Handle GLESglStencilMaskSeparateCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2840,7 +2949,7 @@ Handle GLESglStencilMaskSeparateCallback(const Arguments& args) { Handle GLESglStencilOpCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2857,7 +2966,7 @@ Handle GLESglStencilOpCallback(const Arguments& args) { Handle GLESglStencilOpSeparateCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2875,7 +2984,7 @@ Handle GLESglStencilOpSeparateCallback(const Arguments& args) { Handle GLESglTexParameterfCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2892,7 +3001,7 @@ Handle GLESglTexParameterfCallback(const Arguments& args) { Handle GLESglTexParameterfvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2918,7 +3027,7 @@ Handle GLESglTexParameterfvCallback(const Arguments& args) { Handle GLESglTexParameteriCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2935,7 +3044,7 @@ Handle GLESglTexParameteriCallback(const Arguments& args) { Handle GLESglTexParameterivCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); unsigned int arg1 = args[1]->Uint32Value(); @@ -2961,7 +3070,7 @@ Handle GLESglTexParameterivCallback(const Arguments& args) { Handle GLESglUniform1fCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); double arg1 = args[1]->NumberValue(); @@ -2977,7 +3086,7 @@ Handle GLESglUniform1fCallback(const Arguments& args) { Handle GLESglUniform1fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3003,7 +3112,7 @@ Handle GLESglUniform1fvCallback(const Arguments& args) { Handle GLESglUniform1iCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3019,7 +3128,7 @@ Handle GLESglUniform1iCallback(const Arguments& args) { Handle GLESglUniform1ivCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3045,7 +3154,7 @@ Handle GLESglUniform1ivCallback(const Arguments& args) { Handle GLESglUniform2fCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); double arg1 = args[1]->NumberValue(); @@ -3062,7 +3171,7 @@ Handle GLESglUniform2fCallback(const Arguments& args) { Handle GLESglUniform2fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3088,7 +3197,7 @@ Handle GLESglUniform2fvCallback(const Arguments& args) { Handle GLESglUniform2iCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3105,7 +3214,7 @@ Handle GLESglUniform2iCallback(const Arguments& args) { Handle GLESglUniform2ivCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3131,7 +3240,7 @@ Handle GLESglUniform2ivCallback(const Arguments& args) { Handle GLESglUniform3fCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); double arg1 = args[1]->NumberValue(); @@ -3149,7 +3258,7 @@ Handle GLESglUniform3fCallback(const Arguments& args) { Handle GLESglUniform3fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3175,7 +3284,7 @@ Handle GLESglUniform3fvCallback(const Arguments& args) { Handle GLESglUniform3iCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3193,7 +3302,7 @@ Handle GLESglUniform3iCallback(const Arguments& args) { Handle GLESglUniform3ivCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3219,7 +3328,7 @@ Handle GLESglUniform3ivCallback(const Arguments& args) { Handle GLESglUniform4fCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 5) return v8::Undefined(); + if (args.Length() < 5) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); double arg1 = args[1]->NumberValue(); @@ -3238,7 +3347,7 @@ Handle GLESglUniform4fCallback(const Arguments& args) { Handle GLESglUniform4fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3264,7 +3373,7 @@ Handle GLESglUniform4fvCallback(const Arguments& args) { Handle GLESglUniform4iCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 5) return v8::Undefined(); + if (args.Length() < 5) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3283,7 +3392,7 @@ Handle GLESglUniform4iCallback(const Arguments& args) { Handle GLESglUniform4ivCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3309,7 +3418,7 @@ Handle GLESglUniform4ivCallback(const Arguments& args) { Handle GLESglUniformMatrix2fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3336,7 +3445,7 @@ Handle GLESglUniformMatrix2fvCallback(const Arguments& args) { Handle GLESglUniformMatrix3fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3363,7 +3472,7 @@ Handle GLESglUniformMatrix3fvCallback(const Arguments& args) { Handle GLESglUniformMatrix4fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); @@ -3389,8 +3498,10 @@ Handle GLESglUniformMatrix4fvCallback(const Arguments& args) { Handle GLESglUseProgramCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -3404,8 +3515,10 @@ Handle GLESglUseProgramCallback(const Arguments& args) { Handle GLESglValidateProgramCallback(const Arguments& args) { - //if less that nbr of formal parameters then do nothing - if (args.Length() < 1) return v8::Undefined(); + //if less that nbr of formal parameters then throw exception + if (args.Length() != 1 || !args[0]->IsUint32()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -3420,7 +3533,7 @@ Handle GLESglValidateProgramCallback(const Arguments& args) { Handle GLESglVertexAttrib1fCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); double arg1 = args[1]->NumberValue(); @@ -3436,7 +3549,7 @@ Handle GLESglVertexAttrib1fCallback(const Arguments& args) { Handle GLESglVertexAttrib1fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -3461,7 +3574,7 @@ Handle GLESglVertexAttrib1fvCallback(const Arguments& args) { Handle GLESglVertexAttrib2fCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return v8::Undefined(); + if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); double arg1 = args[1]->NumberValue(); @@ -3478,7 +3591,7 @@ Handle GLESglVertexAttrib2fCallback(const Arguments& args) { Handle GLESglVertexAttrib2fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() < 2) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -3503,7 +3616,7 @@ Handle GLESglVertexAttrib2fvCallback(const Arguments& args) { Handle GLESglVertexAttrib3fCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); double arg1 = args[1]->NumberValue(); @@ -3521,7 +3634,9 @@ Handle GLESglVertexAttrib3fCallback(const Arguments& args) { Handle GLESglVertexAttrib3fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() != 2 || !args[0]->IsUint32() || !args[1]->IsArray()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -3546,7 +3661,7 @@ Handle GLESglVertexAttrib3fvCallback(const Arguments& args) { Handle GLESglVertexAttrib4fCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 5) return v8::Undefined(); + if (args.Length() < 5) return ThrowException(String::New("Bad arguments")); //get arguments unsigned int arg0 = args[0]->Uint32Value(); double arg1 = args[1]->NumberValue(); @@ -3565,7 +3680,9 @@ Handle GLESglVertexAttrib4fCallback(const Arguments& args) { Handle GLESglVertexAttrib4fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 2) return v8::Undefined(); + if (args.Length() != 2 || !args[0]->IsUint32() || !args[1]->IsArray()) + return ThrowException(String::New("Bad arguments")); + //get arguments unsigned int arg0 = args[0]->Uint32Value(); @@ -3590,7 +3707,7 @@ Handle GLESglVertexAttrib4fvCallback(const Arguments& args) { Handle GLESglViewportCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return v8::Undefined(); + if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); //get arguments int arg0 = args[0]->IntegerValue(); int arg1 = args[1]->IntegerValue(); From 622041ea5e4ecd265615dfba23eac22b8aec7c2f Mon Sep 17 00:00:00 2001 From: "C. Scott Ananian" Date: Sun, 4 Dec 2011 04:04:01 -0500 Subject: [PATCH 07/11] Accept additional parameters to vertexAttribPointer(). Accept 'offset' parameter to vertexAttribPointer. Accept JavaScript boolean for 'normalized' parameter. --- glesbindings/glesbind.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/glesbindings/glesbind.cpp b/glesbindings/glesbind.cpp index b8ee10c..0dccb0c 100755 --- a/glesbindings/glesbind.cpp +++ b/glesbindings/glesbind.cpp @@ -146,16 +146,19 @@ Handle GLESglShaderSourceCallback(const Arguments& args) { Handle GLESglVertexAttribPointerCallback(const Arguments& args) { - if (args.Length() != 6 || !args[0]->IsUint32() || !args[1]->IsUint32() || - !args[2]->IsUint32() || !args[3]->IsUint32() || - !args[4]->IsNumber()) + if (args.Length() < 6 || !args[0]->IsUint32() || !args[1]->IsUint32() || + !args[2]->IsUint32() || !(args[3]->IsUint32() || args[3]->IsBoolean()) || + !args[4]->IsNumber() || (args.Length() > 6 && !args[6]->IsUint32())) return ThrowException(String::New("Bad arguments")); unsigned int index = args[0]->Uint32Value(); unsigned int size = args[1]->Uint32Value(); unsigned int type = args[2]->Uint32Value(); - unsigned int normalized = args[3]->Uint32Value(); + bool normalized = args[3]->BooleanValue(); int stride = args[4]->IntegerValue(); + unsigned int offset = 0; + if (args.Length() > 6) + offset = args[6]->Uint32Value(); void* ans; if(args[5]->IsArray()) { @@ -233,9 +236,9 @@ Handle GLESglVertexAttribPointerCallback(const Arguments& args) { glVertexAttribPointer((GLuint)index, (GLint)size, (GLenum)type, - (GLboolean)normalized, + (normalized?GL_TRUE:GL_FALSE), (GLsizei)stride, - (const void*)ans); + ((const void*)ans)+offset); //should I delete[] ans? From db87caca472645b4450faa257c1ec9a911bc4827 Mon Sep 17 00:00:00 2001 From: "C. Scott Ananian" Date: Sun, 4 Dec 2011 05:36:36 -0500 Subject: [PATCH 08/11] Update Gles.getParameter() switch statement to match WebGL spec. Added a few missing cases, and used 'unsigned' return types where WebGL wants us to. --- glesbindings/glesbind.cpp | 53 +++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/glesbindings/glesbind.cpp b/glesbindings/glesbind.cpp index 0dccb0c..e031dc3 100755 --- a/glesbindings/glesbind.cpp +++ b/glesbindings/glesbind.cpp @@ -597,7 +597,6 @@ Handle GLESglGetParameterCallback(const Arguments& args) { case GL_BLEND_SRC: #endif case GL_BLUE_BITS: - case GL_SUBPIXEL_BITS: #ifdef DESKTOP_GL case GL_CLIENT_ATTRIB_STACK_DEPTH: case GL_COLOR_ARRAY_SIZE: @@ -606,16 +605,13 @@ Handle GLESglGetParameterCallback(const Arguments& args) { case GL_COLOR_MATERIAL_FACE: case GL_COLOR_MATERIAL_PARAMETER: #endif - case GL_CULL_FACE_MODE: case GL_DEPTH_BITS: - case GL_DEPTH_FUNC: #ifdef DESKTOP_GL case GL_DRAW_BUFFER: case GL_EDGE_FLAG_ARRAY_STRIDE: case GL_FOG_HINT: case GL_FOG_MODE: #endif - case GL_FRONT_FACE: case GL_GREEN_BITS: #ifdef DESKTOP_GL case GL_INDEX_ARRAY_STRIDE: @@ -642,7 +638,16 @@ Handle GLESglGetParameterCallback(const Arguments& args) { case GL_MAX_PIXEL_MAP_TABLE: case GL_MAX_PROJECTION_STACK_DEPTH: #endif + case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: + case GL_MAX_CUBE_MAP_TEXTURE_SIZE: + case GL_MAX_FRAGMENT_UNIFORM_VECTORS: + case GL_MAX_RENDERBUFFER_SIZE: + case GL_MAX_TEXTURE_IMAGE_UNITS: case GL_MAX_TEXTURE_SIZE: + case GL_MAX_VARYING_VECTORS: + case GL_MAX_VERTEX_ATTRIBS: + case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: + case GL_MAX_VERTEX_UNIFORM_VECTORS: #ifdef DESKTOP_GL case GL_MAX_TEXTURE_STACK_DEPTH: case GL_MODELVIEW_STACK_DEPTH: @@ -650,6 +655,7 @@ Handle GLESglGetParameterCallback(const Arguments& args) { case GL_NORMAL_ARRAY_STRIDE: case GL_NORMAL_ARRAY_TYPE: #endif + case GL_NUM_COMPRESSED_TEXTURE_FORMATS: case GL_PACK_ALIGNMENT: #ifdef DESKTOP_GL case GL_PACK_ROW_LENGTH: @@ -675,15 +681,13 @@ Handle GLESglGetParameterCallback(const Arguments& args) { case GL_RENDER_MODE: case GL_SHADE_MODEL: #endif + case GL_SAMPLE_BUFFERS: + case GL_SAMPLES: + case GL_STENCIL_BACK_REF: case GL_STENCIL_BITS: case GL_STENCIL_CLEAR_VALUE: - case GL_STENCIL_FAIL: - case GL_STENCIL_FUNC: - case GL_STENCIL_PASS_DEPTH_FAIL: - case GL_STENCIL_PASS_DEPTH_PASS: case GL_STENCIL_REF: - case GL_STENCIL_VALUE_MASK: - case GL_STENCIL_WRITEMASK: + case GL_SUBPIXEL_BITS: // case GL_TEXTURE_1D_BINDING: // case GL_TEXTURE_2D_BINDING: #ifdef DESKTOP_GL @@ -706,6 +710,35 @@ Handle GLESglGetParameterCallback(const Arguments& args) { glGetIntegerv((GLenum)pname, (GLint*)&ans); return Integer::New(ans); } + //1 unsigned int + case GL_ACTIVE_TEXTURE: + case GL_BLEND_DST_ALPHA: + case GL_BLEND_DST_RGB: + case GL_BLEND_EQUATION_ALPHA: + case GL_BLEND_EQUATION_RGB: + case GL_BLEND_SRC_ALPHA: + case GL_BLEND_SRC_RGB: + case GL_CULL_FACE_MODE: + case GL_DEPTH_FUNC: + case GL_FRONT_FACE: + case GL_GENERATE_MIPMAP_HINT: + case GL_STENCIL_BACK_FAIL: + case GL_STENCIL_BACK_FUNC: + case GL_STENCIL_BACK_PASS_DEPTH_FAIL: + case GL_STENCIL_BACK_PASS_DEPTH_PASS: + case GL_STENCIL_BACK_VALUE_MASK: + case GL_STENCIL_BACK_WRITEMASK: + case GL_STENCIL_FAIL: + case GL_STENCIL_FUNC: + case GL_STENCIL_PASS_DEPTH_FAIL: + case GL_STENCIL_PASS_DEPTH_PASS: + case GL_STENCIL_VALUE_MASK: + case GL_STENCIL_WRITEMASK: + { + unsigned int ans = 0; + glGetIntegerv((GLenum)pname, (GLint*)&ans); + return Integer::NewFromUnsigned(ans); + } //2 values int #ifdef DESKTOP_GL case GL_LINE_WIDTH_RANGE: From f8154cab60940d93fca3b110fbe79e48aa8eae5a Mon Sep 17 00:00:00 2001 From: "C. Scott Ananian" Date: Sun, 4 Dec 2011 05:39:30 -0500 Subject: [PATCH 09/11] Allow Gles.depthMask() to take a JavaScript boolean as well as GL_TRUE/GL_FALSE. --- glesbindings/glesbind.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/glesbindings/glesbind.cpp b/glesbindings/glesbind.cpp index e031dc3..76bf454 100755 --- a/glesbindings/glesbind.cpp +++ b/glesbindings/glesbind.cpp @@ -2256,11 +2256,11 @@ Handle GLESglDepthFuncCallback(const Arguments& args) { Handle GLESglDepthMaskCallback(const Arguments& args) { //if less that nbr of formal parameters then throw exception - if (args.Length() != 1 || !args[0]->IsUint32()) + if (args.Length() != 1 || !(args[0]->IsUint32() || args[0]->IsBoolean())) return ThrowException(String::New("Bad arguments")); //get arguments - unsigned int arg0 = args[0]->Uint32Value(); + bool arg0 = args[0]->BooleanValue(); //make call glDepthMask((GLboolean) arg0); From 968abd7543fab0f5d7cbcc8009b29bbf764e375d Mon Sep 17 00:00:00 2001 From: "C. Scott Ananian" Date: Sun, 4 Dec 2011 05:40:34 -0500 Subject: [PATCH 10/11] Update Gles.uniform*fv and Gles.uniformMatrix*fv to match WebGL prototype. WebGL removes the 'length' field, preferring to infer the length from the size of the array parameter. We also accept Typed Array arguments as well. --- glesbindings/glesbind.cpp | 331 +++++++++++++++++++++++++++----------- 1 file changed, 237 insertions(+), 94 deletions(-) diff --git a/glesbindings/glesbind.cpp b/glesbindings/glesbind.cpp index 76bf454..d9b5ce7 100755 --- a/glesbindings/glesbind.cpp +++ b/glesbindings/glesbind.cpp @@ -3122,23 +3122,43 @@ Handle GLESglUniform1fCallback(const Arguments& args) { Handle GLESglUniform1fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); - //get arguments - int arg0 = args[0]->IntegerValue(); - int arg1 = args[1]->IntegerValue(); - + if (args.Length() < 2 || !args[0]->IsUint32() || !args[1]->IsObject()) + return ThrowException(String::New("Bad arguments")); - Handle arrHandle2 = Handle::Cast(args[2]); - GLfloat* arg2 = new GLfloat[arrHandle2->Length()]; - for (unsigned j = 0; j < arrHandle2->Length(); j++) { - Handle arg(arrHandle2->Get(Integer::New(j))); - GLfloat aux = ( GLfloat)arg->NumberValue(); - arg2[j] = aux; + //get arguments + unsigned int location = args[0]->Uint32Value(); + Handle value = Handle::Cast(args[1]); + const unsigned VECTOR_SIZE = 1; + GLfloat *data; + unsigned count; + + if (value->IsArray()) { + Handle arrHandle = Handle::Cast(value); + count = arrHandle->Length() / VECTOR_SIZE; + if ((count * VECTOR_SIZE) != arrHandle->Length()) + return ThrowException(String::New("Value array is wrong size")); + data = new GLfloat[count * VECTOR_SIZE]; + for (unsigned j = 0; j < (count * VECTOR_SIZE); j++) { + Handle arg(arrHandle->Get(Integer::New(j))); + GLfloat aux = ( GLfloat)arg->NumberValue(); + data[j] = aux; + } + } else if (value->HasIndexedPropertiesInExternalArrayData() && + value->GetIndexedPropertiesExternalArrayDataType() == + kExternalFloatArray) { + data = (GLfloat *) value->GetIndexedPropertiesExternalArrayData(); + count = value->GetIndexedPropertiesExternalArrayDataLength() / VECTOR_SIZE; + if ((count * VECTOR_SIZE) != + value->GetIndexedPropertiesExternalArrayDataLength()) + return ThrowException(String::New("Value array is wrong size")); + } else { + return ThrowException(String::New("Bad type for value argument")); } - //make call - glUniform1fv((GLint) arg0, (GLsizei) arg1, (const GLfloat*) arg2); + glUniform1fv((GLint) location, (GLsizei) count, + (const GLfloat*) data); + Handle res(GlesFactory::self_); return res; } @@ -3207,23 +3227,43 @@ Handle GLESglUniform2fCallback(const Arguments& args) { Handle GLESglUniform2fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); - //get arguments - int arg0 = args[0]->IntegerValue(); - int arg1 = args[1]->IntegerValue(); - + if (args.Length() < 2 || !args[0]->IsUint32() || !args[1]->IsObject()) + return ThrowException(String::New("Bad arguments")); - Handle arrHandle2 = Handle::Cast(args[2]); - GLfloat* arg2 = new GLfloat[arrHandle2->Length()]; - for (unsigned j = 0; j < arrHandle2->Length(); j++) { - Handle arg(arrHandle2->Get(Integer::New(j))); - GLfloat aux = ( GLfloat)arg->NumberValue(); - arg2[j] = aux; + //get arguments + unsigned int location = args[0]->Uint32Value(); + Handle value = Handle::Cast(args[1]); + const unsigned VECTOR_SIZE = 2; + GLfloat *data; + unsigned count; + + if (value->IsArray()) { + Handle arrHandle = Handle::Cast(value); + count = arrHandle->Length() / VECTOR_SIZE; + if ((count * VECTOR_SIZE) != arrHandle->Length()) + return ThrowException(String::New("Value array is wrong size")); + data = new GLfloat[count * VECTOR_SIZE]; + for (unsigned j = 0; j < (count * VECTOR_SIZE); j++) { + Handle arg(arrHandle->Get(Integer::New(j))); + GLfloat aux = ( GLfloat)arg->NumberValue(); + data[j] = aux; + } + } else if (value->HasIndexedPropertiesInExternalArrayData() && + value->GetIndexedPropertiesExternalArrayDataType() == + kExternalFloatArray) { + data = (GLfloat *) value->GetIndexedPropertiesExternalArrayData(); + count = value->GetIndexedPropertiesExternalArrayDataLength() / VECTOR_SIZE; + if ((count * VECTOR_SIZE) != + value->GetIndexedPropertiesExternalArrayDataLength()) + return ThrowException(String::New("Value array is wrong size")); + } else { + return ThrowException(String::New("Bad type for value argument")); } - //make call - glUniform2fv((GLint) arg0, (GLsizei) arg1, (const GLfloat*) arg2); + glUniform2fv((GLint) location, (GLsizei) count, + (const GLfloat*) data); + Handle res(GlesFactory::self_); return res; } @@ -3294,23 +3334,43 @@ Handle GLESglUniform3fCallback(const Arguments& args) { Handle GLESglUniform3fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); - //get arguments - int arg0 = args[0]->IntegerValue(); - int arg1 = args[1]->IntegerValue(); - + if (args.Length() < 2 || !args[0]->IsUint32() || !args[1]->IsObject()) + return ThrowException(String::New("Bad arguments")); - Handle arrHandle2 = Handle::Cast(args[2]); - GLfloat* arg2 = new GLfloat[arrHandle2->Length()]; - for (unsigned j = 0; j < arrHandle2->Length(); j++) { - Handle arg(arrHandle2->Get(Integer::New(j))); - GLfloat aux = ( GLfloat)arg->NumberValue(); - arg2[j] = aux; + //get arguments + unsigned int location = args[0]->Uint32Value(); + Handle value = Handle::Cast(args[1]); + const unsigned VECTOR_SIZE = 3; + GLfloat *data; + unsigned count; + + if (value->IsArray()) { + Handle arrHandle = Handle::Cast(value); + count = arrHandle->Length() / VECTOR_SIZE; + if ((count * VECTOR_SIZE) != arrHandle->Length()) + return ThrowException(String::New("Value array is wrong size")); + data = new GLfloat[count * VECTOR_SIZE]; + for (unsigned j = 0; j < (count * VECTOR_SIZE); j++) { + Handle arg(arrHandle->Get(Integer::New(j))); + GLfloat aux = ( GLfloat)arg->NumberValue(); + data[j] = aux; + } + } else if (value->HasIndexedPropertiesInExternalArrayData() && + value->GetIndexedPropertiesExternalArrayDataType() == + kExternalFloatArray) { + data = (GLfloat *) value->GetIndexedPropertiesExternalArrayData(); + count = value->GetIndexedPropertiesExternalArrayDataLength() / VECTOR_SIZE; + if ((count * VECTOR_SIZE) != + value->GetIndexedPropertiesExternalArrayDataLength()) + return ThrowException(String::New("Value array is wrong size")); + } else { + return ThrowException(String::New("Bad type for value argument")); } - //make call - glUniform3fv((GLint) arg0, (GLsizei) arg1, (const GLfloat*) arg2); + glUniform3fv((GLint) location, (GLsizei) count, + (const GLfloat*) data); + Handle res(GlesFactory::self_); return res; } @@ -3383,23 +3443,43 @@ Handle GLESglUniform4fCallback(const Arguments& args) { Handle GLESglUniform4fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 3) return ThrowException(String::New("Bad arguments")); - //get arguments - int arg0 = args[0]->IntegerValue(); - int arg1 = args[1]->IntegerValue(); - + if (args.Length() < 2 || !args[0]->IsUint32() || !args[1]->IsObject()) + return ThrowException(String::New("Bad arguments")); - Handle arrHandle2 = Handle::Cast(args[2]); - GLfloat* arg2 = new GLfloat[arrHandle2->Length()]; - for (unsigned j = 0; j < arrHandle2->Length(); j++) { - Handle arg(arrHandle2->Get(Integer::New(j))); - GLfloat aux = ( GLfloat)arg->NumberValue(); - arg2[j] = aux; + //get arguments + unsigned int location = args[0]->Uint32Value(); + Handle value = Handle::Cast(args[1]); + const unsigned VECTOR_SIZE = 4; + GLfloat *data; + unsigned count; + + if (value->IsArray()) { + Handle arrHandle = Handle::Cast(value); + count = arrHandle->Length() / VECTOR_SIZE; + if ((count * VECTOR_SIZE) != arrHandle->Length()) + return ThrowException(String::New("Value array is wrong size")); + data = new GLfloat[count * VECTOR_SIZE]; + for (unsigned j = 0; j < (count * VECTOR_SIZE); j++) { + Handle arg(arrHandle->Get(Integer::New(j))); + GLfloat aux = ( GLfloat)arg->NumberValue(); + data[j] = aux; + } + } else if (value->HasIndexedPropertiesInExternalArrayData() && + value->GetIndexedPropertiesExternalArrayDataType() == + kExternalFloatArray) { + data = (GLfloat *) value->GetIndexedPropertiesExternalArrayData(); + count = value->GetIndexedPropertiesExternalArrayDataLength() / VECTOR_SIZE; + if ((count * VECTOR_SIZE) != + value->GetIndexedPropertiesExternalArrayDataLength()) + return ThrowException(String::New("Value array is wrong size")); + } else { + return ThrowException(String::New("Bad type for value argument")); } - //make call - glUniform4fv((GLint) arg0, (GLsizei) arg1, (const GLfloat*) arg2); + glUniform4fv((GLint) location, (GLsizei) count, + (const GLfloat*) data); + Handle res(GlesFactory::self_); return res; } @@ -3454,24 +3534,45 @@ Handle GLESglUniform4ivCallback(const Arguments& args) { Handle GLESglUniformMatrix2fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); - //get arguments - int arg0 = args[0]->IntegerValue(); - int arg1 = args[1]->IntegerValue(); - unsigned int arg2 = args[2]->Uint32Value(); - + if (args.Length() < 3 || !args[0]->IsUint32() || + !(args[1]->IsBoolean() || args[1]->IsUint32()) || + !args[2]->IsObject()) + return ThrowException(String::New("Bad arguments")); - Handle arrHandle3 = Handle::Cast(args[3]); - GLfloat* arg3 = new GLfloat[arrHandle3->Length()]; - for (unsigned j = 0; j < arrHandle3->Length(); j++) { - Handle arg(arrHandle3->Get(Integer::New(j))); - GLfloat aux = ( GLfloat)arg->NumberValue(); - arg3[j] = aux; + //get arguments + unsigned int location = args[0]->Uint32Value(); + bool transpose = args[1]->BooleanValue(); + Handle value = Handle::Cast(args[2]); + const unsigned MATRIX_SIZE = 4; // 2x2 matrix + GLfloat *data; + unsigned count; + + if (value->IsArray()) { + Handle arrHandle = Handle::Cast(value); + count = arrHandle->Length() / MATRIX_SIZE; + if ((count * MATRIX_SIZE) != arrHandle->Length()) + return ThrowException(String::New("Value array is wrong size")); + data = new GLfloat[count * MATRIX_SIZE]; + for (unsigned j = 0; j < (count * MATRIX_SIZE); j++) { + Handle arg(arrHandle->Get(Integer::New(j))); + GLfloat aux = ( GLfloat)arg->NumberValue(); + data[j] = aux; + } + } else if (value->HasIndexedPropertiesInExternalArrayData() && + value->GetIndexedPropertiesExternalArrayDataType() == + kExternalFloatArray) { + data = (GLfloat *) value->GetIndexedPropertiesExternalArrayData(); + count = value->GetIndexedPropertiesExternalArrayDataLength() / MATRIX_SIZE; + if ((count * MATRIX_SIZE) != + value->GetIndexedPropertiesExternalArrayDataLength()) + return ThrowException(String::New("Value array is wrong size")); + } else { + return ThrowException(String::New("Bad type for value argument")); } - //make call - glUniformMatrix2fv((GLint) arg0, (GLsizei) arg1, (GLboolean) arg2, (const GLfloat*) arg3); + glUniformMatrix2fv((GLint) location, (GLsizei) count, + (GLboolean) transpose, (const GLfloat*) data); Handle res(GlesFactory::self_); return res; } @@ -3481,24 +3582,45 @@ Handle GLESglUniformMatrix2fvCallback(const Arguments& args) { Handle GLESglUniformMatrix3fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); - //get arguments - int arg0 = args[0]->IntegerValue(); - int arg1 = args[1]->IntegerValue(); - unsigned int arg2 = args[2]->Uint32Value(); - + if (args.Length() < 3 || !args[0]->IsUint32() || + !(args[1]->IsBoolean() || args[1]->IsUint32()) || + !args[2]->IsObject()) + return ThrowException(String::New("Bad arguments")); - Handle arrHandle3 = Handle::Cast(args[3]); - GLfloat* arg3 = new GLfloat[arrHandle3->Length()]; - for (unsigned j = 0; j < arrHandle3->Length(); j++) { - Handle arg(arrHandle3->Get(Integer::New(j))); - GLfloat aux = ( GLfloat)arg->NumberValue(); - arg3[j] = aux; + //get arguments + unsigned int location = args[0]->Uint32Value(); + bool transpose = args[1]->BooleanValue(); + Handle value = Handle::Cast(args[2]); + const unsigned MATRIX_SIZE = 9; // 3x3 matrix + GLfloat *data; + unsigned count; + + if (value->IsArray()) { + Handle arrHandle = Handle::Cast(value); + count = arrHandle->Length() / MATRIX_SIZE; + if ((count * MATRIX_SIZE) != arrHandle->Length()) + return ThrowException(String::New("Value array is wrong size")); + data = new GLfloat[count * MATRIX_SIZE]; + for (unsigned j = 0; j < (count * MATRIX_SIZE); j++) { + Handle arg(arrHandle->Get(Integer::New(j))); + GLfloat aux = ( GLfloat)arg->NumberValue(); + data[j] = aux; + } + } else if (value->HasIndexedPropertiesInExternalArrayData() && + value->GetIndexedPropertiesExternalArrayDataType() == + kExternalFloatArray) { + data = (GLfloat *) value->GetIndexedPropertiesExternalArrayData(); + count = value->GetIndexedPropertiesExternalArrayDataLength() / MATRIX_SIZE; + if ((count * MATRIX_SIZE) != + value->GetIndexedPropertiesExternalArrayDataLength()) + return ThrowException(String::New("Value array is wrong size")); + } else { + return ThrowException(String::New("Bad type for value argument")); } - //make call - glUniformMatrix3fv((GLint) arg0, (GLsizei) arg1, (GLboolean) arg2, (const GLfloat*) arg3); + glUniformMatrix3fv((GLint) location, (GLsizei) count, + (GLboolean) transpose, (const GLfloat*) data); Handle res(GlesFactory::self_); return res; } @@ -3508,24 +3630,45 @@ Handle GLESglUniformMatrix3fvCallback(const Arguments& args) { Handle GLESglUniformMatrix4fvCallback(const Arguments& args) { //if less that nbr of formal parameters then do nothing - if (args.Length() < 4) return ThrowException(String::New("Bad arguments")); - //get arguments - int arg0 = args[0]->IntegerValue(); - int arg1 = args[1]->IntegerValue(); - unsigned int arg2 = args[2]->Uint32Value(); - + if (args.Length() < 3 || !args[0]->IsUint32() || + !(args[1]->IsBoolean() || args[1]->IsUint32()) || + !args[2]->IsObject()) + return ThrowException(String::New("Bad arguments")); - Handle arrHandle3 = Handle::Cast(args[3]); - GLfloat* arg3 = new GLfloat[arrHandle3->Length()]; - for (unsigned j = 0; j < arrHandle3->Length(); j++) { - Handle arg(arrHandle3->Get(Integer::New(j))); - GLfloat aux = ( GLfloat)arg->NumberValue(); - arg3[j] = aux; + //get arguments + unsigned int location = args[0]->Uint32Value(); + bool transpose = args[1]->BooleanValue(); + Handle value = Handle::Cast(args[2]); + const unsigned MATRIX_SIZE = 16; // 4x4 matrix + GLfloat *data; + unsigned count; + + if (value->IsArray()) { + Handle arrHandle = Handle::Cast(value); + count = arrHandle->Length() / MATRIX_SIZE; + if ((count * MATRIX_SIZE) != arrHandle->Length()) + return ThrowException(String::New("Value array is wrong size")); + data = new GLfloat[count * MATRIX_SIZE]; + for (unsigned j = 0; j < (count * MATRIX_SIZE); j++) { + Handle arg(arrHandle->Get(Integer::New(j))); + GLfloat aux = ( GLfloat)arg->NumberValue(); + data[j] = aux; + } + } else if (value->HasIndexedPropertiesInExternalArrayData() && + value->GetIndexedPropertiesExternalArrayDataType() == + kExternalFloatArray) { + data = (GLfloat *) value->GetIndexedPropertiesExternalArrayData(); + count = value->GetIndexedPropertiesExternalArrayDataLength() / MATRIX_SIZE; + if ((count * MATRIX_SIZE) != + value->GetIndexedPropertiesExternalArrayDataLength()) + return ThrowException(String::New("Value array is wrong size")); + } else { + return ThrowException(String::New("Bad type for value argument")); } - //make call - glUniformMatrix4fv((GLint) arg0, (GLsizei) arg1, (GLboolean) arg2, (const GLfloat*) arg3); + glUniformMatrix4fv((GLint) location, (GLsizei) count, + (GLboolean) transpose, (const GLfloat*) data); Handle res(GlesFactory::self_); return res; } From c58afc4c408d75cc5580d165a2279ff40e4454b6 Mon Sep 17 00:00:00 2001 From: "C. Scott Ananian" Date: Sun, 4 Dec 2011 06:29:40 -0500 Subject: [PATCH 11/11] Accept TypedArray argument to Gles.texImage2D(). --- glesbindings/glesbind.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/glesbindings/glesbind.cpp b/glesbindings/glesbind.cpp index d9b5ce7..b33d2b1 100755 --- a/glesbindings/glesbind.cpp +++ b/glesbindings/glesbind.cpp @@ -1169,6 +1169,33 @@ Handle GLESglTexImage2DCallback(const Arguments& args) { unsigned format = args[6]->Uint32Value(); unsigned type = args[7]->Uint32Value(); + if(args[8]->IsObject() && + Handle::Cast(args[8])->HasIndexedPropertiesInExternalArrayData()) { + Handle obj = Handle::Cast(args[8]); + const void *pixels = obj->GetIndexedPropertiesExternalArrayData(); + ExternalArrayType atype = obj->GetIndexedPropertiesExternalArrayDataType(); + unsigned int length = obj->GetIndexedPropertiesExternalArrayDataLength(); + if (type == GL_UNSIGNED_BYTE && + atype == kExternalUnsignedByteArray) { + // XXX check length here + glTexImage2D((GLenum)target, (GLint)level, (GLenum)internal_format, + (GLsizei)width, (GLsizei)height, (GLint)border, + (GLenum)format, (GLenum)type, + pixels); + return v8::Undefined(); + } + if ((type == GL_UNSIGNED_SHORT_5_6_5 || + type == GL_UNSIGNED_SHORT_4_4_4_4 || + type == GL_UNSIGNED_SHORT_5_5_5_1) && + atype == kExternalUnsignedShortArray) { + // XXX check length here + glTexImage2D((GLenum)target, (GLint)level, (GLenum)internal_format, + (GLsizei)width, (GLsizei)height, (GLint)border, + (GLenum)format, (GLenum)type, + pixels); + return v8::Undefined(); + } + } if(args[8]->IsArray()) { Handle arr_handle = Handle::Cast(args[8]);