LibWeb: Invalidate the display list when calling set_needs_display()

Calls to `Document::set_needs_display()` and
`Paintable::set_needs_display()` now invalidate the display list by
default. This behavior can be changed by passing
`InvalidateDisplayList::No` to the function where invalidating the
display list is not necessary.
This commit is contained in:
Tim Ledbetter 2024-09-02 16:47:32 +01:00 committed by Alexander Kalenik
commit 5800b7e884
Notes: github-actions[bot] 2024-09-02 18:13:03 +00:00
12 changed files with 53 additions and 28 deletions

View file

@ -128,24 +128,27 @@ void Paintable::invalidate_stacking_context()
m_stacking_context = nullptr;
}
void Paintable::set_needs_display()
void Paintable::set_needs_display(InvalidateDisplayList should_invalidate_display_list)
{
auto& document = const_cast<DOM::Document&>(this->document());
if (should_invalidate_display_list == InvalidateDisplayList::Yes)
document.invalidate_display_list();
auto* containing_block = this->containing_block();
if (!containing_block)
return;
auto& document = const_cast<DOM::Document&>(this->document());
if (is<Painting::InlinePaintable>(*this)) {
auto const& fragments = static_cast<Painting::InlinePaintable const*>(this)->fragments();
for (auto const& fragment : fragments)
document.set_needs_display(fragment.absolute_rect());
for (auto const& fragment : fragments) {
document.set_needs_display(fragment.absolute_rect(), InvalidateDisplayList::No);
}
}
if (!is<Painting::PaintableWithLines>(*containing_block))
return;
static_cast<Painting::PaintableWithLines const&>(*containing_block).for_each_fragment([&](auto& fragment) {
document.set_needs_display(fragment.absolute_rect());
document.set_needs_display(fragment.absolute_rect(), InvalidateDisplayList::No);
return IterationDecision::Continue;
});
}