diff --git a/examples/canvas3d/canvasswitch/qml/canvasswitch/main.qml b/examples/canvas3d/canvasswitch/qml/canvasswitch/main.qml
index b89a48f059b79c4d894d13f1c4047fef927b39cb..4fbcd0de40bbbe67c27d8ecb03e95f859c9bd5ed 100644
--- a/examples/canvas3d/canvasswitch/qml/canvasswitch/main.qml
+++ b/examples/canvas3d/canvasswitch/qml/canvasswitch/main.qml
@@ -177,8 +177,8 @@ Item {
             property double xRotAnim: mainview.xRotAnim
             property double yRotAnim: mainview.yRotAnim
             property double zRotAnim: mainview.zRotAnim
-            function initGL() { activeObject.initGL(canvas3d) }
-            function renderGL() { activeObject.renderGL(canvas3d) }
+            onInitGL: activeObject.initGL(canvas3d)
+            onRenderGL: activeObject.renderGL(canvas3d)
         }", layout)
         //! [2]
         //! [3]
diff --git a/examples/canvas3d/framebuffer/qml/framebuffer/main.qml b/examples/canvas3d/framebuffer/qml/framebuffer/main.qml
index d0b4a39650e6e6a883adcd628de1adec9d624b57..f5d19ed15357e3113a1878e0c2084959dc6225f0 100644
--- a/examples/canvas3d/framebuffer/qml/framebuffer/main.qml
+++ b/examples/canvas3d/framebuffer/qml/framebuffer/main.qml
@@ -59,15 +59,13 @@ Item {
         property double zRotAnim: 0
         property bool isRunning: true
 
-        // Called by Canvas 3D once on Scene Graph render thread
-        // to allow one time initializations to happen
-        function initGL() {
+        // Emitted when one time initializations should happen
+        onInitGL: {
             GLCode.initGL(canvas3d, textureImageLoader);
         }
 
-        // Called by Canvas 3D for every frame
-        // rendered on Scene Graph render thread
-        function renderGL() {
+        // Emitted each time Canvas3D is ready for a new frame
+        onRenderGL: {
             GLCode.renderGL(canvas3d);
         }
 
@@ -224,17 +222,17 @@ Item {
             return textureImageLoader.loadImage("qrc:/qml/framebuffer/"+file);
         }
 
-        function imageLoaded(textureImage) {
+        onImageLoaded: {
             if (canvas3d.logAllCalls)
-                console.log("Texture loaded, size "+textureImage.width+"x"+textureImage.height);
-            GLCode.textureLoaded(textureImage);
+                console.log("Texture loaded, size "+image.width+"x"+image.height);
+            GLCode.textureLoaded(image);
         }
 
-        function imageLoadingError(textureImage) {
+        onImageLoadingFailed: {
             if (GLCode.textureLoadError !== undefined) {
-                GLCode.textureLoadError(textureImage);
+                GLCode.textureLoadError(image);
             }
-            console.log("Texture load FAILED, "+textureImage.errorString);
+            console.log("Texture load FAILED, "+image.errorString);
         }
     }
 }
diff --git a/examples/canvas3d/interaction/qml/interaction/main.qml b/examples/canvas3d/interaction/qml/interaction/main.qml
index ac9be9aa3a6231de0c6b821ad40d6469345b8ff2..298f6e149ca7b0ae753e3926480feb51331f3354 100644
--- a/examples/canvas3d/interaction/qml/interaction/main.qml
+++ b/examples/canvas3d/interaction/qml/interaction/main.qml
@@ -60,15 +60,13 @@ Item {
         property double zRotSlider: 0
         //! [3]
 
-        // Called by Canvas 3D once on Scene Graph render thread
-        // to allow one time initializations to happen
-        function initGL() {
+        // Emitted when one time initializations should happen
+        onInitGL: {
             GLCode.initGL(canvas3d, textureImageLoader);
         }
 
-        // Called by Canvas 3D for every frame
-        // rendered on Scene Graph render thread
-        function renderGL() {
+        // Emitted each time Canvas3D is ready for a new frame
+        onRenderGL: {
             GLCode.renderGL(canvas3d);
         }
     }
@@ -145,17 +143,17 @@ Item {
     TextureImageLoader {
         id: textureImageLoader
 
-        function imageLoaded(textureImage) {
+        onImageLoaded: {
             if (canvas3d.logAllCalls)
-                console.log("Texture loaded, size "+textureImage.width+"x"+textureImage.height);
-            GLCode.textureLoaded(textureImage);
+                console.log("Texture loaded, size "+image.width+"x"+image.height);
+            GLCode.textureLoaded(image);
         }
 
-        function imageLoadingError(textureImage) {
+        onImageLoadingFailed: {
             if (GLCode.textureLoadError !== undefined) {
-                GLCode.textureLoadError(textureImage);
+                GLCode.textureLoadError(image);
             }
-            console.log("Texture load FAILED, "+textureImage.errorString);
+            console.log("Texture load FAILED, "+image.errorString);
         }
     }
 }
diff --git a/examples/canvas3d/jsonmodels/jsonmodels.qml b/examples/canvas3d/jsonmodels/jsonmodels.qml
index ec0d15ee21ead2fbd8215df0a4874c1eeaa5ca70..055635e1d9c0d376e9ca7c579e73d58957b8a943 100644
--- a/examples/canvas3d/jsonmodels/jsonmodels.qml
+++ b/examples/canvas3d/jsonmodels/jsonmodels.qml
@@ -40,11 +40,11 @@ Window {
                 property bool animatingCamera: false
                 property bool drawWireframe: false
 
-                function initGL() {
+                onInitGL: {
                     GLCode.initGL(canvas3d, textureImageLoader);
                 }
 
-                function renderGL() {
+                onRenderGL: {
                     GLCode.renderGL(canvas3d);
                 }
 
@@ -322,13 +322,13 @@ Window {
             return textureImageLoader.loadImage("qrc:///"+file);
         }
 
-        function imageLoaded(textureImage) {
-            GLCode.textureLoaded(textureImage);
+        onImageLoaded: {
+            GLCode.textureLoaded(image);
         }
 
-        function imageLoadingError(textureImage) {
+        onImageLoadingFailed: {
             if (GLCode.textureLoadError !== undefined) {
-                GLCode.textureLoadError(textureImage);
+                GLCode.textureLoadError(image);
             }
         }
     }
diff --git a/examples/canvas3d/jsonmodels/jsonmodelsbasic.qml b/examples/canvas3d/jsonmodels/jsonmodelsbasic.qml
index caab7a834a81f09fe7364837ad002e2222bfea2b..0d0d0168281b8aa7fa925bc727c4f3dfff595869 100644
--- a/examples/canvas3d/jsonmodels/jsonmodelsbasic.qml
+++ b/examples/canvas3d/jsonmodels/jsonmodelsbasic.qml
@@ -35,11 +35,11 @@ Window {
                 property bool animatingCamera: false
                 property bool drawWireframe: false
 
-                function initGL() {
+                onInitGL: {
                     GLCode.initGL(canvas3d, textureImageLoader);
                 }
 
-                function renderGL() {
+                onRenderGL: {
                     GLCode.renderGL(canvas3d);
                 }
 
@@ -266,13 +266,13 @@ Window {
             return textureImageLoader.loadImage("qrc:///"+file);
         }
 
-        function imageLoaded(textureImage) {
-            GLCode.textureLoaded(textureImage);
+        onImageLoaded: {
+            GLCode.textureLoaded(image);
         }
 
-        function imageLoadingError(textureImage) {
+        onImageLoadingFailed: {
             if (GLCode.textureLoadError !== undefined) {
-                GLCode.textureLoadError(textureImage);
+                GLCode.textureLoadError(image);
             }
         }
     }
diff --git a/examples/canvas3d/plasmaeffects/qml/plasmaeffects/main.qml b/examples/canvas3d/plasmaeffects/qml/plasmaeffects/main.qml
index 37a5f703eda9bbba761cb57e320ac885049dbe59..08ee4a08fd0f327d8f042a920e4402a3ddac6788 100644
--- a/examples/canvas3d/plasmaeffects/qml/plasmaeffects/main.qml
+++ b/examples/canvas3d/plasmaeffects/qml/plasmaeffects/main.qml
@@ -55,15 +55,13 @@ Item {
         property double zRotAnim: 0
         property bool isRunning: true
 
-        // Called by Canvas 3D once on Scene Graph render thread
-        // to allow one time initializations to happen
-        function initGL() {
+        // Emitted when one time initializations should happen
+        onInitGL: {
             GLCode.initGL(canvas3d, textureImageLoader);
         }
 
-        // Called by Canvas 3D for every frame
-        // rendered on Scene Graph render thread
-        function renderGL() {
+        // Emitted each time Canvas3D is ready for a new frame
+        onRenderGL: {
             GLCode.renderGL(canvas3d);
         }
 
@@ -150,17 +148,17 @@ Item {
     TextureImageLoader {
         id: textureImageLoader
 
-        function imageLoaded(textureImage) {
+        onImageLoaded: {
             if (canvas3d.logAllCalls)
-                console.log("Texture loaded, size "+textureImage.width+"x"+textureImage.height);
-            GLCode.textureLoaded(textureImage);
+                console.log("Texture loaded, size "+image.width+"x"+image.height);
+            GLCode.textureLoaded(image);
         }
 
-        function imageLoadingError(textureImage) {
+        onImageLoadingFailed: {
             if (GLCode.textureLoadError !== undefined) {
-                GLCode.textureLoadError(textureImage);
+                GLCode.textureLoadError(image);
             }
-            console.log("Texture load FAILED, "+textureImage.errorString);
+            console.log("Texture load FAILED, "+image.errorString);
         }
     }
 }
diff --git a/examples/canvas3d/pureqml/pureqml.qml b/examples/canvas3d/pureqml/pureqml.qml
index 1295a64b2242f7d38269da4818a278e53f40cbb9..2ab006e53d7a831c3a65d70079cbb87e9abd837b 100644
--- a/examples/canvas3d/pureqml/pureqml.qml
+++ b/examples/canvas3d/pureqml/pureqml.qml
@@ -62,12 +62,8 @@ Item {
         property double xRotAnim: 0
         property double yRotAnim: 0
         //! [1]
-        function initGL() {
-            GLCode.initGL(canvas3d);
-        }
-        function renderGL() {
-            GLCode.renderGL();
-        }
+        onInitGL: GLCode.initGL(canvas3d)
+        onRenderGL: GLCode.renderGL()
     }
     //! [0]
 }
diff --git a/examples/canvas3d/textureandlight/qml/textureandlight/main.qml b/examples/canvas3d/textureandlight/qml/textureandlight/main.qml
index 3c9c2b741f906574253164b37f08bf755811c284..b55d12469d32560c46d556ff10fdb2c1db2f498a 100644
--- a/examples/canvas3d/textureandlight/qml/textureandlight/main.qml
+++ b/examples/canvas3d/textureandlight/qml/textureandlight/main.qml
@@ -55,15 +55,13 @@ Item {
         property double zRotAnim: 0
         property bool isRunning: true
 
-        // Called by Canvas 3D once on Scene Graph render thread
-        // to allow one time initializations to happen
-        function initGL() {
+        // Emitted when one time initializations should happen
+        onInitGL: {
             GLCode.initGL(canvas3d, textureImageLoader);
         }
 
-        // Called by Canvas 3D for every frame
-        // rendered on Scene Graph render thread
-        function renderGL() {
+        // Emitted each time Canvas3D is ready for a new frame
+        onRenderGL: {
             GLCode.renderGL(canvas3d);
         }
 
@@ -156,17 +154,17 @@ Item {
             return textureImageLoader.loadImage("qrc:/qml/textureandlight/"+file);
         }
 
-        function imageLoaded(textureImage) {
+        onImageLoaded: {
             if (canvas3d.logAllCalls)
-                console.log("Texture loaded, size "+textureImage.width+"x"+textureImage.height);
-            GLCode.textureLoaded(textureImage);
+                console.log("Texture loaded, size "+image.width+"x"+image.height);
+            GLCode.textureLoaded(image);
         }
 
-        function imageLoadingError(textureImage) {
+        onImageLoadingFailed: {
             if (GLCode.textureLoadError !== undefined) {
-                GLCode.textureLoadError(textureImage);
+                GLCode.textureLoadError(image);
             }
-            console.log("Texture load FAILED, "+textureImage.errorString);
+            console.log("Texture load FAILED, "+image.errorString);
         }
     }
 }
diff --git a/examples/canvas3d/texturedcube/doc/src/texturedcube.qdoc b/examples/canvas3d/texturedcube/doc/src/texturedcube.qdoc
index 560304d4bf9eda4912c25038a94585c4a4fa36af..7327820870b83bdb600482bf27c7543e8b82c960 100644
--- a/examples/canvas3d/texturedcube/doc/src/texturedcube.qdoc
+++ b/examples/canvas3d/texturedcube/doc/src/texturedcube.qdoc
@@ -53,7 +53,7 @@
     \snippet texturedcube/qml/texturedcube/main.qml 0
     \dots
 
-    Inside it, we create the \c initGL and \c renderGL functions to forward the initialization
+    Inside it, we catch the \c initGL and \c renderGL signals to forward the initialization
     and rendering calls to the js object:
 
     \snippet texturedcube/qml/texturedcube/main.qml 1
diff --git a/examples/canvas3d/texturedcube/qml/texturedcube/main.qml b/examples/canvas3d/texturedcube/qml/texturedcube/main.qml
index 6e8ff22512a30b1323453d89586bce8af3591471..7645f2158c9b4c8c510b8b4943dc0a1888827b3a 100644
--- a/examples/canvas3d/texturedcube/qml/texturedcube/main.qml
+++ b/examples/canvas3d/texturedcube/qml/texturedcube/main.qml
@@ -62,15 +62,13 @@ Item {
         property bool isRunning: true
 
         //! [1]
-        // Called by Canvas 3D once on Scene Graph render thread
-        // to allow one time initializations to happen
-        function initGL() {
+        // Emitted when one time initializations should happen
+        onInitGL: {
             GLCode.initGL(canvas3d, textureImageLoader);
         }
 
-        // Called by Canvas 3D for every frame
-        // rendered on Scene Graph render thread
-        function renderGL() {
+        // Emitted each time Canvas3D is ready for a new frame
+        onRenderGL: {
             GLCode.renderGL(canvas3d);
         }
         //! [1]
@@ -148,17 +146,17 @@ Item {
     TextureImageLoader {
         id: textureImageLoader
 
-        function imageLoaded(textureImage) {
+        onImageLoaded: {
             if (canvas3d.logAllCalls)
-                console.log("Texture loaded, size "+textureImage.width+"x"+textureImage.height);
-            GLCode.textureLoaded(textureImage);
+                console.log("Texture loaded, size "+image.width+"x"+image.height);
+            GLCode.textureLoaded(image);
         }
 
-        function imageLoadingError(textureImage) {
+        onImageLoadingFailed: {
             if (GLCode.textureLoadError !== undefined) {
-                GLCode.textureLoadError(textureImage);
+                GLCode.textureLoadError(image);
             }
-            console.log("Texture load FAILED, "+textureImage.errorString);
+            console.log("Texture load FAILED, "+image.errorString);
         }
     }
     //! [3]
diff --git a/src/canvas3d.cpp b/src/canvas3d.cpp
index d200819f149e2c91a2513d1bdc91ee6077c90b1d..514c14ab2eaa9dd079f08ece68e13e3e50ff487b 100644
--- a/src/canvas3d.cpp
+++ b/src/canvas3d.cpp
@@ -63,9 +63,9 @@ static QHash<QQuickWindow *, bool> windowClearList;
  *
  * There are two functions that are called by the Canvas3D implementation:
  * \list
- * \li initGL() method is called before first frame is rendered and usually during that you get
+ * \li initGL is emitted before the first frame is rendered, and usually during that you get
  * the 3D context and initialize resources to be used later on during the rendering cycle.
- * \li renderGL() method is called for each frame to be rendered and usually during that you
+ * \li renderGL is emitted for each frame to be rendered, and usually during that you
  * submit 3D rendering calls to draw whatever 3D content you want to be displayed.
  * \endlist
  *
@@ -111,6 +111,16 @@ Canvas::Canvas(QQuickItem *parent):
     setFlag(ItemHasContents, !m_runningInDesigner);
 }
 
+/*!
+ * \qmlsignal void Canvas::initGL()
+ * Emitted once when Canvas3D is ready and OpenGL state initialization can be done by the client.
+ */
+
+/*!
+ * \qmlsignal void Canvas::renderGL()
+ * Emitted each time a new frame should be drawn to Canvas3D. Driven by the QML scenegraph loop.
+ */
+
 /*!
  * \internal
  */
@@ -200,15 +210,6 @@ bool Canvas::logAllErrors() const
  * \internal
  */
 
-/*!
- * \qmlsignal Canvas3D::initGLCalled()
- * Emitted after initGL has been called.
- */
-/*!
- * \fn Canvas::initGLCalled()
- * \internal
- */
-
 /*!
  * \qmlsignal Canvas3D::textureReady(int id, size size, float devicePixelRatio)
  * Emitted when a new texture is ready to inform the render node.
@@ -471,9 +472,10 @@ void Canvas::setImageLoader(CanvasTextureImageLoader *loader)
 
 /*!
  \qmlproperty bool Canvas3D::animated
- Specifies whether the Canvas3D continuously calls the \c renderGL() method to render new
+ Specifies whether the Canvas3D continuously emits the renderGL signal to render new
  frames or not. In most cases this property should be set to true as the 3D content is
  dynamic.
+ \note Currenly not used.
  */
 void Canvas::setAnimated(bool animated)
 {
@@ -620,12 +622,7 @@ void Canvas::renderNext()
     if (!m_glContext) {
         // Call the initialize function from QML/JavaScript until it calls the getContext() that in turn creates the buffers
         // Allow the JavaScript code to call the getContext() to create the context object and FBOs
-        QVariant ignoredReturnedValue;
-        QMetaObject::invokeMethod(this, "initGL",
-                                  Qt::DirectConnection,
-                                  Q_RETURN_ARG(QVariant, ignoredReturnedValue));
-
-        emit initGLCalled();
+        emit initGL();
 
         if (!m_isContextAttribsSet) {
             if (m_logAllCalls) qDebug() << "Canvas3D::" << __FUNCTION__ << " Context attributes not set, returning";
@@ -665,10 +662,7 @@ void Canvas::renderNext()
         m_imageLoader->notifyLoadedImages();
 
     // Call render in QML JavaScript side
-    QVariant ignoredReturnedValue;
-    QMetaObject::invokeMethod(this, "renderGL",
-                              Qt::DirectConnection,
-                              Q_RETURN_ARG(QVariant, ignoredReturnedValue));
+    emit renderGL();
 
     // Resolve MSAA
     if (m_contextAttribs.antialias()) {
diff --git a/src/canvas3d_p.h b/src/canvas3d_p.h
index d13596852ad5f95d4802ddc9e4004612c41f4985..8c7479fc71f45deddb0393a2313a6c50caa151c3 100644
--- a/src/canvas3d_p.h
+++ b/src/canvas3d_p.h
@@ -104,7 +104,9 @@ signals:
     void logAllCallsChanged(bool logCalls);
     void logAllErrorsChanged(bool logErrors);
     void contextChanged(CanvasContext *context);
-    void initGLCalled();
+
+    void initGL();
+    void renderGL();
 
     void textureReady(int id, const QSize &size, float devicePixelRatio);
 
diff --git a/src/qtcanvas3d.qmltypes b/src/qtcanvas3d.qmltypes
index 1e7795129d0b870cbe566db08546bfc23aa3d661..675d23da2058bb34f5ba4c33a4dfb7fc6cde2757 100644
--- a/src/qtcanvas3d.qmltypes
+++ b/src/qtcanvas3d.qmltypes
@@ -8,9 +8,77 @@ import QtQuick.tooling 1.1
 
 Module {
     Component {
-        name: "ArrayBuffer"
+        name: "Canvas"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["Canvas3D 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "context"; type: "CanvasContext"; isReadonly: true; isPointer: true }
+        Property { name: "animated"; type: "bool" }
+        Property { name: "logAllCalls"; type: "bool" }
+        Property { name: "logAllErrors"; type: "bool" }
+        Property { name: "devicePixelRatio"; type: "float"; isReadonly: true }
+        Property { name: "imageLoader"; type: "CanvasTextureImageLoader"; isPointer: true }
+        Signal { name: "needRender" }
+        Signal {
+            name: "devicePixelRatioChanged"
+            Parameter { name: "ratio"; type: "float" }
+        }
+        Signal {
+            name: "animatedChanged"
+            Parameter { name: "animated"; type: "bool" }
+        }
+        Signal {
+            name: "imageLoaderChanged"
+            Parameter { name: "loader"; type: "CanvasTextureImageLoader"; isPointer: true }
+        }
+        Signal {
+            name: "logAllCallsChanged"
+            Parameter { name: "logCalls"; type: "bool" }
+        }
+        Signal {
+            name: "logAllErrorsChanged"
+            Parameter { name: "logErrors"; type: "bool" }
+        }
+        Signal {
+            name: "contextChanged"
+            Parameter { name: "context"; type: "CanvasContext"; isPointer: true }
+        }
+        Signal { name: "initGLCalled" }
+        Signal {
+            name: "textureReady"
+            Parameter { name: "id"; type: "int" }
+            Parameter { name: "size"; type: "QSize" }
+            Parameter { name: "devicePixelRatio"; type: "float" }
+        }
+        Method { name: "ready" }
+        Method { name: "shutDown" }
+        Method { name: "renderNext" }
+        Method {
+            name: "getContext"
+            type: "CanvasContext*"
+            Parameter { name: "name"; type: "string" }
+        }
+        Method {
+            name: "getContext"
+            type: "CanvasContext*"
+            Parameter { name: "name"; type: "string" }
+            Parameter { name: "options"; type: "QVariantMap" }
+        }
+    }
+    Component {
+        name: "CanvasAbstractObject"
+        prototype: "QObject"
+        Property { name: "name"; type: "string" }
+        Signal {
+            name: "nameChanged"
+            Parameter { name: "name"; type: "string" }
+        }
+    }
+    Component {
+        name: "CanvasArrayBuffer"
         prototype: "QObject"
-        exports: ["QArrayBuffer 1.0"]
+        exports: ["ArrayBuffer 1.0"]
         isCreatable: false
         exportMetaObjectRevisions: [0]
         Property { name: "byteLength"; type: "ulong"; isReadonly: true }
@@ -18,15 +86,14 @@ Module {
             name: "byteLengthChanged"
             Parameter { name: "byteLength"; type: "ulong" }
         }
-        Method { name: "byteLength"; type: "ulong" }
         Method {
             name: "slice"
-            type: "ArrayBuffer*"
+            type: "CanvasArrayBuffer*"
             Parameter { name: "begin"; type: "long" }
         }
         Method {
             name: "slice"
-            type: "ArrayBuffer*"
+            type: "CanvasArrayBuffer*"
             Parameter { name: "begin"; type: "long" }
             Parameter { name: "end"; type: "long" }
         }
@@ -37,17 +104,17 @@ Module {
         }
     }
     Component {
-        name: "ArrayBufferView"
-        prototype: "QAbstractObject3D"
-        exports: ["QArrayBufferView 1.0"]
+        name: "CanvasArrayBufferView"
+        prototype: "CanvasAbstractObject"
+        exports: ["ArrayBufferView 1.0"]
         isCreatable: false
         exportMetaObjectRevisions: [0]
-        Property { name: "buffer"; type: "ArrayBuffer"; isReadonly: true; isPointer: true }
+        Property { name: "buffer"; type: "CanvasArrayBuffer"; isReadonly: true; isPointer: true }
         Property { name: "byteOffset"; type: "ulong"; isReadonly: true }
         Property { name: "byteLength"; type: "ulong"; isReadonly: true }
         Signal {
             name: "bufferChanged"
-            Parameter { name: "buffer"; type: "ArrayBuffer"; isPointer: true }
+            Parameter { name: "buffer"; type: "CanvasArrayBuffer"; isPointer: true }
         }
         Signal {
             name: "byteOffsetChanged"
@@ -57,180 +124,16 @@ Module {
             name: "byteLengthChanged"
             Parameter { name: "byteLength"; type: "ulong" }
         }
-        Method { name: "buffer"; type: "ArrayBuffer*" }
-        Method { name: "byteOffset"; type: "ulong" }
-        Method { name: "byteLength"; type: "ulong" }
     }
     Component {
-        name: "Float32Array"
-        prototype: "TypedArray"
-        exports: ["QFloat32Array 1.0"]
-        isCreatable: false
-        exportMetaObjectRevisions: [0]
-        Method {
-            name: "get"
-            type: "float"
-            Parameter { name: "index"; type: "ulong" }
-        }
-        Method {
-            name: "set"
-            Parameter { name: "index"; type: "ulong" }
-            Parameter { name: "value"; type: "float" }
-        }
-        Method {
-            name: "set"
-            Parameter { name: "array"; type: "QVariantList" }
-            Parameter { name: "offset"; type: "ulong" }
-        }
-        Method {
-            name: "set"
-            Parameter { name: "array"; type: "QVariantList" }
-        }
-        Method {
-            name: "set"
-            Parameter { name: "array"; type: "TypedArray"; isPointer: true }
-            Parameter { name: "offset"; type: "ulong" }
-        }
-        Method {
-            name: "set"
-            Parameter { name: "array"; type: "TypedArray"; isPointer: true }
-        }
-    }
-    Component {
-        name: "Float64Array"
-        prototype: "TypedArray"
-        exports: ["QFloat64Array 1.0"]
-        isCreatable: false
-        exportMetaObjectRevisions: [0]
-        Method {
-            name: "get"
-            type: "double"
-            Parameter { name: "index"; type: "ulong" }
-        }
-        Method {
-            name: "set"
-            Parameter { name: "index"; type: "ulong" }
-            Parameter { name: "value"; type: "double" }
-        }
-    }
-    Component {
-        name: "Int16Array"
-        prototype: "TypedArray"
-        exports: ["QInt16Array 1.0"]
-        isCreatable: false
-        exportMetaObjectRevisions: [0]
-        Method {
-            name: "get"
-            type: "short"
-            Parameter { name: "index"; type: "ulong" }
-        }
-        Method {
-            name: "set"
-            Parameter { name: "index"; type: "ulong" }
-            Parameter { name: "value"; type: "short" }
-        }
-    }
-    Component {
-        name: "Int32Array"
-        prototype: "TypedArray"
-        exports: ["QInt32Array 1.0"]
-        isCreatable: false
-        exportMetaObjectRevisions: [0]
-        Method {
-            name: "get"
-            type: "int"
-            Parameter { name: "index"; type: "ulong" }
-        }
-        Method {
-            name: "set"
-            Parameter { name: "index"; type: "ulong" }
-            Parameter { name: "value"; type: "int" }
-        }
-    }
-    Component {
-        name: "Int8Array"
-        prototype: "TypedArray"
-        exports: ["QInt8Array 1.0"]
-        isCreatable: false
-        exportMetaObjectRevisions: [0]
-        Method {
-            name: "get"
-            type: "signed char"
-            Parameter { name: "index"; type: "ulong" }
-        }
-        Method {
-            name: "set"
-            Parameter { name: "index"; type: "ulong" }
-            Parameter { name: "value"; type: "signed char" }
-        }
-    }
-    Component {
-        name: "QAbstractObject3D"
-        prototype: "QObject"
-        Property { name: "name"; type: "string" }
-        Signal {
-            name: "nameChanged"
-            Parameter { name: "name"; type: "string" }
-        }
-    }
-    Component {
-        name: "QBuffer3D"
-        prototype: "QAbstractObject3D"
+        name: "CanvasBuffer"
+        prototype: "CanvasAbstractObject"
         exports: ["Buffer3D 1.0"]
         isCreatable: false
         exportMetaObjectRevisions: [0]
     }
     Component {
-        name: "QtCanvas3D"
-        defaultProperty: "data"
-        prototype: "QQuickItem"
-        exports: ["Canvas3D 1.0"]
-        exportMetaObjectRevisions: [0]
-        Property { name: "devicePixelRatio"; type: "float"; isReadonly: true }
-        Property { name: "imageLoader"; type: "QTexImageLoader3D"; isPointer: true }
-        Signal { name: "needRender" }
-        Signal {
-            name: "devicePixelRatioChanged"
-            Parameter { name: "ratio"; type: "float" }
-        }
-        Signal {
-            name: "animatedChanged"
-            Parameter { name: "animated"; type: "bool" }
-        }
-        Signal {
-            name: "clearWindowOnRenderUnderChanged"
-            Parameter { name: "enable"; type: "bool" }
-        }
-        Signal {
-            name: "renderOnTopChanged"
-            Parameter { name: "renderOnTop"; type: "bool" }
-        }
-        Signal {
-            name: "imageLoaderChanged"
-            Parameter { name: "loader"; type: "QTexImageLoader3D"; isPointer: true }
-        }
-        Signal {
-            name: "textureReady"
-            Parameter { name: "id"; type: "int" }
-            Parameter { name: "size"; type: "QSize" }
-        }
-        Method { name: "ready" }
-        Method { name: "shutDown" }
-        Method { name: "renderNext" }
-        Method {
-            name: "getContext"
-            type: "QContext3D*"
-            Parameter { name: "name"; type: "string" }
-        }
-        Method {
-            name: "getContext"
-            type: "QContext3D*"
-            Parameter { name: "name"; type: "string" }
-            Parameter { name: "options"; type: "QVariantMap" }
-        }
-    }
-    Component {
-        name: "QContext3D"
+        name: "CanvasContext"
         prototype: "QObject"
         exports: ["Context3D 1.0"]
         isCreatable: false
@@ -539,386 +442,435 @@ Module {
                 "UNMASKED_RENDERER_WEBGL": 37446
             }
         }
-        Property { name: "canvas"; type: "QtCanvas3D"; isReadonly: true; isPointer: true }
-        Property { name: "DEPTH_BUFFER_BIT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_BUFFER_BIT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "COLOR_BUFFER_BIT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "POINTS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LINES"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LINE_LOOP"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LINE_STRIP"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TRIANGLES"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TRIANGLE_STRIP"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TRIANGLE_FAN"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ZERO"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ONE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SRC_COLOR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ONE_MINUS_SRC_COLOR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SRC_ALPHA"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ONE_MINUS_SRC_ALPHA"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DST_ALPHA"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ONE_MINUS_DST_ALPHA"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DST_COLOR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ONE_MINUS_DST_COLOR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SRC_ALPHA_SATURATE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FUNC_ADD"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BLEND_EQUATION"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BLEND_EQUATION_RGB"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BLEND_EQUATION_ALPHA"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FUNC_SUBTRACT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FUNC_REVERSE_SUBTRACT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BLEND_DST_RGB"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BLEND_SRC_RGB"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BLEND_DST_ALPHA"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BLEND_SRC_ALPHA"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "CONSTANT_COLOR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ONE_MINUS_CONSTANT_COLOR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "CONSTANT_ALPHA"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ONE_MINUS_CONSTANT_ALPHA"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BLEND_COLOR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ARRAY_BUFFER"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ELEMENT_ARRAY_BUFFER"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ARRAY_BUFFER_BINDING"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ELEMENT_ARRAY_BUFFER_BINDING"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STREAM_DRAW"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STATIC_DRAW"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DYNAMIC_DRAW"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BUFFER_SIZE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BUFFER_USAGE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "CURRENT_VERTEX_ATTRIB"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FRONT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BACK"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FRONT_AND_BACK"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "CULL_FACE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BLEND"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DITHER"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_TEST"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DEPTH_TEST"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SCISSOR_TEST"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "POLYGON_OFFSET_FILL"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SAMPLE_ALPHA_TO_COVERAGE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SAMPLE_COVERAGE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "NO_ERROR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "INVALID_ENUM"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "INVALID_VALUE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "INVALID_OPERATION"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "OUT_OF_MEMORY"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "CW"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "CCW"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LINE_WIDTH"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ALIASED_POINT_SIZE_RANGE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ALIASED_LINE_WIDTH_RANGE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "CULL_FACE_MODE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FRONT_FACE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DEPTH_RANGE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DEPTH_WRITEMASK"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DEPTH_CLEAR_VALUE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DEPTH_FUNC"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_CLEAR_VALUE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_FUNC"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_FAIL"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_PASS_DEPTH_FAIL"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_PASS_DEPTH_PASS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_REF"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_VALUE_MASK"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_WRITEMASK"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_BACK_FUNC"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_BACK_FAIL"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_BACK_PASS_DEPTH_FAIL"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_BACK_PASS_DEPTH_PASS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_BACK_REF"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_BACK_VALUE_MASK"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_BACK_WRITEMASK"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "VIEWPORT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SCISSOR_BOX"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "COLOR_CLEAR_VALUE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "COLOR_WRITEMASK"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "UNPACK_ALIGNMENT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "PACK_ALIGNMENT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "MAX_TEXTURE_SIZE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "MAX_VIEWPORT_DIMS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SUBPIXEL_BITS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RED_BITS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "GREEN_BITS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BLUE_BITS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ALPHA_BITS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DEPTH_BITS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_BITS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "POLYGON_OFFSET_UNITS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "POLYGON_OFFSET_FACTOR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_BINDING_2D"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SAMPLE_BUFFERS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SAMPLES"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SAMPLE_COVERAGE_VALUE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SAMPLE_COVERAGE_INVERT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "COMPRESSED_TEXTURE_FORMATS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DONT_CARE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FASTEST"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "NICEST"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "GENERATE_MIPMAP_HINT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BYTE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "UNSIGNED_BYTE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SHORT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "UNSIGNED_SHORT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "INT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "UNSIGNED_INT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FLOAT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DEPTH_COMPONENT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ALPHA"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RGB"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RGBA"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LUMINANCE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LUMINANCE_ALPHA"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "UNSIGNED_SHORT_4_4_4_4"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "UNSIGNED_SHORT_5_5_5_1"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "UNSIGNED_SHORT_5_6_5"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FRAGMENT_SHADER"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "VERTEX_SHADER"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "MAX_VERTEX_ATTRIBS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "MAX_VERTEX_UNIFORM_VECTORS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "MAX_VARYING_VECTORS"; type: "QContext3D::glEnums"; isReadonly: true }
+        Property { name: "canvas"; type: "Canvas"; isReadonly: true; isPointer: true }
+        Property { name: "logAllCalls"; type: "bool" }
+        Property { name: "logAllErrors"; type: "bool" }
+        Property { name: "DEPTH_BUFFER_BIT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_BUFFER_BIT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "COLOR_BUFFER_BIT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "POINTS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LINES"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LINE_LOOP"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LINE_STRIP"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TRIANGLES"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TRIANGLE_STRIP"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TRIANGLE_FAN"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ZERO"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ONE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SRC_COLOR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ONE_MINUS_SRC_COLOR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SRC_ALPHA"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ONE_MINUS_SRC_ALPHA"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DST_ALPHA"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ONE_MINUS_DST_ALPHA"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DST_COLOR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ONE_MINUS_DST_COLOR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SRC_ALPHA_SATURATE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FUNC_ADD"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BLEND_EQUATION"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BLEND_EQUATION_RGB"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BLEND_EQUATION_ALPHA"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FUNC_SUBTRACT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FUNC_REVERSE_SUBTRACT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BLEND_DST_RGB"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BLEND_SRC_RGB"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BLEND_DST_ALPHA"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BLEND_SRC_ALPHA"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "CONSTANT_COLOR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ONE_MINUS_CONSTANT_COLOR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "CONSTANT_ALPHA"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ONE_MINUS_CONSTANT_ALPHA"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BLEND_COLOR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ARRAY_BUFFER"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ELEMENT_ARRAY_BUFFER"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ARRAY_BUFFER_BINDING"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property {
+            name: "ELEMENT_ARRAY_BUFFER_BINDING"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property { name: "STREAM_DRAW"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STATIC_DRAW"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DYNAMIC_DRAW"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BUFFER_SIZE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BUFFER_USAGE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "CURRENT_VERTEX_ATTRIB"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FRONT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BACK"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FRONT_AND_BACK"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "CULL_FACE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BLEND"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DITHER"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_TEST"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DEPTH_TEST"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SCISSOR_TEST"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "POLYGON_OFFSET_FILL"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SAMPLE_ALPHA_TO_COVERAGE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SAMPLE_COVERAGE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "NO_ERROR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "INVALID_ENUM"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "INVALID_VALUE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "INVALID_OPERATION"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "OUT_OF_MEMORY"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "CW"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "CCW"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LINE_WIDTH"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ALIASED_POINT_SIZE_RANGE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ALIASED_LINE_WIDTH_RANGE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "CULL_FACE_MODE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FRONT_FACE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DEPTH_RANGE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DEPTH_WRITEMASK"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DEPTH_CLEAR_VALUE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DEPTH_FUNC"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_CLEAR_VALUE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_FUNC"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_FAIL"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_PASS_DEPTH_FAIL"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_PASS_DEPTH_PASS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_REF"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_VALUE_MASK"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_WRITEMASK"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_BACK_FUNC"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_BACK_FAIL"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property {
+            name: "STENCIL_BACK_PASS_DEPTH_FAIL"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property {
+            name: "STENCIL_BACK_PASS_DEPTH_PASS"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property { name: "STENCIL_BACK_REF"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_BACK_VALUE_MASK"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_BACK_WRITEMASK"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "VIEWPORT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SCISSOR_BOX"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "COLOR_CLEAR_VALUE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "COLOR_WRITEMASK"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "UNPACK_ALIGNMENT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "PACK_ALIGNMENT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "MAX_TEXTURE_SIZE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "MAX_VIEWPORT_DIMS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SUBPIXEL_BITS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RED_BITS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "GREEN_BITS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BLUE_BITS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ALPHA_BITS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DEPTH_BITS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_BITS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "POLYGON_OFFSET_UNITS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "POLYGON_OFFSET_FACTOR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE_BINDING_2D"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SAMPLE_BUFFERS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SAMPLES"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SAMPLE_COVERAGE_VALUE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SAMPLE_COVERAGE_INVERT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property {
+            name: "COMPRESSED_TEXTURE_FORMATS"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property { name: "DONT_CARE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FASTEST"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "NICEST"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "GENERATE_MIPMAP_HINT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BYTE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "UNSIGNED_BYTE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SHORT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "UNSIGNED_SHORT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "INT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "UNSIGNED_INT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FLOAT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DEPTH_COMPONENT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ALPHA"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RGB"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RGBA"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LUMINANCE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LUMINANCE_ALPHA"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "UNSIGNED_SHORT_4_4_4_4"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "UNSIGNED_SHORT_5_5_5_1"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "UNSIGNED_SHORT_5_6_5"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FRAGMENT_SHADER"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "VERTEX_SHADER"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "MAX_VERTEX_ATTRIBS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property {
+            name: "MAX_VERTEX_UNIFORM_VECTORS"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property { name: "MAX_VARYING_VECTORS"; type: "CanvasContext::glEnums"; isReadonly: true }
         Property {
             name: "MAX_COMBINED_TEXTURE_IMAGE_UNITS"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
         Property {
             name: "MAX_VERTEX_TEXTURE_IMAGE_UNITS"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property { name: "MAX_TEXTURE_IMAGE_UNITS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property {
+            name: "MAX_FRAGMENT_UNIFORM_VECTORS"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
-        Property { name: "MAX_TEXTURE_IMAGE_UNITS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "MAX_FRAGMENT_UNIFORM_VECTORS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SHADER_TYPE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DELETE_STATUS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LINK_STATUS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "VALIDATE_STATUS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ATTACHED_SHADERS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ACTIVE_UNIFORMS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ACTIVE_ATTRIBUTES"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SHADING_LANGUAGE_VERSION"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "CURRENT_PROGRAM"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "NEVER"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LESS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "EQUAL"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LEQUAL"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "GREATER"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "NOTEQUAL"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "GEQUAL"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ALWAYS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "KEEP"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "REPLACE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "INCR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DECR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "INVERT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "INCR_WRAP"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DECR_WRAP"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "VENDOR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RENDERER"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "VERSION"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "NEAREST"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LINEAR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "NEAREST_MIPMAP_NEAREST"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LINEAR_MIPMAP_NEAREST"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "NEAREST_MIPMAP_LINEAR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LINEAR_MIPMAP_LINEAR"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_MAG_FILTER"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_MIN_FILTER"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_WRAP_S"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_WRAP_T"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_2D"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_CUBE_MAP"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_BINDING_CUBE_MAP"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_CUBE_MAP_POSITIVE_X"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_CUBE_MAP_NEGATIVE_X"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_CUBE_MAP_POSITIVE_Y"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_CUBE_MAP_NEGATIVE_Y"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_CUBE_MAP_POSITIVE_Z"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE_CUBE_MAP_NEGATIVE_Z"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "MAX_CUBE_MAP_TEXTURE_SIZE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE0"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE1"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE2"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE3"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE4"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE5"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE6"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE7"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE8"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE9"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE10"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE11"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE12"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE13"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE14"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE15"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE16"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE17"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE18"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE19"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE20"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE21"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE22"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE23"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE24"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE25"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE26"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE27"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE28"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE29"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE30"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "TEXTURE31"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "ACTIVE_TEXTURE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "REPEAT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "CLAMP_TO_EDGE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "MIRRORED_REPEAT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FLOAT_VEC2"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FLOAT_VEC3"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FLOAT_VEC4"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "INT_VEC2"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "INT_VEC3"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "INT_VEC4"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BOOL"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BOOL_VEC2"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BOOL_VEC3"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "BOOL_VEC4"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FLOAT_MAT2"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FLOAT_MAT3"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FLOAT_MAT4"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SAMPLER_2D"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "SAMPLER_CUBE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "VERTEX_ATTRIB_ARRAY_ENABLED"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "VERTEX_ATTRIB_ARRAY_SIZE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "VERTEX_ATTRIB_ARRAY_STRIDE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "VERTEX_ATTRIB_ARRAY_TYPE"; type: "QContext3D::glEnums"; isReadonly: true }
+        Property { name: "SHADER_TYPE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DELETE_STATUS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LINK_STATUS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "VALIDATE_STATUS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ATTACHED_SHADERS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ACTIVE_UNIFORMS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ACTIVE_ATTRIBUTES"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SHADING_LANGUAGE_VERSION"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "CURRENT_PROGRAM"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "NEVER"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LESS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "EQUAL"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LEQUAL"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "GREATER"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "NOTEQUAL"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "GEQUAL"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ALWAYS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "KEEP"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "REPLACE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "INCR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DECR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "INVERT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "INCR_WRAP"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DECR_WRAP"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "VENDOR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RENDERER"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "VERSION"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "NEAREST"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LINEAR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "NEAREST_MIPMAP_NEAREST"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LINEAR_MIPMAP_NEAREST"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "NEAREST_MIPMAP_LINEAR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LINEAR_MIPMAP_LINEAR"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE_MAG_FILTER"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE_MIN_FILTER"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE_WRAP_S"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE_WRAP_T"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE_2D"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE_CUBE_MAP"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE_BINDING_CUBE_MAP"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property {
+            name: "TEXTURE_CUBE_MAP_POSITIVE_X"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property {
+            name: "TEXTURE_CUBE_MAP_NEGATIVE_X"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property {
+            name: "TEXTURE_CUBE_MAP_POSITIVE_Y"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property {
+            name: "TEXTURE_CUBE_MAP_NEGATIVE_Y"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property {
+            name: "TEXTURE_CUBE_MAP_POSITIVE_Z"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property {
+            name: "TEXTURE_CUBE_MAP_NEGATIVE_Z"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property { name: "MAX_CUBE_MAP_TEXTURE_SIZE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE0"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE1"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE2"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE3"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE4"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE5"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE6"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE7"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE8"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE9"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE10"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE11"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE12"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE13"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE14"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE15"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE16"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE17"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE18"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE19"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE20"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE21"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE22"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE23"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE24"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE25"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE26"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE27"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE28"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE29"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE30"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "TEXTURE31"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "ACTIVE_TEXTURE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "REPEAT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "CLAMP_TO_EDGE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "MIRRORED_REPEAT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FLOAT_VEC2"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FLOAT_VEC3"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FLOAT_VEC4"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "INT_VEC2"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "INT_VEC3"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "INT_VEC4"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BOOL"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BOOL_VEC2"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BOOL_VEC3"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "BOOL_VEC4"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FLOAT_MAT2"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FLOAT_MAT3"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FLOAT_MAT4"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SAMPLER_2D"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "SAMPLER_CUBE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property {
+            name: "VERTEX_ATTRIB_ARRAY_ENABLED"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property { name: "VERTEX_ATTRIB_ARRAY_SIZE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property {
+            name: "VERTEX_ATTRIB_ARRAY_STRIDE"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property { name: "VERTEX_ATTRIB_ARRAY_TYPE"; type: "CanvasContext::glEnums"; isReadonly: true }
         Property {
             name: "VERTEX_ATTRIB_ARRAY_NORMALIZED"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property {
+            name: "VERTEX_ATTRIB_ARRAY_POINTER"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
-        Property { name: "VERTEX_ATTRIB_ARRAY_POINTER"; type: "QContext3D::glEnums"; isReadonly: true }
         Property {
             name: "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
-        Property { name: "COMPILE_STATUS"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LOW_FLOAT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "MEDIUM_FLOAT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "HIGH_FLOAT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "LOW_INT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "MEDIUM_INT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "HIGH_INT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FRAMEBUFFER"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RENDERBUFFER"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RGBA4"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RGB5_A1"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RGB565"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DEPTH_COMPONENT16"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_INDEX"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_INDEX8"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DEPTH_STENCIL"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RENDERBUFFER_WIDTH"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RENDERBUFFER_HEIGHT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RENDERBUFFER_INTERNAL_FORMAT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RENDERBUFFER_RED_SIZE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RENDERBUFFER_GREEN_SIZE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RENDERBUFFER_BLUE_SIZE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RENDERBUFFER_ALPHA_SIZE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RENDERBUFFER_DEPTH_SIZE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RENDERBUFFER_STENCIL_SIZE"; type: "QContext3D::glEnums"; isReadonly: true }
+        Property { name: "COMPILE_STATUS"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LOW_FLOAT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "MEDIUM_FLOAT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "HIGH_FLOAT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "LOW_INT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "MEDIUM_INT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "HIGH_INT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FRAMEBUFFER"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RENDERBUFFER"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RGBA4"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RGB5_A1"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RGB565"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DEPTH_COMPONENT16"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_INDEX"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_INDEX8"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DEPTH_STENCIL"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RENDERBUFFER_WIDTH"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RENDERBUFFER_HEIGHT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property {
+            name: "RENDERBUFFER_INTERNAL_FORMAT"
+            type: "CanvasContext::glEnums"
+            isReadonly: true
+        }
+        Property { name: "RENDERBUFFER_RED_SIZE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RENDERBUFFER_GREEN_SIZE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RENDERBUFFER_BLUE_SIZE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RENDERBUFFER_ALPHA_SIZE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RENDERBUFFER_DEPTH_SIZE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RENDERBUFFER_STENCIL_SIZE"; type: "CanvasContext::glEnums"; isReadonly: true }
         Property {
             name: "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
         Property {
             name: "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
         Property {
             name: "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
         Property {
             name: "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
-        Property { name: "COLOR_ATTACHMENT0"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DEPTH_ATTACHMENT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "STENCIL_ATTACHMENT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "DEPTH_STENCIL_ATTACHMENT"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "NONE"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FRAMEBUFFER_COMPLETE"; type: "QContext3D::glEnums"; isReadonly: true }
+        Property { name: "COLOR_ATTACHMENT0"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DEPTH_ATTACHMENT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "STENCIL_ATTACHMENT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "DEPTH_STENCIL_ATTACHMENT"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "NONE"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FRAMEBUFFER_COMPLETE"; type: "CanvasContext::glEnums"; isReadonly: true }
         Property {
             name: "FRAMEBUFFER_INCOMPLETE_ATTACHMENT"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
         Property {
             name: "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
         Property {
             name: "FRAMEBUFFER_INCOMPLETE_DIMENSIONS"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
-        Property { name: "FRAMEBUFFER_UNSUPPORTED"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "FRAMEBUFFER_BINDING"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "RENDERBUFFER_BINDING"; type: "QContext3D::glEnums"; isReadonly: true }
-        Property { name: "MAX_RENDERBUFFER_SIZE"; type: "QContext3D::glEnums"; isReadonly: true }
+        Property { name: "FRAMEBUFFER_UNSUPPORTED"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "FRAMEBUFFER_BINDING"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "RENDERBUFFER_BINDING"; type: "CanvasContext::glEnums"; isReadonly: true }
+        Property { name: "MAX_RENDERBUFFER_SIZE"; type: "CanvasContext::glEnums"; isReadonly: true }
         Property {
             name: "INVALID_FRAMEBUFFER_OPERATION"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
-        Property { name: "UNPACK_FLIP_Y_WEBGL"; type: "QContext3D::glEnums"; isReadonly: true }
+        Property { name: "UNPACK_FLIP_Y_WEBGL"; type: "CanvasContext::glEnums"; isReadonly: true }
         Property {
             name: "UNPACK_PREMULTIPLY_ALPHA_WEBGL"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
-        Property { name: "CONTEXT_LOST_WEBGL"; type: "QContext3D::glEnums"; isReadonly: true }
+        Property { name: "CONTEXT_LOST_WEBGL"; type: "CanvasContext::glEnums"; isReadonly: true }
         Property {
             name: "UNPACK_COLORSPACE_CONVERSION_WEBGL"
-            type: "QContext3D::glEnums"
+            type: "CanvasContext::glEnums"
             isReadonly: true
         }
-        Property { name: "BROWSER_DEFAULT_WEBGL"; type: "QContext3D::glEnums"; isReadonly: true }
-        Signal {
-            name: "viewportChanged"
-            Parameter { name: "viewport"; type: "QRect" }
-        }
-        Signal {
-            name: "viewportWidthChanged"
-            Parameter { name: "width"; type: "int" }
-        }
-        Signal {
-            name: "viewportHeightChanged"
-            Parameter { name: "height"; type: "int" }
-        }
+        Property { name: "BROWSER_DEFAULT_WEBGL"; type: "CanvasContext::glEnums"; isReadonly: true }
         Signal {
-            name: "imageLoaded"
-            Parameter { name: "url"; type: "QUrl" }
-            Parameter { name: "width"; type: "int" }
-            Parameter { name: "height"; type: "int" }
-            Parameter { name: "format"; type: "int" }
-            Parameter { name: "list"; type: "QVariantList" }
+            name: "canvasChanged"
+            Parameter { name: "canvas"; type: "Canvas"; isPointer: true }
         }
         Signal {
-            name: "imageLoadingError"
-            Parameter { name: "url"; type: "QUrl" }
-            Parameter { name: "errorString"; type: "string" }
+            name: "logAllCallsChanged"
+            Parameter { name: "logCalls"; type: "bool" }
         }
         Signal {
-            name: "canvasChanged"
-            Parameter { name: "canvas"; type: "QtCanvas3D"; isPointer: true }
+            name: "logAllErrorsChanged"
+            Parameter { name: "logErrors"; type: "bool" }
         }
         Method { name: "getSupportedExtensions"; type: "QVariantList" }
         Method {
@@ -927,19 +879,19 @@ Module {
             Parameter { name: "name"; type: "string" }
         }
         Method { name: "isContextLost"; type: "bool" }
-        Method { name: "getContextAttributes"; type: "QContextAttributes*" }
+        Method { name: "getContextAttributes"; type: "CanvasContextAttributes*" }
         Method {
             name: "getShaderPrecisionFormat"
-            type: "QShaderPrecisionFormat*"
+            type: "CanvasShaderPrecisionFormat*"
             Parameter { name: "shadertype"; type: "glEnums" }
             Parameter { name: "precisiontype"; type: "glEnums" }
         }
         Method { name: "flush" }
         Method { name: "finish" }
-        Method { name: "createTexture"; type: "QTexture3D*" }
+        Method { name: "createTexture"; type: "CanvasTexture*" }
         Method {
             name: "deleteTexture"
-            Parameter { name: "texture"; type: "QTexture3D"; isPointer: true }
+            Parameter { name: "texture"; type: "CanvasTexture"; isPointer: true }
         }
         Method {
             name: "activeTexture"
@@ -948,7 +900,7 @@ Module {
         Method {
             name: "bindTexture"
             Parameter { name: "target"; type: "glEnums" }
-            Parameter { name: "texture"; type: "QTexture3D"; isPointer: true }
+            Parameter { name: "texture"; type: "CanvasTexture"; isPointer: true }
         }
         Method {
             name: "generateMipmap"
@@ -967,7 +919,7 @@ Module {
             Parameter { name: "width"; type: "int" }
             Parameter { name: "height"; type: "int" }
             Parameter { name: "border"; type: "int" }
-            Parameter { name: "pixels"; type: "TypedArray"; isPointer: true }
+            Parameter { name: "pixels"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "compressedTexSubImage2D"
@@ -978,7 +930,7 @@ Module {
             Parameter { name: "width"; type: "int" }
             Parameter { name: "height"; type: "int" }
             Parameter { name: "format"; type: "glEnums" }
-            Parameter { name: "pixels"; type: "TypedArray"; isPointer: true }
+            Parameter { name: "pixels"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "copyTexImage2D"
@@ -1012,7 +964,7 @@ Module {
             Parameter { name: "border"; type: "int" }
             Parameter { name: "format"; type: "glEnums" }
             Parameter { name: "type"; type: "glEnums" }
-            Parameter { name: "pixels"; type: "TypedArray"; isPointer: true }
+            Parameter { name: "pixels"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "texSubImage2D"
@@ -1024,7 +976,7 @@ Module {
             Parameter { name: "height"; type: "int" }
             Parameter { name: "format"; type: "glEnums" }
             Parameter { name: "type"; type: "glEnums" }
-            Parameter { name: "pixels"; type: "TypedArray"; isPointer: true }
+            Parameter { name: "pixels"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "texImage2D"
@@ -1033,7 +985,7 @@ Module {
             Parameter { name: "internalformat"; type: "glEnums" }
             Parameter { name: "format"; type: "glEnums" }
             Parameter { name: "type"; type: "glEnums" }
-            Parameter { name: "image"; type: "QTexImage3D"; isPointer: true }
+            Parameter { name: "image"; type: "CanvasTextureImage"; isPointer: true }
         }
         Method {
             name: "texSubImage2D"
@@ -1043,7 +995,7 @@ Module {
             Parameter { name: "yoffset"; type: "int" }
             Parameter { name: "format"; type: "glEnums" }
             Parameter { name: "type"; type: "glEnums" }
-            Parameter { name: "image"; type: "QTexImage3D"; isPointer: true }
+            Parameter { name: "image"; type: "CanvasTextureImage"; isPointer: true }
         }
         Method {
             name: "texParameterf"
@@ -1057,11 +1009,11 @@ Module {
             Parameter { name: "pname"; type: "glEnums" }
             Parameter { name: "param"; type: "int" }
         }
-        Method { name: "createFramebuffer"; type: "QFramebuffer3D*" }
+        Method { name: "createFramebuffer"; type: "CanvasFrameBuffer*" }
         Method {
             name: "bindFramebuffer"
             Parameter { name: "target"; type: "glEnums" }
-            Parameter { name: "framebuffer"; type: "QFramebuffer3D"; isPointer: true }
+            Parameter { name: "framebuffer"; type: "CanvasFrameBuffer"; isPointer: true }
         }
         Method {
             name: "checkFramebufferStatus"
@@ -1073,14 +1025,14 @@ Module {
             Parameter { name: "target"; type: "glEnums" }
             Parameter { name: "attachment"; type: "glEnums" }
             Parameter { name: "renderbuffertarget"; type: "glEnums" }
-            Parameter { name: "renderbuffer"; type: "QRenderbuffer3D"; isPointer: true }
+            Parameter { name: "renderbuffer"; type: "CanvasRenderBuffer"; isPointer: true }
         }
         Method {
             name: "framebufferTexture2D"
             Parameter { name: "target"; type: "glEnums" }
             Parameter { name: "attachment"; type: "glEnums" }
             Parameter { name: "textarget"; type: "glEnums" }
-            Parameter { name: "texture"; type: "QTexture3D"; isPointer: true }
+            Parameter { name: "texture"; type: "CanvasTexture"; isPointer: true }
             Parameter { name: "level"; type: "int" }
         }
         Method {
@@ -1090,13 +1042,13 @@ Module {
         }
         Method {
             name: "deleteFramebuffer"
-            Parameter { name: "buffer"; type: "QFramebuffer3D"; isPointer: true }
+            Parameter { name: "buffer"; type: "CanvasFrameBuffer"; isPointer: true }
         }
-        Method { name: "createRenderbuffer"; type: "QRenderbuffer3D*" }
+        Method { name: "createRenderbuffer"; type: "CanvasRenderBuffer*" }
         Method {
             name: "bindRenderbuffer"
             Parameter { name: "target"; type: "glEnums" }
-            Parameter { name: "renderbuffer"; type: "QRenderbuffer3D"; isPointer: true }
+            Parameter { name: "renderbuffer"; type: "CanvasRenderBuffer"; isPointer: true }
         }
         Method {
             name: "renderbufferStorage"
@@ -1112,7 +1064,7 @@ Module {
         }
         Method {
             name: "deleteRenderbuffer"
-            Parameter { name: "renderbuffer"; type: "QRenderbuffer3D"; isPointer: true }
+            Parameter { name: "renderbuffer"; type: "CanvasRenderBuffer"; isPointer: true }
         }
         Method {
             name: "sampleCoverage"
@@ -1121,7 +1073,7 @@ Module {
         }
         Method {
             name: "createShader"
-            type: "QShader3D*"
+            type: "CanvasShader*"
             Parameter { name: "type"; type: "glEnums" }
         }
         Method {
@@ -1131,61 +1083,61 @@ Module {
         }
         Method {
             name: "deleteShader"
-            Parameter { name: "shader"; type: "QShader3D"; isPointer: true }
+            Parameter { name: "shader"; type: "CanvasShader"; isPointer: true }
         }
         Method {
             name: "shaderSource"
-            Parameter { name: "shader"; type: "QShader3D"; isPointer: true }
+            Parameter { name: "shader"; type: "CanvasShader"; isPointer: true }
             Parameter { name: "shaderSource"; type: "string" }
         }
         Method {
             name: "getShaderSource"
             type: "string"
-            Parameter { name: "shader"; type: "QShader3D"; isPointer: true }
+            Parameter { name: "shader"; type: "CanvasShader"; isPointer: true }
         }
         Method {
             name: "compileShader"
-            Parameter { name: "shader"; type: "QShader3D"; isPointer: true }
+            Parameter { name: "shader"; type: "CanvasShader"; isPointer: true }
         }
         Method {
             name: "uniform1f"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "x"; type: "float" }
         }
         Method {
             name: "uniform1i"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "x"; type: "int" }
         }
         Method {
             name: "uniform2f"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "x"; type: "float" }
             Parameter { name: "y"; type: "float" }
         }
         Method {
             name: "uniform2i"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "x"; type: "int" }
             Parameter { name: "y"; type: "int" }
         }
         Method {
             name: "uniform3f"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "x"; type: "float" }
             Parameter { name: "y"; type: "float" }
             Parameter { name: "z"; type: "float" }
         }
         Method {
             name: "uniform3i"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "x"; type: "int" }
             Parameter { name: "y"; type: "int" }
             Parameter { name: "z"; type: "int" }
         }
         Method {
             name: "uniform4f"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "x"; type: "float" }
             Parameter { name: "y"; type: "float" }
             Parameter { name: "z"; type: "float" }
@@ -1193,7 +1145,7 @@ Module {
         }
         Method {
             name: "uniform4i"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "x"; type: "int" }
             Parameter { name: "y"; type: "int" }
             Parameter { name: "z"; type: "int" }
@@ -1201,165 +1153,165 @@ Module {
         }
         Method {
             name: "uniform1fv"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
-            Parameter { name: "array"; type: "Float32Array"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
+            Parameter { name: "array"; type: "CanvasFloat32Array"; isPointer: true }
         }
         Method {
             name: "uniform1iv"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
-            Parameter { name: "array"; type: "Int32Array"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
+            Parameter { name: "array"; type: "CanvasInt32Array"; isPointer: true }
         }
         Method {
             name: "uniform2fv"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
-            Parameter { name: "array"; type: "Float32Array"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
+            Parameter { name: "array"; type: "CanvasFloat32Array"; isPointer: true }
         }
         Method {
             name: "uniform2iv"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
-            Parameter { name: "array"; type: "Int32Array"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
+            Parameter { name: "array"; type: "CanvasInt32Array"; isPointer: true }
         }
         Method {
             name: "uniform3fv"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
-            Parameter { name: "array"; type: "Float32Array"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
+            Parameter { name: "array"; type: "CanvasFloat32Array"; isPointer: true }
         }
         Method {
             name: "uniform3iv"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
-            Parameter { name: "array"; type: "Int32Array"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
+            Parameter { name: "array"; type: "CanvasInt32Array"; isPointer: true }
         }
         Method {
             name: "uniform4fv"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
-            Parameter { name: "array"; type: "Float32Array"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
+            Parameter { name: "array"; type: "CanvasFloat32Array"; isPointer: true }
         }
         Method {
             name: "uniform4iv"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
-            Parameter { name: "array"; type: "Int32Array"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
+            Parameter { name: "array"; type: "CanvasInt32Array"; isPointer: true }
         }
         Method {
             name: "uniform1fva"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "uniform2fva"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "uniform3fva"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "uniform4fva"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "uniform1iva"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "uniform2iva"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "uniform3iva"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "uniform4iva"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "uniformMatrix2fv"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "transpose"; type: "bool" }
-            Parameter { name: "value"; type: "Float32Array"; isPointer: true }
+            Parameter { name: "value"; type: "CanvasFloat32Array"; isPointer: true }
         }
         Method {
             name: "uniformMatrix3fv"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "transpose"; type: "bool" }
-            Parameter { name: "value"; type: "Float32Array"; isPointer: true }
+            Parameter { name: "value"; type: "CanvasFloat32Array"; isPointer: true }
         }
         Method {
             name: "uniformMatrix4fv"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "transpose"; type: "bool" }
-            Parameter { name: "value"; type: "Float32Array"; isPointer: true }
+            Parameter { name: "value"; type: "CanvasFloat32Array"; isPointer: true }
         }
         Method {
             name: "uniformMatrix2fva"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "transpose"; type: "bool" }
             Parameter { name: "value"; type: "QVariantList" }
         }
         Method {
             name: "uniformMatrix3fva"
-            Parameter { name: "location"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "location"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "transpose"; type: "bool" }
             Parameter { name: "value"; type: "QVariantList" }
         }
         Method {
             name: "uniformMatrix4fva"
-            Parameter { name: "uniformLocation"; type: "QUniformLocation"; isPointer: true }
+            Parameter { name: "uniformLocation"; type: "CanvasUniformLocation"; isPointer: true }
             Parameter { name: "transpose"; type: "bool" }
             Parameter { name: "value"; type: "QVariantList" }
         }
-        Method { name: "createProgram"; type: "QProgram3D*" }
+        Method { name: "createProgram"; type: "CanvasProgram*" }
         Method {
             name: "attachShader"
-            Parameter { name: "program"; type: "QProgram3D"; isPointer: true }
-            Parameter { name: "shader"; type: "QShader3D"; isPointer: true }
+            Parameter { name: "program"; type: "CanvasProgram"; isPointer: true }
+            Parameter { name: "shader"; type: "CanvasShader"; isPointer: true }
         }
         Method {
             name: "detachShader"
-            Parameter { name: "program"; type: "QProgram3D"; isPointer: true }
-            Parameter { name: "shader"; type: "QShader3D"; isPointer: true }
+            Parameter { name: "program"; type: "CanvasProgram"; isPointer: true }
+            Parameter { name: "shader"; type: "CanvasShader"; isPointer: true }
         }
         Method {
             name: "linkProgram"
-            Parameter { name: "program"; type: "QProgram3D"; isPointer: true }
+            Parameter { name: "program"; type: "CanvasProgram"; isPointer: true }
         }
         Method {
             name: "useProgram"
-            Parameter { name: "program"; type: "QProgram3D"; isPointer: true }
+            Parameter { name: "program"; type: "CanvasProgram"; isPointer: true }
         }
         Method {
             name: "validateProgram"
-            Parameter { name: "program"; type: "QProgram3D"; isPointer: true }
+            Parameter { name: "program"; type: "CanvasProgram"; isPointer: true }
         }
         Method {
             name: "getUniformLocation"
-            type: "QUniformLocation*"
-            Parameter { name: "program"; type: "QProgram3D"; isPointer: true }
+            type: "CanvasUniformLocation*"
+            Parameter { name: "program"; type: "CanvasProgram"; isPointer: true }
             Parameter { name: "name"; type: "string" }
         }
         Method {
             name: "getAttribLocation"
             type: "int"
-            Parameter { name: "program"; type: "QProgram3D"; isPointer: true }
+            Parameter { name: "program"; type: "CanvasProgram"; isPointer: true }
             Parameter { name: "name"; type: "string" }
         }
         Method {
             name: "bindAttribLocation"
-            Parameter { name: "program"; type: "QProgram3D"; isPointer: true }
+            Parameter { name: "program"; type: "CanvasProgram"; isPointer: true }
             Parameter { name: "index"; type: "int" }
             Parameter { name: "name"; type: "string" }
         }
         Method {
             name: "getProgramInfoLog"
             type: "string"
-            Parameter { name: "program"; type: "QProgram3D"; isPointer: true }
+            Parameter { name: "program"; type: "CanvasProgram"; isPointer: true }
         }
         Method {
             name: "isProgram"
@@ -1368,7 +1320,7 @@ Module {
         }
         Method {
             name: "deleteProgram"
-            Parameter { name: "program"; type: "QProgram3D"; isPointer: true }
+            Parameter { name: "program"; type: "CanvasProgram"; isPointer: true }
         }
         Method {
             name: "disableVertexAttribArray"
@@ -1395,7 +1347,7 @@ Module {
         Method {
             name: "vertexAttrib1fv"
             Parameter { name: "indx"; type: "uint" }
-            Parameter { name: "values"; type: "Float32Array"; isPointer: true }
+            Parameter { name: "values"; type: "CanvasFloat32Array"; isPointer: true }
         }
         Method {
             name: "vertexAttrib2f"
@@ -1406,7 +1358,7 @@ Module {
         Method {
             name: "vertexAttrib2fv"
             Parameter { name: "indx"; type: "uint" }
-            Parameter { name: "values"; type: "Float32Array"; isPointer: true }
+            Parameter { name: "values"; type: "CanvasFloat32Array"; isPointer: true }
         }
         Method {
             name: "vertexAttrib3f"
@@ -1418,7 +1370,7 @@ Module {
         Method {
             name: "vertexAttrib3fv"
             Parameter { name: "indx"; type: "uint" }
-            Parameter { name: "values"; type: "Float32Array"; isPointer: true }
+            Parameter { name: "values"; type: "CanvasFloat32Array"; isPointer: true }
         }
         Method {
             name: "vertexAttrib4f"
@@ -1431,30 +1383,30 @@ Module {
         Method {
             name: "vertexAttrib4fv"
             Parameter { name: "indx"; type: "uint" }
-            Parameter { name: "values"; type: "Float32Array"; isPointer: true }
+            Parameter { name: "values"; type: "CanvasFloat32Array"; isPointer: true }
         }
         Method {
             name: "getShaderParameter"
             type: "int"
-            Parameter { name: "shader"; type: "QShader3D"; isPointer: true }
+            Parameter { name: "shader"; type: "CanvasShader"; isPointer: true }
             Parameter { name: "paramName"; type: "glEnums" }
         }
         Method {
             name: "getProgramParameter"
-            type: "int"
-            Parameter { name: "program"; type: "QProgram3D"; isPointer: true }
+            type: "QVariant"
+            Parameter { name: "program"; type: "CanvasProgram"; isPointer: true }
             Parameter { name: "paramName"; type: "glEnums" }
         }
         Method {
             name: "getShaderInfoLog"
             type: "string"
-            Parameter { name: "shader"; type: "QShader3D"; isPointer: true }
+            Parameter { name: "shader"; type: "CanvasShader"; isPointer: true }
         }
-        Method { name: "createBuffer"; type: "QBuffer3D*" }
+        Method { name: "createBuffer"; type: "CanvasBuffer*" }
         Method {
             name: "bindBuffer"
             Parameter { name: "target"; type: "glEnums" }
-            Parameter { name: "buffer"; type: "QBuffer3D"; isPointer: true }
+            Parameter { name: "buffer"; type: "CanvasBuffer"; isPointer: true }
         }
         Method {
             name: "bufferData"
@@ -1465,26 +1417,26 @@ Module {
         Method {
             name: "bufferData"
             Parameter { name: "target"; type: "glEnums" }
-            Parameter { name: "data"; type: "TypedArray"; isPointer: true }
+            Parameter { name: "data"; type: "CanvasTypedArray"; isPointer: true }
             Parameter { name: "hint"; type: "glEnums" }
         }
         Method {
             name: "bufferData"
             Parameter { name: "target"; type: "glEnums" }
-            Parameter { name: "data"; type: "ArrayBuffer&" }
+            Parameter { name: "data"; type: "CanvasArrayBuffer&" }
             Parameter { name: "hint"; type: "glEnums" }
         }
         Method {
             name: "bufferSubData"
             Parameter { name: "target"; type: "glEnums" }
             Parameter { name: "offset"; type: "int" }
-            Parameter { name: "data"; type: "TypedArray"; isPointer: true }
+            Parameter { name: "data"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "bufferSubData"
             Parameter { name: "target"; type: "glEnums" }
             Parameter { name: "offset"; type: "int" }
-            Parameter { name: "data"; type: "ArrayBuffer&" }
+            Parameter { name: "data"; type: "CanvasArrayBuffer&" }
         }
         Method {
             name: "getBufferParameter"
@@ -1499,7 +1451,7 @@ Module {
         }
         Method {
             name: "deleteBuffer"
-            Parameter { name: "buffer"; type: "QBuffer3D"; isPointer: true }
+            Parameter { name: "buffer"; type: "CanvasBuffer"; isPointer: true }
         }
         Method { name: "getError"; type: "glEnums" }
         Method {
@@ -1531,16 +1483,16 @@ Module {
         }
         Method {
             name: "enable"
-            Parameter { name: "flag"; type: "glEnums" }
+            Parameter { name: "cap"; type: "glEnums" }
         }
         Method {
             name: "isEnabled"
             type: "bool"
-            Parameter { name: "flag"; type: "glEnums" }
+            Parameter { name: "cap"; type: "glEnums" }
         }
         Method {
             name: "disable"
-            Parameter { name: "flag"; type: "glEnums" }
+            Parameter { name: "cap"; type: "glEnums" }
         }
         Method {
             name: "getParameter"
@@ -1649,11 +1601,11 @@ Module {
             Parameter { name: "height"; type: "long" }
             Parameter { name: "format"; type: "glEnums" }
             Parameter { name: "type"; type: "glEnums" }
-            Parameter { name: "pixels"; type: "ArrayBufferView"; isPointer: true }
+            Parameter { name: "pixels"; type: "CanvasArrayBufferView"; isPointer: true }
         }
     }
     Component {
-        name: "QContextAttributes"
+        name: "CanvasContextAttributes"
         prototype: "QObject"
         exports: ["ContextAttributes 1.0"]
         exportMetaObjectRevisions: [0]
@@ -1699,15 +1651,118 @@ Module {
         }
     }
     Component {
-        name: "QFramebuffer3D"
-        prototype: "QAbstractObject3D"
-        exports: ["Framebuffer3D 1.0"]
+        name: "CanvasFloat32Array"
+        prototype: "CanvasTypedArray"
+        exports: ["Float32Array 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Method {
+            name: "get"
+            type: "float"
+            Parameter { name: "index"; type: "ulong" }
+        }
+        Method {
+            name: "set"
+            Parameter { name: "index"; type: "ulong" }
+            Parameter { name: "value"; type: "float" }
+        }
+        Method {
+            name: "set"
+            Parameter { name: "array"; type: "QVariantList" }
+            Parameter { name: "offset"; type: "ulong" }
+        }
+        Method {
+            name: "set"
+            Parameter { name: "array"; type: "QVariantList" }
+        }
+        Method {
+            name: "set"
+            Parameter { name: "array"; type: "CanvasTypedArray"; isPointer: true }
+            Parameter { name: "offset"; type: "ulong" }
+        }
+        Method {
+            name: "set"
+            Parameter { name: "array"; type: "CanvasTypedArray"; isPointer: true }
+        }
+    }
+    Component {
+        name: "CanvasFloat64Array"
+        prototype: "CanvasTypedArray"
+        exports: ["Float64Array 1.0"]
         isCreatable: false
         exportMetaObjectRevisions: [0]
+        Method {
+            name: "get"
+            type: "double"
+            Parameter { name: "index"; type: "ulong" }
+        }
+        Method {
+            name: "set"
+            Parameter { name: "index"; type: "ulong" }
+            Parameter { name: "value"; type: "double" }
+        }
     }
     Component {
-        name: "QProgram3D"
-        prototype: "QAbstractObject3D"
+        name: "CanvasFrameBuffer"
+        prototype: "CanvasAbstractObject"
+        exports: ["FrameBuffer3D 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "CanvasInt16Array"
+        prototype: "CanvasTypedArray"
+        exports: ["Int16Array 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Method {
+            name: "get"
+            type: "short"
+            Parameter { name: "index"; type: "ulong" }
+        }
+        Method {
+            name: "set"
+            Parameter { name: "index"; type: "ulong" }
+            Parameter { name: "value"; type: "short" }
+        }
+    }
+    Component {
+        name: "CanvasInt32Array"
+        prototype: "CanvasTypedArray"
+        exports: ["Int32Array 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Method {
+            name: "get"
+            type: "int"
+            Parameter { name: "index"; type: "ulong" }
+        }
+        Method {
+            name: "set"
+            Parameter { name: "index"; type: "ulong" }
+            Parameter { name: "value"; type: "int" }
+        }
+    }
+    Component {
+        name: "CanvasInt8Array"
+        prototype: "CanvasTypedArray"
+        exports: ["Int8Array 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Method {
+            name: "get"
+            type: "signed char"
+            Parameter { name: "index"; type: "ulong" }
+        }
+        Method {
+            name: "set"
+            Parameter { name: "index"; type: "ulong" }
+            Parameter { name: "value"; type: "signed char" }
+        }
+    }
+    Component {
+        name: "CanvasProgram"
+        prototype: "CanvasAbstractObject"
         exports: ["Program3D 1.0"]
         isCreatable: false
         exportMetaObjectRevisions: [0]
@@ -1718,21 +1773,21 @@ Module {
         }
     }
     Component {
-        name: "QRenderbuffer3D"
+        name: "CanvasRenderBuffer"
         prototype: "QObject"
-        exports: ["Renderbuffer3D 1.0"]
+        exports: ["RenderBuffer3D 1.0"]
         isCreatable: false
         exportMetaObjectRevisions: [0]
     }
     Component {
-        name: "QShader3D"
+        name: "CanvasShader"
         prototype: "QObject"
         exports: ["Shader3D 1.0"]
         isCreatable: false
         exportMetaObjectRevisions: [0]
     }
     Component {
-        name: "QShaderPrecisionFormat"
+        name: "CanvasShaderPrecisionFormat"
         prototype: "QObject"
         exports: ["ShaderPrecisionFormat 1.0"]
         isCreatable: false
@@ -1754,12 +1809,19 @@ Module {
         }
     }
     Component {
-        name: "QTexImage3D"
-        prototype: "QAbstractObject3D"
-        exports: ["TexImage 1.0"]
+        name: "CanvasTexture"
+        prototype: "CanvasAbstractObject"
+        exports: ["Texture3D 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "CanvasTextureImage"
+        prototype: "CanvasAbstractObject"
+        exports: ["TextureImage 1.0"]
         exportMetaObjectRevisions: [0]
         Enum {
-            name: "QTexImageState"
+            name: "TextureImageState"
             values: {
                 "INITIALIZED": 0,
                 "LOAD_PENDING": 1,
@@ -1769,7 +1831,7 @@ Module {
             }
         }
         Property { name: "source"; type: "QUrl" }
-        Property { name: "imageState"; type: "QTexImageState"; isReadonly: true }
+        Property { name: "imageState"; type: "TextureImageState"; isReadonly: true }
         Property { name: "width"; type: "int"; isReadonly: true }
         Property { name: "height"; type: "int"; isReadonly: true }
         Property { name: "errorString"; type: "string"; isReadonly: true }
@@ -1779,7 +1841,7 @@ Module {
         }
         Signal {
             name: "imageStateChanged"
-            Parameter { name: "state"; type: "QTexImageState" }
+            Parameter { name: "state"; type: "TextureImageState" }
         }
         Signal {
             name: "widthChanged"
@@ -1800,34 +1862,30 @@ Module {
         Method { name: "id"; type: "ulong" }
     }
     Component {
-        name: "QTexImageLoader3D"
+        name: "CanvasTextureImageLoader"
         prototype: "QObject"
         exports: ["TextureImageLoader 1.0"]
         exportMetaObjectRevisions: [0]
+        Property { name: "logAllCalls"; type: "bool" }
+        Property { name: "logAllErrors"; type: "bool" }
+        Signal {
+            name: "logAllCallsChanged"
+            Parameter { name: "logCalls"; type: "bool" }
+        }
+        Signal {
+            name: "logAllErrorsChanged"
+            Parameter { name: "logErrors"; type: "bool" }
+        }
         Method {
             name: "loadImage"
-            type: "QTexImage3D*"
+            type: "CanvasTextureImage*"
             Parameter { name: "url"; type: "QUrl" }
         }
     }
     Component {
-        name: "QTexture3D"
-        prototype: "QAbstractObject3D"
-        exports: ["Texture3D 1.0"]
-        isCreatable: false
-        exportMetaObjectRevisions: [0]
-    }
-    Component {
-        name: "QUniformLocation"
-        prototype: "QAbstractObject3D"
-        exports: ["UniformLocation3D 1.0"]
-        isCreatable: false
-        exportMetaObjectRevisions: [0]
-    }
-    Component {
-        name: "TypedArray"
-        prototype: "ArrayBufferView"
-        exports: ["QTypedArray 1.0"]
+        name: "CanvasTypedArray"
+        prototype: "CanvasArrayBufferView"
+        exports: ["TypedArray 1.0"]
         isCreatable: false
         exportMetaObjectRevisions: [0]
         Property { name: "length"; type: "ulong"; isReadonly: true }
@@ -1837,7 +1895,7 @@ Module {
         }
     }
     Component {
-        name: "Arrays"
+        name: "CanvasTypedArrayFactory"
         prototype: "QObject"
         exports: ["Arrays 1.0"]
         isCreatable: false
@@ -1845,199 +1903,199 @@ Module {
         exportMetaObjectRevisions: [0]
         Method {
             name: "newInt8Array"
-            type: "Int8Array*"
+            type: "CanvasInt8Array*"
             Parameter { name: "length"; type: "ulong" }
         }
         Method {
             name: "newInt8Array"
-            type: "Int8Array*"
-            Parameter { name: "array"; type: "TypedArray"; isPointer: true }
+            type: "CanvasInt8Array*"
+            Parameter { name: "array"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "newInt8Array"
-            type: "Int8Array*"
+            type: "CanvasInt8Array*"
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "newInt8Array"
-            type: "Int8Array*"
-            Parameter { name: "buffer"; type: "ArrayBuffer"; isPointer: true }
+            type: "CanvasInt8Array*"
+            Parameter { name: "buffer"; type: "CanvasArrayBuffer"; isPointer: true }
             Parameter { name: "byteOffset"; type: "ulong" }
         }
         Method {
             name: "newUint8Array"
-            type: "Uint8Array*"
+            type: "CanvasUint8Array*"
             Parameter { name: "length"; type: "ulong" }
         }
         Method {
             name: "newUint8Array"
-            type: "Uint8Array*"
-            Parameter { name: "array"; type: "TypedArray"; isPointer: true }
+            type: "CanvasUint8Array*"
+            Parameter { name: "array"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "newUint8Array"
-            type: "Uint8Array*"
+            type: "CanvasUint8Array*"
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "newUint8Array"
-            type: "Uint8Array*"
-            Parameter { name: "buffer"; type: "ArrayBuffer"; isPointer: true }
+            type: "CanvasUint8Array*"
+            Parameter { name: "buffer"; type: "CanvasArrayBuffer"; isPointer: true }
             Parameter { name: "byteOffset"; type: "ulong" }
         }
         Method {
             name: "newInt16Array"
-            type: "Int16Array*"
+            type: "CanvasInt16Array*"
             Parameter { name: "length"; type: "ulong" }
         }
         Method {
             name: "newInt16Array"
-            type: "Int16Array*"
-            Parameter { name: "array"; type: "TypedArray"; isPointer: true }
+            type: "CanvasInt16Array*"
+            Parameter { name: "array"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "newInt16Array"
-            type: "Int16Array*"
+            type: "CanvasInt16Array*"
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "newInt16Array"
-            type: "Int16Array*"
-            Parameter { name: "buffer"; type: "ArrayBuffer"; isPointer: true }
+            type: "CanvasInt16Array*"
+            Parameter { name: "buffer"; type: "CanvasArrayBuffer"; isPointer: true }
             Parameter { name: "byteOffset"; type: "ulong" }
         }
         Method {
             name: "newUint16Array"
-            type: "Uint16Array*"
+            type: "CanvasUint16Array*"
             Parameter { name: "length"; type: "ulong" }
         }
         Method {
             name: "newUint16Array"
-            type: "Uint16Array*"
-            Parameter { name: "array"; type: "TypedArray"; isPointer: true }
+            type: "CanvasUint16Array*"
+            Parameter { name: "array"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "newUint16Array"
-            type: "Uint16Array*"
+            type: "CanvasUint16Array*"
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "newUint16Array"
-            type: "Uint16Array*"
-            Parameter { name: "buffer"; type: "ArrayBuffer"; isPointer: true }
+            type: "CanvasUint16Array*"
+            Parameter { name: "buffer"; type: "CanvasArrayBuffer"; isPointer: true }
             Parameter { name: "byteOffset"; type: "ulong" }
         }
         Method {
             name: "newInt32Array"
-            type: "Int32Array*"
+            type: "CanvasInt32Array*"
             Parameter { name: "length"; type: "ulong" }
         }
         Method {
             name: "newInt32Array"
-            type: "Int32Array*"
-            Parameter { name: "array"; type: "TypedArray"; isPointer: true }
+            type: "CanvasInt32Array*"
+            Parameter { name: "array"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "newInt32Array"
-            type: "Int32Array*"
+            type: "CanvasInt32Array*"
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "newInt32Array"
-            type: "Int32Array*"
-            Parameter { name: "buffer"; type: "ArrayBuffer"; isPointer: true }
+            type: "CanvasInt32Array*"
+            Parameter { name: "buffer"; type: "CanvasArrayBuffer"; isPointer: true }
             Parameter { name: "byteOffset"; type: "ulong" }
         }
         Method {
             name: "newUint32Array"
-            type: "Uint32Array*"
+            type: "CanvasUint32Array*"
             Parameter { name: "length"; type: "ulong" }
         }
         Method {
             name: "newUint32Array"
-            type: "Uint32Array*"
-            Parameter { name: "array"; type: "TypedArray"; isPointer: true }
+            type: "CanvasUint32Array*"
+            Parameter { name: "array"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "newUint32Array"
-            type: "Uint32Array*"
+            type: "CanvasUint32Array*"
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "newUint32Array"
-            type: "Uint32Array*"
-            Parameter { name: "buffer"; type: "ArrayBuffer"; isPointer: true }
+            type: "CanvasUint32Array*"
+            Parameter { name: "buffer"; type: "CanvasArrayBuffer"; isPointer: true }
             Parameter { name: "byteOffset"; type: "ulong" }
         }
         Method {
             name: "newFloat32Array"
-            type: "Float32Array*"
+            type: "CanvasFloat32Array*"
             Parameter { name: "length"; type: "ulong" }
         }
         Method {
             name: "newFloat32Array"
-            type: "Float32Array*"
-            Parameter { name: "array"; type: "TypedArray"; isPointer: true }
+            type: "CanvasFloat32Array*"
+            Parameter { name: "array"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "newFloat32Array"
-            type: "Float32Array*"
+            type: "CanvasFloat32Array*"
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "newFloat32Array"
-            type: "Float32Array*"
-            Parameter { name: "buffer"; type: "ArrayBuffer"; isPointer: true }
+            type: "CanvasFloat32Array*"
+            Parameter { name: "buffer"; type: "CanvasArrayBuffer"; isPointer: true }
             Parameter { name: "byteOffset"; type: "ulong" }
         }
         Method {
             name: "newFloat64Array"
-            type: "Float64Array*"
+            type: "CanvasFloat64Array*"
             Parameter { name: "length"; type: "ulong" }
         }
         Method {
             name: "newFloat64Array"
-            type: "Float64Array*"
-            Parameter { name: "array"; type: "TypedArray"; isPointer: true }
+            type: "CanvasFloat64Array*"
+            Parameter { name: "array"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "newFloat64Array"
-            type: "Float64Array*"
+            type: "CanvasFloat64Array*"
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "newFloat64Array"
-            type: "Float64Array*"
-            Parameter { name: "buffer"; type: "ArrayBuffer"; isPointer: true }
+            type: "CanvasFloat64Array*"
+            Parameter { name: "buffer"; type: "CanvasArrayBuffer"; isPointer: true }
             Parameter { name: "byteOffset"; type: "ulong" }
         }
         Method {
             name: "newUint8ClampedArray"
-            type: "Uint8ClampedArray*"
+            type: "CanvasUint8ClampedArray*"
             Parameter { name: "length"; type: "ulong" }
         }
         Method {
             name: "newUint8ClampedArray"
-            type: "Uint8ClampedArray*"
-            Parameter { name: "array"; type: "TypedArray"; isPointer: true }
+            type: "CanvasUint8ClampedArray*"
+            Parameter { name: "array"; type: "CanvasTypedArray"; isPointer: true }
         }
         Method {
             name: "newUint8ClampedArray"
-            type: "Uint8ClampedArray*"
+            type: "CanvasUint8ClampedArray*"
             Parameter { name: "array"; type: "QVariantList" }
         }
         Method {
             name: "newUint8ClampedArray"
-            type: "Uint8ClampedArray*"
-            Parameter { name: "buffer"; type: "ArrayBuffer"; isPointer: true }
+            type: "CanvasUint8ClampedArray*"
+            Parameter { name: "buffer"; type: "CanvasArrayBuffer"; isPointer: true }
             Parameter { name: "byteOffset"; type: "ulong" }
         }
-        Method { name: "newTexImage"; type: "QTexImage3D*" }
+        Method { name: "newTexImage"; type: "CanvasTextureImage*" }
     }
     Component {
-        name: "Uint16Array"
-        prototype: "TypedArray"
-        exports: ["QUint16Array 1.0"]
+        name: "CanvasUint16Array"
+        prototype: "CanvasTypedArray"
+        exports: ["Uint16Array 1.0"]
         isCreatable: false
         exportMetaObjectRevisions: [0]
         Method {
@@ -2052,9 +2110,9 @@ Module {
         }
     }
     Component {
-        name: "Uint32Array"
-        prototype: "TypedArray"
-        exports: ["QUint32Array 1.0"]
+        name: "CanvasUint32Array"
+        prototype: "CanvasTypedArray"
+        exports: ["Uint32Array 1.0"]
         isCreatable: false
         exportMetaObjectRevisions: [0]
         Method {
@@ -2069,9 +2127,9 @@ Module {
         }
     }
     Component {
-        name: "Uint8Array"
-        prototype: "TypedArray"
-        exports: ["QUint8Array 1.0"]
+        name: "CanvasUint8Array"
+        prototype: "CanvasTypedArray"
+        exports: ["Uint8Array 1.0"]
         isCreatable: false
         exportMetaObjectRevisions: [0]
         Method {
@@ -2086,9 +2144,9 @@ Module {
         }
     }
     Component {
-        name: "Uint8ClampedArray"
-        prototype: "TypedArray"
-        exports: ["QUint8ClampedArray 1.0"]
+        name: "CanvasUint8ClampedArray"
+        prototype: "CanvasTypedArray"
+        exports: ["Uint8ClampedArray 1.0"]
         isCreatable: false
         exportMetaObjectRevisions: [0]
         Method {
@@ -2102,4 +2160,11 @@ Module {
             Parameter { name: "value"; type: "uchar" }
         }
     }
+    Component {
+        name: "CanvasUniformLocation"
+        prototype: "CanvasAbstractObject"
+        exports: ["UniformLocation 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+    }
 }
diff --git a/src/teximage3dloader.cpp b/src/teximage3dloader.cpp
index f2d3b89f99712dcbf087e6ac86fb927173e834c2..a7125f33808810627d9f67f7cf2322fc421c0129 100644
--- a/src/teximage3dloader.cpp
+++ b/src/teximage3dloader.cpp
@@ -50,6 +50,22 @@
  * \sa Context3D, TextureImage, {QML Canvas 3D QML Types}
  */
 
+/*!
+ * \qmlproperty TextureImage TextureImageLoader::image
+ * A read-only property holding the last loaded or failed texture. Should be called on receiving the
+ * imageLoaded or imageLoadingFailed signal.
+ */
+
+/*!
+ * \qmlsignal void TextureImageLoader::imageLoaded()
+ * Emitted when a texture has been successfully loaded.
+ */
+
+/*!
+ * \qmlsignal void TextureImageLoader::imageLoadingFailed()
+ * Emitted when a texture loading has failed.
+ */
+
 /*!
  * \internal
  */
@@ -120,14 +136,9 @@ bool CanvasTextureImageLoader::logAllErrors() const
  */
 void CanvasTextureImageLoader::emitImageLoaded(CanvasTextureImage *textureImage)
 {
-    // Can't use signals as those change the signal processing to main thread
-    // Using invokeMethod() preserves execution on scene graph render thread.
     if (m_logAllCalls) qDebug() << "TexImage3DLoader::" << __FUNCTION__;
-    QVariant ignoredReturnedValue;
-    QMetaObject::invokeMethod(this, "imageLoaded",
-                              Qt::DirectConnection,
-                              Q_RETURN_ARG(QVariant, ignoredReturnedValue),
-                              Q_ARG(QVariant, QVariant::fromValue(textureImage)));
+    m_image = textureImage;
+    emit imageLoaded();
 }
 
 /*!
@@ -135,14 +146,9 @@ void CanvasTextureImageLoader::emitImageLoaded(CanvasTextureImage *textureImage)
  */
 void CanvasTextureImageLoader::emitImageLoadingError(CanvasTextureImage *textureImage)
 {
-    // Can't use signals as those change the signal processing to main thread
-    // Using invokeMethod() preserves execution on scene graph render thread.
     if (m_logAllCalls) qDebug() << "TexImage3DLoader::" << __FUNCTION__;
-    QVariant ignoredReturnedValue;
-    QMetaObject::invokeMethod(this, "imageLoadingError",
-                              Qt::DirectConnection,
-                              Q_RETURN_ARG(QVariant, ignoredReturnedValue),
-                              Q_ARG(QVariant, QVariant::fromValue(textureImage)));
+    m_image = textureImage;
+    emit imageLoadingFailed();
 }
 
 /*!
diff --git a/src/teximage3dloader_p.h b/src/teximage3dloader_p.h
index d05696348362420bf91fe2e513fbd1a14369d54d..8e2421d0c511c7480a069078bb7e97a7a2124f41 100644
--- a/src/teximage3dloader_p.h
+++ b/src/teximage3dloader_p.h
@@ -54,6 +54,7 @@ class Canvas;
 class CanvasTextureImageLoader : public QObject
 {
     Q_OBJECT
+    Q_PROPERTY(CanvasTextureImage* image READ image)
     Q_PROPERTY(bool logAllCalls READ logAllCalls WRITE setLogAllCalls NOTIFY logAllCallsChanged)
     Q_PROPERTY(bool logAllErrors READ logAllErrors WRITE setLogAllErrors NOTIFY logAllErrorsChanged)
 
@@ -71,8 +72,11 @@ public:
     void notifyLoadedImages();
     void emitImageLoaded(CanvasTextureImage *textureImage);
     void emitImageLoadingError(CanvasTextureImage *textureImage);
+    inline CanvasTextureImage *image() { return m_image; }
 
 signals:
+    void imageLoaded();
+    void imageLoadingFailed();
     void logAllCallsChanged(bool logCalls);
     void logAllErrorsChanged(bool logErrors);
 
@@ -81,6 +85,7 @@ private:
     bool m_logAllErrors;
     QMap<QUrl, CanvasTextureImage *> m_urlToImageMap;
     QList<CanvasTextureImage *> m_loadingImagesList;
+    CanvasTextureImage *m_image;
     Canvas *m_canvas;
 };