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
Notes: sideshowbarker 2024-07-17 03:46:45 +09:00
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())
return {};
auto repeating_gradient = GradientRepeating::No;
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))
return {};
@ -2786,7 +2792,7 @@ RefPtr<StyleValue> Parser::parse_radial_gradient_function(ComponentValue const&
if (!color_stops.has_value())
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)

View file

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

View file

@ -1232,10 +1232,10 @@ public:
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);
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;
@ -1255,15 +1255,18 @@ public:
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;
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)
, m_ending_shape(ending_shape)
, m_size(size)
, m_position(position)
, m_color_stop_list(move(color_stop_list))
, m_repeating(repeating)
{
}
@ -1271,6 +1274,7 @@ private:
Size m_size;
PositionValue m_position;
Vector<LinearColorStopListElement> m_color_stop_list;
GradientRepeating m_repeating;
struct ResolvedData {
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) {
return length_percentage.resolved(node, gradient_length).to_px(node) / gradient_size.width();
},
false);
radial_gradient.is_repeating());
return { resolved_color_stops };
}