| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2024-10-04 13:19:50 +02:00
										 |  |  |  * Copyright (c) 2022, Andreas Kling <andreas@ladybird.org> | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <LibWeb/CSS/Size.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Web::CSS { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Size::Size(Type type, LengthPercentage length_percentage) | 
					
						
							|  |  |  |     : m_type(type) | 
					
						
							|  |  |  |     , m_length_percentage(move(length_percentage)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-06 16:33:06 +02:00
										 |  |  | CSSPixels Size::to_px(Layout::Node const& node, CSSPixels reference_value) const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2024-01-07 01:09:09 +01:00
										 |  |  |     return m_length_percentage.resolved(node, reference_value).to_px(node); | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Size Size::make_auto() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return Size { Type::Auto, Length::make_auto() }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 14:43:24 +00:00
										 |  |  | Size Size::make_px(CSSPixels px) | 
					
						
							| 
									
										
										
										
											2022-09-25 19:09:08 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return make_length(CSS::Length::make_px(px)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | Size Size::make_length(Length length) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return Size { Type::Length, move(length) }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Size Size::make_percentage(Percentage percentage) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return Size { Type::Percentage, move(percentage) }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-18 17:27:47 +01:00
										 |  |  | Size Size::make_calculated(NonnullRefPtr<Web::CSS::CSSMathValue> calculated) | 
					
						
							| 
									
										
										
										
											2023-03-30 10:50:40 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return Size { Type::Calculated, move(calculated) }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | Size Size::make_min_content() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return Size { Type::MinContent, Length::make_auto() }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Size Size::make_max_content() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return Size { Type::MaxContent, Length::make_auto() }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Size Size::make_fit_content(Length available_space) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return Size { Type::FitContent, move(available_space) }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-26 18:58:06 +02:00
										 |  |  | Size Size::make_fit_content() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // NOTE: We use "auto" as a stand-in for "stretch" here.
 | 
					
						
							|  |  |  |     return Size { Type::FitContent, Length::make_auto() }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | Size Size::make_none() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return Size { Type::None, Length::make_auto() }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool Size::contains_percentage() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     switch (m_type) { | 
					
						
							|  |  |  |     case Type::Auto: | 
					
						
							|  |  |  |     case Type::MinContent: | 
					
						
							|  |  |  |     case Type::MaxContent: | 
					
						
							|  |  |  |     case Type::None: | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |         return m_length_percentage.contains_percentage(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-22 12:25:30 +01:00
										 |  |  | String Size::to_string() const | 
					
						
							| 
									
										
										
										
											2022-09-26 11:14:42 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     switch (m_type) { | 
					
						
							|  |  |  |     case Type::Auto: | 
					
						
							| 
									
										
										
										
											2023-02-25 16:40:37 +01:00
										 |  |  |         return "auto"_string; | 
					
						
							| 
									
										
										
										
											2023-03-30 10:50:40 +01:00
										 |  |  |     case Type::Calculated: | 
					
						
							| 
									
										
										
										
											2022-09-26 11:14:42 +02:00
										 |  |  |     case Type::Length: | 
					
						
							|  |  |  |     case Type::Percentage: | 
					
						
							| 
									
										
										
										
											2023-01-06 19:02:26 +01:00
										 |  |  |         return m_length_percentage.to_string(); | 
					
						
							| 
									
										
										
										
											2022-09-26 11:14:42 +02:00
										 |  |  |     case Type::MinContent: | 
					
						
							| 
									
										
										
										
											2023-02-25 16:40:37 +01:00
										 |  |  |         return "min-content"_string; | 
					
						
							| 
									
										
										
										
											2022-09-26 11:14:42 +02:00
										 |  |  |     case Type::MaxContent: | 
					
						
							| 
									
										
										
										
											2023-02-25 16:40:37 +01:00
										 |  |  |         return "max-content"_string; | 
					
						
							| 
									
										
										
										
											2022-09-26 11:14:42 +02:00
										 |  |  |     case Type::FitContent: | 
					
						
							| 
									
										
										
										
											2023-08-22 12:25:30 +01:00
										 |  |  |         return MUST(String::formatted("fit-content({})", m_length_percentage.to_string())); | 
					
						
							| 
									
										
										
										
											2022-09-26 11:14:42 +02:00
										 |  |  |     case Type::None: | 
					
						
							| 
									
										
										
										
											2023-02-25 16:40:37 +01:00
										 |  |  |         return "none"_string; | 
					
						
							| 
									
										
										
										
											2022-09-26 11:14:42 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |     VERIFY_NOT_REACHED(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | } |