Serenity Operating System
1/*
2 * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibWeb/CSS/Length.h>
8#include <LibWeb/CSS/Size.h>
9#include <LibWeb/CSS/StyleValue.h>
10
11namespace Web::CSS {
12
13Size::Size(Type type, LengthPercentage length_percentage)
14 : m_type(type)
15 , m_length_percentage(move(length_percentage))
16{
17}
18
19CSS::Length Size::resolved(Layout::Node const& node, Length const& reference_value) const
20{
21 return m_length_percentage.resolved(node, reference_value);
22}
23
24Size Size::make_auto()
25{
26 return Size { Type::Auto, Length::make_auto() };
27}
28
29Size Size::make_px(CSSPixels px)
30{
31 return make_length(CSS::Length::make_px(px));
32}
33
34Size Size::make_length(Length length)
35{
36 return Size { Type::Length, move(length) };
37}
38
39Size Size::make_percentage(Percentage percentage)
40{
41 return Size { Type::Percentage, move(percentage) };
42}
43
44Size Size::make_min_content()
45{
46 return Size { Type::MinContent, Length::make_auto() };
47}
48
49Size Size::make_max_content()
50{
51 return Size { Type::MaxContent, Length::make_auto() };
52}
53
54Size Size::make_fit_content(Length available_space)
55{
56 return Size { Type::FitContent, move(available_space) };
57}
58
59Size Size::make_none()
60{
61 return Size { Type::None, Length::make_auto() };
62}
63
64bool Size::contains_percentage() const
65{
66 switch (m_type) {
67 case Type::Auto:
68 case Type::MinContent:
69 case Type::MaxContent:
70 case Type::None:
71 return false;
72 default:
73 return m_length_percentage.contains_percentage();
74 }
75}
76
77ErrorOr<String> Size::to_string() const
78{
79 switch (m_type) {
80 case Type::Auto:
81 return "auto"_string;
82 case Type::Length:
83 case Type::Percentage:
84 return m_length_percentage.to_string();
85 case Type::MinContent:
86 return "min-content"_string;
87 case Type::MaxContent:
88 return "max-content"_string;
89 case Type::FitContent:
90 return String::formatted("fit-content({})", TRY(m_length_percentage.to_string()));
91 case Type::None:
92 return "none"_string;
93 }
94 VERIFY_NOT_REACHED();
95}
96
97}