SVGLength.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright (c) 2022, Tim Flynn <trflynn89@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/Bindings/Intrinsics.h>
  7. #include <LibWeb/CSS/PercentageOr.h>
  8. #include <LibWeb/SVG/SVGLength.h>
  9. namespace Web::SVG {
  10. JS_DEFINE_ALLOCATOR(SVGLength);
  11. // Same as SVGLength.idl
  12. constexpr unsigned short SVG_LENGTHTYPE_UNKNOWN = 0;
  13. constexpr unsigned short SVG_LENGTHTYPE_NUMBER = 1;
  14. constexpr unsigned short SVG_LENGTHTYPE_PERCENTAGE = 2;
  15. constexpr unsigned short SVG_LENGTHTYPE_EMS = 3;
  16. constexpr unsigned short SVG_LENGTHTYPE_EXS = 4;
  17. constexpr unsigned short SVG_LENGTHTYPE_PX = 5;
  18. constexpr unsigned short SVG_LENGTHTYPE_CM = 6;
  19. constexpr unsigned short SVG_LENGTHTYPE_MM = 7;
  20. constexpr unsigned short SVG_LENGTHTYPE_IN = 8;
  21. constexpr unsigned short SVG_LENGTHTYPE_PT = 9;
  22. constexpr unsigned short SVG_LENGTHTYPE_PC = 10;
  23. JS::NonnullGCPtr<SVGLength> SVGLength::create(JS::Realm& realm, u8 unit_type, float value)
  24. {
  25. return realm.heap().allocate<SVGLength>(realm, realm, unit_type, value);
  26. }
  27. JS::NonnullGCPtr<SVGLength> SVGLength::from_length_percentage(JS::Realm& realm, CSS::LengthPercentage const& length_percentage)
  28. {
  29. // FIXME: We can't tell if a CSS::LengthPercentage was a unitless length.
  30. (void)SVG_LENGTHTYPE_NUMBER;
  31. if (length_percentage.is_percentage())
  32. return SVGLength::create(realm, SVG_LENGTHTYPE_PERCENTAGE, length_percentage.percentage().value());
  33. if (length_percentage.is_length())
  34. return SVGLength::create(
  35. realm, [&] {
  36. switch (length_percentage.length().type()) {
  37. case CSS::Length::Type::Em:
  38. return SVG_LENGTHTYPE_EMS;
  39. case CSS::Length::Type::Ex:
  40. return SVG_LENGTHTYPE_EXS;
  41. case CSS::Length::Type::Px:
  42. return SVG_LENGTHTYPE_PX;
  43. case CSS::Length::Type::Cm:
  44. return SVG_LENGTHTYPE_CM;
  45. case CSS::Length::Type::Mm:
  46. return SVG_LENGTHTYPE_MM;
  47. case CSS::Length::Type::In:
  48. return SVG_LENGTHTYPE_IN;
  49. case CSS::Length::Type::Pt:
  50. return SVG_LENGTHTYPE_PT;
  51. case CSS::Length::Type::Pc:
  52. return SVG_LENGTHTYPE_PC;
  53. default:
  54. return SVG_LENGTHTYPE_UNKNOWN;
  55. }
  56. }(),
  57. length_percentage.length().raw_value());
  58. return SVGLength::create(realm, SVG_LENGTHTYPE_UNKNOWN, 0);
  59. }
  60. SVGLength::SVGLength(JS::Realm& realm, u8 unit_type, float value)
  61. : PlatformObject(realm)
  62. , m_unit_type(unit_type)
  63. , m_value(value)
  64. {
  65. }
  66. void SVGLength::initialize(JS::Realm& realm)
  67. {
  68. Base::initialize(realm);
  69. WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGLength);
  70. }
  71. SVGLength::~SVGLength() = default;
  72. // https://www.w3.org/TR/SVG11/types.html#__svg__SVGLength__value
  73. WebIDL::ExceptionOr<void> SVGLength::set_value(float value)
  74. {
  75. // FIXME: Raise an exception if this <length> is read-only.
  76. m_value = value;
  77. return {};
  78. }
  79. }