gwt.g3d.client.gl2.GL2Impl.java Source code

Java tutorial

Introduction

Here is the source code for gwt.g3d.client.gl2.GL2Impl.java

Source

/*
 * Copyright 2009 Hao Nguyen
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package gwt.g3d.client.gl2;

import static gwt.g3d.client.gl2.array.JsArrayUtils.toJsArrayInteger;
import static gwt.g3d.client.gl2.array.JsArrayUtils.toJsArrayNumber;
import gwt.g2d.client.graphics.canvas.CanvasElement;
import gwt.g2d.client.graphics.canvas.ImageData;
import gwt.g2d.client.media.VideoElement;
import gwt.g3d.client.gl2.array.ArrayBuffer;
import gwt.g3d.client.gl2.array.ArrayBufferView;
import gwt.g3d.client.gl2.array.Float32Array;
import gwt.g3d.client.gl2.array.Int32Array;
import gwt.g3d.client.gl2.array.TypeArray;
import gwt.g3d.client.gl2.array.WebGLArray;
import gwt.g3d.client.gl2.array.WebGLArrayBuffer;
import gwt.g3d.client.gl2.array.WebGLFloatArray;
import gwt.g3d.client.gl2.array.WebGLIntArray;
import gwt.g3d.client.gl2.enums.BeginMode;
import gwt.g3d.client.gl2.enums.BlendEquationMode;
import gwt.g3d.client.gl2.enums.BlendingFactorDest;
import gwt.g3d.client.gl2.enums.BlendingFactorSrc;
import gwt.g3d.client.gl2.enums.BufferParameterName;
import gwt.g3d.client.gl2.enums.BufferTarget;
import gwt.g3d.client.gl2.enums.BufferUsage;
import gwt.g3d.client.gl2.enums.ClearBufferMask;
import gwt.g3d.client.gl2.enums.CullFaceMode;
import gwt.g3d.client.gl2.enums.DataType;
import gwt.g3d.client.gl2.enums.DepthFunction;
import gwt.g3d.client.gl2.enums.DrawElementsType;
import gwt.g3d.client.gl2.enums.EnableCap;
import gwt.g3d.client.gl2.enums.ErrorCode;
import gwt.g3d.client.gl2.enums.FramebufferErrorCode;
import gwt.g3d.client.gl2.enums.FramebufferParameterName;
import gwt.g3d.client.gl2.enums.FramebufferSlot;
import gwt.g3d.client.gl2.enums.FramebufferTarget;
import gwt.g3d.client.gl2.enums.FrontFaceDirection;
import gwt.g3d.client.gl2.enums.GetPName;
import gwt.g3d.client.gl2.enums.HintMode;
import gwt.g3d.client.gl2.enums.HintTarget;
import gwt.g3d.client.gl2.enums.PixelFormat;
import gwt.g3d.client.gl2.enums.PixelInternalFormat;
import gwt.g3d.client.gl2.enums.PixelStoreParameter;
import gwt.g3d.client.gl2.enums.PixelType;
import gwt.g3d.client.gl2.enums.ProgramParameter;
import gwt.g3d.client.gl2.enums.RenderbufferInternalFormat;
import gwt.g3d.client.gl2.enums.RenderbufferParameterName;
import gwt.g3d.client.gl2.enums.RenderbufferTarget;
import gwt.g3d.client.gl2.enums.ShaderParameter;
import gwt.g3d.client.gl2.enums.ShaderType;
import gwt.g3d.client.gl2.enums.StencilFunction;
import gwt.g3d.client.gl2.enums.StencilOp;
import gwt.g3d.client.gl2.enums.StringName;
import gwt.g3d.client.gl2.enums.TextureMagFilter;
import gwt.g3d.client.gl2.enums.TextureMinFilter;
import gwt.g3d.client.gl2.enums.TextureParameterName;
import gwt.g3d.client.gl2.enums.TextureTarget;
import gwt.g3d.client.gl2.enums.TextureUnit;
import gwt.g3d.client.gl2.enums.TextureWrapMode;
import gwt.g3d.client.gl2.enums.VertexAttribParameter;
import gwt.g3d.client.math.MatrixUtils;

import javax.vecmath.Matrix3f;
import javax.vecmath.Matrix4f;
import javax.vecmath.Tuple2f;
import javax.vecmath.Tuple2i;
import javax.vecmath.Tuple3f;
import javax.vecmath.Tuple3i;
import javax.vecmath.Tuple4f;
import javax.vecmath.Tuple4i;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayInteger;
import com.google.gwt.core.client.JsArrayNumber;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.dom.client.ImageElement;

/**
 * Default implementation of WebGL context.
 * 
 * @author hao1300@gmail.com
 */
@SuppressWarnings("deprecation")
public final class GL2Impl extends JavaScriptObject implements GL2 {

    public static GL2Impl as(JavaScriptObject jsContext) {
        return jsContext.cast();
    }

    protected GL2Impl() {
    }

    @Override
    public void activeTexture(TextureUnit texture) {
        activeTextureImpl(texture.getValue());
    }

    @Override
    public native void attachShader(WebGLProgram program, WebGLShader shader) /*-{
                                                                              this.attachShader(program, shader);      
                                                                              }-*/;

    @Override
    public native void bindAttribLocation(WebGLProgram program, int index, String name) /*-{
                                                                                        this.bindAttribLocation(program, index, name);
                                                                                        }-*/;

    @Override
    public void bindBuffer(BufferTarget target, WebGLBuffer buffer) {
        bindBufferImpl(target.getValue(), buffer);
    }

    @Override
    public void bindFramebuffer(FramebufferTarget target, WebGLFramebuffer buffer) {
        bindFramebufferImpl(target.getValue(), buffer);
    }

    @Override
    public void bindRenderbuffer(RenderbufferTarget target, WebGLRenderbuffer buffer) {
        bindRenderbufferImpl(target.getValue(), buffer);
    }

    @Override
    public void bindTexture(TextureTarget target, WebGLTexture texture) {
        bindTextureImpl(target.getValue(), texture);
    }

    @Override
    public native void blendColor(float red, float green, float blue, float alpha) /*-{
                                                                                   this.blendColor(red, green, blue, alpha);
                                                                                   }-*/;

    @Override
    public void blendEquation(BlendEquationMode mode) {
        blendEquationImpl(mode.getValue());
    }

    @Override
    public void blendEquationSeparate(BlendEquationMode modeRGB, BlendEquationMode modeAlpha) {
        blendEquationSeparateImpl(modeRGB.getValue(), modeAlpha.getValue());
    }

    @Override
    public void blendFunc(BlendingFactorSrc sfactor, BlendingFactorDest dfactor) {
        blendFuncImpl(sfactor.getValue(), dfactor.getValue());
    }

    @Override
    public void blendFuncSeparate(BlendingFactorSrc srcRGB, BlendingFactorDest dstRGB, BlendingFactorSrc srcAlpha,
            BlendingFactorDest dstAlpha) {
        blendFuncSeparateImpl(srcRGB.getValue(), dstRGB.getValue(), srcAlpha.getValue(), dstAlpha.getValue());
    }

    @Override
    public void bufferData(BufferTarget target, ArrayBuffer data, BufferUsage usage) {
        bufferDataImpl(target.getValue(), data, usage.getValue());
    }

    @Override
    public void bufferData(BufferTarget target, ArrayBufferView data, BufferUsage usage) {
        bufferDataImpl(target.getValue(), data, usage.getValue());
    }

    @Override
    public void bufferData(BufferTarget target, int size, BufferUsage usage) {
        bufferDataImpl(target.getValue(), size, usage.getValue());
    }

    @Deprecated
    @Override
    public void bufferData(BufferTarget target, WebGLArray data, BufferUsage usage) {
        bufferDataImpl(target.getValue(), data, usage.getValue());
    }

    @Deprecated
    @Override
    public void bufferData(BufferTarget target, WebGLArrayBuffer data, BufferUsage usage) {
        bufferDataImpl(target.getValue(), data, usage.getValue());
    }

    @Override
    public void bufferSubData(BufferTarget target, int offset, ArrayBuffer data) {
        this.bufferSubDataImpl(target.getValue(), offset, data);
    }

    @Override
    public void bufferSubData(BufferTarget target, int offset, ArrayBufferView data) {
        this.bufferSubDataImpl(target.getValue(), offset, data);
    }

    @Deprecated
    @Override
    public void bufferSubData(BufferTarget target, int offset, WebGLArray data) {
        bufferSubDataImpl(target.getValue(), offset, data);
    }

    @Deprecated
    @Override
    public void bufferSubData(BufferTarget target, int offset, WebGLArrayBuffer data) {
        bufferSubDataImpl(target.getValue(), offset, data);
    }

    @Override
    public FramebufferErrorCode checkFramebufferStatus(FramebufferTarget target) {
        return FramebufferErrorCode.parseErrorCode(checkFramebufferStatusImpl(target.getValue()));
    }

    @Override
    public void clear(ClearBufferMask mask) {
        clearImpl(mask.getValue());
    }

    @Override
    public void clear(ClearBufferMask mask1, ClearBufferMask mask2) {
        clearImpl(mask1.getValue() | mask2.getValue());
    }

    @Override
    public void clear(ClearBufferMask mask1, ClearBufferMask mask2, ClearBufferMask mask3) {
        clearImpl(mask1.getValue() | mask2.getValue() | mask3.getValue());
    }

    @Override
    public native void clearColor(float red, float green, float blue, float alpha) /*-{
                                                                                   this.clearColor(red, green, blue, alpha);
                                                                                   }-*/;

    @Override
    public native void clearDepth(float depth) /*-{
                                               this.clearDepth(depth);
                                               }-*/;

    @Override
    public native void clearStencil(int s) /*-{
                                           this.clearStencil(s);
                                           }-*/;

    @Override
    public native void colorMask(boolean red, boolean green, boolean blue, boolean alpha) /*-{
                                                                                          this.colorMask(red, green, blue, alpha);
                                                                                          }-*/;

    @Override
    public native void compileShader(WebGLShader shader) /*-{
                                                         this.compileShader(shader);      
                                                         }-*/;

    @Override
    public void copyTexImage2D(TextureTarget target, int level, PixelInternalFormat internalformat, int x, int y,
            int width, int height, int border) {
        copyTexImage2DImpl(target.getValue(), level, internalformat.getValue(), x, y, width, height, border);
    }

    @Override
    public void copyTexSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, int x, int y,
            int width, int height) {
        copyTexSubImage2DImpl(target.getValue(), level, xoffset, yoffset, x, y, width, height);
    }

    @Override
    public native WebGLBuffer createBuffer() /*-{
                                             return this.createBuffer();
                                             }-*/;

    @Override
    public native WebGLFramebuffer createFramebuffer() /*-{
                                                       return this.createFramebuffer();
                                                       }-*/;

    @Override
    public native WebGLProgram createProgram() /*-{
                                               return this.createProgram();
                                               }-*/;

    @Override
    public native WebGLRenderbuffer createRenderbuffer() /*-{
                                                         return this.createRenderbuffer();
                                                         }-*/;

    @Override
    public WebGLShader createShader(ShaderType type) {
        return createShaderImpl(type.getValue());
    }

    @Override
    public native WebGLTexture createTexture() /*-{
                                               return this.createTexture();
                                               }-*/;

    @Override
    public void cullFace(CullFaceMode mode) {
        cullFaceImpl(mode.getValue());
    }

    @Override
    public native void deleteBuffer(WebGLBuffer buffer)/*-{
                                                       this.deleteBuffer(buffer);
                                                       }-*/;

    @Override
    public native void deleteFramebuffer(WebGLFramebuffer buffer) /*-{
                                                                  this.deleteFramebuffer(buffer);
                                                                  }-*/;

    @Override
    public native void deleteProgram(WebGLProgram program) /*-{
                                                           this.deleteProgram(program);      
                                                           }-*/;

    @Override
    public native void deleteRenderbuffer(WebGLRenderbuffer buffer)/*-{
                                                                   this.deleteRenderbuffer(buffer);
                                                                   }-*/;

    @Override
    public native void deleteShader(WebGLShader shader) /*-{
                                                        this.deleteShader(shader);      
                                                        }-*/;

    @Override
    public native void deleteTexture(WebGLTexture texture) /*-{
                                                           this.deleteTexture(texture);
                                                           }-*/;

    @Override
    public void depthFunc(DepthFunction func) {
        depthFuncImpl(func.getValue());
    }

    @Override
    public native void depthMask(boolean flag) /*-{
                                               this.depthMask(flag);
                                               }-*/;

    @Override
    public native void depthRange(float zNear, float zFar) /*-{
                                                           this.depthRange(zNear, zFar);
                                                           }-*/;

    @Override
    public native void detachShader(WebGLProgram program, WebGLShader shader) /*-{
                                                                              this.detachShader(program, shader);      
                                                                              }-*/;

    @Override
    public void disable(EnableCap cap) {
        disableImpl(cap.getValue());
    }

    @Override
    public native void disableVertexAttribArray(int index) /*-{
                                                           this.disableVertexAttribArray(index);
                                                           }-*/;

    @Override
    public void drawArrays(BeginMode mode, int first, int count) {
        drawArraysImpl(mode.getValue(), first, count);
    }

    @Override
    public void drawElements(BeginMode mode, int count, DrawElementsType type, int offset) {
        drawElementsImpl(mode.getValue(), count, type.getValue(), offset);
    }

    @Override
    public void enable(EnableCap cap) {
        enableImpl(cap.getValue());
    }

    @Override
    public native void enableVertexAttribArray(int index) /*-{
                                                          this.enableVertexAttribArray(index);
                                                          }-*/;

    @Override
    public native void finish() /*-{
                                this.finish();
                                }-*/;

    @Override
    public native void flush() /*-{
                               this.flush();
                               }-*/;

    @Override
    public void framebufferRenderbuffer(FramebufferTarget target, FramebufferSlot attachment,
            RenderbufferTarget renderbuffertarget, WebGLRenderbuffer renderbuffer) {
        framebufferRenderbufferImpl(target.getValue(), attachment.getValue(), renderbuffertarget.getValue(),
                renderbuffer);
    }

    @Override
    public void framebufferTexture2D(FramebufferTarget target, FramebufferSlot attachment, TextureTarget textarget,
            WebGLTexture texture, int level) {
        framebufferTexture2DImpl(target.getValue(), attachment.getValue(), textarget.getValue(), texture, level);
    }

    @Override
    public void frontFace(FrontFaceDirection mode) {
        frontFaceImpl(mode.getValue());
    }

    @Override
    public void generateMipmap(TextureTarget target) {
        generateMipmapImpl(target.getValue());
    }

    @Override
    public native final WebGLActiveInfo getActiveAttrib(WebGLProgram program, int index) /*-{
                                                                                         return this.getActiveAttrib(program, index);
                                                                                         }-*/;

    @Override
    public native final WebGLActiveInfo getActiveUniform(WebGLProgram program, int index) /*-{
                                                                                          return this.getActiveUniform(program, index);
                                                                                          }-*/;

    @Override
    public final WebGLShader[] getAttachedShaders(WebGLProgram program) {
        JsArray<WebGLShader> shaders = this.getAttachedShadersImpl(program);
        WebGLShader[] outShaders = new WebGLShader[shaders.length()];
        for (int i = 0; i < outShaders.length; i++) {
            outShaders[i] = shaders.get(i);
        }
        return outShaders;
    }

    @Override
    public native int getAttribLocation(WebGLProgram program, String name) /*-{
                                                                           return this.getAttribLocation(program, name);
                                                                           }-*/;

    @Override
    public int getBufferParameteri(BufferTarget target, BufferParameterName pname) {
        return getBufferParameteriImpl(target.getValue(), pname.getValue());
    }

    @Override
    public native CanvasElement getCanvas() /*-{
                                            return this.canvas;
                                            }-*/;

    @Override
    public WebGLContextAttributes getContextAttributes() {
        return new WebGLContextAttributes(getContextAttributesImpl());
    }

    @Override
    public ErrorCode getError() {
        return ErrorCode.parseErrorCode(getErrorImpl());
    }

    @Override
    public native JavaScriptObject getExtension(String name) /*-{
                                                             return this.getExtension(name);
                                                             }-*/;

    @Override
    public <T extends WebGLObject> T getFramebufferAttachmentParameter(FramebufferTarget target,
            FramebufferSlot attachment, FramebufferParameterName pname) {
        return this.<T>getFramebufferAttachmentParameterImpl(target.getValue(), attachment.getValue(),
                pname.getValue());
    }

    @Override
    public int getFramebufferAttachmentParameteri(FramebufferTarget target, FramebufferSlot attachment,
            FramebufferParameterName pname) {
        return getFramebufferAttachmentParameteriImpl(target.getValue(), attachment.getValue(), pname.getValue());
    }

    @Override
    public <T extends JavaScriptObject> T getParameter(GetPName pname) {
        return this.<T>getParameterImpl(pname.getValue());
    }

    @Override
    public boolean getParameterb(GetPName pname) {
        return getParameterbImpl(pname.getValue());
    }

    @Override
    public float getParameterf(GetPName pname) {
        return getParameterfImpl(pname.getValue());
    }

    @Override
    public int getParameteri(GetPName pname) {
        return getParameteriImpl(pname.getValue());
    }

    @Override
    public native final String getProgramInfoLog(WebGLProgram program) /*-{
                                                                       return this.getProgramInfoLog(program);
                                                                       }-*/;

    @Override
    public boolean getProgramParameterb(WebGLProgram program, ProgramParameter pname) {
        return getProgramParameterbImpl(program, pname.getValue());
    }

    @Override
    public int getProgramParameteri(WebGLProgram program, ProgramParameter pname) {
        return getProgramParameteriImpl(program, pname.getValue());
    }

    @Override
    public int getRenderbufferParameteri(RenderbufferTarget target, RenderbufferParameterName pname) {
        return getRenderbufferParameteriImpl(target.getValue(), pname.getValue());
    }

    @Override
    public native final String getShaderInfoLog(WebGLShader shader)/*-{
                                                                   return this.getShaderInfoLog(shader);
                                                                   }-*/;

    @Override
    public boolean getShaderParameterb(WebGLShader shader, ShaderParameter pname) {
        return getShaderParameterbImpl(shader, pname.getValue());
    }

    @Override
    public int getShaderParameteri(WebGLShader shader, ShaderParameter pname) {
        return getShaderParameteriImpl(shader, pname.getValue());
    }

    @Override
    public native final String getShaderSource(WebGLShader shader) /*-{
                                                                   return this.getShaderSource(shader);
                                                                   }-*/;

    @Override
    public String getString(StringName name) {
        return getStringImpl(name.getValue());
    }

    @Override
    public String[] getSupportedExtensions() {
        JsArrayString supportedExts = getSupportedExtensionsImpl();
        String[] outSupportedExts = new String[supportedExts.length()];
        for (int i = 0; i < outSupportedExts.length; i++) {
            outSupportedExts[i] = supportedExts.get(i);
        }
        return outSupportedExts;
    }

    @Override
    public native <T extends TypeArray> T getUniform(WebGLProgram program, WebGLUniformLocation location) /*-{
                                                                                                          return this.getUniform(program, location);
                                                                                                          }-*/;

    @Override
    public native boolean getUniformb(WebGLProgram program, WebGLUniformLocation location) /*-{
                                                                                           return this.getUniform(program, location);
                                                                                           }-*/;

    @Override
    public native float getUniformf(WebGLProgram program, WebGLUniformLocation location) /*-{
                                                                                         return this.getUniform(program, location);
                                                                                         }-*/;

    @Override
    public native int getUniformi(WebGLProgram program, WebGLUniformLocation location) /*-{
                                                                                       return this.getUniform(program, location);
                                                                                       }-*/;

    @Override
    public native WebGLUniformLocation getUniformLocation(WebGLProgram program, String name) /*-{
                                                                                             return this.getUniformLocation(program, name);
                                                                                             }-*/;

    @Override
    public <T extends JavaScriptObject> T getVertexAttrib(int index, VertexAttribParameter pname) {
        return this.<T>getVertexAttribImpl(index, pname.getValue());
    }

    @Override
    public boolean getVertexAttribb(int index, VertexAttribParameter pname) {
        return this.getVertexAttribbImpl(index, pname.getValue());
    }

    @Override
    public int getVertexAttribi(int index, VertexAttribParameter pname) {
        return this.getVertexAttribiImpl(index, pname.getValue());
    }

    @Override
    public void hint(HintTarget target, HintMode mode) {
        hintImpl(target.getValue(), mode.getValue());
    }

    @Override
    public native boolean isBuffer(WebGLObject buffer) /*-{
                                                       return this.isBuffer(buffer);
                                                       }-*/;

    @Override
    public native boolean isContextLost() /*-{
                                          return this.isContextLost();
                                          }-*/;

    @Override
    public boolean isEnabled(EnableCap cap) {
        return isEnabledImpl(cap.getValue());
    }

    @Override
    public native boolean isFramebuffer(WebGLObject buffer) /*-{
                                                            return this.isFramebuffer(buffer);
                                                            }-*/;

    @Override
    public native boolean isProgram(WebGLObject program) /*-{
                                                         return this.isProgram(program);
                                                         }-*/;

    @Override
    public native boolean isRenderbuffer(WebGLObject buffer) /*-{
                                                             return this.isRenderbuffer(buffer);
                                                             }-*/;

    @Override
    public native boolean isShader(WebGLObject shader) /*-{
                                                       return this.isShader(shader);
                                                       }-*/;

    @Override
    public native boolean isTexture(WebGLObject buffer) /*-{
                                                        return this.isTexture(buffer);
                                                        }-*/;

    @Override
    public native void lineWidth(float width) /*-{
                                              this.lineWidth(width);
                                              }-*/;

    @Override
    public native void linkProgram(WebGLProgram program) /*-{
                                                         this.linkProgram(program);      
                                                         }-*/;

    @Override
    public void pixelStorei(PixelStoreParameter pname, int param) {
        pixelStoreiImpl(pname.getValue(), param);
    }

    @Override
    public native void polygonOffset(float factor, float units) /*-{
                                                                this.polygonOffset(factor, units);
                                                                }-*/;

    @Deprecated
    @Override
    public WebGLArray readPixels(int x, int y, int width, int height, PixelFormat format, PixelType type) {
        return readPixelsImpl(x, y, width, height, format.getValue(), type.getValue());
    }

    @Override
    public void readPixels(int x, int y, int width, int height, PixelFormat format, PixelType type,
            ArrayBufferView pixels) {
        this.readPixelsImpl(x, y, width, height, format.getValue(), type.getValue(), pixels);
    }

    @Override
    public void renderbufferStorage(RenderbufferTarget target, RenderbufferInternalFormat internalformat, int width,
            int height) {
        renderbufferStorageImpl(target.getValue(), internalformat.getValue(), width, height);
    }

    @Override
    public native void sampleCoverage(float value, boolean invert) /*-{
                                                                   this.sampleCoverage(value, invert);
                                                                   }-*/;

    @Override
    public native void scissor(float x, float y, float width, float height) /*-{
                                                                            this.scissor(x, y, width, height);
                                                                            }-*/;

    @Override
    public native void shaderSource(WebGLShader shader, String source) /*-{
                                                                       this.shaderSource(shader, source);      
                                                                       }-*/;

    @Override
    public void stencilFunc(StencilFunction func, int ref, int mask) {
        stencilFuncImpl(func.getValue(), ref, mask);
    }

    @Override
    public void stencilFuncSeparate(CullFaceMode face, StencilFunction func, int ref, int mask) {
        stencilFuncSeparateImpl(face.getValue(), func.getValue(), ref, mask);
    }

    @Override
    public native void stencilMask(int mask) /*-{
                                             this.stencilMask(mask);
                                             }-*/;

    @Override
    public void stencilMaskSeparate(CullFaceMode face, int mask) {
        stencilMaskSeparateImpl(face.getValue(), mask);
    }

    @Override
    public void stencilOp(StencilOp fail, StencilOp zfail, StencilOp zpass) {
        stencilOpImpl(fail.getValue(), zfail.getValue(), zpass.getValue());
    }

    @Override
    public void stencilOpSeparate(CullFaceMode face, StencilOp fail, StencilOp zfail, StencilOp zpass) {
        stencilOpSeparateImpl(face.getValue(), fail.getValue(), zfail.getValue(), zpass.getValue());
    }

    @Override
    public void texImage2D(TextureTarget target, int level, CanvasElement image) {
        texImage2DImpl(target.getValue(), level, image);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, CanvasElement image, boolean flipY) {
        texImage2DImpl(target.getValue(), level, image, flipY);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, CanvasElement image, boolean flipY,
            boolean asPremultipliedAlpha) {
        texImage2DImpl(target.getValue(), level, image, flipY, asPremultipliedAlpha);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, ImageData image) {
        texImage2DImpl(target.getValue(), level, image);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, ImageData image, boolean flipY) {
        texImage2DImpl(target.getValue(), level, image, flipY);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, ImageData image, boolean flipY,
            boolean asPremultipliedAlpha) {
        texImage2DImpl(target.getValue(), level, image, flipY, asPremultipliedAlpha);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, ImageElement image) {
        texImage2DImpl(target.getValue(), level, image);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, ImageElement image, boolean flipY) {
        texImage2DImpl(target.getValue(), level, image, flipY);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, ImageElement image, boolean flipY,
            boolean asPremultipliedAlpha) {
        texImage2DImpl(target.getValue(), level, image, flipY, asPremultipliedAlpha);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, PixelInternalFormat internalformat, int width,
            int height, int border, PixelFormat format, PixelType type, ArrayBufferView pixels) {
        this.texImage2DImpl(target.getValue(), level, internalformat.getValue(), width, height, border,
                format.getValue(), type.getValue(), pixels);
    }

    @Deprecated
    @Override
    public void texImage2D(TextureTarget target, int level, PixelInternalFormat internalformat, int width,
            int height, int border, PixelFormat format, PixelType type, WebGLArray pixels) {
        texImage2DImpl(target.getValue(), level, internalformat.getValue(), width, height, border,
                format.getValue(), type.getValue(), pixels);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, PixelInternalFormat internalformat, PixelFormat format,
            PixelType type, CanvasElement pixels) {
        texImage2DImpl(target.getValue(), level, internalformat.getValue(), format.getValue(), type.getValue(),
                pixels);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, PixelInternalFormat internalformat, PixelFormat format,
            PixelType type, ImageData pixels) {
        texImage2DImpl(target.getValue(), level, internalformat.getValue(), format.getValue(), type.getValue(),
                pixels);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, PixelInternalFormat internalformat, PixelFormat format,
            PixelType type, ImageElement pixels) {
        texImage2DImpl(target.getValue(), level, internalformat.getValue(), format.getValue(), type.getValue(),
                pixels);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, PixelInternalFormat internalformat, PixelFormat format,
            PixelType type, VideoElement pixels) {
        texImage2DImpl(target.getValue(), level, internalformat.getValue(), format.getValue(), type.getValue(),
                pixels);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, VideoElement image) {
        texImage2DImpl(target.getValue(), level, image);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, VideoElement image, boolean flipY) {
        texImage2DImpl(target.getValue(), level, image, flipY);
    }

    @Override
    public void texImage2D(TextureTarget target, int level, VideoElement image, boolean flipY,
            boolean asPremultipliedAlpha) {
        texImage2DImpl(target.getValue(), level, image, flipY, asPremultipliedAlpha);
    }

    @Override
    public void texParameter(TextureTarget target, TextureParameterName pname, TextureMagFilter param) {
        texParameteriImpl(target.getValue(), pname.getValue(), param.getValue());
    }

    @Override
    public void texParameter(TextureTarget target, TextureParameterName pname, TextureMinFilter param) {
        texParameteriImpl(target.getValue(), pname.getValue(), param.getValue());
    }

    @Override
    public void texParameter(TextureTarget target, TextureParameterName pname, TextureWrapMode param) {
        texParameteriImpl(target.getValue(), pname.getValue(), param.getValue());
    }

    @Override
    public void texParameterf(TextureTarget target, TextureParameterName pname, float param) {
        texParameterfImpl(target.getValue(), pname.getValue(), param);
    }

    @Override
    public void texParameteri(TextureTarget target, TextureParameterName pname, int param) {
        texParameteriImpl(target.getValue(), pname.getValue(), param);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, CanvasElement image) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, image);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, CanvasElement image,
            boolean flipY) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, image, flipY);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, CanvasElement image,
            boolean flipY, boolean asPremultipliedAlpha) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, image, flipY, asPremultipliedAlpha);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, ImageData image) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, image);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, ImageData image,
            boolean flipY) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, image, flipY);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, ImageData image,
            boolean flipY, boolean asPremultipliedAlpha) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, image, flipY, asPremultipliedAlpha);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, ImageElement image) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, image);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, ImageElement image,
            boolean flipY) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, image, flipY);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, ImageElement image,
            boolean flipY, boolean asPremultipliedAlpha) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, image, flipY, asPremultipliedAlpha);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, int width, int height,
            PixelFormat format, PixelType type, ArrayBufferView pixels) {
        this.texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, width, height, format.getValue(),
                type.getValue(), pixels);
    }

    @Deprecated
    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, int width, int height,
            PixelFormat format, PixelType type, WebGLArray pixels) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, width, height, format.getValue(),
                type.getValue(), pixels);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, PixelFormat format,
            PixelType type, CanvasElement canvas) {
        this.texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, format.getValue(), type.getValue(),
                canvas);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, PixelFormat format,
            PixelType type, ImageData pixels) {
        this.texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, format.getValue(), type.getValue(),
                pixels);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, PixelFormat format,
            PixelType type, ImageElement image) {
        this.texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, format.getValue(), type.getValue(),
                image);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, PixelFormat format,
            PixelType type, VideoElement video) {
        this.texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, format.getValue(), type.getValue(),
                video);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, VideoElement image) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, image);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, VideoElement image,
            boolean flipY) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, image, flipY);
    }

    @Override
    public void texSubImage2D(TextureTarget target, int level, int xoffset, int yoffset, VideoElement image,
            boolean flipY, boolean asPremultipliedAlpha) {
        texSubImage2DImpl(target.getValue(), level, xoffset, yoffset, image, flipY, asPremultipliedAlpha);
    }

    @Override
    public void uniform(WebGLUniformLocation location, Tuple2f v) {
        uniform2f(location, v.x, v.y);
    }

    @Override
    public void uniform(WebGLUniformLocation location, Tuple2i v) {
        uniform2f(location, v.x, v.y);
    }

    @Override
    public void uniform(WebGLUniformLocation location, Tuple3f v) {
        uniform3f(location, v.x, v.y, v.z);
    }

    @Override
    public void uniform(WebGLUniformLocation location, Tuple3i v) {
        uniform3i(location, v.x, v.y, v.z);
    }

    @Override
    public void uniform(WebGLUniformLocation location, Tuple4f v) {
        uniform4f(location, v.x, v.y, v.z, v.w);
    }

    @Override
    public void uniform(WebGLUniformLocation location, Tuple4i v) {
        uniform4i(location, v.x, v.y, v.z, v.w);
    }

    @Override
    public native void uniform1f(WebGLUniformLocation location, float x) /*-{
                                                                         this.uniform1f(location, x);      
                                                                         }-*/;

    @Override
    public void uniform1fv(WebGLUniformLocation location, float[] v) {
        uniform1fvImpl(location, toJsArrayNumber(v));
    }

    @Override
    public void uniform1fv(WebGLUniformLocation location, Float32Array v) {
        uniform1fvImpl(location, v);
    }

    @Override
    public void uniform1fv(WebGLUniformLocation location, JsArrayNumber v) {
        uniform1fvImpl(location, v);
    }

    @Deprecated
    @Override
    public void uniform1fv(WebGLUniformLocation location, WebGLFloatArray v) {
        uniform1fvImpl(location, v);
    }

    @Override
    public native void uniform1i(WebGLUniformLocation location, int x) /*-{
                                                                       this.uniform1i(location, x);      
                                                                       }-*/;

    @Override
    public void uniform1iv(WebGLUniformLocation location, int[] v) {
        uniform1ivImpl(location, toJsArrayInteger(v));
    }

    @Override
    public void uniform1iv(WebGLUniformLocation location, Int32Array v) {
        uniform1ivImpl(location, v);
    }

    @Override
    public void uniform1iv(WebGLUniformLocation location, JsArrayInteger v) {
        uniform1ivImpl(location, v);
    }

    @Deprecated
    @Override
    public void uniform1iv(WebGLUniformLocation location, WebGLIntArray v) {
        uniform1ivImpl(location, v);
    }

    @Override
    public native void uniform2f(WebGLUniformLocation location, float x, float y) /*-{
                                                                                  this.uniform2f(location, x, y);      
                                                                                  }-*/;

    @Override
    public void uniform2fv(WebGLUniformLocation location, float[] v) {
        uniform2fvImpl(location, toJsArrayNumber(v));
    }

    @Override
    public void uniform2fv(WebGLUniformLocation location, Float32Array v) {
        uniform2fvImpl(location, v);
    }

    @Override
    public void uniform2fv(WebGLUniformLocation location, JsArrayNumber v) {
        uniform2fvImpl(location, v);
    }

    @Deprecated
    @Override
    public void uniform2fv(WebGLUniformLocation location, WebGLFloatArray v) {
        uniform2fvImpl(location, v);
    }

    @Override
    public native void uniform2i(WebGLUniformLocation location, int x, int y) /*-{
                                                                              this.uniform2i(location, x, y);      
                                                                              }-*/;

    @Override
    public void uniform2iv(WebGLUniformLocation location, int[] v) {
        uniform2ivImpl(location, toJsArrayInteger(v));
    }

    @Override
    public void uniform2iv(WebGLUniformLocation location, Int32Array v) {
        uniform2ivImpl(location, v);
    }

    @Override
    public void uniform2iv(WebGLUniformLocation location, JsArrayInteger v) {
        uniform2ivImpl(location, v);
    }

    @Deprecated
    @Override
    public void uniform2iv(WebGLUniformLocation location, WebGLIntArray v) {
        uniform2ivImpl(location, v);
    }

    @Override
    public native void uniform3f(WebGLUniformLocation location, float x, float y, float z) /*-{
                                                                                           this.uniform3f(location, x, y, z);      
                                                                                           }-*/;

    @Override
    public void uniform3fv(WebGLUniformLocation location, float[] v) {
        uniform3fvImpl(location, toJsArrayNumber(v));
    }

    @Override
    public void uniform3fv(WebGLUniformLocation location, Float32Array v) {
        uniform3fvImpl(location, v);
    }

    @Override
    public void uniform3fv(WebGLUniformLocation location, JsArrayNumber v) {
        uniform3fvImpl(location, v);
    }

    @Deprecated
    @Override
    public void uniform3fv(WebGLUniformLocation location, WebGLFloatArray v) {
        uniform3fvImpl(location, v);
    }

    @Override
    public native void uniform3i(WebGLUniformLocation location, int x, int y, int z) /*-{
                                                                                     this.uniform3i(location, x, y, z);      
                                                                                     }-*/;

    @Override
    public void uniform3iv(WebGLUniformLocation location, Float32Array v) {
        uniform3ivImpl(location, v);
    }

    @Override
    public void uniform3iv(WebGLUniformLocation location, int[] v) {
        uniform3ivImpl(location, toJsArrayInteger(v));
    }

    @Override
    public void uniform3iv(WebGLUniformLocation location, JsArrayInteger v) {
        uniform3ivImpl(location, v);
    }

    @Deprecated
    @Override
    public void uniform3iv(WebGLUniformLocation location, WebGLIntArray v) {
        uniform3ivImpl(location, v);
    }

    @Override
    public native void uniform4f(WebGLUniformLocation location, float x, float y, float z, float w) /*-{
                                                                                                    this.uniform4f(location, x, y, z, w);      
                                                                                                    }-*/;

    @Override
    public void uniform4fv(WebGLUniformLocation location, float[] v) {
        uniform4fvImpl(location, toJsArrayNumber(v));
    }

    @Override
    public void uniform4fv(WebGLUniformLocation location, Float32Array v) {
        uniform4fvImpl(location, v);
    }

    @Override
    public void uniform4fv(WebGLUniformLocation location, JsArrayNumber v) {
        uniform4fvImpl(location, v);
    }

    @Deprecated
    @Override
    public void uniform4fv(WebGLUniformLocation location, WebGLFloatArray v) {
        uniform4fvImpl(location, v);
    }

    @Override
    public native void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w) /*-{
                                                                                            this.uniform4i(location, x, y, z, w);      
                                                                                            }-*/;

    @Override
    public void uniform4iv(WebGLUniformLocation location, int[] v) {
        uniform4ivImpl(location, toJsArrayInteger(v));
    }

    @Override
    public void uniform4iv(WebGLUniformLocation location, Int32Array v) {
        uniform4ivImpl(location, v);
    }

    @Override
    public void uniform4iv(WebGLUniformLocation location, JsArrayInteger v) {
        uniform4ivImpl(location, v);
    }

    @Deprecated
    @Override
    public void uniform4iv(WebGLUniformLocation location, WebGLIntArray v) {
        uniform4ivImpl(location, v);
    }

    @Override
    public void uniformMatrix(WebGLUniformLocation location, boolean transpose, Matrix3f value) {
        uniformMatrix3fvImpl(location, transpose, MatrixUtils.toJsFloatArray(value));
    }

    @Override
    public void uniformMatrix(WebGLUniformLocation location, boolean transpose, Matrix4f value) {
        uniformMatrix4fvImpl(location, transpose, MatrixUtils.toJsFloatArray(value));
    }

    @Override
    public void uniformMatrix(WebGLUniformLocation location, Matrix3f value) {
        uniformMatrix(location, true, value);
    }

    @Override
    public void uniformMatrix(WebGLUniformLocation location, Matrix4f value) {
        uniformMatrix(location, true, value);
    }

    @Override
    public void uniformMatrix2fv(WebGLUniformLocation location, boolean transpose, float[] value) {
        uniformMatrix2fvImpl(location, transpose, toJsArrayNumber(value));
    }

    @Override
    public void uniformMatrix2fv(WebGLUniformLocation location, boolean transpose, Float32Array value) {
        uniformMatrix2fvImpl(location, transpose, value);
    }

    @Override
    public void uniformMatrix2fv(WebGLUniformLocation location, boolean transpose, JsArrayNumber value) {
        uniformMatrix2fvImpl(location, transpose, value);
    }

    @Deprecated
    @Override
    public void uniformMatrix2fv(WebGLUniformLocation location, boolean transpose, WebGLFloatArray value) {
        uniformMatrix2fvImpl(location, transpose, value);
    }

    private native void uniformMatrix2fvImpl(WebGLUniformLocation location, boolean transpose,
            JavaScriptObject value) /*-{
                                    this.uniformMatrix2fv(location, false, 
                                    transpose ? [
                                    value[0], value[2],
                                    value[1], value[3] ]
                                    : value);
                                    }-*/;

    @Override
    public void uniformMatrix3fv(WebGLUniformLocation location, boolean transpose, float[] value) {
        uniformMatrix3fvImpl(location, transpose, toJsArrayNumber(value));
    }

    @Override
    public void uniformMatrix3fv(WebGLUniformLocation location, boolean transpose, Float32Array value) {
        uniformMatrix3fvImpl(location, transpose, value);
    }

    @Override
    public void uniformMatrix3fv(WebGLUniformLocation location, boolean transpose, JsArrayNumber value) {
        uniformMatrix3fvImpl(location, transpose, value);
    }

    @Deprecated
    @Override
    public void uniformMatrix3fv(WebGLUniformLocation location, boolean transpose, WebGLFloatArray value) {
        uniformMatrix3fvImpl(location, transpose, value);
    }

    private native void uniformMatrix3fvImpl(WebGLUniformLocation location, boolean transpose,
            JavaScriptObject value) /*-{
                                    this.uniformMatrix3fv(location, false, 
                                    transpose ? [
                                    value[0], value[3], value[6],
                                    value[1], value[4], value[7],
                                    value[2], value[5], value[8] ]
                                    : value);
                                    }-*/;

    @Override
    public void uniformMatrix4fv(WebGLUniformLocation location, boolean transpose, float[] value) {
        uniformMatrix4fvImpl(location, transpose, toJsArrayNumber(value));
    }

    @Override
    public void uniformMatrix4fv(WebGLUniformLocation location, boolean transpose, Float32Array value) {
        uniformMatrix4fvImpl(location, transpose, value);
    }

    @Override
    public void uniformMatrix4fv(WebGLUniformLocation location, boolean transpose, JsArrayNumber value) {
        uniformMatrix4fvImpl(location, transpose, value);
    }

    @Deprecated
    @Override
    public void uniformMatrix4fv(WebGLUniformLocation location, boolean transpose, WebGLFloatArray value) {
        uniformMatrix4fvImpl(location, transpose, value);
    }

    private native void uniformMatrix4fvImpl(WebGLUniformLocation location, boolean transpose,
            JavaScriptObject value) /*-{
                                    this.uniformMatrix4fv(location, false, 
                                    transpose ? [
                                    value[0], value[4], value[8], value[12],
                                    value[1], value[5], value[9], value[13],
                                    value[2], value[6], value[10], value[14],
                                    value[3], value[7], value[11], value[15] ]
                                    : value);
                                    }-*/;

    @Override
    public native void useProgram(WebGLProgram program) /*-{
                                                        this.useProgram(program);      
                                                        }-*/;

    @Override
    public native void validateProgram(WebGLProgram program) /*-{
                                                             this.validateProgram(program);      
                                                             }-*/;

    @Override
    public void vertexAttrib(int indx, Tuple2f values) {
        vertexAttrib2f(indx, values.x, values.y);
    }

    @Override
    public void vertexAttrib(int indx, Tuple3f values) {
        vertexAttrib3f(indx, values.x, values.y, values.z);
    }

    @Override
    public void vertexAttrib(int indx, Tuple4f values) {
        vertexAttrib4f(indx, values.x, values.y, values.z, values.w);
    }

    @Override
    public native void vertexAttrib1f(int indx, float x) /*-{
                                                         this.vertexAttrib1f(indx, x);
                                                         }-*/;

    @Override
    public void vertexAttrib1fv(int indx, float[] values) {
        vertexAttrib1fvImpl(indx, toJsArrayNumber(values));
    }

    @Override
    public void vertexAttrib1fv(int indx, Float32Array values) {
        vertexAttrib1fvImpl(indx, values);
    }

    @Override
    public void vertexAttrib1fv(int indx, JsArrayNumber values) {
        vertexAttrib1fvImpl(indx, values);
    }

    @Deprecated
    @Override
    public void vertexAttrib1fv(int indx, WebGLFloatArray values) {
        vertexAttrib1fvImpl(indx, values);
    }

    @Override
    public native void vertexAttrib2f(int indx, float x, float y) /*-{
                                                                  this.vertexAttrib2f(indx, x, y);
                                                                  }-*/;

    @Override
    public void vertexAttrib2fv(int indx, float[] values) {
        vertexAttrib2fvImpl(indx, toJsArrayNumber(values));
    }

    @Override
    public void vertexAttrib2fv(int indx, Float32Array values) {
        vertexAttrib2fvImpl(indx, values);
    }

    @Override
    public void vertexAttrib2fv(int indx, JsArrayNumber values) {
        vertexAttrib2fvImpl(indx, values);
    }

    @Deprecated
    @Override
    public void vertexAttrib2fv(int indx, WebGLFloatArray values) {
        vertexAttrib2fvImpl(indx, values);
    }

    @Override
    public native void vertexAttrib3f(int indx, float x, float y, float z) /*-{
                                                                           this.vertexAttrib3f(indx, x, y, z);      
                                                                           }-*/;

    @Override
    public void vertexAttrib3fv(int indx, float[] values) {
        vertexAttrib3fvImpl(indx, toJsArrayNumber(values));
    }

    @Override
    public void vertexAttrib3fv(int indx, Float32Array values) {
        vertexAttrib3fvImpl(indx, values);
    }

    @Override
    public void vertexAttrib3fv(int indx, JsArrayNumber values) {
        vertexAttrib3fvImpl(indx, values);
    }

    @Deprecated
    @Override
    public void vertexAttrib3fv(int indx, WebGLFloatArray values) {
        vertexAttrib3fvImpl(indx, values);
    }

    @Override
    public native void vertexAttrib4f(int indx, float x, float y, float z, float w) /*-{
                                                                                    this.vertexAttrib4f(indx, x, y, z, w);         
                                                                                    }-*/;

    @Override
    public void vertexAttrib4fv(int indx, float[] values) {
        vertexAttrib4fvImpl(indx, toJsArrayNumber(values));
    }

    @Override
    public void vertexAttrib4fv(int indx, Float32Array values) {
        vertexAttrib4fvImpl(indx, values);
    }

    @Override
    public void vertexAttrib4fv(int indx, JsArrayNumber values) {
        vertexAttrib4fvImpl(indx, values);
    }

    @Deprecated
    @Override
    public void vertexAttrib4fv(int indx, WebGLFloatArray values) {
        vertexAttrib4fvImpl(indx, values);
    }

    @Override
    public void vertexAttribPointer(int indx, int size, DataType type, boolean normalized, int stride, int offset) {
        vertexAttribPointerImpl(indx, size, type.getValue(), normalized, stride, offset);
    }

    @Override
    public native void viewport(float x, float y, float width, float height) /*-{
                                                                             this.viewport(x, y, width, height);
                                                                             }-*/;

    private native void activeTextureImpl(int texture) /*-{
                                                       this.activeTexture(texture);
                                                       }-*/;

    private native void bindBufferImpl(int target, WebGLBuffer buffer)/*-{
                                                                      this.bindBuffer(target, buffer);
                                                                      }-*/;

    private native void bindFramebufferImpl(int target, WebGLFramebuffer buffer)/*-{
                                                                                this.bindFramebuffer(target, buffer);
                                                                                }-*/;

    private native void bindRenderbufferImpl(int target, WebGLRenderbuffer buffer)/*-{
                                                                                  this.bindRenderbuffer(target, buffer);
                                                                                  }-*/;

    private native void bindTextureImpl(int target, WebGLTexture texture) /*-{
                                                                          this.bindTexture(target, texture);      
                                                                          }-*/;

    private native void blendEquationImpl(int mode) /*-{
                                                    this.blendEquation(mode);
                                                    }-*/;

    private native void blendEquationSeparateImpl(int modeRGB, int modeAlpha) /*-{
                                                                              this.blendEquationSeparate(modeRGB, modeAlpha);
                                                                              }-*/;

    private native void blendFuncImpl(int sfactor, int dfactor) /*-{
                                                                this.blendFunc(sfactor, dfactor);
                                                                }-*/;

    private native void blendFuncSeparateImpl(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) /*-{
                                                                                                  this.blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
                                                                                                  }-*/;

    private native void bufferDataImpl(int target, int size, int usage)/*-{
                                                                       this.bufferData(target, size, usage);
                                                                       }-*/;

    private native void bufferDataImpl(int target, JavaScriptObject data, int usage) /*-{
                                                                                     this.bufferData(target, data, usage);
                                                                                     }-*/;

    private native void bufferSubDataImpl(int target, int offset, JavaScriptObject data) /*-{
                                                                                         this.bufferSubData(target, offset, data);
                                                                                         }-*/;

    private native int checkFramebufferStatusImpl(int target) /*-{
                                                              return this.checkFramebufferStatus(target);
                                                              }-*/;

    private native void clearImpl(int mask) /*-{
                                            this.clear(mask);
                                            }-*/;

    private native void copyTexImage2DImpl(int target, int level, int internalformat, int x, int y, int width,
            int height, int border) /*-{
                                    this.copyTexImage2D(target, level, internalformat, x, y, width, height, border);      
                                    }-*/;

    private native void copyTexSubImage2DImpl(int target, int level, int xoffset, int yoffset, int x, int y,
            int width, int height) /*-{
                                   this.copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);      
                                   }-*/;

    private native WebGLShader createShaderImpl(int type) /*-{
                                                          return this.createShader(type);
                                                          }-*/;

    private native void cullFaceImpl(int mode) /*-{
                                               this.cullFace(mode);
                                               }-*/;

    private native void depthFuncImpl(int func) /*-{
                                                this.depthFunc(func);
                                                }-*/;

    private native void disableImpl(int cap) /*-{
                                             this.disable(cap);
                                             }-*/;

    private native void drawArraysImpl(int mode, int first, int count) /*-{
                                                                       this.drawArrays(mode, first, count);
                                                                       }-*/;

    private native void drawElementsImpl(int mode, int count, int type, int offset) /*-{
                                                                                    this.drawElements(mode, count, type, offset);
                                                                                    }-*/;

    private native void enableImpl(int cap) /*-{
                                            this.enable(cap);
                                            }-*/;

    private native void framebufferRenderbufferImpl(int target, int attachment, int renderbuffertarget,
            WebGLRenderbuffer renderbuffer) /*-{
                                            this.framebufferRenderbuffer(target, attachment, renderbuffertarget,
                                            renderbuffer);
                                            }-*/;

    private native void framebufferTexture2DImpl(int target, int attachment, int textarget, WebGLTexture texture,
            int level) /*-{
                       this.framebufferTexture2D(target, attachment, textarget, texture, level);
                       }-*/;

    private native void frontFaceImpl(int mode) /*-{
                                                this.frontFace(mode);
                                                }-*/;

    private native void generateMipmapImpl(int target) /*-{
                                                       this.generateMipmap(target);
                                                       }-*/;

    private native final JsArray<WebGLShader> getAttachedShadersImpl(WebGLProgram program) /*-{
                                                                                           return this.getAttachedShaders(program);
                                                                                           }-*/;

    private native int getBufferParameteriImpl(int target, int pname) /*-{
                                                                      return this.getBufferParameter(target, pname);      
                                                                      }-*/;

    private native final JavaScriptObject getContextAttributesImpl() /*-{
                                                                     return this.getContextAttributes();
                                                                     }-*/;

    private native int getErrorImpl() /*-{
                                      return this.getError();
                                      }-*/;

    private native int getFramebufferAttachmentParameteriImpl(int target, int attachment, int pname) /*-{
                                                                                                     return this.getFramebufferAttachmentParameter(target, attachment, pname);
                                                                                                     }-*/;

    private native <T extends WebGLObject> T getFramebufferAttachmentParameterImpl(int target, int attachment,
            int pname) /*-{
                       return this.getFramebufferAttachmentParameter(target, attachment, pname);
                       }-*/;

    private native boolean getParameterbImpl(int pname) /*-{
                                                        return this.getParameter(pname);
                                                        }-*/;

    private native float getParameterfImpl(int pname) /*-{
                                                      return this.getParameter(pname);
                                                      }-*/;

    private native int getParameteriImpl(int pname) /*-{
                                                    return this.getParameter(pname);
                                                    }-*/;

    private native <T extends JavaScriptObject> T getParameterImpl(int pname) /*-{
                                                                              return this.getParameter(pname);
                                                                              }-*/;

    private native boolean getProgramParameterbImpl(WebGLProgram program, int pname) /*-{
                                                                                     return this.getProgramParameter(program, pname);
                                                                                     }-*/;

    private native int getProgramParameteriImpl(WebGLProgram program, int pname) /*-{
                                                                                 return this.getProgramParameter(program, pname);
                                                                                 }-*/;

    private native int getRenderbufferParameteriImpl(int target, int pname) /*-{
                                                                            return this.getRenderbufferParameter(target, pname);
                                                                            }-*/;

    private native boolean getShaderParameterbImpl(WebGLShader shader, int pname) /*-{
                                                                                  return this.getShaderParameter(shader, pname);
                                                                                  }-*/;

    private native int getShaderParameteriImpl(WebGLShader shader, int pname) /*-{
                                                                              return this.getShaderParameter(shader, pname);
                                                                              }-*/;

    private native String getStringImpl(int name) /*-{
                                                  return this.getString(name);
                                                  }-*/;

    private native JsArrayString getSupportedExtensionsImpl() /*-{
                                                              return this.getSupportedExtensions();
                                                              }-*/;

    private native boolean getVertexAttribbImpl(int index, int pname) /*-{
                                                                      return this.getVertexAttrib(index, pname);      
                                                                      }-*/;

    private native int getVertexAttribiImpl(int index, int pname) /*-{
                                                                  return this.getVertexAttrib(index, pname);      
                                                                  }-*/;

    private native <T extends JavaScriptObject> T getVertexAttribImpl(int index, int pname) /*-{
                                                                                            return this.getVertexAttrib(index, pname);      
                                                                                            }-*/;

    private native void hintImpl(int target, int mode) /*-{
                                                       this.hint(target, mode);
                                                       }-*/;

    private native boolean isEnabledImpl(int cap) /*-{
                                                  return this.isEnabled(cap);
                                                  }-*/;

    private native void pixelStoreiImpl(int pname, int param) /*-{
                                                              this.pixelStorei(pname, param);
                                                              }-*/;

    @Deprecated
    private native WebGLArray readPixelsImpl(int x, int y, int width, int height, int format, int type) /*-{
                                                                                                        return this.readPixels(x, y, width, height, format, type);      
                                                                                                        }-*/;

    private native void readPixelsImpl(int x, int y, int width, int height, int format, int type,
            JavaScriptObject pixels) /*-{
                                     return this.readPixels(x, y, width, height, format, type, pixels);      
                                     }-*/;

    private native void renderbufferStorageImpl(int target, int internalformat, int width, int height) /*-{
                                                                                                       this.renderbufferStorage(target, internalformat, width, height);
                                                                                                       }-*/;

    private native void stencilFuncImpl(int func, int ref, int mask) /*-{
                                                                     this.stencilFunc(func, ref, mask);
                                                                     }-*/;

    private native void stencilFuncSeparateImpl(int face, int func, int ref, int mask) /*-{
                                                                                       this.stencilFuncSeparate(face, func, ref, mask);
                                                                                       }-*/;

    private native void stencilMaskSeparateImpl(int face, int mask) /*-{
                                                                    this.stencilMaskSeparate(face, mask);
                                                                    }-*/;

    private native void stencilOpImpl(int fail, int zfail, int zpass) /*-{
                                                                      this.stencilOp(fail, zfail, zpass);
                                                                      }-*/;

    private native void stencilOpSeparateImpl(int face, int fail, int zfail, int zpass) /*-{
                                                                                        this.stencilOpSeparate(face, fail, zfail, zpass);
                                                                                        }-*/;

    private native void texImage2DImpl(int target, int level, int internalformat, int width, int height, int border,
            int format, int type, JavaScriptObject pixels) /*-{
                                                           this.texImage2D(target, level, internalformat, width, height, border, 
                                                           format, type, pixels);
                                                           }-*/;

    private native void texImage2DImpl(int target, int level, int internalformat, int format, int type,
            JavaScriptObject pixels) /*-{
                                     this.texImage2D(target, level, internalformat, format, type, pixels);
                                     }-*/;

    private native void texImage2DImpl(int target, int level, JavaScriptObject image) /*-{
                                                                                      this.texImage2D(target, level, image);
                                                                                      }-*/;

    private native void texImage2DImpl(int target, int level, JavaScriptObject image, boolean flipY) /*-{
                                                                                                     this.texImage2D(target, level, image, flipY);
                                                                                                     }-*/;

    private native void texImage2DImpl(int target, int level, JavaScriptObject image, boolean flipY,
            boolean asPremultipliedAlpha) /*-{
                                          this.texImage2D(target, level, image, flipY, asPremultipliedAlpha);
                                          }-*/;

    private native void texParameterfImpl(int target, int pname, float param) /*-{
                                                                              this.texParameterf(target, pname, param);
                                                                              }-*/;

    private native void texParameteriImpl(int target, int pname, int param) /*-{
                                                                            this.texParameteri(target, pname, param);
                                                                            }-*/;

    private native void texSubImage2DImpl(int target, int level, int xoffset, int yoffset, int width, int height,
            int format, int type, JavaScriptObject pixels) /*-{
                                                           this.texSubImage2D(target, level, xoffset, yoffset, width, height, format,
                                                           type, pixels);
                                                           }-*/;

    private native void texSubImage2DImpl(int target, int level, int xoffset, int yoffset, int format, int type,
            JavaScriptObject pixels) /*-{
                                     this.texSubImage2D(target, level, xoffset, yoffset, format,
                                     type, pixels);
                                     }-*/;

    private native void texSubImage2DImpl(int target, int level, int xoffset, int yoffset,
            JavaScriptObject image) /*-{
                                    this.texSubImage2D(target, level, xoffset, yoffset, image);
                                    }-*/;

    private native void texSubImage2DImpl(int target, int level, int xoffset, int yoffset, JavaScriptObject image,
            boolean flipY) /*-{
                           this.texSubImage2D(target, level, xoffset, yoffset, image, flipY);
                           }-*/;

    private native void texSubImage2DImpl(int target, int level, int xoffset, int yoffset, JavaScriptObject image,
            boolean flipY, boolean asPremultipliedAlpha) /*-{
                                                         this.texSubImage2D(target, level, xoffset, yoffset, image, flipY, 
                                                         asPremultipliedAlpha);
                                                         }-*/;

    private native void uniform1fvImpl(WebGLUniformLocation location, JavaScriptObject v) /*-{
                                                                                          this.uniform1fv(location, v);
                                                                                          }-*/;

    private native void uniform1ivImpl(WebGLUniformLocation location, JavaScriptObject v) /*-{
                                                                                          this.uniform1iv(location, v);
                                                                                          }-*/;

    private native void uniform2fvImpl(WebGLUniformLocation location, JavaScriptObject v) /*-{
                                                                                          this.uniform2fv(location, v);
                                                                                          }-*/;

    private native void uniform2ivImpl(WebGLUniformLocation location, JavaScriptObject v) /*-{
                                                                                          this.uniform2iv(location, v);
                                                                                          }-*/;

    private native void uniform3fvImpl(WebGLUniformLocation location, JavaScriptObject v) /*-{
                                                                                          this.uniform3fv(location, v);
                                                                                          }-*/;

    private native void uniform3ivImpl(WebGLUniformLocation location, JavaScriptObject v) /*-{
                                                                                          this.uniform3iv(location, v);
                                                                                          }-*/;

    private native void uniform4fvImpl(WebGLUniformLocation location, JavaScriptObject v) /*-{
                                                                                          this.uniform4fv(location, v);
                                                                                          }-*/;

    private native void uniform4ivImpl(WebGLUniformLocation location, JavaScriptObject v) /*-{
                                                                                          this.uniform4iv(location, v);
                                                                                          }-*/;

    private native void vertexAttrib1fvImpl(int indx, JavaScriptObject values) /*-{
                                                                               this.vertexAttrib1fv(indx, values);
                                                                               }-*/;

    private native void vertexAttrib2fvImpl(int indx, JavaScriptObject values) /*-{
                                                                               this.vertexAttrib2fv(indx, values);
                                                                               }-*/;

    private native void vertexAttrib3fvImpl(int indx, JavaScriptObject values) /*-{
                                                                               this.vertexAttrib3fv(indx, values);
                                                                               }-*/;

    private native void vertexAttrib4fvImpl(int indx, JavaScriptObject values) /*-{
                                                                               this.vertexAttrib4fv(indx, values);
                                                                               }-*/;

    private native void vertexAttribPointerImpl(int indx, int size, int type, boolean normalized, int stride,
            int offset) /*-{
                        this.vertexAttribPointer(indx, size, type, normalized, stride, offset);      
                        }-*/;
}