diff --git a/Libraries/LibWeb/CMakeLists.txt b/Libraries/LibWeb/CMakeLists.txt index f06428c24a7..9f8b303f16c 100644 --- a/Libraries/LibWeb/CMakeLists.txt +++ b/Libraries/LibWeb/CMakeLists.txt @@ -864,6 +864,7 @@ set(SOURCES WebDriver/TimeoutsConfiguration.cpp WebDriver/UserPrompt.cpp WebGL/Extensions/ANGLEInstancedArrays.cpp + WebGL/Extensions/EXTBlendMinMax.cpp WebGL/Extensions/EXTColorBufferFloat.cpp WebGL/Extensions/OESVertexArrayObject.cpp WebGL/Extensions/WebGLCompressedTextureS3tc.cpp diff --git a/Libraries/LibWeb/Forward.h b/Libraries/LibWeb/Forward.h index 23d621cfdee..557f007dafc 100644 --- a/Libraries/LibWeb/Forward.h +++ b/Libraries/LibWeb/Forward.h @@ -925,6 +925,7 @@ class WebGLVertexArrayObject; namespace Web::WebGL::Extensions { class ANGLEInstancedArrays; +class EXTBlendMinMax; class EXTColorBufferFloat; class OESVertexArrayObject; class WebGLCompressedTextureS3tc; diff --git a/Libraries/LibWeb/WebGL/Extensions/EXTBlendMinMax.cpp b/Libraries/LibWeb/WebGL/Extensions/EXTBlendMinMax.cpp new file mode 100644 index 00000000000..aea21d3ac2b --- /dev/null +++ b/Libraries/LibWeb/WebGL/Extensions/EXTBlendMinMax.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2025, Luke Wilde + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include +#include + +namespace Web::WebGL::Extensions { + +GC_DEFINE_ALLOCATOR(EXTBlendMinMax); + +JS::ThrowCompletionOr> EXTBlendMinMax::create(JS::Realm& realm, GC::Ref context) +{ + return realm.create(realm, context); +} + +EXTBlendMinMax::EXTBlendMinMax(JS::Realm& realm, GC::Ref context) + : PlatformObject(realm) + , m_context(context) +{ + m_context->context().request_extension("GL_EXT_blend_minmax"); +} + +void EXTBlendMinMax::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(EXTBlendMinMax); +} + +void EXTBlendMinMax::visit_edges(Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_context); +} + +} diff --git a/Libraries/LibWeb/WebGL/Extensions/EXTBlendMinMax.h b/Libraries/LibWeb/WebGL/Extensions/EXTBlendMinMax.h new file mode 100644 index 00000000000..1b9f1db8567 --- /dev/null +++ b/Libraries/LibWeb/WebGL/Extensions/EXTBlendMinMax.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2025, Luke Wilde + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::WebGL::Extensions { + +class EXTBlendMinMax : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(EXTBlendMinMax, Bindings::PlatformObject); + GC_DECLARE_ALLOCATOR(EXTBlendMinMax); + +public: + static JS::ThrowCompletionOr> create(JS::Realm&, GC::Ref); + +protected: + void initialize(JS::Realm&) override; + void visit_edges(Visitor&) override; + +private: + EXTBlendMinMax(JS::Realm&, GC::Ref); + + GC::Ref m_context; +}; + +} diff --git a/Libraries/LibWeb/WebGL/Extensions/EXTBlendMinMax.idl b/Libraries/LibWeb/WebGL/Extensions/EXTBlendMinMax.idl new file mode 100644 index 00000000000..85042355e4e --- /dev/null +++ b/Libraries/LibWeb/WebGL/Extensions/EXTBlendMinMax.idl @@ -0,0 +1,13 @@ +#import + +// https://registry.khronos.org/webgl/extensions/EXT_blend_minmax/ +// NOTE: Original EXT_blend_minmax name is changed to title case, +// so it matches corresponding C++ class name, and does not require +// IDL generator to handle snake_case to TitleCase conversion. +// Having a different name is totally fine, because LegacyNoInterfaceObject +// prevents the name from being exposed to JavaScript. +[Exposed=(Window,Worker), LegacyNoInterfaceObject] +interface EXTBlendMinMax { + const GLenum MIN_EXT = 0x8007; + const GLenum MAX_EXT = 0x8008; +}; diff --git a/Libraries/LibWeb/WebGL/WebGLRenderingContext.cpp b/Libraries/LibWeb/WebGL/WebGLRenderingContext.cpp index b3a9dfa77d4..c53aee16903 100644 --- a/Libraries/LibWeb/WebGL/WebGLRenderingContext.cpp +++ b/Libraries/LibWeb/WebGL/WebGLRenderingContext.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -93,6 +94,7 @@ void WebGLRenderingContext::visit_edges(Cell::Visitor& visitor) WebGLRenderingContextImpl::visit_edges(visitor); visitor.visit(m_canvas_element); visitor.visit(m_angle_instanced_arrays_extension); + visitor.visit(m_ext_blend_min_max_extension); visitor.visit(m_oes_vertex_array_object_extension); visitor.visit(m_webgl_compressed_texture_s3tc_extension); visitor.visit(m_webgl_draw_buffers_extension); @@ -202,6 +204,15 @@ JS::Object* WebGLRenderingContext::get_extension(String const& name) return m_angle_instanced_arrays_extension; } + if (Infra::is_ascii_case_insensitive_match(name, "EXT_blend_minmax"sv)) { + if (!m_ext_blend_min_max_extension) { + m_ext_blend_min_max_extension = MUST(Extensions::EXTBlendMinMax::create(realm(), *this)); + } + + VERIFY(m_ext_blend_min_max_extension); + return m_ext_blend_min_max_extension; + } + if (Infra::is_ascii_case_insensitive_match(name, "OES_vertex_array_object"sv)) { if (!m_oes_vertex_array_object_extension) { m_oes_vertex_array_object_extension = MUST(Extensions::OESVertexArrayObject::create(realm(), *this)); diff --git a/Libraries/LibWeb/WebGL/WebGLRenderingContext.h b/Libraries/LibWeb/WebGL/WebGLRenderingContext.h index c9cc8ece980..4b2345aa165 100644 --- a/Libraries/LibWeb/WebGL/WebGLRenderingContext.h +++ b/Libraries/LibWeb/WebGL/WebGLRenderingContext.h @@ -82,6 +82,7 @@ private: // Extensions // "Multiple calls to getExtension with the same extension string, taking into account case-insensitive comparison, must return the same object as long as the extension is enabled." GC::Ptr m_angle_instanced_arrays_extension; + GC::Ptr m_ext_blend_min_max_extension; GC::Ptr m_oes_vertex_array_object_extension; GC::Ptr m_webgl_compressed_texture_s3tc_extension; GC::Ptr m_webgl_draw_buffers_extension; diff --git a/Libraries/LibWeb/idl_files.cmake b/Libraries/LibWeb/idl_files.cmake index ee5ba51f249..56b087accec 100644 --- a/Libraries/LibWeb/idl_files.cmake +++ b/Libraries/LibWeb/idl_files.cmake @@ -395,6 +395,7 @@ libweb_js_bindings(WebAudio/PannerNode) libweb_js_bindings(WebAudio/PeriodicWave) libweb_js_bindings(WebAudio/StereoPannerNode) libweb_js_bindings(WebGL/Extensions/ANGLEInstancedArrays) +libweb_js_bindings(WebGL/Extensions/EXTBlendMinMax) libweb_js_bindings(WebGL/Extensions/EXTColorBufferFloat) libweb_js_bindings(WebGL/Extensions/OESVertexArrayObject) libweb_js_bindings(WebGL/Extensions/WebGLCompressedTextureS3tc)