12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- /*
- * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
- #include <LibWeb/Layout/BlockContainer.h>
- #include <LibWeb/Painting/Box.h>
- namespace Web::Painting {
- Box::Box(Layout::Box const& layout_box)
- : m_layout_box(layout_box)
- {
- }
- Box::~Box()
- {
- }
- BoxWithLines::BoxWithLines(Layout::BlockContainer const& layout_box)
- : Box(layout_box)
- {
- }
- BoxWithLines::~BoxWithLines()
- {
- }
- void Box::set_offset(const Gfx::FloatPoint& offset)
- {
- if (m_offset == offset)
- return;
- m_offset = offset;
- // FIXME: This const_cast is gross.
- const_cast<Layout::Box&>(m_layout_box).did_set_rect();
- }
- void Box::set_content_size(Gfx::FloatSize const& size)
- {
- if (m_content_size == size)
- return;
- m_content_size = size;
- // FIXME: This const_cast is gross.
- const_cast<Layout::Box&>(m_layout_box).did_set_rect();
- }
- Gfx::FloatPoint Box::effective_offset() const
- {
- if (m_containing_line_box_fragment.has_value()) {
- auto const& fragment = m_layout_box.containing_block()->paint_box()->line_boxes()[m_containing_line_box_fragment->line_box_index].fragments()[m_containing_line_box_fragment->fragment_index];
- return fragment.offset();
- }
- return m_offset;
- }
- Gfx::FloatRect Box::absolute_rect() const
- {
- Gfx::FloatRect rect { effective_offset(), content_size() };
- for (auto* block = m_layout_box.containing_block(); block; block = block->containing_block())
- rect.translate_by(block->m_paint_box->effective_offset());
- return rect;
- }
- void Box::set_containing_line_box_fragment(Optional<Layout::LineBoxFragmentCoordinate> fragment_coordinate)
- {
- m_containing_line_box_fragment = fragment_coordinate;
- }
- Painting::StackingContext* Box::enclosing_stacking_context()
- {
- for (auto* ancestor = m_layout_box.parent(); ancestor; ancestor = ancestor->parent()) {
- if (!is<Layout::Box>(ancestor))
- continue;
- auto& ancestor_box = static_cast<Layout::Box&>(const_cast<Layout::NodeWithStyle&>(*ancestor));
- if (!ancestor_box.establishes_stacking_context())
- continue;
- VERIFY(ancestor_box.m_paint_box->stacking_context());
- return ancestor_box.m_paint_box->stacking_context();
- }
- // We should always reach the Layout::InitialContainingBlock stacking context.
- VERIFY_NOT_REACHED();
- }
- }
|