// sequence<DOMString>? getSupportedExtensions(); bool JSB_glGetSupportedExtensions(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 0, cx, false, "Invalid number of arguments" ); JS::CallArgs args = JS::CallArgsFromVp(argc, vp); const GLubyte *extensions = glGetString(GL_EXTENSIONS); JS::RootedObject jsobj(cx, JS_NewArrayObject(cx, 0)); JSB_PRECONDITION2(jsobj, cx, false, "Error creating JS Object"); // copy, to be able to add '\0' size_t len = strlen((char*)extensions); GLubyte* copy = new (std::nothrow) GLubyte[len+1]; strncpy((char*)copy, (const char*)extensions, len ); int start_extension=0; int element=0; for( size_t i=0; i<len+1; i++) { if( copy[i]==' ' || copy[i]==',' || i==len ) { copy[i] = 0; JS::RootedValue str(cx, charptr_to_jsval(cx, (const char*)©[start_extension])); JS_SetElement(cx, jsobj, element++, str ); start_extension = i+1; i++; } } args.rval().set(OBJECT_TO_JSVAL(jsobj)); CC_SAFE_DELETE_ARRAY(copy); return true; }
// sequence<DOMString>? getSupportedExtensions(); JSBool JSB_glGetSupportedExtensions(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 0, cx, JS_FALSE, "Invalid number of arguments" ); const GLubyte *extensions = glGetString(GL_EXTENSIONS); JSObject *jsobj = JS_NewArrayObject(cx, 0, NULL); JSB_PRECONDITION2(jsobj, cx, JS_FALSE, "Error creating JS Object"); // copy, to be able to add '\0' size_t len = strlen((char*)extensions); GLubyte* copy = new GLubyte[len+1]; strncpy((char*)copy, (const char*)extensions, len ); int start_extension=0; int element=0; for( int i=0; i<len+1; i++) { if( copy[i]==' ' || copy[i]==',' || i==len ) { copy[i] = 0; jsval str = charptr_to_jsval(cx, (const char*)©[start_extension]); JS_SetElement(cx, jsobj, element++, &str ); start_extension = i+1; i++; } } JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(jsobj)); CC_SAFE_DELETE_ARRAY(copy); return JS_TRUE; }
// interface WebGLActiveInfo { // readonly attribute GLint size; // readonly attribute GLenum type; // readonly attribute DOMString name; // WebGLActiveInfo? getActiveAttrib(WebGLProgram? program, GLuint index); JSBool JSB_glGetActiveAttrib(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 2, cx, JS_FALSE, "Invalid number of arguments" ); jsval *argvp = JS_ARGV(cx,vp); JSBool ok = JS_TRUE; uint32_t arg0, arg1; ok &= jsval_to_uint( cx, *argvp++, &arg0 ); ok &= jsval_to_uint( cx, *argvp++, &arg1 ); JSB_PRECONDITION2(ok, cx, JS_FALSE, "Error processing arguments"); GLsizei length; glGetProgramiv(arg0, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &length); GLchar* buffer = new GLchar[length]; GLint size = -1; GLenum type = -1; glGetActiveAttrib(arg0, arg1, length, NULL, &size, &type, buffer); jsval retval = JSVAL_VOID; JSObject *object = JS_NewObject(cx, NULL, NULL, NULL ); JSB_PRECONDITION2(ok, cx, JS_FALSE, "Error creating JS Object"); if (!JS_DefineProperty(cx, object, "size", INT_TO_JSVAL(size), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) || !JS_DefineProperty(cx, object, "type", INT_TO_JSVAL(type), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) || !JS_DefineProperty(cx, object, "name", charptr_to_jsval(cx, buffer), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) ) return JS_FALSE; retval = OBJECT_TO_JSVAL(object); JS_SET_RVAL(cx, vp, retval); CC_SAFE_DELETE_ARRAY(buffer); return JS_TRUE; }
// Arguments: char* // Ret value: const char* JSBool JSB_localStorageGetItem(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 1, cx, JS_FALSE, "Invalid number of arguments" ); jsval *argvp = JS_ARGV(cx,vp); JSBool ok = JS_TRUE; const char* arg0; ok &= jsval_to_charptr( cx, *argvp++, &arg0 ); JSB_PRECONDITION2(ok, cx, JS_FALSE, "Error processing arguments"); const char* ret_val; ret_val = localStorageGetItem((char*)arg0 ); jsval ret_jsval = charptr_to_jsval( cx, ret_val); JS_SET_RVAL(cx, vp, ret_jsval ); return JS_TRUE; }
// DOMString? getShaderSource(WebGLShader? shader); bool JSB_glGetShaderSource(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 1, cx, false, "Invalid number of arguments" ); JS::CallArgs args = JS::CallArgsFromVp(argc, vp); bool ok = true; uint32_t arg0; ok &= jsval_to_uint( cx, args.get(0), &arg0 ); JSB_PRECONDITION2(ok, cx, false, "Error processing arguments"); GLsizei length; glGetShaderiv(arg0, GL_SHADER_SOURCE_LENGTH, &length); GLchar* src = new (std::nothrow) GLchar[length]; glGetShaderSource(arg0, length, NULL, src); args.rval().set(charptr_to_jsval(cx, src)); CC_SAFE_DELETE_ARRAY(src); return true; }
// DOMString? getShaderSource(WebGLShader? shader); JSBool JSB_glGetShaderSource(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 1, cx, JS_FALSE, "Invalid number of arguments" ); jsval *argvp = JS_ARGV(cx,vp); JSBool ok = JS_TRUE; uint32_t arg0; ok &= jsval_to_uint( cx, *argvp++, &arg0 ); JSB_PRECONDITION2(ok, cx, JS_FALSE, "Error processing arguments"); GLsizei length; glGetShaderiv(arg0, GL_SHADER_SOURCE_LENGTH, &length); GLchar* src = new GLchar[length]; glGetShaderSource(arg0, length, NULL, src); JS_SET_RVAL(cx, vp, charptr_to_jsval(cx, src)); CC_SAFE_DELETE_ARRAY(src); return JS_TRUE; }
bool JSB_glGetProgramInfoLog(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 1, cx, false, "Invalid number of arguments" ); JS::CallArgs args = JS::CallArgsFromVp(argc, vp); bool ok = true; uint32_t arg0; ok &= jsval_to_uint( cx, args.get(0), &arg0 ); JSB_PRECONDITION2(ok, cx, false, "Error processing arguments"); GLsizei length; glGetProgramiv(arg0, GL_INFO_LOG_LENGTH, &length); GLchar* src = new GLchar[length]; glGetProgramInfoLog(arg0, length, NULL, src); args.rval().set(charptr_to_jsval(cx, src)); CC_SAFE_DELETE_ARRAY(src); return true; }
// interface WebGLActiveInfo { // readonly attribute GLint size; // readonly attribute GLenum type; // readonly attribute DOMString name; // }; // WebGLActiveInfo? getActiveUniform(WebGLProgram? program, GLuint index); bool JSB_glGetActiveUniform(JSContext *cx, uint32_t argc, jsval *vp) { JSB_PRECONDITION2( argc == 2, cx, false, "Invalid number of arguments" ); JS::CallArgs args = JS::CallArgsFromVp(argc, vp); bool ok = true; uint32_t arg0, arg1; ok &= jsval_to_uint( cx, args.get(0), &arg0 ); ok &= jsval_to_uint( cx, args.get(1), &arg1 ); JSB_PRECONDITION2(ok, cx, false, "Error processing arguments"); GLsizei length; glGetProgramiv(arg0, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &length); GLchar* buffer = new (std::nothrow) GLchar[length]; GLint size = -1; GLenum type = -1; glGetActiveUniform(arg0, arg1, length, NULL, &size, &type, buffer); jsval retval = JSVAL_VOID; JS::RootedObject object(cx, JS_NewObject(cx, NULL, JS::NullPtr(), JS::NullPtr() )); JSB_PRECONDITION2(ok, cx, false, "Error creating JS Object"); JS::RootedValue jsname(cx, charptr_to_jsval(cx, buffer)); if (!JS_DefineProperty(cx, object, "size", (int32_t)size, JSPROP_ENUMERATE | JSPROP_PERMANENT) || !JS_DefineProperty(cx, object, "type", (int32_t)type, JSPROP_ENUMERATE | JSPROP_PERMANENT) || !JS_DefineProperty(cx, object, "name", jsname, JSPROP_ENUMERATE | JSPROP_PERMANENT) ) return false; retval = OBJECT_TO_JSVAL(object); args.rval().set(retval); CC_SAFE_DELETE_ARRAY(buffer); return true; }