From 5cf85d30aac6f039351b44acc3aab522b61ae9ff Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Tue, 7 Nov 2023 12:11:04 +0000 Subject: [PATCH] LibWeb: Store RadialGradientStyleValue's position as PositionStyleValue --- .../LibWeb/CSS/Parser/GradientParsing.cpp | 14 +++++++++----- .../CSS/StyleValues/RadialGradientStyleValue.cpp | 9 ++++----- .../CSS/StyleValues/RadialGradientStyleValue.h | 11 +++++------ .../Libraries/LibWeb/Painting/GradientPainting.cpp | 1 + 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/GradientParsing.cpp b/Userland/Libraries/LibWeb/CSS/Parser/GradientParsing.cpp index 0539e3fa26..c72f7f38f8 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/GradientParsing.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/GradientParsing.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include namespace Web::CSS::Parser { @@ -403,7 +404,7 @@ RefPtr Parser::parse_radial_gradient_function(ComponentValue const& Size size = Extent::FarthestCorner; EndingShape ending_shape = EndingShape::Circle; - PositionValue at_position = PositionValue::center(); + RefPtr at_position; auto parse_ending_shape = [&]() -> Optional { auto transaction = tokens.begin_transaction(); @@ -495,10 +496,10 @@ RefPtr Parser::parse_radial_gradient_function(ComponentValue const& auto& token = tokens.peek_token(); if (token.is(Token::Type::Ident) && token.token().ident().equals_ignoring_ascii_case("at"sv)) { (void)tokens.next_token(); - auto position = parse_position(tokens); - if (!position.has_value()) + auto position = parse_position_value(tokens); + if (!position) return nullptr; - at_position = *position; + at_position = position; expect_comma = true; } @@ -513,7 +514,10 @@ RefPtr Parser::parse_radial_gradient_function(ComponentValue const& if (!color_stops.has_value()) return nullptr; - return RadialGradientStyleValue::create(ending_shape, size, at_position, move(*color_stops), repeating_gradient); + if (!at_position) + at_position = PositionStyleValue::create_center(); + + return RadialGradientStyleValue::create(ending_shape, size, at_position.release_nonnull(), move(*color_stops), repeating_gradient); } } diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/RadialGradientStyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValues/RadialGradientStyleValue.cpp index 7982913c76..94dcc17942 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValues/RadialGradientStyleValue.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/RadialGradientStyleValue.cpp @@ -8,6 +8,7 @@ */ #include "RadialGradientStyleValue.h" +#include #include namespace Web::CSS { @@ -44,10 +45,8 @@ String RadialGradientStyleValue::to_string() const builder.appendff("{} {}", ellipse_size.radius_a.to_string(), ellipse_size.radius_b.to_string()); }); - if (m_properties.position != PositionValue::center()) { - builder.appendff(" at "sv); - m_properties.position.serialize(builder); - } + if (!m_properties.position->is_center()) + builder.appendff(" at {}"sv, m_properties.position->to_string()); builder.append(", "sv); serialize_color_stop_list(builder, m_properties.color_stop_list); @@ -189,7 +188,7 @@ CSSPixelSize RadialGradientStyleValue::resolve_size(Layout::Node const& node, CS void RadialGradientStyleValue::resolve_for_size(Layout::NodeWithStyleAndBoxModelMetrics const& node, CSSPixelSize paint_size) const { CSSPixelRect gradient_box { { 0, 0 }, paint_size }; - auto center = m_properties.position.resolved(node, gradient_box); + auto center = m_properties.position->resolved(node, gradient_box); auto gradient_size = resolve_size(node, center, gradient_box); if (m_resolved.has_value() && m_resolved->gradient_size == gradient_size) return; diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/RadialGradientStyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValues/RadialGradientStyleValue.h index f33e6ca701..2f8c6bd795 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValues/RadialGradientStyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/RadialGradientStyleValue.h @@ -11,7 +11,6 @@ #include #include -#include #include #include @@ -44,10 +43,10 @@ public: using Size = Variant; - static ValueComparingNonnullRefPtr create(EndingShape ending_shape, Size size, PositionValue position, Vector color_stop_list, GradientRepeating repeating) + static ValueComparingNonnullRefPtr create(EndingShape ending_shape, Size size, ValueComparingNonnullRefPtr position, Vector color_stop_list, GradientRepeating repeating) { VERIFY(color_stop_list.size() >= 2); - return adopt_ref(*new (nothrow) RadialGradientStyleValue(ending_shape, size, position, move(color_stop_list), repeating)); + return adopt_ref(*new (nothrow) RadialGradientStyleValue(ending_shape, size, move(position), move(color_stop_list), repeating)); } virtual String to_string() const override; @@ -72,16 +71,16 @@ public: virtual ~RadialGradientStyleValue() override = default; private: - RadialGradientStyleValue(EndingShape ending_shape, Size size, PositionValue position, Vector color_stop_list, GradientRepeating repeating) + RadialGradientStyleValue(EndingShape ending_shape, Size size, ValueComparingNonnullRefPtr position, Vector color_stop_list, GradientRepeating repeating) : AbstractImageStyleValue(Type::RadialGradient) - , m_properties { .ending_shape = ending_shape, .size = size, .position = position, .color_stop_list = move(color_stop_list), .repeating = repeating } + , m_properties { .ending_shape = ending_shape, .size = size, .position = move(position), .color_stop_list = move(color_stop_list), .repeating = repeating } { } struct Properties { EndingShape ending_shape; Size size; - PositionValue position; + ValueComparingNonnullRefPtr position; Vector color_stop_list; GradientRepeating repeating; bool operator==(Properties const&) const = default; diff --git a/Userland/Libraries/LibWeb/Painting/GradientPainting.cpp b/Userland/Libraries/LibWeb/Painting/GradientPainting.cpp index 5c4ec7afcb..df50a8262b 100644 --- a/Userland/Libraries/LibWeb/Painting/GradientPainting.cpp +++ b/Userland/Libraries/LibWeb/Painting/GradientPainting.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include