DOMQuad.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright (c) 2023, Bastiaan van der Plaat <bastiaan.v.d.plaat@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/Bindings/Intrinsics.h>
  7. #include <LibWeb/Geometry/DOMQuad.h>
  8. namespace Web::Geometry {
  9. JS_DEFINE_ALLOCATOR(DOMQuad);
  10. JS::NonnullGCPtr<DOMQuad> DOMQuad::construct_impl(JS::Realm& realm, DOMPointInit const& p1, DOMPointInit const& p2, DOMPointInit const& p3, DOMPointInit const& p4)
  11. {
  12. return realm.heap().allocate<DOMQuad>(realm, realm, p1, p2, p3, p4);
  13. }
  14. DOMQuad::DOMQuad(JS::Realm& realm, DOMPointInit const& p1, DOMPointInit const& p2, DOMPointInit const& p3, DOMPointInit const& p4)
  15. : PlatformObject(realm)
  16. , m_p1(DOMPoint::from_point(realm.vm(), p1))
  17. , m_p2(DOMPoint::from_point(realm.vm(), p2))
  18. , m_p3(DOMPoint::from_point(realm.vm(), p3))
  19. , m_p4(DOMPoint::from_point(realm.vm(), p4))
  20. {
  21. }
  22. DOMQuad::~DOMQuad() = default;
  23. // https://drafts.fxtf.org/geometry/#dom-domquad-fromrect
  24. JS::NonnullGCPtr<DOMQuad> DOMQuad::from_rect(JS::VM& vm, DOMRectInit const& other)
  25. {
  26. // The fromRect(other) static method on DOMQuad must create a DOMQuad from the DOMRectInit dictionary other.
  27. return construct_impl(*vm.current_realm(), { other.x, other.y },
  28. { other.x + other.width, other.y },
  29. { other.x + other.width, other.y + other.height },
  30. { other.x, other.y + other.height });
  31. }
  32. // https://drafts.fxtf.org/geometry/#dom-domquad-fromquad
  33. JS::NonnullGCPtr<DOMQuad> DOMQuad::from_quad(JS::VM& vm, DOMQuadInit const& other)
  34. {
  35. // The fromQuad(other) static method on DOMQuad must create a DOMQuad from the DOMQuadInit dictionary other.
  36. return construct_impl(*vm.current_realm(), other.p1, other.p2, other.p3, other.p4);
  37. }
  38. // https://drafts.fxtf.org/geometry/#dom-domquad-getbounds
  39. JS::NonnullGCPtr<DOMRect> DOMQuad::get_bounds() const
  40. {
  41. // 1. Let bounds be a DOMRect object.
  42. auto bounds = DOMRect::create(realm(), {});
  43. // 2. Let left be the NaN-safe minimum of point 1’s x coordinate, point 2’s x coordinate, point 3’s x coordinate and point 4’s x coordinate.
  44. auto left = min(m_p1->x(), min(m_p2->x(), min(m_p3->x(), m_p4->x())));
  45. // 3. Let top be the NaN-safe minimum of point 1’s y coordinate, point 2’s y coordinate, point 3’s y coordinate and point 4’s y coordinate.
  46. auto top = min(m_p1->y(), min(m_p2->y(), min(m_p3->y(), m_p4->y())));
  47. // 4. Let right be the NaN-safe maximum of point 1’s x coordinate, point 2’s x coordinate, point 3’s x coordinate and point 4’s x coordinate.
  48. auto right = max(m_p1->x(), max(m_p2->x(), max(m_p3->x(), m_p4->x())));
  49. // 5. Let bottom be the NaN-safe maximum of point 1’s y coordinate, point 2’s y coordinate, point 3’s y coordinate and point 4’s y coordinate.
  50. auto bottom = max(m_p1->y(), max(m_p2->y(), max(m_p3->y(), m_p4->y())));
  51. // 6. Set x coordinate of bounds to left, y coordinate of bounds to top, width dimension of bounds to right - left and height dimension of bounds to bottom - top.
  52. bounds->set_x(left);
  53. bounds->set_y(top);
  54. bounds->set_width(right - left);
  55. bounds->set_height(bottom - top);
  56. // 7. Return bounds.
  57. return bounds;
  58. }
  59. void DOMQuad::initialize(JS::Realm& realm)
  60. {
  61. Base::initialize(realm);
  62. set_prototype(&Bindings::ensure_web_prototype<Bindings::DOMQuadPrototype>(realm, "DOMQuad"_fly_string));
  63. }
  64. void DOMQuad::visit_edges(Cell::Visitor& visitor)
  65. {
  66. Base::visit_edges(visitor);
  67. visitor.visit(m_p1);
  68. visitor.visit(m_p2);
  69. visitor.visit(m_p3);
  70. visitor.visit(m_p4);
  71. }
  72. }