LibWeb: Don't fill or stroke SVG <path> with transparent color

Before this, we were filling and stroking every <path>, whether they had
a fill/stroke color or not. We can avoid a bunch of unnecessary work by
checking if the color is transparent (also the case if unset) before
doing the painting work.

If there is no fill color, we also avoid making a copy of the path to
ensure that it's closed.
This commit is contained in:
Andreas Kling 2022-02-09 13:18:05 +01:00
parent 7676b1b925
commit 0ba2a3ff30

View file

@ -29,27 +29,32 @@ void SVGPathBox::paint(PaintContext& context, PaintPhase phase)
auto& path_element = dom_node();
auto& path = path_element.get_path();
// We need to fill the path before applying the stroke, however the filled
// path must be closed, whereas the stroke path may not necessary be closed.
// Copy the path and close it for filling, but use the previous path for stroke
auto closed_path = path;
closed_path.close();
// Fills are computed as though all paths are closed (https://svgwg.org/svg2-draft/painting.html#FillProperties)
Gfx::AntiAliasingPainter painter { context.painter() };
auto& svg_context = context.svg_context();
auto offset = absolute_position();
painter.translate(offset);
painter.fill_path(
closed_path,
path_element.fill_color().value_or(svg_context.fill_color()),
Gfx::Painter::WindingRule::EvenOdd);
painter.stroke_path(
path,
path_element.stroke_color().value_or(svg_context.stroke_color()),
path_element.stroke_width().value_or(svg_context.stroke_width()));
if (auto fill_color = path_element.fill_color().value_or(svg_context.fill_color()); fill_color.alpha() > 0) {
// We need to fill the path before applying the stroke, however the filled
// path must be closed, whereas the stroke path may not necessary be closed.
// Copy the path and close it for filling, but use the previous path for stroke
auto closed_path = path;
closed_path.close();
// Fills are computed as though all paths are closed (https://svgwg.org/svg2-draft/painting.html#FillProperties)
painter.fill_path(
closed_path,
fill_color,
Gfx::Painter::WindingRule::EvenOdd);
}
if (auto stroke_color = path_element.stroke_color().value_or(svg_context.stroke_color()); stroke_color.alpha() > 0) {
painter.stroke_path(
path,
stroke_color,
path_element.stroke_width().value_or(svg_context.stroke_width()));
}
painter.translate(-offset);
}