浏览代码

LibWeb: Don't call establishes_stacking_context() during painting

By the time we're painting, we've already built the stacking context
tree. So instead of asking if a box establishes a stacking context, we
can ask if its paintable *has* a stacking context.

This was taking up ~6% of the profile when mousing around on the HTML
specification. With this change, it disappears completely. :^)
Andreas Kling 3 年之前
父节点
当前提交
ccc37032a4
共有 1 个文件被更改,包括 2 次插入1 次删除
  1. 2 1
      Userland/Libraries/LibWeb/Painting/StackingContext.cpp

+ 2 - 1
Userland/Libraries/LibWeb/Painting/StackingContext.cpp

@@ -52,7 +52,8 @@ void StackingContext::paint_descendants(PaintContext& context, Layout::Node& box
     }
     }
 
 
     box.for_each_child([&](auto& child) {
     box.for_each_child([&](auto& child) {
-        if (child.establishes_stacking_context())
+        // If `child` establishes its own stacking context, skip over it.
+        if (is<Layout::Box>(child) && child.paintable() && static_cast<Layout::Box const&>(child).paint_box()->stacking_context())
             return;
             return;
         bool child_is_inline_or_replaced = child.is_inline() || is<Layout::ReplacedBox>(child);
         bool child_is_inline_or_replaced = child.is_inline() || is<Layout::ReplacedBox>(child);
         switch (phase) {
         switch (phase) {