Browse Source

LibWeb/WebGL: Implement readPixels()

Aliaksandr Kalenik 7 months ago
parent
commit
4e8ec1e793

+ 1 - 1
Libraries/LibWeb/WebGL/WebGL2RenderingContextOverloads.idl

@@ -59,7 +59,7 @@ interface mixin WebGL2RenderingContextOverloads {
 
     // Reading back pixels
     // WebGL1:
-    [FIXME] undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView? dstData);
+    undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels);
     // WebGL2:
     [FIXME] undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLintptr offset);
     [FIXME] undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView dstData, unsigned long long dstOffset);

+ 1 - 1
Libraries/LibWeb/WebGL/WebGLRenderingContextOverloads.idl

@@ -25,7 +25,7 @@ interface mixin WebGLRenderingContextOverloads {
     [FIXME] undefined compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, [AllowShared] ArrayBufferView data);
     [FIXME] undefined compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, [AllowShared] ArrayBufferView data);
 
-    [FIXME] undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels);
+    undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels);
 
     undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels);
     undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLenum format, GLenum type, TexImageSource source); // May throw DOMException

+ 22 - 0
Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp

@@ -621,6 +621,28 @@ public:
             continue;
         }
 
+        if (function.name == "readPixels"sv) {
+            function_impl_generator.append(R"~~~(
+    if (!pixels) {
+        return;
+    }
+
+    void *ptr = nullptr;
+    if (pixels->is_data_view()) {
+        auto& data_view = static_cast<JS::DataView&>(*pixels->raw_object());
+        ptr = data_view.viewed_array_buffer()->buffer().data();
+    } else if (pixels->is_typed_array_base()) {
+        auto& typed_array_base = static_cast<JS::TypedArrayBase&>(*pixels->raw_object());
+        ptr = typed_array_base.viewed_array_buffer()->buffer().data();
+    } else {
+        VERIFY_NOT_REACHED();
+    }
+
+    glReadPixels(x, y, width, height, format, type, ptr);
+)~~~");
+            continue;
+        }
+
         if (function.name == "drawElements"sv) {
             function_impl_generator.append(R"~~~(
     glDrawElements(mode, count, type, reinterpret_cast<void*>(offset));