Size.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/CSS/Size.h>
  7. namespace Web::CSS {
  8. Size::Size(Type type, LengthPercentage length_percentage)
  9. : m_type(type)
  10. , m_length_percentage(move(length_percentage))
  11. {
  12. }
  13. CSSPixels Size::to_px(Layout::Node const& node, CSSPixels reference_value) const
  14. {
  15. return m_length_percentage.resolved(node, reference_value).to_px(node);
  16. }
  17. CSS::Length Size::resolved(Layout::Node const& node, CSSPixels reference_value) const
  18. {
  19. return m_length_percentage.resolved(node, reference_value);
  20. }
  21. Size Size::make_auto()
  22. {
  23. return Size { Type::Auto, Length::make_auto() };
  24. }
  25. Size Size::make_px(CSSPixels px)
  26. {
  27. return make_length(CSS::Length::make_px(px));
  28. }
  29. Size Size::make_length(Length length)
  30. {
  31. return Size { Type::Length, move(length) };
  32. }
  33. Size Size::make_percentage(Percentage percentage)
  34. {
  35. return Size { Type::Percentage, move(percentage) };
  36. }
  37. Size Size::make_calculated(NonnullRefPtr<Web::CSS::CalculatedStyleValue> calculated)
  38. {
  39. return Size { Type::Calculated, move(calculated) };
  40. }
  41. Size Size::make_min_content()
  42. {
  43. return Size { Type::MinContent, Length::make_auto() };
  44. }
  45. Size Size::make_max_content()
  46. {
  47. return Size { Type::MaxContent, Length::make_auto() };
  48. }
  49. Size Size::make_fit_content(Length available_space)
  50. {
  51. return Size { Type::FitContent, move(available_space) };
  52. }
  53. Size Size::make_fit_content()
  54. {
  55. // NOTE: We use "auto" as a stand-in for "stretch" here.
  56. return Size { Type::FitContent, Length::make_auto() };
  57. }
  58. Size Size::make_none()
  59. {
  60. return Size { Type::None, Length::make_auto() };
  61. }
  62. bool Size::contains_percentage() const
  63. {
  64. switch (m_type) {
  65. case Type::Auto:
  66. case Type::MinContent:
  67. case Type::MaxContent:
  68. case Type::None:
  69. return false;
  70. default:
  71. return m_length_percentage.contains_percentage();
  72. }
  73. }
  74. String Size::to_string() const
  75. {
  76. switch (m_type) {
  77. case Type::Auto:
  78. return "auto"_string;
  79. case Type::Calculated:
  80. case Type::Length:
  81. case Type::Percentage:
  82. return m_length_percentage.to_string();
  83. case Type::MinContent:
  84. return "min-content"_string;
  85. case Type::MaxContent:
  86. return "max-content"_string;
  87. case Type::FitContent:
  88. return MUST(String::formatted("fit-content({})", m_length_percentage.to_string()));
  89. case Type::None:
  90. return "none"_string;
  91. }
  92. VERIFY_NOT_REACHED();
  93. }
  94. }