From bd16648b71dd3c238ebaa1c4acb41033b6566462 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Wed, 19 Jun 2024 03:41:36 +0300 Subject: [PATCH] LibWeb: Support bitmap scaling mode in Skia painter Co-authored-by: Andreas Kling --- .../LibWeb/Painting/CommandExecutorSkia.cpp | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWeb/Painting/CommandExecutorSkia.cpp b/Userland/Libraries/LibWeb/Painting/CommandExecutorSkia.cpp index 77fe9b1eb8d..ce2e435f369 100644 --- a/Userland/Libraries/LibWeb/Painting/CommandExecutorSkia.cpp +++ b/Userland/Libraries/LibWeb/Painting/CommandExecutorSkia.cpp @@ -158,6 +158,21 @@ static SkMatrix to_skia_matrix(Gfx::AffineTransform const& affine_transform) return matrix; } +static SkSamplingOptions to_skia_sampling_options(Gfx::ScalingMode scaling_mode) +{ + switch (scaling_mode) { + case Gfx::ScalingMode::NearestNeighbor: + return SkSamplingOptions(SkFilterMode::kNearest); + case Gfx::ScalingMode::BilinearBlend: + case Gfx::ScalingMode::SmoothPixels: + return SkSamplingOptions(SkFilterMode::kLinear); + case Gfx::ScalingMode::BoxSampling: + return SkSamplingOptions(SkCubicResampler::Mitchell()); + default: + VERIFY_NOT_REACHED(); + } +} + #define APPLY_PATH_CLIP_IF_NEEDED \ ScopeGuard restore_path_clip { [&] { \ if (command.clip_paths.size() > 0) \ @@ -244,8 +259,7 @@ CommandResult CommandExecutorSkia::draw_scaled_bitmap(DrawScaledBitmap const& co auto image = SkImages::RasterFromBitmap(bitmap); auto& canvas = surface().canvas(); SkPaint paint; - // FIXME: Account for scaling_mode - canvas.drawImageRect(image, src_rect, dst_rect, SkSamplingOptions(), &paint, SkCanvas::kStrict_SrcRectConstraint); + canvas.drawImageRect(image, src_rect, dst_rect, to_skia_sampling_options(command.scaling_mode), &paint, SkCanvas::kStrict_SrcRectConstraint); return CommandResult::Continue; } @@ -259,8 +273,7 @@ CommandResult CommandExecutorSkia::draw_scaled_immutable_bitmap(DrawScaledImmuta auto image = SkImages::RasterFromBitmap(bitmap); auto& canvas = surface().canvas(); SkPaint paint; - // FIXME: Account for scaling_mode - canvas.drawImageRect(image, src_rect, dst_rect, SkSamplingOptions(), &paint, SkCanvas::kStrict_SrcRectConstraint); + canvas.drawImageRect(image, src_rect, dst_rect, to_skia_sampling_options(command.scaling_mode), &paint, SkCanvas::kStrict_SrcRectConstraint); return CommandResult::Continue; }