diff --git a/Userland/Libraries/LibWeb/Painting/ClippableAndScrollable.cpp b/Userland/Libraries/LibWeb/Painting/ClippableAndScrollable.cpp index d79dc893f48..a3d41153747 100644 --- a/Userland/Libraries/LibWeb/Painting/ClippableAndScrollable.cpp +++ b/Userland/Libraries/LibWeb/Painting/ClippableAndScrollable.cpp @@ -47,12 +47,11 @@ void ClippableAndScrollable::apply_clip(PaintContext& context) const auto& display_list_recorder = context.display_list_recorder(); display_list_recorder.save(); - auto saved_scroll_frame_id = display_list_recorder.scroll_frame_id(); for (auto const& clip_rect : clip_rects) { Optional<i32> clip_scroll_frame_id; if (clip_rect.enclosing_scroll_frame) clip_scroll_frame_id = clip_rect.enclosing_scroll_frame->id(); - display_list_recorder.set_scroll_frame_id(clip_scroll_frame_id); + display_list_recorder.push_scroll_frame_id(clip_scroll_frame_id); auto rect = context.rounded_device_rect(clip_rect.rect).to_type<int>(); auto corner_radii = clip_rect.corner_radii.as_corners(context); if (corner_radii.has_any_radius()) { @@ -60,8 +59,8 @@ void ClippableAndScrollable::apply_clip(PaintContext& context) const } else { display_list_recorder.add_clip_rect(rect); } + display_list_recorder.pop_scroll_frame_id(); } - display_list_recorder.set_scroll_frame_id(saved_scroll_frame_id); } void ClippableAndScrollable::restore_clip(PaintContext& context) const diff --git a/Userland/Libraries/LibWeb/Painting/DisplayListRecorder.cpp b/Userland/Libraries/LibWeb/Painting/DisplayListRecorder.cpp index 39ae395560d..38fe974714b 100644 --- a/Userland/Libraries/LibWeb/Painting/DisplayListRecorder.cpp +++ b/Userland/Libraries/LibWeb/Painting/DisplayListRecorder.cpp @@ -12,14 +12,16 @@ namespace Web::Painting { DisplayListRecorder::DisplayListRecorder(DisplayList& command_list) : m_command_list(command_list) { - m_state_stack.append(State()); } DisplayListRecorder::~DisplayListRecorder() = default; void DisplayListRecorder::append(Command&& command) { - m_command_list.append(move(command), state().scroll_frame_id); + Optional<i32> scroll_frame_id; + if (!m_scroll_frame_id_stack.is_empty()) + scroll_frame_id = m_scroll_frame_id_stack.last(); + m_command_list.append(move(command), scroll_frame_id); } void DisplayListRecorder::paint_nested_display_list(RefPtr<DisplayList> display_list, Gfx::IntRect rect) @@ -261,15 +263,21 @@ void DisplayListRecorder::translate(Gfx::IntPoint delta) void DisplayListRecorder::save() { append(Save {}); - m_state_stack.append(m_state_stack.last()); } void DisplayListRecorder::restore() { append(Restore {}); +} - VERIFY(m_state_stack.size() > 1); - m_state_stack.take_last(); +void DisplayListRecorder::push_scroll_frame_id(Optional<i32> id) +{ + m_scroll_frame_id_stack.append(id); +} + +void DisplayListRecorder::pop_scroll_frame_id() +{ + (void)m_scroll_frame_id_stack.take_last(); } void DisplayListRecorder::push_stacking_context(PushStackingContextParams params) @@ -282,12 +290,12 @@ void DisplayListRecorder::push_stacking_context(PushStackingContextParams params .matrix = params.transform.matrix, }, .clip_path = params.clip_path }); - m_state_stack.append(State()); + m_scroll_frame_id_stack.append({}); } void DisplayListRecorder::pop_stacking_context() { - m_state_stack.take_last(); + (void)m_scroll_frame_id_stack.take_last(); append(PopStackingContext {}); } diff --git a/Userland/Libraries/LibWeb/Painting/DisplayListRecorder.h b/Userland/Libraries/LibWeb/Painting/DisplayListRecorder.h index 37738e4a88c..db151c2a959 100644 --- a/Userland/Libraries/LibWeb/Painting/DisplayListRecorder.h +++ b/Userland/Libraries/LibWeb/Painting/DisplayListRecorder.h @@ -103,15 +103,8 @@ public: void translate(Gfx::IntPoint delta); - void set_scroll_frame_id(Optional<i32> id) - { - state().scroll_frame_id = id; - } - - Optional<i32> scroll_frame_id() const - { - return state().scroll_frame_id; - } + void push_scroll_frame_id(Optional<i32> id); + void pop_scroll_frame_id(); void save(); void restore(); @@ -157,13 +150,7 @@ public: void append(Command&& command); private: - struct State { - Optional<i32> scroll_frame_id; - }; - State& state() { return m_state_stack.last(); } - State const& state() const { return m_state_stack.last(); } - - Vector<State> m_state_stack; + Vector<Optional<i32>> m_scroll_frame_id_stack; DisplayList& m_command_list; }; diff --git a/Userland/Libraries/LibWeb/Painting/InlinePaintable.cpp b/Userland/Libraries/LibWeb/Painting/InlinePaintable.cpp index c54b484485e..21769a4029d 100644 --- a/Userland/Libraries/LibWeb/Painting/InlinePaintable.cpp +++ b/Userland/Libraries/LibWeb/Painting/InlinePaintable.cpp @@ -37,15 +37,15 @@ void InlinePaintable::before_paint(PaintContext& context, PaintPhase) const apply_clip(context); if (scroll_frame_id().has_value()) { - context.display_list_recorder().save(); - context.display_list_recorder().set_scroll_frame_id(scroll_frame_id().value()); + context.display_list_recorder().push_scroll_frame_id(scroll_frame_id().value()); } } void InlinePaintable::after_paint(PaintContext& context, PaintPhase) const { - if (scroll_frame_id().has_value()) - context.display_list_recorder().restore(); + if (scroll_frame_id().has_value()) { + context.display_list_recorder().pop_scroll_frame_id(); + } restore_clip(context); } diff --git a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp index 79801815c2a..1cab96f2247 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp +++ b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp @@ -477,15 +477,15 @@ BorderRadiiData PaintableBox::normalized_border_radii_data(ShrinkRadiiForBorders void PaintableBox::apply_scroll_offset(PaintContext& context, PaintPhase) const { if (scroll_frame_id().has_value()) { - context.display_list_recorder().save(); - context.display_list_recorder().set_scroll_frame_id(scroll_frame_id().value()); + context.display_list_recorder().push_scroll_frame_id(scroll_frame_id().value()); } } void PaintableBox::reset_scroll_offset(PaintContext& context, PaintPhase) const { - if (scroll_frame_id().has_value()) - context.display_list_recorder().restore(); + if (scroll_frame_id().has_value()) { + context.display_list_recorder().pop_scroll_frame_id(); + } } void PaintableBox::apply_clip_overflow_rect(PaintContext& context, PaintPhase phase) const @@ -687,7 +687,7 @@ void PaintableWithLines::paint(PaintContext& context, PaintPhase phase) const } if (own_scroll_frame_id().has_value()) { - context.display_list_recorder().set_scroll_frame_id(own_scroll_frame_id().value()); + context.display_list_recorder().push_scroll_frame_id(own_scroll_frame_id().value()); } } @@ -716,6 +716,10 @@ void PaintableWithLines::paint(PaintContext& context, PaintPhase phase) const if (should_clip_overflow) { context.display_list_recorder().restore(); + + if (own_scroll_frame_id().has_value()) { + context.display_list_recorder().pop_scroll_frame_id(); + } } } diff --git a/Userland/Libraries/LibWeb/Painting/SVGSVGPaintable.cpp b/Userland/Libraries/LibWeb/Painting/SVGSVGPaintable.cpp index 3fb691d81e4..fa1bd596847 100644 --- a/Userland/Libraries/LibWeb/Painting/SVGSVGPaintable.cpp +++ b/Userland/Libraries/LibWeb/Painting/SVGSVGPaintable.cpp @@ -31,8 +31,7 @@ void SVGSVGPaintable::before_children_paint(PaintContext& context, PaintPhase ph PaintableBox::before_children_paint(context, phase); if (phase != PaintPhase::Foreground) return; - context.display_list_recorder().save(); - context.display_list_recorder().set_scroll_frame_id(scroll_frame_id()); + context.display_list_recorder().push_scroll_frame_id(scroll_frame_id()); } void SVGSVGPaintable::after_children_paint(PaintContext& context, PaintPhase phase) const @@ -40,7 +39,7 @@ void SVGSVGPaintable::after_children_paint(PaintContext& context, PaintPhase pha PaintableBox::after_children_paint(context, phase); if (phase != PaintPhase::Foreground) return; - context.display_list_recorder().restore(); + context.display_list_recorder().pop_scroll_frame_id(); } static Gfx::FloatMatrix4x4 matrix_with_scaled_translation(Gfx::FloatMatrix4x4 matrix, float scale) diff --git a/Userland/Libraries/LibWeb/Painting/StackingContext.cpp b/Userland/Libraries/LibWeb/Painting/StackingContext.cpp index b8f43c67e65..8f9aa97888b 100644 --- a/Userland/Libraries/LibWeb/Painting/StackingContext.cpp +++ b/Userland/Libraries/LibWeb/Painting/StackingContext.cpp @@ -335,8 +335,9 @@ void StackingContext::paint(PaintContext& context) const if (has_css_transform) { paintable_box().apply_clip_overflow_rect(context, PaintPhase::Foreground); } - if (paintable().is_paintable_box() && paintable_box().scroll_frame_id().has_value()) - context.display_list_recorder().set_scroll_frame_id(*paintable_box().scroll_frame_id()); + if (paintable().is_paintable_box() && paintable_box().scroll_frame_id().has_value()) { + context.display_list_recorder().push_scroll_frame_id(*paintable_box().scroll_frame_id()); + } context.display_list_recorder().push_stacking_context(push_stacking_context_params); if (paintable().is_paintable_box()) { @@ -353,6 +354,9 @@ void StackingContext::paint(PaintContext& context) const paint_internal(context); context.display_list_recorder().pop_stacking_context(); + if (paintable().is_paintable_box() && paintable_box().scroll_frame_id().has_value()) { + context.display_list_recorder().pop_scroll_frame_id(); + } if (has_css_transform) paintable_box().clear_clip_overflow_rect(context, PaintPhase::Foreground); context.display_list_recorder().restore();