diff options
Diffstat (limited to 'Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp')
-rw-r--r-- | Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp | 727 |
1 files changed, 10 insertions, 717 deletions
diff --git a/Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp b/Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp index 9e390fc23..65abcdd1f 100644 --- a/Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp +++ b/Source/WebCore/bindings/js/JSWebGLRenderingContextCustom.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Apple Inc. All rights reserved. + * Copyright (C) 2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -10,10 +10,10 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR @@ -26,727 +26,20 @@ #include "config.h" #if ENABLE(WEBGL) - #include "JSWebGLRenderingContext.h" - -#include "ANGLEInstancedArrays.h" -#include "EXTDrawBuffers.h" -#include "EXTTextureFilterAnisotropic.h" -#include "ExceptionCode.h" -#include "HTMLCanvasElement.h" -#include "HTMLImageElement.h" -#include "JSANGLEInstancedArrays.h" -#include "JSEXTDrawBuffers.h" -#include "JSEXTTextureFilterAnisotropic.h" -#include "JSHTMLCanvasElement.h" -#include "JSHTMLImageElement.h" -#include "JSImageData.h" -#include "JSOESElementIndexUint.h" -#include "JSOESStandardDerivatives.h" -#include "JSOESTextureFloat.h" -#include "JSOESTextureFloatLinear.h" -#include "JSOESTextureHalfFloat.h" -#include "JSOESTextureHalfFloatLinear.h" -#include "JSOESVertexArrayObject.h" -#include "JSWebGLBuffer.h" -#include "JSWebGLCompressedTextureATC.h" -#include "JSWebGLCompressedTexturePVRTC.h" -#include "JSWebGLCompressedTextureS3TC.h" -#include "JSWebGLDebugRendererInfo.h" -#include "JSWebGLDebugShaders.h" -#include "JSWebGLDepthTexture.h" -#include "JSWebGLFramebuffer.h" -#include "JSWebGLLoseContext.h" -#include "JSWebGLProgram.h" -#include "JSWebGLRenderbuffer.h" -#include "JSWebGLShader.h" -#include "JSWebGLTexture.h" -#include "JSWebGLUniformLocation.h" -#include "JSWebGLVertexArrayObjectOES.h" -#include "JSWebKitCSSMatrix.h" -#include "NotImplemented.h" -#include "OESElementIndexUint.h" -#include "OESStandardDerivatives.h" -#include "OESTextureFloat.h" -#include "OESTextureFloatLinear.h" -#include "OESTextureHalfFloat.h" -#include "OESTextureHalfFloatLinear.h" -#include "OESVertexArrayObject.h" -#include "WebGLBuffer.h" -#include "WebGLCompressedTextureATC.h" -#include "WebGLCompressedTexturePVRTC.h" -#include "WebGLCompressedTextureS3TC.h" -#include "WebGLDebugRendererInfo.h" -#include "WebGLDebugShaders.h" -#include "WebGLDepthTexture.h" -#include "WebGLExtension.h" -#include "WebGLFramebuffer.h" -#include "WebGLGetInfo.h" -#include "WebGLLoseContext.h" -#include "WebGLProgram.h" -#include "WebGLRenderingContext.h" -#include "WebGLVertexArrayObjectOES.h" -#include <runtime/Error.h> -#include <runtime/JSTypedArrays.h> -#include <runtime/TypedArrayInlines.h> -#include <runtime/TypedArrays.h> -#include <wtf/FastMalloc.h> - -#if ENABLE(VIDEO) -#include "HTMLVideoElement.h" -#include "JSHTMLVideoElement.h" -#endif +#include "DOMWrapperWorld.h" +#include <JavaScriptCore/JSCellInlines.h> +#include <JavaScriptCore/StructureInlines.h> +#include <heap/HeapInlines.h> +#include <heap/SlotVisitorInlines.h> using namespace JSC; namespace WebCore { -static JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, const WebGLGetInfo& info) -{ - switch (info.getType()) { - case WebGLGetInfo::kTypeBool: - return jsBoolean(info.getBool()); - case WebGLGetInfo::kTypeBoolArray: { - MarkedArgumentBuffer list; - const Vector<bool>& value = info.getBoolArray(); - for (size_t ii = 0; ii < value.size(); ++ii) - list.append(jsBoolean(value[ii])); - return constructArray(exec, 0, globalObject, list); - } - case WebGLGetInfo::kTypeFloat: - return jsNumber(info.getFloat()); - case WebGLGetInfo::kTypeInt: - return jsNumber(info.getInt()); - case WebGLGetInfo::kTypeNull: - return jsNull(); - case WebGLGetInfo::kTypeString: - return jsStringWithCache(exec, info.getString()); - case WebGLGetInfo::kTypeUnsignedInt: - return jsNumber(info.getUnsignedInt()); - case WebGLGetInfo::kTypeWebGLBuffer: - return toJS(exec, globalObject, info.getWebGLBuffer()); - case WebGLGetInfo::kTypeWebGLFloatArray: - return toJS(exec, globalObject, info.getWebGLFloatArray()); - case WebGLGetInfo::kTypeWebGLFramebuffer: - return toJS(exec, globalObject, info.getWebGLFramebuffer()); - case WebGLGetInfo::kTypeWebGLIntArray: - return toJS(exec, globalObject, info.getWebGLIntArray()); - // FIXME: implement WebGLObjectArray - // case WebGLGetInfo::kTypeWebGLObjectArray: - case WebGLGetInfo::kTypeWebGLProgram: - return toJS(exec, globalObject, info.getWebGLProgram()); - case WebGLGetInfo::kTypeWebGLRenderbuffer: - return toJS(exec, globalObject, info.getWebGLRenderbuffer()); - case WebGLGetInfo::kTypeWebGLTexture: - return toJS(exec, globalObject, info.getWebGLTexture()); - case WebGLGetInfo::kTypeWebGLUnsignedByteArray: - return toJS(exec, globalObject, info.getWebGLUnsignedByteArray()); - case WebGLGetInfo::kTypeWebGLUnsignedIntArray: - return toJS(exec, globalObject, info.getWebGLUnsignedIntArray()); - case WebGLGetInfo::kTypeWebGLVertexArrayObjectOES: - return toJS(exec, globalObject, info.getWebGLVertexArrayObjectOES()); - default: - notImplemented(); - return jsUndefined(); - } -} - -enum ObjectType { - kBuffer, kRenderbuffer, kTexture, kVertexAttrib -}; - -static JSValue getObjectParameter(JSWebGLRenderingContext* obj, ExecState* exec, ObjectType objectType) -{ - if (exec->argumentCount() != 2) - return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); - - ExceptionCode ec = 0; - WebGLRenderingContext& context = obj->impl(); - unsigned target = exec->uncheckedArgument(0).toInt32(exec); - if (exec->hadException()) - return jsUndefined(); - unsigned pname = exec->uncheckedArgument(1).toInt32(exec); - if (exec->hadException()) - return jsUndefined(); - WebGLGetInfo info; - switch (objectType) { - case kBuffer: - info = context.getBufferParameter(target, pname, ec); - break; - case kRenderbuffer: - info = context.getRenderbufferParameter(target, pname, ec); - break; - case kTexture: - info = context.getTexParameter(target, pname, ec); - break; - case kVertexAttrib: - // target => index - info = context.getVertexAttrib(target, pname, ec); - break; - default: - notImplemented(); - break; - } - if (ec) { - setDOMException(exec, ec); - return jsUndefined(); - } - return toJS(exec, obj->globalObject(), info); -} - -enum WhichProgramCall { - kProgramParameter, kUniform -}; - -static JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, WebGLExtension* extension) -{ - if (!extension) - return jsNull(); - switch (extension->getName()) { - case WebGLExtension::WebGLLoseContextName: - return toJS(exec, globalObject, static_cast<WebGLLoseContext*>(extension)); - case WebGLExtension::EXTDrawBuffersName: - return toJS(exec, globalObject, static_cast<EXTDrawBuffers*>(extension)); - case WebGLExtension::EXTTextureFilterAnisotropicName: - return toJS(exec, globalObject, static_cast<EXTTextureFilterAnisotropic*>(extension)); - case WebGLExtension::OESStandardDerivativesName: - return toJS(exec, globalObject, static_cast<OESStandardDerivatives*>(extension)); - case WebGLExtension::OESTextureFloatName: - return toJS(exec, globalObject, static_cast<OESTextureFloat*>(extension)); - case WebGLExtension::OESTextureFloatLinearName: - return toJS(exec, globalObject, static_cast<OESTextureFloatLinear*>(extension)); - case WebGLExtension::OESTextureHalfFloatName: - return toJS(exec, globalObject, static_cast<OESTextureHalfFloat*>(extension)); - case WebGLExtension::OESTextureHalfFloatLinearName: - return toJS(exec, globalObject, static_cast<OESTextureHalfFloatLinear*>(extension)); - case WebGLExtension::OESVertexArrayObjectName: - return toJS(exec, globalObject, static_cast<OESVertexArrayObject*>(extension)); - case WebGLExtension::OESElementIndexUintName: - return toJS(exec, globalObject, static_cast<OESElementIndexUint*>(extension)); - case WebGLExtension::WebGLDebugRendererInfoName: - return toJS(exec, globalObject, static_cast<WebGLDebugRendererInfo*>(extension)); - case WebGLExtension::WebGLDebugShadersName: - return toJS(exec, globalObject, static_cast<WebGLDebugShaders*>(extension)); - case WebGLExtension::WebGLCompressedTextureATCName: - return toJS(exec, globalObject, static_cast<WebGLCompressedTextureATC*>(extension)); - case WebGLExtension::WebGLCompressedTexturePVRTCName: - return toJS(exec, globalObject, static_cast<WebGLCompressedTexturePVRTC*>(extension)); - case WebGLExtension::WebGLCompressedTextureS3TCName: - return toJS(exec, globalObject, static_cast<WebGLCompressedTextureS3TC*>(extension)); - case WebGLExtension::WebGLDepthTextureName: - return toJS(exec, globalObject, static_cast<WebGLDepthTexture*>(extension)); - case WebGLExtension::ANGLEInstancedArraysName: - return toJS(exec, globalObject, static_cast<ANGLEInstancedArrays*>(extension)); - } - ASSERT_NOT_REACHED(); - return jsNull(); -} - -void JSWebGLRenderingContext::visitChildren(JSCell* cell, SlotVisitor& visitor) -{ - JSWebGLRenderingContext* thisObject = jsCast<JSWebGLRenderingContext*>(cell); - ASSERT_GC_OBJECT_INHERITS(thisObject, info()); - COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); - ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren()); - Base::visitChildren(thisObject, visitor); - visitor.addOpaqueRoot(&thisObject->impl()); -} - -JSValue JSWebGLRenderingContext::getAttachedShaders(ExecState* exec) -{ - if (exec->argumentCount() < 1) - return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); - ExceptionCode ec = 0; - WebGLRenderingContext& context = impl(); - WebGLProgram* program = toWebGLProgram(exec->uncheckedArgument(0)); - if (!program && !exec->uncheckedArgument(0).isUndefinedOrNull()) - return throwTypeError(exec); - Vector<RefPtr<WebGLShader>> shaders; - bool succeed = context.getAttachedShaders(program, shaders, ec); - if (ec) { - setDOMException(exec, ec); - return jsNull(); - } - if (!succeed) - return jsNull(); - MarkedArgumentBuffer list; - for (size_t ii = 0; ii < shaders.size(); ++ii) - list.append(toJS(exec, globalObject(), shaders[ii].get())); - return constructArray(exec, 0, globalObject(), list); -} - -JSValue JSWebGLRenderingContext::getExtension(ExecState* exec) -{ - if (exec->argumentCount() < 1) - return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); - - WebGLRenderingContext& context = impl(); - const String name = exec->uncheckedArgument(0).toString(exec)->value(exec); - if (exec->hadException()) - return jsUndefined(); - WebGLExtension* extension = context.getExtension(name); - return toJS(exec, globalObject(), extension); -} - -JSValue JSWebGLRenderingContext::getBufferParameter(ExecState* exec) -{ - return getObjectParameter(this, exec, kBuffer); -} - -JSValue JSWebGLRenderingContext::getFramebufferAttachmentParameter(ExecState* exec) -{ - if (exec->argumentCount() != 3) - return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); - - ExceptionCode ec = 0; - WebGLRenderingContext& context = impl(); - unsigned target = exec->uncheckedArgument(0).toInt32(exec); - if (exec->hadException()) - return jsUndefined(); - unsigned attachment = exec->uncheckedArgument(1).toInt32(exec); - if (exec->hadException()) - return jsUndefined(); - unsigned pname = exec->uncheckedArgument(2).toInt32(exec); - if (exec->hadException()) - return jsUndefined(); - WebGLGetInfo info = context.getFramebufferAttachmentParameter(target, attachment, pname, ec); - if (ec) { - setDOMException(exec, ec); - return jsUndefined(); - } - return toJS(exec, globalObject(), info); -} - -JSValue JSWebGLRenderingContext::getParameter(ExecState* exec) -{ - if (exec->argumentCount() != 1) - return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); - - ExceptionCode ec = 0; - WebGLRenderingContext& context = impl(); - unsigned pname = exec->uncheckedArgument(0).toInt32(exec); - if (exec->hadException()) - return jsUndefined(); - WebGLGetInfo info = context.getParameter(pname, ec); - if (ec) { - setDOMException(exec, ec); - return jsUndefined(); - } - return toJS(exec, globalObject(), info); -} - -JSValue JSWebGLRenderingContext::getProgramParameter(ExecState* exec) -{ - if (exec->argumentCount() != 2) - return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); - - ExceptionCode ec = 0; - WebGLRenderingContext& context = impl(); - WebGLProgram* program = toWebGLProgram(exec->uncheckedArgument(0)); - if (!program && !exec->uncheckedArgument(0).isUndefinedOrNull()) - return throwTypeError(exec); - unsigned pname = exec->uncheckedArgument(1).toInt32(exec); - if (exec->hadException()) - return jsUndefined(); - WebGLGetInfo info = context.getProgramParameter(program, pname, ec); - if (ec) { - setDOMException(exec, ec); - return jsUndefined(); - } - return toJS(exec, globalObject(), info); -} - -JSValue JSWebGLRenderingContext::getRenderbufferParameter(ExecState* exec) -{ - return getObjectParameter(this, exec, kRenderbuffer); -} - -JSValue JSWebGLRenderingContext::getShaderParameter(ExecState* exec) -{ - if (exec->argumentCount() != 2) - return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); - - ExceptionCode ec = 0; - WebGLRenderingContext& context = impl(); - if (!exec->uncheckedArgument(0).isUndefinedOrNull() && !exec->uncheckedArgument(0).inherits(JSWebGLShader::info())) - return throwTypeError(exec); - WebGLShader* shader = toWebGLShader(exec->uncheckedArgument(0)); - unsigned pname = exec->uncheckedArgument(1).toInt32(exec); - if (exec->hadException()) - return jsUndefined(); - WebGLGetInfo info = context.getShaderParameter(shader, pname, ec); - if (ec) { - setDOMException(exec, ec); - return jsUndefined(); - } - return toJS(exec, globalObject(), info); -} - -JSValue JSWebGLRenderingContext::getSupportedExtensions(ExecState* exec) -{ - WebGLRenderingContext& context = impl(); - if (context.isContextLost()) - return jsNull(); - Vector<String> value = context.getSupportedExtensions(); - MarkedArgumentBuffer list; - for (size_t ii = 0; ii < value.size(); ++ii) - list.append(jsStringWithCache(exec, value[ii])); - return constructArray(exec, 0, globalObject(), list); -} - -JSValue JSWebGLRenderingContext::getTexParameter(ExecState* exec) -{ - return getObjectParameter(this, exec, kTexture); -} - -JSValue JSWebGLRenderingContext::getUniform(ExecState* exec) -{ - if (exec->argumentCount() != 2) - return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); - - ExceptionCode ec = 0; - WebGLRenderingContext& context = impl(); - WebGLProgram* program = toWebGLProgram(exec->uncheckedArgument(0)); - if (!program && !exec->uncheckedArgument(0).isUndefinedOrNull()) - return throwTypeError(exec); - WebGLUniformLocation* location = toWebGLUniformLocation(exec->uncheckedArgument(1)); - if (!location && !exec->uncheckedArgument(1).isUndefinedOrNull()) - return throwTypeError(exec); - WebGLGetInfo info = context.getUniform(program, location, ec); - if (ec) { - setDOMException(exec, ec); - return jsUndefined(); - } - return toJS(exec, globalObject(), info); -} - -JSValue JSWebGLRenderingContext::getVertexAttrib(ExecState* exec) -{ - return getObjectParameter(this, exec, kVertexAttrib); -} - -template<typename T, size_t inlineCapacity> -bool toVector(JSC::ExecState* exec, JSC::JSValue value, Vector<T, inlineCapacity>& vector) -{ - if (!value.isObject()) - return false; - - JSC::JSObject* object = asObject(value); - int32_t length = object->get(exec, exec->vm().propertyNames->length).toInt32(exec); - - if (!vector.tryReserveCapacity(length)) - return false; - vector.resize(length); - - for (int32_t i = 0; i < length; ++i) { - JSC::JSValue v = object->get(exec, i); - if (exec->hadException()) - return false; - vector[i] = static_cast<T>(v.toNumber(exec)); - } - - return true; -} - -enum DataFunctionToCall { - f_uniform1v, f_uniform2v, f_uniform3v, f_uniform4v, - f_vertexAttrib1v, f_vertexAttrib2v, f_vertexAttrib3v, f_vertexAttrib4v -}; - -enum DataFunctionMatrixToCall { - f_uniformMatrix2fv, f_uniformMatrix3fv, f_uniformMatrix4fv -}; - -static bool functionForUniform(DataFunctionToCall f) -{ - switch (f) { - case f_uniform1v: - case f_uniform2v: - case f_uniform3v: - case f_uniform4v: - return true; - break; - default: break; - } - return false; -} - -static JSC::JSValue dataFunctionf(DataFunctionToCall f, JSC::ExecState* exec, WebGLRenderingContext& context) -{ - if (exec->argumentCount() != 2) - return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); - - WebGLUniformLocation* location = 0; - long index = -1; - - if (functionForUniform(f)) { - location = toWebGLUniformLocation(exec->uncheckedArgument(0)); - if (!location && !exec->uncheckedArgument(0).isUndefinedOrNull()) - return throwTypeError(exec); - } else - index = exec->uncheckedArgument(0).toInt32(exec); - - if (exec->hadException()) - return jsUndefined(); - - RefPtr<Float32Array> webGLArray = toFloat32Array(exec->uncheckedArgument(1)); - if (exec->hadException()) - return jsUndefined(); - - ExceptionCode ec = 0; - if (webGLArray) { - switch (f) { - case f_uniform1v: - context.uniform1fv(location, webGLArray.get(), ec); - break; - case f_uniform2v: - context.uniform2fv(location, webGLArray.get(), ec); - break; - case f_uniform3v: - context.uniform3fv(location, webGLArray.get(), ec); - break; - case f_uniform4v: - context.uniform4fv(location, webGLArray.get(), ec); - break; - case f_vertexAttrib1v: - context.vertexAttrib1fv(index, webGLArray.get()); - break; - case f_vertexAttrib2v: - context.vertexAttrib2fv(index, webGLArray.get()); - break; - case f_vertexAttrib3v: - context.vertexAttrib3fv(index, webGLArray.get()); - break; - case f_vertexAttrib4v: - context.vertexAttrib4fv(index, webGLArray.get()); - break; - } - - setDOMException(exec, ec); - return jsUndefined(); - } - - Vector<float, 64> array; - if (!toVector(exec, exec->uncheckedArgument(1), array)) - return throwTypeError(exec); - - switch (f) { - case f_uniform1v: - context.uniform1fv(location, array.data(), array.size(), ec); - break; - case f_uniform2v: - context.uniform2fv(location, array.data(), array.size(), ec); - break; - case f_uniform3v: - context.uniform3fv(location, array.data(), array.size(), ec); - break; - case f_uniform4v: - context.uniform4fv(location, array.data(), array.size(), ec); - break; - case f_vertexAttrib1v: - context.vertexAttrib1fv(index, array.data(), array.size()); - break; - case f_vertexAttrib2v: - context.vertexAttrib2fv(index, array.data(), array.size()); - break; - case f_vertexAttrib3v: - context.vertexAttrib3fv(index, array.data(), array.size()); - break; - case f_vertexAttrib4v: - context.vertexAttrib4fv(index, array.data(), array.size()); - break; - } - - setDOMException(exec, ec); - return jsUndefined(); -} - -static JSC::JSValue dataFunctioni(DataFunctionToCall f, JSC::ExecState* exec, WebGLRenderingContext& context) -{ - if (exec->argumentCount() != 2) - return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); - - WebGLUniformLocation* location = toWebGLUniformLocation(exec->uncheckedArgument(0)); - if (!location && !exec->uncheckedArgument(0).isUndefinedOrNull()) - return throwTypeError(exec); - - RefPtr<Int32Array> webGLArray = toInt32Array(exec->uncheckedArgument(1)); - - ExceptionCode ec = 0; - if (webGLArray) { - switch (f) { - case f_uniform1v: - context.uniform1iv(location, webGLArray.get(), ec); - break; - case f_uniform2v: - context.uniform2iv(location, webGLArray.get(), ec); - break; - case f_uniform3v: - context.uniform3iv(location, webGLArray.get(), ec); - break; - case f_uniform4v: - context.uniform4iv(location, webGLArray.get(), ec); - break; - default: - break; - } - - setDOMException(exec, ec); - return jsUndefined(); - } - - - Vector<int, 64> array; - if (!toVector(exec, exec->uncheckedArgument(1), array)) - return throwTypeError(exec); - - switch (f) { - case f_uniform1v: - context.uniform1iv(location, array.data(), array.size(), ec); - break; - case f_uniform2v: - context.uniform2iv(location, array.data(), array.size(), ec); - break; - case f_uniform3v: - context.uniform3iv(location, array.data(), array.size(), ec); - break; - case f_uniform4v: - context.uniform4iv(location, array.data(), array.size(), ec); - break; - default: - break; - } - - setDOMException(exec, ec); - return jsUndefined(); -} - -static JSC::JSValue dataFunctionMatrix(DataFunctionMatrixToCall f, JSC::ExecState* exec, WebGLRenderingContext& context) -{ - if (exec->argumentCount() != 3) - return exec->vm().throwException(exec, createNotEnoughArgumentsError(exec)); - - WebGLUniformLocation* location = toWebGLUniformLocation(exec->uncheckedArgument(0)); - if (!location && !exec->uncheckedArgument(0).isUndefinedOrNull()) - return throwTypeError(exec); - - bool transpose = exec->uncheckedArgument(1).toBoolean(exec); - if (exec->hadException()) - return jsUndefined(); - - RefPtr<Float32Array> webGLArray = toFloat32Array(exec->uncheckedArgument(2)); - - ExceptionCode ec = 0; - if (webGLArray) { - switch (f) { - case f_uniformMatrix2fv: - context.uniformMatrix2fv(location, transpose, webGLArray.get(), ec); - break; - case f_uniformMatrix3fv: - context.uniformMatrix3fv(location, transpose, webGLArray.get(), ec); - break; - case f_uniformMatrix4fv: - context.uniformMatrix4fv(location, transpose, webGLArray.get(), ec); - break; - } - - setDOMException(exec, ec); - return jsUndefined(); - } - - Vector<float, 64> array; - if (!toVector(exec, exec->uncheckedArgument(2), array)) - return throwTypeError(exec); - - switch (f) { - case f_uniformMatrix2fv: - context.uniformMatrix2fv(location, transpose, array.data(), array.size(), ec); - break; - case f_uniformMatrix3fv: - context.uniformMatrix3fv(location, transpose, array.data(), array.size(), ec); - break; - case f_uniformMatrix4fv: - context.uniformMatrix4fv(location, transpose, array.data(), array.size(), ec); - break; - } - - setDOMException(exec, ec); - return jsUndefined(); -} - -JSC::JSValue JSWebGLRenderingContext::uniform1fv(JSC::ExecState* exec) -{ - return dataFunctionf(f_uniform1v, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::uniform1iv(JSC::ExecState* exec) -{ - return dataFunctioni(f_uniform1v, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::uniform2fv(JSC::ExecState* exec) -{ - return dataFunctionf(f_uniform2v, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::uniform2iv(JSC::ExecState* exec) -{ - return dataFunctioni(f_uniform2v, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::uniform3fv(JSC::ExecState* exec) -{ - return dataFunctionf(f_uniform3v, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::uniform3iv(JSC::ExecState* exec) -{ - return dataFunctioni(f_uniform3v, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::uniform4fv(JSC::ExecState* exec) -{ - return dataFunctionf(f_uniform4v, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::uniform4iv(JSC::ExecState* exec) -{ - return dataFunctioni(f_uniform4v, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::uniformMatrix2fv(JSC::ExecState* exec) -{ - return dataFunctionMatrix(f_uniformMatrix2fv, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::uniformMatrix3fv(JSC::ExecState* exec) -{ - return dataFunctionMatrix(f_uniformMatrix3fv, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::uniformMatrix4fv(JSC::ExecState* exec) -{ - return dataFunctionMatrix(f_uniformMatrix4fv, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::vertexAttrib1fv(JSC::ExecState* exec) -{ - return dataFunctionf(f_vertexAttrib1v, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::vertexAttrib2fv(JSC::ExecState* exec) -{ - return dataFunctionf(f_vertexAttrib2v, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::vertexAttrib3fv(JSC::ExecState* exec) -{ - return dataFunctionf(f_vertexAttrib3v, exec, impl()); -} - -JSC::JSValue JSWebGLRenderingContext::vertexAttrib4fv(JSC::ExecState* exec) +void JSWebGLRenderingContext::visitAdditionalChildren(SlotVisitor& visitor) { - return dataFunctionf(f_vertexAttrib4v, exec, impl()); + visitor.addOpaqueRoot(&wrapped()); } } // namespace WebCore |