From d8a73a8165a89920b99e25a00152a6f49da93eee Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 27 Feb 2025 19:23:27 +0000 Subject: [PATCH] LibWeb/Painting: Paint triangle waves using Skia This has been left unimplemented since we switched to the Skia renderer. Now `text-decoration-style: wavy` actually paints a wavy line. :^) We had a text-decoration test, but it only checked `solid` lines, so I've replaced it with a modified version of the old test page from Serenity, without the blink option, and with some thickness parameters. I did experiment with using a `SkPath1DPathEffect` to make it repeat the pattern for us, but I couldn't make it look good at all. --- .../LibWeb/Painting/DisplayListPlayerSkia.cpp | 71 +++++++++++++++++- .../Screenshot/images/text-decorations.png | Bin 1905 -> 15304 bytes .../Screenshot/input/text-decorations.html | 40 +++------- 3 files changed, 81 insertions(+), 30 deletions(-) diff --git a/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp b/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp index 8ace0745655..454820051bf 100644 --- a/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp +++ b/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp @@ -816,8 +816,77 @@ void DisplayListPlayerSkia::paint_conic_gradient(PaintConicGradient const& comma surface().canvas().drawRect(to_skia_rect(rect), paint); } -void DisplayListPlayerSkia::draw_triangle_wave(DrawTriangleWave const&) +void DisplayListPlayerSkia::draw_triangle_wave(DrawTriangleWave const& command) { + // Skia treats zero thickness as a special case and will draw a hairline, while we want to draw nothing. + if (!command.thickness) + return; + + // FIXME: Support more than horizontal waves + if (command.p1.y() != command.p2.y()) { + dbgln("FIXME: Support more than horizontal waves"); + return; + } + + auto& canvas = surface().canvas(); + auto from = to_skia_point(command.p1); + auto to = to_skia_point(command.p2); + + SkPaint paint; + paint.setAntiAlias(true); + paint.setStyle(SkPaint::kStroke_Style); + paint.setStrokeWidth(command.thickness); + paint.setStrokeJoin(SkPaint::kRound_Join); + paint.setStrokeCap(SkPaint::kRound_Cap); + paint.setColor(to_skia_color(command.color)); + + SkPath path; + path.moveTo(from); + + float const wavelength = command.amplitude * 2.0f; + float const half_wavelength = command.amplitude; + float const quarter_wavelength = command.amplitude / 2.0f; + + auto position = from; + auto remaining = abs(to.x() - position.x()); + while (remaining > wavelength) { + // Draw a whole wave + path.lineTo(position.x() + quarter_wavelength, position.y() - quarter_wavelength); + path.lineTo(position.x() + quarter_wavelength + half_wavelength, position.y() + quarter_wavelength); + path.lineTo(position.x() + wavelength, position.y()); + position.offset(wavelength, 0); + remaining = abs(to.x() - position.x()); + } + + // Up + if (remaining > quarter_wavelength) { + path.lineTo(position.x() + quarter_wavelength, position.y() - quarter_wavelength); + position.offset(quarter_wavelength, 0); + remaining = abs(to.x() - position.x()); + } else if (remaining >= 1) { + auto fraction = remaining / quarter_wavelength; + path.lineTo(position.x() + (fraction * quarter_wavelength), position.y() - (fraction * quarter_wavelength)); + remaining = 0; + } + + // Down + if (remaining > half_wavelength) { + path.lineTo(position.x() + half_wavelength, position.y() + quarter_wavelength); + position.offset(half_wavelength, 0); + remaining = abs(to.x() - position.x()); + } else if (remaining >= 1) { + auto fraction = remaining / half_wavelength; + path.lineTo(position.x() + (fraction * half_wavelength), position.y() - quarter_wavelength + (fraction * half_wavelength)); + remaining = 0; + } + + // Back to middle + if (remaining >= 1) { + auto fraction = remaining / quarter_wavelength; + path.lineTo(position.x() + (fraction * quarter_wavelength), position.y() + ((1 - fraction) * quarter_wavelength)); + } + + canvas.drawPath(path, paint); } void DisplayListPlayerSkia::add_rounded_rect_clip(AddRoundedRectClip const& command) diff --git a/Tests/LibWeb/Screenshot/images/text-decorations.png b/Tests/LibWeb/Screenshot/images/text-decorations.png index a2b3b8ca565f9b28d2f2ff85c6e0fc237220c5d5..74bf0e3938f77443f91f4ebaed464c3f9d63d605 100644 GIT binary patch literal 15304 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 B9LfLy diff --git a/Tests/LibWeb/Screenshot/input/text-decorations.html b/Tests/LibWeb/Screenshot/input/text-decorations.html index d433239cb06..0ec0b414cfa 100644 --- a/Tests/LibWeb/Screenshot/input/text-decorations.html +++ b/Tests/LibWeb/Screenshot/input/text-decorations.html @@ -3,37 +3,19 @@ -

Hello

-

Hello

-

Hello

-

Hello

-

Hello

+

Overline

+

Underline

+

Wombling

+ +

This underline should match the text color

+

This should have an underline, overline and line-through, all in glorious magenta.