Box.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "../../Include/RmlUi/Core/Box.h"
  2. #include <string.h>
  3. namespace Rml {
  4. Box::Box() {}
  5. Box::Box(Vector2f content) : content(content) {}
  6. Box::~Box() {}
  7. Vector2f Box::GetPosition(BoxArea area) const
  8. {
  9. RMLUI_ASSERT(area != BoxArea::Auto);
  10. Vector2f area_position(-GetEdge(BoxArea::Margin, BoxEdge::Left), -GetEdge(BoxArea::Margin, BoxEdge::Top));
  11. for (int i = 0; i < (int)area; i++)
  12. {
  13. area_position.x += area_edges[i][(int)BoxEdge::Left];
  14. area_position.y += area_edges[i][(int)BoxEdge::Top];
  15. }
  16. return area_position;
  17. }
  18. Vector2f Box::GetSize() const
  19. {
  20. return content;
  21. }
  22. Vector2f Box::GetSize(BoxArea area) const
  23. {
  24. RMLUI_ASSERT(area != BoxArea::Auto);
  25. Vector2f area_size(content);
  26. for (int i = (int)area; i <= (int)BoxArea::Padding; i++)
  27. {
  28. area_size.x += (area_edges[i][(int)BoxEdge::Left] + area_edges[i][(int)BoxEdge::Right]);
  29. area_size.y += (area_edges[i][(int)BoxEdge::Top] + area_edges[i][(int)BoxEdge::Bottom]);
  30. }
  31. return area_size;
  32. }
  33. void Box::SetContent(Vector2f _content)
  34. {
  35. content = _content;
  36. }
  37. void Box::SetEdge(BoxArea area, BoxEdge edge, float size)
  38. {
  39. RMLUI_ASSERT(area != BoxArea::Auto);
  40. area_edges[(int)area][(int)edge] = size;
  41. }
  42. float Box::GetEdge(BoxArea area, BoxEdge edge) const
  43. {
  44. RMLUI_ASSERT(area != BoxArea::Auto);
  45. return area_edges[(int)area][(int)edge];
  46. }
  47. float Box::GetCumulativeEdge(BoxArea area, BoxEdge edge) const
  48. {
  49. RMLUI_ASSERT(area != BoxArea::Auto);
  50. float size = 0;
  51. int max_area = Math::Min((int)area, (int)BoxArea::Padding);
  52. for (int i = 0; i <= max_area; i++)
  53. size += area_edges[i][(int)edge];
  54. return size;
  55. }
  56. float Box::GetSizeAcross(BoxDirection direction, BoxArea area_outer, BoxArea area_inner) const
  57. {
  58. static_assert((int)BoxDirection::Horizontal == 1 && (int)BoxDirection::Vertical == 0, "");
  59. RMLUI_ASSERT((int)area_outer <= (int)area_inner && (int)direction <= 1 && area_inner != BoxArea::Auto);
  60. float size = 0.0f;
  61. if (area_inner == BoxArea::Content)
  62. size = (direction == BoxDirection::Horizontal ? content.x : content.y);
  63. for (int i = (int)area_outer; i <= (int)area_inner && i < (int)BoxArea::Content; i++)
  64. size += (area_edges[i][(int)BoxEdge::Top + (int)direction] + area_edges[i][(int)BoxEdge::Bottom + (int)direction]);
  65. return size;
  66. }
  67. Vector2f Box::GetFrameSize(BoxArea area) const
  68. {
  69. if (area == BoxArea::Content)
  70. return content;
  71. return {
  72. area_edges[(int)area][(int)BoxEdge::Right] + area_edges[(int)area][(int)BoxEdge::Left],
  73. area_edges[(int)area][(int)BoxEdge::Top] + area_edges[(int)area][(int)BoxEdge::Bottom],
  74. };
  75. }
  76. bool Box::operator==(const Box& rhs) const
  77. {
  78. return content == rhs.content && memcmp(area_edges, rhs.area_edges, sizeof(area_edges)) == 0;
  79. }
  80. bool Box::operator!=(const Box& rhs) const
  81. {
  82. return !(*this == rhs);
  83. }
  84. } // namespace Rml