1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 08:48:11 +00:00

LibWeb: Support rendering background images with 'background-repeat'

Update the painting of background images for both <body> nodes and other
non-initial nodes. Currently, only the following values are supported:
    repeat, repeat-x, repeat-y, no-repeat

This also doesn't support the two-value syntax which allows for setting
horizontal and vertical repetition separately.
This commit is contained in:
Timothy Flynn 2021-04-02 18:19:33 -04:00 committed by Andreas Kling
parent bd5a91269f
commit fa9ba8bce5
4 changed files with 55 additions and 6 deletions

View file

@ -68,12 +68,30 @@ void InitialContainingBlockBox::paint_document_background(PaintContext& context)
context.painter().translate(-context.viewport_rect().location());
if (auto background_bitmap = document().background_image()) {
Gfx::IntRect background_rect {
0,
0,
context.viewport_rect().x() + context.viewport_rect().width(),
context.viewport_rect().y() + context.viewport_rect().height()
};
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());
}
}