2023-08-20 22:03:41 +02:00
/*
* Copyright ( c ) 2023 , Bastiaan van der Plaat < bastiaan . v . d . plaat @ gmail . com >
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
# include <LibWeb/Bindings/Intrinsics.h>
# include <LibWeb/Geometry/DOMQuad.h>
namespace Web : : Geometry {
2023-11-19 19:47:52 +01:00
JS_DEFINE_ALLOCATOR ( DOMQuad ) ;
2023-08-20 22:03:41 +02:00
JS : : NonnullGCPtr < DOMQuad > DOMQuad : : construct_impl ( JS : : Realm & realm , DOMPointInit const & p1 , DOMPointInit const & p2 , DOMPointInit const & p3 , DOMPointInit const & p4 )
{
return realm . heap ( ) . allocate < DOMQuad > ( realm , realm , p1 , p2 , p3 , p4 ) ;
}
DOMQuad : : DOMQuad ( JS : : Realm & realm , DOMPointInit const & p1 , DOMPointInit const & p2 , DOMPointInit const & p3 , DOMPointInit const & p4 )
: PlatformObject ( realm )
, m_p1 ( DOMPoint : : from_point ( realm . vm ( ) , p1 ) )
, m_p2 ( DOMPoint : : from_point ( realm . vm ( ) , p2 ) )
, m_p3 ( DOMPoint : : from_point ( realm . vm ( ) , p3 ) )
, m_p4 ( DOMPoint : : from_point ( realm . vm ( ) , p4 ) )
{
}
DOMQuad : : ~ DOMQuad ( ) = default ;
// https://drafts.fxtf.org/geometry/#dom-domquad-fromrect
JS : : NonnullGCPtr < DOMQuad > DOMQuad : : from_rect ( JS : : VM & vm , DOMRectInit const & other )
{
// The fromRect(other) static method on DOMQuad must create a DOMQuad from the DOMRectInit dictionary other.
return construct_impl ( * vm . current_realm ( ) , { other . x , other . y } ,
{ other . x + other . width , other . y } ,
{ other . x + other . width , other . y + other . height } ,
{ other . x , other . y + other . height } ) ;
}
// https://drafts.fxtf.org/geometry/#dom-domquad-fromquad
JS : : NonnullGCPtr < DOMQuad > DOMQuad : : from_quad ( JS : : VM & vm , DOMQuadInit const & other )
{
// The fromQuad(other) static method on DOMQuad must create a DOMQuad from the DOMQuadInit dictionary other.
return construct_impl ( * vm . current_realm ( ) , other . p1 , other . p2 , other . p3 , other . p4 ) ;
}
// https://drafts.fxtf.org/geometry/#dom-domquad-getbounds
JS : : NonnullGCPtr < DOMRect > DOMQuad : : get_bounds ( ) const
{
2024-02-17 08:09:53 +00:00
auto nan_safe_minimum = [ ] ( double a , double b , double c , double d ) - > double {
if ( isnan ( a ) | | isnan ( b ) | | isnan ( c ) | | isnan ( d ) )
return NAN ;
return min ( a , min ( b , min ( c , d ) ) ) ;
} ;
auto nan_safe_maximum = [ ] ( double a , double b , double c , double d ) - > double {
if ( isnan ( a ) | | isnan ( b ) | | isnan ( c ) | | isnan ( d ) )
return NAN ;
return max ( a , max ( b , max ( c , d ) ) ) ;
} ;
2023-08-20 22:03:41 +02:00
// 1. Let bounds be a DOMRect object.
auto bounds = DOMRect : : create ( realm ( ) , { } ) ;
// 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.
2024-02-17 08:09:53 +00:00
auto left = nan_safe_minimum ( m_p1 - > x ( ) , m_p2 - > x ( ) , m_p3 - > x ( ) , m_p4 - > x ( ) ) ;
2023-08-20 22:03:41 +02:00
// 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.
2024-02-17 08:09:53 +00:00
auto top = nan_safe_minimum ( m_p1 - > y ( ) , m_p2 - > y ( ) , m_p3 - > y ( ) , m_p4 - > y ( ) ) ;
2023-08-20 22:03:41 +02:00
// 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.
2024-02-17 08:09:53 +00:00
auto right = nan_safe_maximum ( m_p1 - > x ( ) , m_p2 - > x ( ) , m_p3 - > x ( ) , m_p4 - > x ( ) ) ;
2023-08-20 22:03:41 +02:00
// 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.
2024-02-17 08:09:53 +00:00
auto bottom = nan_safe_maximum ( m_p1 - > y ( ) , m_p2 - > y ( ) , m_p3 - > y ( ) , m_p4 - > y ( ) ) ;
2023-08-20 22:03:41 +02:00
// 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.
bounds - > set_x ( left ) ;
bounds - > set_y ( top ) ;
bounds - > set_width ( right - left ) ;
bounds - > set_height ( bottom - top ) ;
// 7. Return bounds.
return bounds ;
}
void DOMQuad : : initialize ( JS : : Realm & realm )
{
Base : : initialize ( realm ) ;
2023-11-22 12:55:21 +13:00
set_prototype ( & Bindings : : ensure_web_prototype < Bindings : : DOMQuadPrototype > ( realm , " DOMQuad " _fly_string ) ) ;
2023-08-20 22:03:41 +02:00
}
void DOMQuad : : visit_edges ( Cell : : Visitor & visitor )
{
Base : : visit_edges ( visitor ) ;
2023-11-19 16:18:00 +13:00
visitor . visit ( m_p1 ) ;
visitor . visit ( m_p2 ) ;
visitor . visit ( m_p3 ) ;
visitor . visit ( m_p4 ) ;
2023-08-20 22:03:41 +02:00
}
}