From 66c88b432fe2a4fe2086142a2b385d82a4ced2c9 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Wed, 17 Jul 2024 12:57:52 +0300 Subject: [PATCH] LibWeb: Join text clip paths before application in Skia painter Each item in clip_paths represents a glyph run, and applying them as a clip in intersection mode one by one results in an empty clip. Instead, now all clip paths are joined and applied as a clip together. This change fixes rendering of "background-clip: text" when an element has more than one glyph run. Fixed ref-test: Tests/LibWeb/Ref/css-background-clip-text.html --- .../LibWeb/Painting/DisplayListPlayerSkia.cpp | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Userland/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp b/Userland/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp index 8a30953df23..6507435ce1c 100644 --- a/Userland/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp +++ b/Userland/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp @@ -359,15 +359,17 @@ static SkSamplingOptions to_skia_sampling_options(Gfx::ScalingMode scaling_mode) } } -#define APPLY_PATH_CLIP_IF_NEEDED \ - ScopeGuard restore_path_clip { [&] { \ - if (command.clip_paths.size() > 0) \ - surface().canvas().restore(); \ - } }; \ - if (command.clip_paths.size() > 0) { \ - surface().canvas().save(); \ - for (auto const& path : command.clip_paths) \ - surface().canvas().clipPath(to_skia_path(path), true); \ +#define APPLY_PATH_CLIP_IF_NEEDED \ + ScopeGuard restore_path_clip { [&] { \ + if (command.clip_paths.size() > 0) \ + surface().canvas().restore(); \ + } }; \ + if (command.clip_paths.size() > 0) { \ + surface().canvas().save(); \ + SkPath clip_path; \ + for (auto const& path : command.clip_paths) \ + clip_path.addPath(to_skia_path(path)); \ + surface().canvas().clipPath(clip_path, true); \ } DisplayListPlayerSkia::SkiaSurface& DisplayListPlayerSkia::surface() const