diff options
Diffstat (limited to 'Userland/Libraries')
-rw-r--r-- | Userland/Libraries/LibWeb/Painting/BackgroundPainting.cpp | 45 |
1 files changed, 3 insertions, 42 deletions
diff --git a/Userland/Libraries/LibWeb/Painting/BackgroundPainting.cpp b/Userland/Libraries/LibWeb/Painting/BackgroundPainting.cpp index 9d4b1791c5..1d664748f4 100644 --- a/Userland/Libraries/LibWeb/Painting/BackgroundPainting.cpp +++ b/Userland/Libraries/LibWeb/Painting/BackgroundPainting.cpp @@ -12,47 +12,11 @@ #include <LibWeb/Layout/Node.h> #include <LibWeb/Painting/BackgroundPainting.h> #include <LibWeb/Painting/BorderRadiusCornerClipper.h> +#include <LibWeb/Painting/GradientPainting.h> #include <LibWeb/Painting/PaintContext.h> namespace Web::Painting { -struct GfxGradient { - Gfx::Orientation orientation; - Gfx::Color color_a; - Gfx::Color color_b; -}; - -static Optional<GfxGradient> linear_gradient_to_gfx_gradient(CSS::LinearGradientStyleValue const& linear_gradient, Gfx::FloatRect const& background_rect) -{ - if (linear_gradient.color_stop_list().size() != 2) - return {}; - - auto angle = round_to<int>(linear_gradient.angle_degrees(background_rect)); - auto color_a = linear_gradient.color_stop_list()[0].color_stop.color; - auto color_b = linear_gradient.color_stop_list()[1].color_stop.color; - auto orientation = [&]() -> Optional<Gfx::Orientation> { - switch (angle) { - case 0: - swap(color_a, color_b); - [[fallthrough]]; - case 180: - return Gfx::Orientation::Vertical; - case 270: - swap(color_a, color_b); - [[fallthrough]]; - case 90: - return Gfx::Orientation::Horizontal; - default: - return {}; - } - }(); - - if (!orientation.has_value()) - return {}; - - return GfxGradient { *orientation, color_a, color_b }; -}; - // https://www.w3.org/TR/css-backgrounds-3/#backgrounds void paint_background(PaintContext& context, Layout::NodeWithStyleAndBoxModelMetrics const& layout_node, Gfx::FloatRect const& border_rect, Color background_color, Vector<CSS::BackgroundLayerData> const* background_layers, BorderRadiiData const& border_radii) { @@ -134,13 +98,10 @@ void paint_background(PaintContext& context, Layout::NodeWithStyleAndBoxModelMet ScopedCornerRadiusClip corner_clip { painter, clip_rect, clip_box.radii }; if (layer.background_image->is_linear_gradient()) { - // FIXME: Paint non-orthogonal gradients, gradients with > 2 color stops, gradients with custom stop positions ... // FIXME: Support sizing and positioning rules with gradients. auto& linear_gradient = layer.background_image->as_linear_gradient(); - auto gfx_gradient = linear_gradient_to_gfx_gradient(linear_gradient, border_box.rect); - if (gfx_gradient.has_value()) { - painter.fill_rect_with_gradient(gfx_gradient->orientation, border_box.rect.to_rounded<int>(), gfx_gradient->color_a, gfx_gradient->color_b); - } + auto data = resolve_linear_gradient_data(layout_node, border_box.rect, linear_gradient); + paint_linear_gradient(context, border_box.rect.to_rounded<int>(), data); continue; } |