Box.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*
  2. * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/Layout/BlockContainer.h>
  7. #include <LibWeb/Painting/Box.h>
  8. namespace Web::Painting {
  9. Box::Box(Layout::Box const& layout_box)
  10. : m_layout_box(layout_box)
  11. {
  12. }
  13. Box::~Box()
  14. {
  15. }
  16. BoxWithLines::BoxWithLines(Layout::BlockContainer const& layout_box)
  17. : Box(layout_box)
  18. {
  19. }
  20. BoxWithLines::~BoxWithLines()
  21. {
  22. }
  23. void Box::set_offset(const Gfx::FloatPoint& offset)
  24. {
  25. if (m_offset == offset)
  26. return;
  27. m_offset = offset;
  28. // FIXME: This const_cast is gross.
  29. const_cast<Layout::Box&>(m_layout_box).did_set_rect();
  30. }
  31. void Box::set_content_size(Gfx::FloatSize const& size)
  32. {
  33. if (m_content_size == size)
  34. return;
  35. m_content_size = size;
  36. // FIXME: This const_cast is gross.
  37. const_cast<Layout::Box&>(m_layout_box).did_set_rect();
  38. }
  39. Gfx::FloatPoint Box::effective_offset() const
  40. {
  41. if (m_containing_line_box_fragment.has_value()) {
  42. 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];
  43. return fragment.offset();
  44. }
  45. return m_offset;
  46. }
  47. Gfx::FloatRect Box::absolute_rect() const
  48. {
  49. Gfx::FloatRect rect { effective_offset(), content_size() };
  50. for (auto* block = m_layout_box.containing_block(); block; block = block->containing_block())
  51. rect.translate_by(block->m_paint_box->effective_offset());
  52. return rect;
  53. }
  54. void Box::set_containing_line_box_fragment(Optional<Layout::LineBoxFragmentCoordinate> fragment_coordinate)
  55. {
  56. m_containing_line_box_fragment = fragment_coordinate;
  57. }
  58. Painting::StackingContext* Box::enclosing_stacking_context()
  59. {
  60. for (auto* ancestor = m_layout_box.parent(); ancestor; ancestor = ancestor->parent()) {
  61. if (!is<Layout::Box>(ancestor))
  62. continue;
  63. auto& ancestor_box = static_cast<Layout::Box&>(const_cast<Layout::NodeWithStyle&>(*ancestor));
  64. if (!ancestor_box.establishes_stacking_context())
  65. continue;
  66. VERIFY(ancestor_box.m_paint_box->stacking_context());
  67. return ancestor_box.m_paint_box->stacking_context();
  68. }
  69. // We should always reach the Layout::InitialContainingBlock stacking context.
  70. VERIFY_NOT_REACHED();
  71. }
  72. }