From 735829f6941eccb29a1b9b9c2880a1d44dff6bdb Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sun, 4 Apr 2021 18:04:38 -0400 Subject: [PATCH] LibWeb: Move painting of background images to common location For now, painting of background color is kept separate. The ICB needs to perform a "translate" call between painting the color and background, whereas other divs must not make that call. --- Userland/Libraries/LibWeb/Layout/Box.cpp | 46 +++++++++++-------- Userland/Libraries/LibWeb/Layout/Box.h | 2 + .../Layout/InitialContainingBlockBox.cpp | 27 +---------- 3 files changed, 32 insertions(+), 43 deletions(-) diff --git a/Userland/Libraries/LibWeb/Layout/Box.cpp b/Userland/Libraries/LibWeb/Layout/Box.cpp index eee05e81d7..7e45d6a793 100644 --- a/Userland/Libraries/LibWeb/Layout/Box.cpp +++ b/Userland/Libraries/LibWeb/Layout/Box.cpp @@ -48,25 +48,9 @@ void Box::paint(PaintContext& context, PaintPhase phase) if (phase == PaintPhase::Background && !is_body()) { auto background_rect = enclosing_int_rect(padded_rect); context.painter().fill_rect(background_rect, computed_values().background_color()); - if (background_image() && background_image()->bitmap()) { - switch (computed_values().background_repeat()) { - case CSS::Repeat::Repeat: - // The background rect is already sized to align with 'repeat'. - break; - case CSS::Repeat::RepeatX: - background_rect.set_height(background_image()->bitmap()->height()); - break; - case CSS::Repeat::RepeatY: - background_rect.set_width(background_image()->bitmap()->width()); - break; - case CSS::Repeat::NoRepeat: - default: // FIXME: Support 'round' and 'square' - background_rect.set_width(background_image()->bitmap()->width()); - background_rect.set_height(background_image()->bitmap()->height()); - break; - } - context.painter().blit_tiled(background_rect, *background_image()->bitmap(), background_image()->bitmap()->rect()); + if (background_image() && background_image()->bitmap()) { + paint_background_image(context, *background_image()->bitmap(), computed_values().background_repeat(), move(background_rect)); } } @@ -100,6 +84,32 @@ void Box::paint(PaintContext& context, PaintPhase phase) } } +void Box::paint_background_image( + PaintContext& context, + const Gfx::Bitmap& background_image, + CSS::Repeat background_repeat, + Gfx::IntRect background_rect) +{ + switch (background_repeat) { + case CSS::Repeat::Repeat: + // The background rect is already sized to align with 'repeat'. + break; + case CSS::Repeat::RepeatX: + background_rect.set_height(background_image.height()); + break; + case CSS::Repeat::RepeatY: + background_rect.set_width(background_image.width()); + break; + case CSS::Repeat::NoRepeat: + default: // FIXME: Support 'round' and 'square' + background_rect.set_width(background_image.width()); + background_rect.set_height(background_image.height()); + break; + } + + context.painter().blit_tiled(background_rect, background_image, background_image.rect()); +} + HitTestResult Box::hit_test(const Gfx::IntPoint& position, HitTestType type) const { // FIXME: It would be nice if we could confidently skip over hit testing diff --git a/Userland/Libraries/LibWeb/Layout/Box.h b/Userland/Libraries/LibWeb/Layout/Box.h index 41d061fddd..7c6039c936 100644 --- a/Userland/Libraries/LibWeb/Layout/Box.h +++ b/Userland/Libraries/LibWeb/Layout/Box.h @@ -153,6 +153,8 @@ protected: virtual void did_set_rect() { } + void paint_background_image(PaintContext&, const Gfx::Bitmap&, CSS::Repeat, Gfx::IntRect); + Vector m_line_boxes; private: diff --git a/Userland/Libraries/LibWeb/Layout/InitialContainingBlockBox.cpp b/Userland/Libraries/LibWeb/Layout/InitialContainingBlockBox.cpp index 3bf9b1d67d..16e03ab32f 100644 --- a/Userland/Libraries/LibWeb/Layout/InitialContainingBlockBox.cpp +++ b/Userland/Libraries/LibWeb/Layout/InitialContainingBlockBox.cpp @@ -68,31 +68,8 @@ void InitialContainingBlockBox::paint_document_background(PaintContext& context) context.painter().translate(-context.viewport_rect().location()); if (auto background_bitmap = document().background_image()) { - int painted_image_width = 0; - int painted_image_height = 0; - - switch (document().background_repeat()) { - case CSS::Repeat::Repeat: - painted_image_width = context.viewport_rect().x() + context.viewport_rect().width(); - painted_image_height = context.viewport_rect().y() + context.viewport_rect().height(); - break; - case CSS::Repeat::RepeatX: - painted_image_width = context.viewport_rect().x() + context.viewport_rect().width(); - painted_image_height = background_bitmap->rect().height(); - break; - case CSS::Repeat::RepeatY: - painted_image_width = background_bitmap->rect().width(); - painted_image_height = context.viewport_rect().y() + context.viewport_rect().height(); - break; - case CSS::Repeat::NoRepeat: - default: // FIXME: Support 'round' and 'square' - painted_image_width = background_bitmap->rect().width(); - painted_image_height = background_bitmap->rect().height(); - break; - } - - Gfx::IntRect background_rect { 0, 0, painted_image_width, painted_image_height }; - context.painter().blit_tiled(background_rect, *background_bitmap, background_bitmap->rect()); + Gfx::IntRect background_rect = { 0, 0, context.viewport_rect().x() + context.viewport_rect().width(), context.viewport_rect().y() + context.viewport_rect().height() }; + paint_background_image(context, *background_bitmap, document().background_repeat(), move(background_rect)); } }