1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 09:17:35 +00:00

LibWeb: Add Paintable::stacking_context_rooted_here()

This is a convenience helper that lets you get the stacking context
rooted at a given paintable, without checking that the paintable is a
box first.
This commit is contained in:
Andreas Kling 2023-07-14 10:02:19 +02:00
parent 2138c164c9
commit 268492413a
3 changed files with 12 additions and 2 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2022-2023, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -7,6 +7,7 @@
#include <LibWeb/DOM/Document.h>
#include <LibWeb/Layout/BlockContainer.h>
#include <LibWeb/Painting/Paintable.h>
#include <LibWeb/Painting/PaintableBox.h>
namespace Web::Painting {
@ -86,4 +87,11 @@ Paintable const* Paintable::previous_sibling() const
return layout_node ? layout_node->paintable() : nullptr;
}
StackingContext const* Paintable::stacking_context_rooted_here() const
{
if (!layout_node().is_box())
return nullptr;
return static_cast<PaintableBox const&>(*this).stacking_context();
}
}

View file

@ -134,6 +134,8 @@ public:
template<typename T>
bool fast_is() const = delete;
StackingContext const* stacking_context_rooted_here() const;
protected:
explicit Paintable(Layout::Node const& layout_node)
: m_layout_node(layout_node)

View file

@ -444,7 +444,7 @@ Gfx::FloatPoint StackingContext::compute_transform_origin() const
template<typename U, typename Callback>
static TraversalDecision for_each_in_inclusive_subtree_of_type_within_same_stacking_context_in_reverse(Paintable const& paintable, Callback callback)
{
if (is<PaintableBox>(paintable) && static_cast<PaintableBox const&>(paintable).stacking_context()) {
if (paintable.stacking_context_rooted_here()) {
// Note: Include the stacking context (so we can hit test it), but don't recurse into it.
if (auto decision = callback(static_cast<U const&>(paintable)); decision != TraversalDecision::Continue)
return decision;