LibWeb: Fix position: fixed canvases/images disappearing when scrolling

This fixes the Serenity logo vanishing after scrolling on the 4th
birthday post.

The previous check did not account for any translation in the painter.
This now uses the painter's clip rect and translation to work out
if a rect is visible. It also makes use of `absolute_paint_rect()`
rather than `absolute_rect()` which can account for things like
box-shadows.
This commit is contained in:
MacDue 2022-10-10 21:28:57 +01:00 committed by Andreas Kling
parent f5e68fcc20
commit 4507920187
Notes: sideshowbarker 2024-07-17 05:59:44 +09:00
4 changed files with 13 additions and 4 deletions

View file

@ -34,8 +34,8 @@ void CanvasPaintable::paint(PaintContext& context, PaintPhase phase) const
auto canvas_rect = absolute_rect().to_rounded<int>();
ScopedCornerRadiusClip corner_clip { context.painter(), canvas_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) };
// FIXME: This should be done at a different level. Also rect() does not include padding etc!
if (!context.viewport_rect().intersects(canvas_rect))
// FIXME: This should be done at a different level.
if (is_out_of_view(context))
return;
if (layout_box().dom_node().bitmap()) {

View file

@ -33,8 +33,8 @@ void ImagePaintable::paint(PaintContext& context, PaintPhase phase) const
if (!is_visible())
return;
// FIXME: This should be done at a different level. Also rect() does not include padding etc!
if (!context.viewport_rect().intersects(enclosing_int_rect(absolute_rect())))
// FIXME: This should be done at a different level.
if (is_out_of_view(context))
return;
PaintableBox::paint(context, phase);

View file

@ -37,6 +37,13 @@ void PaintableBox::invalidate_stacking_context()
m_stacking_context = nullptr;
}
bool PaintableBox::is_out_of_view(PaintContext& context) const
{
return !enclosing_int_rect(absolute_paint_rect())
.translated(context.painter().translation())
.intersects(context.painter().clip_rect());
}
PaintableWithLines::PaintableWithLines(Layout::BlockContainer const& layout_box)
: PaintableBox(layout_box)
{

View file

@ -117,6 +117,8 @@ public:
void invalidate_stacking_context();
bool is_out_of_view(PaintContext&) const;
protected:
explicit PaintableBox(Layout::Box const&);