From a9ea0ee9af2c3a4dfe738daca8855c8215d66982 Mon Sep 17 00:00:00 2001 From: MacDue Date: Sat, 17 Dec 2022 20:04:39 +0000 Subject: [PATCH] LibWeb: Fix passing size/position to paint_radial_gradient() This was wrong twice making it right... But let's fix that. The center was being passed as a DevicePixelPoint, but was in fact in CSS pixels, the size was passed as a Gfx::FloatSize but was in CSS pixels again. Then we were scaling from device pixels to CSS pixels when painting which does not need to be done if everything is passed which the correct scale factors already applied. --- Userland/Libraries/LibWeb/CSS/StyleValue.cpp | 4 +++- .../Libraries/LibWeb/Painting/GradientPainting.cpp | 10 +++++----- Userland/Libraries/LibWeb/Painting/GradientPainting.h | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp index 94d96c01a6..bf9e52ac8f 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp @@ -2178,7 +2178,9 @@ bool RadialGradientStyleValue::equals(StyleValue const& other) const void RadialGradientStyleValue::paint(PaintContext& context, Gfx::IntRect const& dest_rect, CSS::ImageRendering) const { VERIFY(m_resolved.has_value()); - Painting::paint_radial_gradient(context, dest_rect.to_type(), m_resolved->data, m_resolved->center.to_rounded(), m_resolved->gradient_size); + Painting::paint_radial_gradient(context, dest_rect.to_type(), m_resolved->data, + context.rounded_device_point(m_resolved->center.to_type()), + context.rounded_device_size(m_resolved->gradient_size.to_type())); } DeprecatedString ConicGradientStyleValue::to_deprecated_string() const diff --git a/Userland/Libraries/LibWeb/Painting/GradientPainting.cpp b/Userland/Libraries/LibWeb/Painting/GradientPainting.cpp index 2b13b36ccc..8443ded853 100644 --- a/Userland/Libraries/LibWeb/Painting/GradientPainting.cpp +++ b/Userland/Libraries/LibWeb/Painting/GradientPainting.cpp @@ -304,18 +304,18 @@ void paint_conic_gradient(PaintContext& context, DevicePixelRect const& gradient }); } -void paint_radial_gradient(PaintContext& context, DevicePixelRect const& gradient_rect, RadialGradientData const& data, DevicePixelPoint center, Gfx::FloatSize size) +void paint_radial_gradient(PaintContext& context, DevicePixelRect const& gradient_rect, RadialGradientData const& data, DevicePixelPoint center, DevicePixelSize size) { // A conservative guesstimate on how many colors we need to generate: auto max_dimension = max(gradient_rect.width(), gradient_rect.height()); - int max_visible_gradient = max(max_dimension.value() / 2, min(size.width(), max_dimension.value())); + auto max_visible_gradient = max(max_dimension / 2, min(size.width(), max_dimension.value())).value(); GradientLine gradient_line(max_visible_gradient, data.color_stops); auto center_point = Gfx::FloatPoint { center.to_type() }.translated(0.5, 0.5); gradient_line.paint_into_rect(context.painter(), gradient_rect, [&](DevicePixels x, DevicePixels y) { // FIXME: See if there's a more efficient calculation we do there :^) - auto point = context.scale_to_css_point({ x, y }).to_type() - center_point; - auto gradient_x = point.x() / size.width(); - auto gradient_y = point.y() / size.height(); + auto point = Gfx::FloatPoint(x.value(), y.value()) - center_point; + auto gradient_x = point.x() / size.width().value(); + auto gradient_y = point.y() / size.height().value(); return AK::sqrt(gradient_x * gradient_x + gradient_y * gradient_y) * max_visible_gradient; }); } diff --git a/Userland/Libraries/LibWeb/Painting/GradientPainting.h b/Userland/Libraries/LibWeb/Painting/GradientPainting.h index 056750af2b..7408505136 100644 --- a/Userland/Libraries/LibWeb/Painting/GradientPainting.h +++ b/Userland/Libraries/LibWeb/Painting/GradientPainting.h @@ -47,6 +47,6 @@ RadialGradientData resolve_radial_gradient_data(Layout::Node const&, CSSPixelSiz void paint_linear_gradient(PaintContext&, DevicePixelRect const&, LinearGradientData const&); void paint_conic_gradient(PaintContext&, DevicePixelRect const&, ConicGradientData const&, DevicePixelPoint position); -void paint_radial_gradient(PaintContext&, DevicePixelRect const&, RadialGradientData const&, DevicePixelPoint position, Gfx::FloatSize size); +void paint_radial_gradient(PaintContext&, DevicePixelRect const&, RadialGradientData const&, DevicePixelPoint position, DevicePixelSize size); }