mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-28 13:18:19 +00:00
LibWeb: Simplify SVGFilterElement::gfx_filter()
No functional changes.
This commit is contained in:
parent
400a36aac1
commit
3d613a2ac4
Notes:
github-actions[bot]
2025-08-06 13:01:46 +00:00
Author: https://github.com/gmta
Commit: 3d613a2ac4
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/5739
Reviewed-by: https://github.com/tcl3 ✅
1 changed files with 20 additions and 34 deletions
|
@ -79,6 +79,12 @@ Optional<Gfx::Filter> SVGFilterElement::gfx_filter()
|
||||||
HashMap<String, Gfx::Filter> result_map;
|
HashMap<String, Gfx::Filter> result_map;
|
||||||
Optional<Gfx::Filter> root_filter;
|
Optional<Gfx::Filter> root_filter;
|
||||||
|
|
||||||
|
auto update_result_map = [&](auto& filter_primitive) {
|
||||||
|
auto result = filter_primitive.result()->base_val();
|
||||||
|
if (!result.is_empty())
|
||||||
|
result_map.set(result, *root_filter);
|
||||||
|
};
|
||||||
|
|
||||||
// https://www.w3.org/TR/filter-effects-1/#element-attrdef-filter-primitive-in
|
// https://www.w3.org/TR/filter-effects-1/#element-attrdef-filter-primitive-in
|
||||||
auto resolve_input_filter = [&](String const& name) -> Optional<Gfx::Filter> {
|
auto resolve_input_filter = [&](String const& name) -> Optional<Gfx::Filter> {
|
||||||
// TODO: Add missing ones.
|
// TODO: Add missing ones.
|
||||||
|
@ -94,10 +100,9 @@ Optional<Gfx::Filter> SVGFilterElement::gfx_filter()
|
||||||
return Gfx::Filter::color_matrix(matrix);
|
return Gfx::Filter::color_matrix(matrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto filter_from_map = result_map.get(name).copy();
|
auto filter_from_map = result_map.get(name);
|
||||||
|
|
||||||
if (filter_from_map.has_value())
|
if (filter_from_map.has_value())
|
||||||
return filter_from_map;
|
return filter_from_map.value();
|
||||||
|
|
||||||
return root_filter;
|
return root_filter;
|
||||||
};
|
};
|
||||||
|
@ -106,45 +111,26 @@ Optional<Gfx::Filter> SVGFilterElement::gfx_filter()
|
||||||
if (is<DOM::Text>(node))
|
if (is<DOM::Text>(node))
|
||||||
return IterationDecision::Continue;
|
return IterationDecision::Continue;
|
||||||
|
|
||||||
if (is<SVGFEFloodElement>(node)) {
|
if (auto* flood_primitive = as_if<SVGFEFloodElement>(node)) {
|
||||||
auto& flood_primitive = static_cast<SVGFEFloodElement&>(node);
|
root_filter = Gfx::Filter::flood(flood_primitive->flood_color(), flood_primitive->flood_opacity());
|
||||||
|
update_result_map(*flood_primitive);
|
||||||
root_filter = Gfx::Filter::flood(flood_primitive.flood_color(), flood_primitive.flood_opacity());
|
} else if (auto* blend_primitive = as_if<SVGFEBlendElement>(node)) {
|
||||||
|
auto foreground = resolve_input_filter(blend_primitive->in1()->base_val());
|
||||||
auto result = flood_primitive.result()->base_val();
|
auto background = resolve_input_filter(blend_primitive->in2()->base_val());
|
||||||
if (!result.is_empty()) {
|
|
||||||
result_map.set(result, *root_filter);
|
|
||||||
}
|
|
||||||
} else if (is<SVGFEBlendElement>(node)) {
|
|
||||||
auto& blend_primitive = static_cast<SVGFEBlendElement&>(node);
|
|
||||||
|
|
||||||
auto foreground = resolve_input_filter(blend_primitive.in1()->base_val());
|
|
||||||
|
|
||||||
auto background = resolve_input_filter(blend_primitive.in2()->base_val());
|
|
||||||
|
|
||||||
// FIXME: Actually resolve the blend mode
|
// FIXME: Actually resolve the blend mode
|
||||||
auto blend_mode = Gfx::CompositingAndBlendingOperator::Normal;
|
auto blend_mode = Gfx::CompositingAndBlendingOperator::Normal;
|
||||||
|
|
||||||
root_filter = Gfx::Filter::blend(background, foreground, blend_mode);
|
root_filter = Gfx::Filter::blend(background, foreground, blend_mode);
|
||||||
|
update_result_map(*blend_primitive);
|
||||||
|
} else if (auto* blur_primitive = as_if<SVGFEGaussianBlurElement>(node)) {
|
||||||
|
auto input = resolve_input_filter(blur_primitive->in1()->base_val());
|
||||||
|
|
||||||
auto result = blend_primitive.result()->base_val();
|
auto radius_x = blur_primitive->std_deviation_x()->base_val();
|
||||||
if (!result.is_empty()) {
|
auto radius_y = blur_primitive->std_deviation_y()->base_val();
|
||||||
result_map.set(result, *root_filter);
|
|
||||||
}
|
|
||||||
} else if (is<SVGFEGaussianBlurElement>(node)) {
|
|
||||||
auto& blur_primitive = static_cast<SVGFEGaussianBlurElement&>(node);
|
|
||||||
|
|
||||||
auto input = resolve_input_filter(blur_primitive.in1()->base_val());
|
|
||||||
|
|
||||||
auto radius_x = blur_primitive.std_deviation_x()->base_val();
|
|
||||||
auto radius_y = blur_primitive.std_deviation_y()->base_val();
|
|
||||||
|
|
||||||
root_filter = Gfx::Filter::blur(radius_x, radius_y, input);
|
root_filter = Gfx::Filter::blur(radius_x, radius_y, input);
|
||||||
|
update_result_map(*blur_primitive);
|
||||||
auto result = blur_primitive.result()->base_val();
|
|
||||||
if (!result.is_empty()) {
|
|
||||||
result_map.set(result, *root_filter);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
dbgln("SVGFilterElement::gfx_filter(): Unknown or unsupported filter element '{}'", node.debug_description());
|
dbgln("SVGFilterElement::gfx_filter(): Unknown or unsupported filter element '{}'", node.debug_description());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue