diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 179a536eb9..cec6ceb6d2 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -69,6 +69,7 @@ set(SOURCES CSS/StyleValues/BackgroundSizeStyleValue.cpp CSS/StyleValues/BackgroundStyleValue.cpp CSS/StyleValues/BorderRadiusShorthandStyleValue.cpp + CSS/StyleValues/BorderRadiusStyleValue.cpp CSS/StyleValues/BorderStyleValue.cpp CSS/Supports.cpp CSS/SyntaxHighlighter/SyntaxHighlighter.cpp diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 418f5428f0..c5c0b64109 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp b/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp index 0113ab2e97..82275d8583 100644 --- a/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp +++ b/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp index a8ab94605a..496e76ccc5 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp index 623138e425..a8e61df653 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -296,13 +297,6 @@ StyleValueList const& StyleValue::as_value_list() const return static_cast(*this); } -ErrorOr BorderRadiusStyleValue::to_string() const -{ - if (m_properties.horizontal_radius == m_properties.vertical_radius) - return m_properties.horizontal_radius.to_string(); - return String::formatted("{} / {}", TRY(m_properties.horizontal_radius.to_string()), TRY(m_properties.vertical_radius.to_string())); -} - void CalculatedStyleValue::CalculationResult::add(CalculationResult const& other, Layout::Node const* layout_node, PercentageBasis const& percentage_basis) { add_or_subtract_internal(SumOperation::Add, other, layout_node, percentage_basis); @@ -2158,7 +2152,7 @@ ValueComparingNonnullRefPtr LengthStyleValue::create(Length co return adopt_ref(*new LengthStyleValue(length)); } -static Optional absolutized_length(CSS::Length const& length, CSSPixelRect const& viewport_rect, Gfx::FontPixelMetrics const& font_metrics, CSSPixels font_size, CSSPixels root_font_size, CSSPixels line_height, CSSPixels root_line_height) +Optional absolutized_length(CSS::Length const& length, CSSPixelRect const& viewport_rect, Gfx::FontPixelMetrics const& font_metrics, CSSPixels font_size, CSSPixels root_font_size, CSSPixels line_height, CSSPixels root_line_height) { if (length.is_px()) return {}; @@ -2190,19 +2184,6 @@ ValueComparingNonnullRefPtr ShadowStyleValue::absolutized(CSSP return ShadowStyleValue::create(m_properties.color, absolutized_offset_x, absolutized_offset_y, absolutized_blur_radius, absolutized_spread_distance, m_properties.placement); } -ValueComparingNonnullRefPtr BorderRadiusStyleValue::absolutized(CSSPixelRect const& viewport_rect, Gfx::FontPixelMetrics const& font_metrics, CSSPixels font_size, CSSPixels root_font_size, CSSPixels line_height, CSSPixels root_line_height) const -{ - if (m_properties.horizontal_radius.is_percentage() && m_properties.vertical_radius.is_percentage()) - return *this; - auto absolutized_horizontal_radius = m_properties.horizontal_radius; - auto absolutized_vertical_radius = m_properties.vertical_radius; - if (!m_properties.horizontal_radius.is_percentage()) - absolutized_horizontal_radius = absolutized_length(m_properties.horizontal_radius.length(), viewport_rect, font_metrics, font_size, root_font_size, line_height, root_line_height).value_or(m_properties.horizontal_radius.length()); - if (!m_properties.vertical_radius.is_percentage()) - absolutized_vertical_radius = absolutized_length(m_properties.vertical_radius.length(), viewport_rect, font_metrics, font_size, root_font_size, line_height, root_line_height).value_or(m_properties.vertical_radius.length()); - return BorderRadiusStyleValue::create(absolutized_horizontal_radius, absolutized_vertical_radius); -} - bool CalculatedStyleValue::contains_percentage() const { return m_expression->contains_percentage(); diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValue.h index 030bd0a61d..3c0709408b 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.h @@ -267,6 +267,8 @@ private: using StyleValueVector = Vector>; +Optional absolutized_length(CSS::Length const&, CSSPixelRect const& viewport_rect, Gfx::FontPixelMetrics const&, CSSPixels font_size, CSSPixels root_font_size, CSSPixels line_height, CSSPixels root_line_height); + class StyleValue : public RefCounted { public: virtual ~StyleValue() = default; @@ -502,39 +504,6 @@ struct StyleValueWithDefaultOperators : public StyleValue { } }; -class BorderRadiusStyleValue final : public StyleValueWithDefaultOperators { -public: - static ValueComparingNonnullRefPtr create(LengthPercentage const& horizontal_radius, LengthPercentage const& vertical_radius) - { - return adopt_ref(*new BorderRadiusStyleValue(horizontal_radius, vertical_radius)); - } - virtual ~BorderRadiusStyleValue() override = default; - - LengthPercentage const& horizontal_radius() const { return m_properties.horizontal_radius; } - LengthPercentage const& vertical_radius() const { return m_properties.vertical_radius; } - bool is_elliptical() const { return m_properties.is_elliptical; } - - virtual ErrorOr to_string() const override; - - bool properties_equal(BorderRadiusStyleValue const& other) const { return m_properties == other.m_properties; } - -private: - BorderRadiusStyleValue(LengthPercentage const& horizontal_radius, LengthPercentage const& vertical_radius) - : StyleValueWithDefaultOperators(Type::BorderRadius) - , m_properties { .is_elliptical = horizontal_radius != vertical_radius, .horizontal_radius = horizontal_radius, .vertical_radius = vertical_radius } - { - } - - virtual ValueComparingNonnullRefPtr absolutized(CSSPixelRect const& viewport_rect, Gfx::FontPixelMetrics const& font_metrics, CSSPixels font_size, CSSPixels root_font_size, CSSPixels line_height, CSSPixels root_line_height) const override; - - struct Properties { - bool is_elliptical; - LengthPercentage horizontal_radius; - LengthPercentage vertical_radius; - bool operator==(Properties const&) const = default; - } m_properties; -}; - class CalculatedStyleValue : public StyleValue { public: enum class ResolvedType { diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/BorderRadiusShorthandStyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValues/BorderRadiusShorthandStyleValue.h index 9f82881262..504f455a0e 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValues/BorderRadiusShorthandStyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/BorderRadiusShorthandStyleValue.h @@ -10,6 +10,7 @@ #pragma once #include +#include namespace Web::CSS { diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/BorderRadiusStyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValues/BorderRadiusStyleValue.cpp new file mode 100644 index 0000000000..51ed3004a0 --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/BorderRadiusStyleValue.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018-2020, Andreas Kling + * Copyright (c) 2021, Tobias Christiansen + * Copyright (c) 2021-2023, Sam Atkins + * Copyright (c) 2022-2023, MacDue + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "BorderRadiusStyleValue.h" + +namespace Web::CSS { + +ErrorOr BorderRadiusStyleValue::to_string() const +{ + if (m_properties.horizontal_radius == m_properties.vertical_radius) + return m_properties.horizontal_radius.to_string(); + return String::formatted("{} / {}", TRY(m_properties.horizontal_radius.to_string()), TRY(m_properties.vertical_radius.to_string())); +} + +ValueComparingNonnullRefPtr BorderRadiusStyleValue::absolutized(CSSPixelRect const& viewport_rect, Gfx::FontPixelMetrics const& font_metrics, CSSPixels font_size, CSSPixels root_font_size, CSSPixels line_height, CSSPixels root_line_height) const +{ + if (m_properties.horizontal_radius.is_percentage() && m_properties.vertical_radius.is_percentage()) + return *this; + auto absolutized_horizontal_radius = m_properties.horizontal_radius; + auto absolutized_vertical_radius = m_properties.vertical_radius; + if (!m_properties.horizontal_radius.is_percentage()) + absolutized_horizontal_radius = absolutized_length(m_properties.horizontal_radius.length(), viewport_rect, font_metrics, font_size, root_font_size, line_height, root_line_height).value_or(m_properties.horizontal_radius.length()); + if (!m_properties.vertical_radius.is_percentage()) + absolutized_vertical_radius = absolutized_length(m_properties.vertical_radius.length(), viewport_rect, font_metrics, font_size, root_font_size, line_height, root_line_height).value_or(m_properties.vertical_radius.length()); + return BorderRadiusStyleValue::create(absolutized_horizontal_radius, absolutized_vertical_radius); +} + +} diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/BorderRadiusStyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValues/BorderRadiusStyleValue.h new file mode 100644 index 0000000000..f8474d23df --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/BorderRadiusStyleValue.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2020, Andreas Kling + * Copyright (c) 2021, Tobias Christiansen + * Copyright (c) 2021-2023, Sam Atkins + * Copyright (c) 2022-2023, MacDue + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::CSS { + +class BorderRadiusStyleValue final : public StyleValueWithDefaultOperators { +public: + static ValueComparingNonnullRefPtr create(LengthPercentage const& horizontal_radius, LengthPercentage const& vertical_radius) + { + return adopt_ref(*new BorderRadiusStyleValue(horizontal_radius, vertical_radius)); + } + virtual ~BorderRadiusStyleValue() override = default; + + LengthPercentage const& horizontal_radius() const { return m_properties.horizontal_radius; } + LengthPercentage const& vertical_radius() const { return m_properties.vertical_radius; } + bool is_elliptical() const { return m_properties.is_elliptical; } + + virtual ErrorOr to_string() const override; + + bool properties_equal(BorderRadiusStyleValue const& other) const { return m_properties == other.m_properties; } + +private: + BorderRadiusStyleValue(LengthPercentage const& horizontal_radius, LengthPercentage const& vertical_radius) + : StyleValueWithDefaultOperators(Type::BorderRadius) + , m_properties { .is_elliptical = horizontal_radius != vertical_radius, .horizontal_radius = horizontal_radius, .vertical_radius = vertical_radius } + { + } + + virtual ValueComparingNonnullRefPtr absolutized(CSSPixelRect const& viewport_rect, Gfx::FontPixelMetrics const& font_metrics, CSSPixels font_size, CSSPixels root_font_size, CSSPixels line_height, CSSPixels root_line_height) const override; + + struct Properties { + bool is_elliptical; + LengthPercentage horizontal_radius; + LengthPercentage vertical_radius; + bool operator==(Properties const&) const = default; + } m_properties; +}; + +} diff --git a/Userland/Libraries/LibWeb/Layout/Node.cpp b/Userland/Libraries/LibWeb/Layout/Node.cpp index 94ef74876a..7fc6b5d781 100644 --- a/Userland/Libraries/LibWeb/Layout/Node.cpp +++ b/Userland/Libraries/LibWeb/Layout/Node.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include