| 
									
										
										
										
											2024-05-25 23:06:47 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2024, MacDue <macdue@dueutil.tech> | 
					
						
							| 
									
										
										
										
											2025-07-17 16:39:45 +01:00
										 |  |  |  * Copyright (c) 2025, Sam Atkins <sam@ladybird.org> | 
					
						
							| 
									
										
										
										
											2024-05-25 23:06:47 +01:00
										 |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <AK/Variant.h>
 | 
					
						
							| 
									
										
										
										
											2024-10-28 13:51:23 +11:00
										 |  |  | #include <LibGfx/WindingRule.h>
 | 
					
						
							| 
									
										
										
										
											2024-10-27 11:58:52 +11:00
										 |  |  | #include <LibWeb/CSS/LengthBox.h>
 | 
					
						
							| 
									
										
										
										
											2024-05-25 23:06:47 +01:00
										 |  |  | #include <LibWeb/CSS/PercentageOr.h>
 | 
					
						
							| 
									
										
										
										
											2024-10-27 11:58:52 +11:00
										 |  |  | #include <LibWeb/CSS/StyleValues/PositionStyleValue.h>
 | 
					
						
							| 
									
										
										
										
											2025-08-08 10:11:51 +01:00
										 |  |  | #include <LibWeb/CSS/StyleValues/StyleValue.h>
 | 
					
						
							| 
									
										
										
										
											2025-07-17 16:39:45 +01:00
										 |  |  | #include <LibWeb/SVG/AttributeParser.h>
 | 
					
						
							| 
									
										
										
										
											2024-05-25 23:06:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Web::CSS { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-27 11:58:52 +11:00
										 |  |  | struct Inset { | 
					
						
							|  |  |  |     Gfx::Path to_path(CSSPixelRect reference_box, Layout::Node const&) const; | 
					
						
							| 
									
										
										
										
											2025-05-16 19:20:24 +01:00
										 |  |  |     String to_string(SerializationMode) const; | 
					
						
							| 
									
										
										
										
											2024-10-27 11:58:52 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool operator==(Inset const&) const = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     LengthBox inset_box; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct Xywh { | 
					
						
							|  |  |  |     Gfx::Path to_path(CSSPixelRect reference_box, Layout::Node const&) const; | 
					
						
							| 
									
										
										
										
											2025-05-16 19:20:24 +01:00
										 |  |  |     String to_string(SerializationMode) const; | 
					
						
							| 
									
										
										
										
											2024-10-27 11:58:52 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool operator==(Xywh const&) const = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     LengthPercentage x; | 
					
						
							|  |  |  |     LengthPercentage y; | 
					
						
							|  |  |  |     LengthPercentage width; | 
					
						
							|  |  |  |     LengthPercentage height; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct Rect { | 
					
						
							|  |  |  |     Gfx::Path to_path(CSSPixelRect reference_box, Layout::Node const&) const; | 
					
						
							| 
									
										
										
										
											2025-05-16 19:20:24 +01:00
										 |  |  |     String to_string(SerializationMode) const; | 
					
						
							| 
									
										
										
										
											2024-10-27 11:58:52 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool operator==(Rect const&) const = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     LengthBox box; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum class FitSide { | 
					
						
							|  |  |  |     ClosestSide, | 
					
						
							|  |  |  |     FarthestSide, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using ShapeRadius = Variant<LengthPercentage, FitSide>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct Circle { | 
					
						
							|  |  |  |     Gfx::Path to_path(CSSPixelRect reference_box, Layout::Node const&) const; | 
					
						
							| 
									
										
										
										
											2025-05-16 19:20:24 +01:00
										 |  |  |     String to_string(SerializationMode) const; | 
					
						
							| 
									
										
										
										
											2024-10-27 11:58:52 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool operator==(Circle const&) const = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ShapeRadius radius; | 
					
						
							| 
									
										
										
										
											2025-04-15 15:18:27 -06:00
										 |  |  |     ValueComparingNonnullRefPtr<PositionStyleValue const> position; | 
					
						
							| 
									
										
										
										
											2024-10-27 11:58:52 +11:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct Ellipse { | 
					
						
							|  |  |  |     Gfx::Path to_path(CSSPixelRect reference_box, Layout::Node const&) const; | 
					
						
							| 
									
										
										
										
											2025-05-16 19:20:24 +01:00
										 |  |  |     String to_string(SerializationMode) const; | 
					
						
							| 
									
										
										
										
											2024-10-27 11:58:52 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool operator==(Ellipse const&) const = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ShapeRadius radius_x; | 
					
						
							|  |  |  |     ShapeRadius radius_y; | 
					
						
							| 
									
										
										
										
											2025-04-15 15:18:27 -06:00
										 |  |  |     ValueComparingNonnullRefPtr<PositionStyleValue const> position; | 
					
						
							| 
									
										
										
										
											2024-10-27 11:58:52 +11:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-25 23:06:47 +01:00
										 |  |  | struct Polygon { | 
					
						
							|  |  |  |     struct Point { | 
					
						
							|  |  |  |         bool operator==(Point const&) const = default; | 
					
						
							|  |  |  |         LengthPercentage x; | 
					
						
							|  |  |  |         LengthPercentage y; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-20 17:27:08 +02:00
										 |  |  |     Gfx::Path to_path(CSSPixelRect reference_box, Layout::Node const&) const; | 
					
						
							| 
									
										
										
										
											2025-05-16 19:20:24 +01:00
										 |  |  |     String to_string(SerializationMode) const; | 
					
						
							| 
									
										
										
										
											2024-05-25 23:06:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool operator==(Polygon const&) const = default; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-28 13:51:23 +11:00
										 |  |  |     Gfx::WindingRule fill_rule; | 
					
						
							| 
									
										
										
										
											2024-05-25 23:06:47 +01:00
										 |  |  |     Vector<Point> points; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-17 16:39:45 +01:00
										 |  |  | // https://drafts.csswg.org/css-shapes/#funcdef-basic-shape-path
 | 
					
						
							|  |  |  | struct Path { | 
					
						
							|  |  |  |     Gfx::Path to_path(CSSPixelRect reference_box, Layout::Node const&) const; | 
					
						
							|  |  |  |     String to_string(SerializationMode) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool operator==(Path const&) const = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Gfx::WindingRule fill_rule; | 
					
						
							|  |  |  |     SVG::Path path_instructions; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // https://www.w3.org/TR/css-shapes-1/#basic-shape-functions
 | 
					
						
							|  |  |  | using BasicShape = Variant<Inset, Xywh, Rect, Circle, Ellipse, Polygon, Path>; | 
					
						
							| 
									
										
										
										
											2024-05-25 23:06:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class BasicShapeStyleValue : public StyleValueWithDefaultOperators<BasicShapeStyleValue> { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2025-04-15 15:18:27 -06:00
										 |  |  |     static ValueComparingNonnullRefPtr<BasicShapeStyleValue const> create(BasicShape basic_shape) | 
					
						
							| 
									
										
										
										
											2024-05-25 23:06:47 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         return adopt_ref(*new (nothrow) BasicShapeStyleValue(move(basic_shape))); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     virtual ~BasicShapeStyleValue() override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BasicShape const& basic_shape() const { return m_basic_shape; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-07 00:59:49 +01:00
										 |  |  |     virtual String to_string(SerializationMode) const override; | 
					
						
							| 
									
										
										
										
											2024-05-25 23:06:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool properties_equal(BasicShapeStyleValue const& other) const { return m_basic_shape == other.m_basic_shape; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-20 17:27:08 +02:00
										 |  |  |     Gfx::Path to_path(CSSPixelRect reference_box, Layout::Node const&) const; | 
					
						
							| 
									
										
										
										
											2024-05-25 23:06:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     BasicShapeStyleValue(BasicShape basic_shape) | 
					
						
							|  |  |  |         : StyleValueWithDefaultOperators(Type::BasicShape) | 
					
						
							|  |  |  |         , m_basic_shape(move(basic_shape)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     BasicShape m_basic_shape; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |