From 0ff977bd04f020422f24b0622b170723b3e294b3 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Mon, 27 Nov 2023 16:49:10 +0100 Subject: [PATCH] LibWeb: Add fixed position stacking context support in GPU painter --- .../LibWeb/Painting/PaintingCommandExecutorGPU.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp index 7bf9520b4c..bcc9dca56c 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp +++ b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp @@ -90,8 +90,13 @@ CommandResult PaintingCommandExecutorGPU::set_font(Gfx::Font const&) return CommandResult::Continue; } -CommandResult PaintingCommandExecutorGPU::push_stacking_context(float opacity, bool, Gfx::IntRect const& source_paintable_rect, Gfx::IntPoint post_transform_translation, CSS::ImageRendering, StackingContextTransform, Optional) +CommandResult PaintingCommandExecutorGPU::push_stacking_context(float opacity, bool is_fixed_position, Gfx::IntRect const& source_paintable_rect, Gfx::IntPoint post_transform_translation, CSS::ImageRendering, StackingContextTransform, Optional) { + painter().save(); + if (is_fixed_position) { + auto const& translation = painter().transform().translation(); + painter().translate(-translation); + } if (opacity < 1) { auto painter = AccelGfx::Painter::create(); auto canvas = AccelGfx::Canvas::create(source_paintable_rect.size()); @@ -102,7 +107,6 @@ CommandResult PaintingCommandExecutorGPU::push_stacking_context(float opacity, b .opacity = opacity, .destination = source_paintable_rect }); } else { - painter().save(); painter().translate(post_transform_translation.to_type()); } return CommandResult::Continue; @@ -113,9 +117,8 @@ CommandResult PaintingCommandExecutorGPU::pop_stacking_context() if (stacking_contexts.last().opacity < 1) { auto stacking_context = stacking_contexts.take_last(); painter().blit_canvas(stacking_context.destination, *stacking_context.canvas, stacking_context.opacity); - } else { - painter().restore(); } + painter().restore(); return CommandResult::Continue; }