mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 14:17:36 +00:00
LibWeb: Move border corner bitmap getter/cache to function
This will allow the same bitmap to be shared between border, background, and various other corner clipping code.
This commit is contained in:
parent
81a3ec0692
commit
4dfbbd5965
2 changed files with 32 additions and 22 deletions
|
@ -204,6 +204,31 @@ void paint_border(PaintContext& context, BorderEdge edge, Gfx::IntRect const& re
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RefPtr<Gfx::Bitmap> get_cached_corner_bitmap(Gfx::IntSize const& corners_size)
|
||||||
|
{
|
||||||
|
auto allocate_mask_bitmap = [&]() -> RefPtr<Gfx::Bitmap> {
|
||||||
|
auto bitmap = Gfx::Bitmap::try_create(Gfx::BitmapFormat::BGRA8888, corners_size);
|
||||||
|
if (!bitmap.is_error())
|
||||||
|
return bitmap.release_value();
|
||||||
|
return nullptr;
|
||||||
|
};
|
||||||
|
// FIXME: Allocate per page?
|
||||||
|
static thread_local auto corner_bitmap = allocate_mask_bitmap();
|
||||||
|
// Only reallocate the corner bitmap is the existing one is too small.
|
||||||
|
// (should mean no more allocations after the first paint -- amortised zero allocations :^))
|
||||||
|
if (corner_bitmap && corner_bitmap->rect().size().contains(corners_size)) {
|
||||||
|
Gfx::Painter painter { *corner_bitmap };
|
||||||
|
painter.clear_rect({ { 0, 0 }, corners_size }, Gfx::Color());
|
||||||
|
} else {
|
||||||
|
corner_bitmap = allocate_mask_bitmap();
|
||||||
|
if (!corner_bitmap) {
|
||||||
|
dbgln("Failed to allocate corner bitmap with size {}", corners_size);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return corner_bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
void paint_all_borders(PaintContext& context, Gfx::FloatRect const& bordered_rect, BorderRadiiData const& border_radii_data, BordersData const& borders_data)
|
void paint_all_borders(PaintContext& context, Gfx::FloatRect const& bordered_rect, BorderRadiiData const& border_radii_data, BordersData const& borders_data)
|
||||||
{
|
{
|
||||||
if (borders_data.top.width <= 0 && borders_data.right.width <= 0 && borders_data.left.width <= 0 && borders_data.bottom.width <= 0)
|
if (borders_data.top.width <= 0 && borders_data.right.width <= 0 && borders_data.left.width <= 0 && borders_data.bottom.width <= 0)
|
||||||
|
@ -289,29 +314,11 @@ void paint_all_borders(PaintContext& context, Gfx::FloatRect const& bordered_rec
|
||||||
top_left.vertical_radius + bottom_left.vertical_radius + expand_width,
|
top_left.vertical_radius + bottom_left.vertical_radius + expand_width,
|
||||||
top_right.vertical_radius + bottom_right.vertical_radius + expand_height)
|
top_right.vertical_radius + bottom_right.vertical_radius + expand_height)
|
||||||
};
|
};
|
||||||
auto allocate_mask_bitmap = [&]() -> RefPtr<Gfx::Bitmap> {
|
|
||||||
auto bitmap = Gfx::Bitmap::try_create(Gfx::BitmapFormat::BGRA8888, corner_mask_rect.size());
|
|
||||||
if (!bitmap.is_error())
|
|
||||||
return bitmap.release_value();
|
|
||||||
return nullptr;
|
|
||||||
};
|
|
||||||
static thread_local auto corner_bitmap = allocate_mask_bitmap();
|
|
||||||
|
|
||||||
// Only reallocate the corner bitmap is the existing one is too small.
|
auto corner_bitmap = get_cached_corner_bitmap(corner_mask_rect.size());
|
||||||
// (should mean no more allocations after the first paint -- amortised zero allocations :^))
|
if (!corner_bitmap)
|
||||||
Gfx::Painter painter = ({
|
return;
|
||||||
Optional<Gfx::Painter> painter;
|
Gfx::Painter painter { *corner_bitmap };
|
||||||
if (corner_bitmap && corner_bitmap->rect().contains(corner_mask_rect)) {
|
|
||||||
painter = Gfx::Painter { *corner_bitmap };
|
|
||||||
painter->clear_rect(corner_mask_rect, Gfx::Color());
|
|
||||||
} else {
|
|
||||||
corner_bitmap = allocate_mask_bitmap();
|
|
||||||
if (!corner_bitmap)
|
|
||||||
return dbgln("Failed to allocate border corner bitmap with size {}", corner_mask_rect.size());
|
|
||||||
painter = Gfx::Painter { *corner_bitmap };
|
|
||||||
}
|
|
||||||
*painter;
|
|
||||||
});
|
|
||||||
|
|
||||||
Gfx::AntiAliasingPainter aa_painter { painter };
|
Gfx::AntiAliasingPainter aa_painter { painter };
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,9 @@ struct BordersData {
|
||||||
CSS::BorderData bottom;
|
CSS::BorderData bottom;
|
||||||
CSS::BorderData left;
|
CSS::BorderData left;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
RefPtr<Gfx::Bitmap> get_cached_corner_bitmap(Gfx::IntSize const& corners_size);
|
||||||
|
|
||||||
void paint_border(PaintContext& context, BorderEdge edge, Gfx::IntRect const& rect, BorderRadiiData const& border_radii_data, BordersData const& borders_data);
|
void paint_border(PaintContext& context, BorderEdge edge, Gfx::IntRect const& rect, BorderRadiiData const& border_radii_data, BordersData const& borders_data);
|
||||||
void paint_all_borders(PaintContext& context, Gfx::FloatRect const& bordered_rect, BorderRadiiData const& border_radii_data, BordersData const&);
|
void paint_all_borders(PaintContext& context, Gfx::FloatRect const& bordered_rect, BorderRadiiData const& border_radii_data, BordersData const&);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue