| 
									
										
										
										
											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 { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-28 12:29:58 +01:00
										 |  |  | Size::Size(Type type, Optional<LengthPercentage> length_percentage) | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  |     : 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 | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2025-08-28 12:29:58 +01:00
										 |  |  |     if (!m_length_percentage.has_value()) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     return m_length_percentage->resolved(node, reference_value).to_px(node); | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Size Size::make_auto() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2025-08-28 12:29:58 +01:00
										 |  |  |     return Size { Type::Auto }; | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 14:43:24 +00:00
										 |  |  | Size Size::make_px(CSSPixels px) | 
					
						
							| 
									
										
										
										
											2022-09-25 19:09:08 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2025-08-28 12:29:58 +01:00
										 |  |  |     return make_length(Length::make_px(px)); | 
					
						
							| 
									
										
										
										
											2022-09-25 19:09:08 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-15 15:18:27 -06:00
										 |  |  | Size Size::make_calculated(NonnullRefPtr<CalculatedStyleValue const> calculated) | 
					
						
							| 
									
										
										
										
											2023-03-30 10:50:40 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return Size { Type::Calculated, move(calculated) }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-27 11:43:44 +01:00
										 |  |  | Size Size::make_length_percentage(LengthPercentage const& length_percentage) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (length_percentage.is_length()) | 
					
						
							|  |  |  |         return make_length(length_percentage.length()); | 
					
						
							|  |  |  |     if (length_percentage.is_percentage()) | 
					
						
							|  |  |  |         return make_percentage(length_percentage.percentage()); | 
					
						
							|  |  |  |     VERIFY(length_percentage.is_calculated()); | 
					
						
							|  |  |  |     return make_calculated(length_percentage.calculated()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | Size Size::make_min_content() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2025-08-28 12:29:58 +01:00
										 |  |  |     return Size { Type::MinContent }; | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Size Size::make_max_content() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2025-08-28 12:29:58 +01:00
										 |  |  |     return Size { Type::MaxContent }; | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-26 18:16:36 +01:00
										 |  |  | Size Size::make_fit_content(LengthPercentage available_space) | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return Size { Type::FitContent, move(available_space) }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-26 18:58:06 +02:00
										 |  |  | Size Size::make_fit_content() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2025-08-28 12:29:58 +01:00
										 |  |  |     return Size { Type::FitContent }; | 
					
						
							| 
									
										
										
										
											2023-05-26 18:58:06 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | Size Size::make_none() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2025-08-28 12:29:58 +01:00
										 |  |  |     return Size { Type::None }; | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool Size::contains_percentage() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     switch (m_type) { | 
					
						
							|  |  |  |     case Type::Auto: | 
					
						
							|  |  |  |     case Type::MinContent: | 
					
						
							|  |  |  |     case Type::MaxContent: | 
					
						
							|  |  |  |     case Type::None: | 
					
						
							|  |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2025-02-26 18:16:36 +01:00
										 |  |  |     case Type::FitContent: | 
					
						
							|  |  |  |         // FIXME: This should return m_length_percentage.contains_percentage()
 | 
					
						
							|  |  |  |         //        but we have to update a lot of code to handle this.
 | 
					
						
							|  |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  |     default: | 
					
						
							| 
									
										
										
										
											2025-08-28 12:29:58 +01:00
										 |  |  |         return m_length_percentage->contains_percentage(); | 
					
						
							| 
									
										
										
										
											2022-09-25 15:13:09 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-03 15:37:42 +12:00
										 |  |  | String Size::to_string(SerializationMode mode) 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: | 
					
						
							| 
									
										
										
										
											2025-08-28 12:29:58 +01:00
										 |  |  |         return m_length_percentage->to_string(mode); | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							| 
									
										
										
										
											2025-08-28 12:29:58 +01:00
										 |  |  |         if (!m_length_percentage.has_value()) | 
					
						
							|  |  |  |             return "fit-content"_string; | 
					
						
							|  |  |  |         return MUST(String::formatted("fit-content({})", m_length_percentage->to_string(mode))); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | } |