Angle.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "Angle.h"
  7. #include <AK/Math.h>
  8. #include <LibWeb/CSS/StyleValue.h>
  9. namespace Web::CSS {
  10. Angle::Angle(int value, Type type)
  11. : m_type(type)
  12. , m_value(value)
  13. {
  14. }
  15. Angle::Angle(float value, Type type)
  16. : m_type(type)
  17. , m_value(value)
  18. {
  19. }
  20. Angle Angle::make_calculated(NonnullRefPtr<CalculatedStyleValue> calculated_style_value)
  21. {
  22. Angle angle { 0, Type::Calculated };
  23. angle.m_calculated_style = move(calculated_style_value);
  24. return angle;
  25. }
  26. Angle Angle::make_degrees(float value)
  27. {
  28. return { value, Type::Deg };
  29. }
  30. Angle Angle::percentage_of(Percentage const& percentage) const
  31. {
  32. VERIFY(!is_calculated());
  33. return Angle { percentage.as_fraction() * m_value, m_type };
  34. }
  35. String Angle::to_string() const
  36. {
  37. if (is_calculated())
  38. return m_calculated_style->to_string();
  39. return String::formatted("{}{}", m_value, unit_name());
  40. }
  41. float Angle::to_degrees() const
  42. {
  43. switch (m_type) {
  44. case Type::Calculated:
  45. return m_calculated_style->resolve_angle()->to_degrees();
  46. case Type::Deg:
  47. return m_value;
  48. case Type::Grad:
  49. return m_value * (360.0f / 400.0f);
  50. case Type::Rad:
  51. return m_value * (360.0f / 2 * AK::Pi<float>);
  52. case Type::Turn:
  53. return m_value * 360.0f;
  54. }
  55. VERIFY_NOT_REACHED();
  56. }
  57. StringView Angle::unit_name() const
  58. {
  59. switch (m_type) {
  60. case Type::Calculated:
  61. return "calculated"sv;
  62. case Type::Deg:
  63. return "deg"sv;
  64. case Type::Grad:
  65. return "grad"sv;
  66. case Type::Rad:
  67. return "rad"sv;
  68. case Type::Turn:
  69. return "turn"sv;
  70. }
  71. VERIFY_NOT_REACHED();
  72. }
  73. Optional<Angle::Type> Angle::unit_from_name(StringView name)
  74. {
  75. if (name.equals_ignoring_case("deg"sv)) {
  76. return Type::Deg;
  77. } else if (name.equals_ignoring_case("grad"sv)) {
  78. return Type::Grad;
  79. } else if (name.equals_ignoring_case("rad"sv)) {
  80. return Type::Rad;
  81. } else if (name.equals_ignoring_case("turn"sv)) {
  82. return Type::Turn;
  83. }
  84. return {};
  85. }
  86. }