mirror of
https://github.com/SerenityOS/serenity.git
synced 2025-01-24 18:32:28 -05:00
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:
parent
7676b1b925
commit
0ba2a3ff30
1 changed files with 20 additions and 15 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue