mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-09-02 15:46:33 +00:00
LibWeb/SVG: Implement resolution for a subset of SVG filters
This commit is contained in:
parent
5d85959f5f
commit
635adc8aa7
Notes:
github-actions[bot]
2025-07-09 17:08:27 +00:00
Author: https://github.com/ananas-dev
Commit: 635adc8aa7
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/5028
Reviewed-by: https://github.com/gmta ✅
10 changed files with 161 additions and 17 deletions
|
@ -28,7 +28,7 @@ public:
|
|||
bool has_filters() const { return m_filter_value_list; }
|
||||
bool is_none() const { return !has_filters(); }
|
||||
|
||||
ReadonlySpan<FilterFunction> filters() const
|
||||
ReadonlySpan<FilterValue> filters() const
|
||||
{
|
||||
VERIFY(has_filters());
|
||||
return m_filter_value_list->filter_value_list().span();
|
||||
|
|
|
@ -5049,11 +5049,11 @@ RefPtr<CSSStyleValue const> Parser::parse_filter_value_list_value(TokenStream<Co
|
|||
return {};
|
||||
};
|
||||
|
||||
auto parse_filter_function = [&](auto filter_token, auto const& function_values) -> Optional<FilterFunction> {
|
||||
auto parse_filter_function = [&](auto filter_token, auto const& function_values) -> Optional<FilterValue> {
|
||||
TokenStream tokens { function_values };
|
||||
tokens.discard_whitespace();
|
||||
|
||||
auto if_no_more_tokens_return = [&](auto filter) -> Optional<FilterFunction> {
|
||||
auto if_no_more_tokens_return = [&](auto filter) -> Optional<FilterValue> {
|
||||
tokens.discard_whitespace();
|
||||
if (tokens.has_next_token())
|
||||
return {};
|
||||
|
@ -5149,12 +5149,19 @@ RefPtr<CSSStyleValue const> Parser::parse_filter_value_list_value(TokenStream<Co
|
|||
}
|
||||
};
|
||||
|
||||
Vector<FilterFunction> filter_value_list {};
|
||||
Vector<FilterValue> filter_value_list {};
|
||||
|
||||
while (tokens.has_next_token()) {
|
||||
tokens.discard_whitespace();
|
||||
if (!tokens.has_next_token())
|
||||
break;
|
||||
|
||||
auto url_function = parse_url_function(tokens);
|
||||
if (url_function.has_value()) {
|
||||
filter_value_list.append(*url_function);
|
||||
continue;
|
||||
}
|
||||
|
||||
auto& token = tokens.consume_a_token();
|
||||
if (!token.is_function())
|
||||
return nullptr;
|
||||
|
|
|
@ -98,6 +98,9 @@ String FilterValueListStyleValue::to_string(SerializationMode) const
|
|||
}());
|
||||
|
||||
builder.append(color.amount.to_string());
|
||||
},
|
||||
[&](CSS::URL const& url) {
|
||||
builder.append(url.to_string());
|
||||
});
|
||||
builder.append(')');
|
||||
first = false;
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <LibWeb/CSS/Length.h>
|
||||
#include <LibWeb/CSS/Number.h>
|
||||
#include <LibWeb/CSS/PercentageOr.h>
|
||||
#include <LibWeb/CSS/URL.h>
|
||||
|
||||
namespace Web::CSS {
|
||||
|
||||
|
@ -53,18 +54,18 @@ struct Color {
|
|||
|
||||
};
|
||||
|
||||
using FilterFunction = Variant<FilterOperation::Blur, FilterOperation::DropShadow, FilterOperation::HueRotate, FilterOperation::Color>;
|
||||
using FilterValue = Variant<FilterOperation::Blur, FilterOperation::DropShadow, FilterOperation::HueRotate, FilterOperation::Color, URL>;
|
||||
|
||||
class FilterValueListStyleValue final : public StyleValueWithDefaultOperators<FilterValueListStyleValue> {
|
||||
public:
|
||||
static ValueComparingNonnullRefPtr<FilterValueListStyleValue const> create(
|
||||
Vector<FilterFunction> filter_value_list)
|
||||
Vector<FilterValue> filter_value_list)
|
||||
{
|
||||
VERIFY(filter_value_list.size() >= 1);
|
||||
return adopt_ref(*new (nothrow) FilterValueListStyleValue(move(filter_value_list)));
|
||||
}
|
||||
|
||||
Vector<FilterFunction> const& filter_value_list() const { return m_filter_value_list; }
|
||||
Vector<FilterValue> const& filter_value_list() const { return m_filter_value_list; }
|
||||
|
||||
virtual String to_string(SerializationMode) const override;
|
||||
|
||||
|
@ -73,14 +74,14 @@ public:
|
|||
bool properties_equal(FilterValueListStyleValue const& other) const { return m_filter_value_list == other.m_filter_value_list; }
|
||||
|
||||
private:
|
||||
FilterValueListStyleValue(Vector<FilterFunction> filter_value_list)
|
||||
FilterValueListStyleValue(Vector<FilterValue> filter_value_list)
|
||||
: StyleValueWithDefaultOperators(Type::FilterValueList)
|
||||
, m_filter_value_list(move(filter_value_list))
|
||||
{
|
||||
}
|
||||
|
||||
// FIXME: No support for SVG filters yet
|
||||
Vector<FilterFunction> m_filter_value_list;
|
||||
Vector<FilterValue> m_filter_value_list;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue