1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 12:48:10 +00:00

LibWeb: Paint positioned elements after non-positioned ones

Within the same stacking context, positioned elements must be painted
after non-positioned ones.

I added a Layout::Node::for_each_child_in_paint_order() to help with
this since it's also needed for hit testing.
This commit is contained in:
Andreas Kling 2020-12-06 19:59:28 +01:00
parent 85a1bd6803
commit c953e5d98a
3 changed files with 20 additions and 11 deletions

View file

@ -93,9 +93,7 @@ void Node::paint(PaintContext& context, PaintPhase phase)
before_children_paint(context, phase);
for_each_child([&](auto& child) {
if (child.is_box() && downcast<Box>(child).stacking_context())
return;
for_each_child_in_paint_order([&](auto& child) {
child.paint(context, phase);
});
@ -105,11 +103,7 @@ void Node::paint(PaintContext& context, PaintPhase phase)
HitTestResult Node::hit_test(const Gfx::IntPoint& position, HitTestType type) const
{
HitTestResult result;
for_each_child([&](auto& child) {
// Skip over children that establish their own stacking context.
// The outer loop who called us will take care of those.
if (is<Box>(child) && downcast<Box>(child).stacking_context())
return;
for_each_child_in_paint_order([&](auto& child) {
auto child_result = child.hit_test(position, type);
if (child_result.layout_node)
result = child_result;