1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 19:37:35 +00:00

LibWeb: Support repeating-radial-gradient()s

This commit is contained in:
MacDue 2022-12-02 19:20:25 +00:00 committed by Tim Flynn
parent f539bf467c
commit 28028be2fc
4 changed files with 17 additions and 5 deletions

View file

@ -2655,8 +2655,14 @@ RefPtr<StyleValue> Parser::parse_radial_gradient_function(ComponentValue const&
if (!component_value.is_function()) if (!component_value.is_function())
return {}; return {};
auto repeating_gradient = GradientRepeating::No;
auto function_name = component_value.function().name(); auto function_name = component_value.function().name();
function_name = consume_if_starts_with(function_name, "repeating-"sv, [&] {
repeating_gradient = GradientRepeating::Yes;
});
if (!function_name.equals_ignoring_case("radial-gradient"sv)) if (!function_name.equals_ignoring_case("radial-gradient"sv))
return {}; return {};
@ -2786,7 +2792,7 @@ RefPtr<StyleValue> Parser::parse_radial_gradient_function(ComponentValue const&
if (!color_stops.has_value()) if (!color_stops.has_value())
return {}; return {};
return RadialGradientStyleValue::create(ending_shape, size, at_position, move(*color_stops)); return RadialGradientStyleValue::create(ending_shape, size, at_position, move(*color_stops), repeating_gradient);
} }
Optional<PositionValue> Parser::parse_position(TokenStream<ComponentValue>& tokens, PositionValue initial_value) Optional<PositionValue> Parser::parse_position(TokenStream<ComponentValue>& tokens, PositionValue initial_value)

View file

@ -1984,6 +1984,8 @@ bool PositionValue::operator==(PositionValue const& other) const
String RadialGradientStyleValue::to_string() const String RadialGradientStyleValue::to_string() const
{ {
StringBuilder builder; StringBuilder builder;
if (is_repeating())
builder.append("repeating-"sv);
builder.appendff("radial-gradient({} "sv, builder.appendff("radial-gradient({} "sv,
m_ending_shape == EndingShape::Circle ? "circle"sv : "ellipse"sv); m_ending_shape == EndingShape::Circle ? "circle"sv : "ellipse"sv);

View file

@ -1232,10 +1232,10 @@ public:
using Size = Variant<Extent, CircleSize, EllipseSize>; using Size = Variant<Extent, CircleSize, EllipseSize>;
static NonnullRefPtr<RadialGradientStyleValue> create(EndingShape ending_shape, Size size, PositionValue position, Vector<LinearColorStopListElement> color_stop_list) static NonnullRefPtr<RadialGradientStyleValue> create(EndingShape ending_shape, Size size, PositionValue position, Vector<LinearColorStopListElement> color_stop_list, GradientRepeating repeating)
{ {
VERIFY(color_stop_list.size() >= 2); VERIFY(color_stop_list.size() >= 2);
return adopt_ref(*new RadialGradientStyleValue(ending_shape, size, position, move(color_stop_list))); return adopt_ref(*new RadialGradientStyleValue(ending_shape, size, position, move(color_stop_list), repeating));
} }
virtual String to_string() const override; virtual String to_string() const override;
@ -1255,15 +1255,18 @@ public:
Gfx::FloatSize resolve_size(Layout::Node const&, Gfx::FloatPoint, Gfx::FloatRect const&) const; Gfx::FloatSize resolve_size(Layout::Node const&, Gfx::FloatPoint, Gfx::FloatRect const&) const;
bool is_repeating() const { return m_repeating == GradientRepeating::Yes; }
virtual ~RadialGradientStyleValue() override = default; virtual ~RadialGradientStyleValue() override = default;
private: private:
RadialGradientStyleValue(EndingShape ending_shape, Size size, PositionValue position, Vector<LinearColorStopListElement> color_stop_list) RadialGradientStyleValue(EndingShape ending_shape, Size size, PositionValue position, Vector<LinearColorStopListElement> color_stop_list, GradientRepeating repeating)
: AbstractImageStyleValue(Type::RadialGradient) : AbstractImageStyleValue(Type::RadialGradient)
, m_ending_shape(ending_shape) , m_ending_shape(ending_shape)
, m_size(size) , m_size(size)
, m_position(position) , m_position(position)
, m_color_stop_list(move(color_stop_list)) , m_color_stop_list(move(color_stop_list))
, m_repeating(repeating)
{ {
} }
@ -1271,6 +1274,7 @@ private:
Size m_size; Size m_size;
PositionValue m_position; PositionValue m_position;
Vector<LinearColorStopListElement> m_color_stop_list; Vector<LinearColorStopListElement> m_color_stop_list;
GradientRepeating m_repeating;
struct ResolvedData { struct ResolvedData {
Painting::RadialGradientData data; Painting::RadialGradientData data;

View file

@ -163,7 +163,7 @@ RadialGradientData resolve_radial_gradient_data(Layout::Node const& node, Gfx::F
radial_gradient.color_stop_list(), [&](auto const& length_percentage) { radial_gradient.color_stop_list(), [&](auto const& length_percentage) {
return length_percentage.resolved(node, gradient_length).to_px(node) / gradient_size.width(); return length_percentage.resolved(node, gradient_length).to_px(node) / gradient_size.width();
}, },
false); radial_gradient.is_repeating());
return { resolved_color_stops }; return { resolved_color_stops };
} }