From 01d938c77bf6b07cc67e52b9b59c4e8025dc9033 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Mon, 13 Nov 2023 18:34:55 +0100 Subject: [PATCH] LibAccelGfx+LibWeb: Implement SetClipRect and ClearClipRect commands --- Userland/Libraries/LibAccelGfx/GL.cpp | 13 +++++++++++++ Userland/Libraries/LibAccelGfx/GL.h | 3 +++ Userland/Libraries/LibAccelGfx/Painter.cpp | 10 ++++++++++ Userland/Libraries/LibAccelGfx/Painter.h | 3 +++ .../LibWeb/Painting/PaintingCommandExecutorGPU.cpp | 6 +++--- 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibAccelGfx/GL.cpp b/Userland/Libraries/LibAccelGfx/GL.cpp index 28097abd57..7c886a0b7e 100644 --- a/Userland/Libraries/LibAccelGfx/GL.cpp +++ b/Userland/Libraries/LibAccelGfx/GL.cpp @@ -255,4 +255,17 @@ void delete_framebuffer(Framebuffer const& framebuffer) verify_no_error(); } +void enable_scissor_test(Gfx::IntRect rect) +{ + glEnable(GL_SCISSOR_TEST); + glScissor(rect.left(), rect.top(), rect.width(), rect.height()); + verify_no_error(); +} + +void disable_scissor_test() +{ + glDisable(GL_SCISSOR_TEST); + verify_no_error(); +} + } diff --git a/Userland/Libraries/LibAccelGfx/GL.h b/Userland/Libraries/LibAccelGfx/GL.h index b3a2526ff1..ea6e628c2c 100644 --- a/Userland/Libraries/LibAccelGfx/GL.h +++ b/Userland/Libraries/LibAccelGfx/GL.h @@ -98,4 +98,7 @@ Framebuffer create_framebuffer(Gfx::IntSize); void bind_framebuffer(Framebuffer const& framebuffer); void delete_framebuffer(Framebuffer const& framebuffer); +void enable_scissor_test(Gfx::IntRect); +void disable_scissor_test(); + } diff --git a/Userland/Libraries/LibAccelGfx/Painter.cpp b/Userland/Libraries/LibAccelGfx/Painter.cpp index 5466786560..2144877951 100644 --- a/Userland/Libraries/LibAccelGfx/Painter.cpp +++ b/Userland/Libraries/LibAccelGfx/Painter.cpp @@ -417,6 +417,16 @@ void Painter::restore() m_state_stack.take_last(); } +void Painter::set_clip_rect(Gfx::IntRect rect) +{ + GL::enable_scissor_test(rect); +} + +void Painter::clear_clip_rect() +{ + GL::disable_scissor_test(); +} + void Painter::set_target_bitmap(Gfx::Bitmap& bitmap) { if (m_target_framebuffer.has_value()) { diff --git a/Userland/Libraries/LibAccelGfx/Painter.h b/Userland/Libraries/LibAccelGfx/Painter.h index ca0494074b..099517d982 100644 --- a/Userland/Libraries/LibAccelGfx/Painter.h +++ b/Userland/Libraries/LibAccelGfx/Painter.h @@ -67,6 +67,9 @@ public: void draw_glyph_run(Vector const& glyph_run, Color const& color); + void set_clip_rect(Gfx::IntRect); + void clear_clip_rect(); + void set_target_bitmap(Gfx::Bitmap&); void flush(); diff --git a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp index c35e8623ec..6757c07000 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp +++ b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp @@ -57,15 +57,15 @@ CommandResult PaintingCommandExecutorGPU::draw_scaled_bitmap(Gfx::IntRect const& return CommandResult::Continue; } -CommandResult PaintingCommandExecutorGPU::set_clip_rect(Gfx::IntRect const&) +CommandResult PaintingCommandExecutorGPU::set_clip_rect(Gfx::IntRect const& rect) { - // FIXME + painter().set_clip_rect(rect); return CommandResult::Continue; } CommandResult PaintingCommandExecutorGPU::clear_clip_rect() { - // FIXME + painter().clear_clip_rect(); return CommandResult::Continue; }