1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 15:07:45 +00:00

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.
This commit is contained in:
Timothy Flynn 2021-04-04 18:04:38 -04:00 committed by Andreas Kling
parent 1333fa7cf7
commit 735829f694
3 changed files with 32 additions and 43 deletions

View file

@ -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