InlineBox.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * This source file is part of RmlUi, the HTML/CSS Interface Middleware
  3. *
  4. * For the latest information, see http://github.com/mikke89/RmlUi
  5. *
  6. * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd
  7. * Copyright (c) 2019 The RmlUi Team, and contributors
  8. *
  9. * Permission is hereby granted, free of charge, to any person obtaining a copy
  10. * of this software and associated documentation files (the "Software"), to deal
  11. * in the Software without restriction, including without limitation the rights
  12. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  13. * copies of the Software, and to permit persons to whom the Software is
  14. * furnished to do so, subject to the following conditions:
  15. *
  16. * The above copyright notice and this permission notice shall be included in
  17. * all copies or substantial portions of the Software.
  18. *
  19. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  22. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  23. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  24. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  25. * THE SOFTWARE.
  26. *
  27. */
  28. #ifndef RMLUI_CORE_LAYOUT_INLINEBOX_H
  29. #define RMLUI_CORE_LAYOUT_INLINEBOX_H
  30. #include "../../../Include/RmlUi/Core/Box.h"
  31. #include "InlineLevelBox.h"
  32. namespace Rml {
  33. class InlineBoxBase : public InlineLevelBox {
  34. public:
  35. InlineLevelBox* AddChild(UniquePtr<InlineLevelBox> child);
  36. String DebugDumpTree(int depth) const override;
  37. protected:
  38. InlineBoxBase(Element* element);
  39. // Get the total height above and depth below the baseline based on this element's line-height and font.
  40. void GetStrut(float& out_total_height_above, float& out_total_depth_below) const;
  41. private:
  42. using InlineLevelBoxList = Vector<UniquePtr<InlineLevelBox>>;
  43. // @performance Use first_child, next_sibling instead to build the tree?
  44. InlineLevelBoxList children;
  45. };
  46. /**
  47. Inline boxes are inline-level boxes whose contents (child boxes) participate in the same inline formatting context
  48. as the box itself.
  49. An inline box initially creates an unsized open fragment, since its width depends on its children. The fragment is
  50. sized and placed later on, either when its line needs to be split or when its element is closed, which happens after
  51. all its children in the element tree have already been placed.
  52. */
  53. class InlineBox final : public InlineBoxBase {
  54. public:
  55. InlineBox(const InlineLevelBox* parent, Element* element, const Box& box);
  56. FragmentConstructor CreateFragment(InlineLayoutMode mode, float available_width, float right_spacing_width, bool first_box,
  57. LayoutOverflowHandle overflow_handle) override;
  58. void Submit(const PlacedFragment& placed_fragment) override;
  59. String DebugDumpNameValue() const override { return "InlineBox"; }
  60. private:
  61. float baseline_to_border_height = 0;
  62. Vector2f element_offset;
  63. Box box;
  64. };
  65. /**
  66. The root inline box is contained directly within its inline container.
  67. All content in the current inline formatting context is contained either within the root or one of its decendants.
  68. */
  69. class InlineBoxRoot final : public InlineBoxBase {
  70. public:
  71. InlineBoxRoot(Element* element);
  72. FragmentConstructor CreateFragment(InlineLayoutMode mode, float available_width, float right_spacing_width, bool first_box,
  73. LayoutOverflowHandle overflow_handle) override;
  74. void Submit(const PlacedFragment& placed_fragment) override;
  75. String DebugDumpNameValue() const override { return "InlineBoxRoot"; }
  76. };
  77. } // namespace Rml
  78. #endif