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

LibGfx: Avoid copying ByteBuffers while loading PNG images

This wasn't much of a problem before because copying the ByteBuffer
merely copied the RefPtr but now that ByteBuffer behaves like Vector
this causes unnecessary allocations.
This commit is contained in:
Gunnar Beutner 2021-05-15 15:01:38 +02:00 committed by Andreas Kling
parent fcaf98361f
commit 24376e7759

View file

@ -101,7 +101,7 @@ struct PNGLoadingContext {
bool has_alpha() const { return color_type & 4 || palette_transparency_data.size() > 0; }
Vector<Scanline> scanlines;
RefPtr<Gfx::Bitmap> bitmap;
ByteBuffer decompression_buffer;
ByteBuffer* decompression_buffer { nullptr };
Vector<u8> compressed_data;
Vector<PaletteEntry> palette_data;
Vector<u8> palette_transparency_data;
@ -580,7 +580,7 @@ static bool decode_png_chunks(PNGLoadingContext& context)
static bool decode_png_bitmap_simple(PNGLoadingContext& context)
{
Streamer streamer(context.decompression_buffer.data(), context.decompression_buffer.size());
Streamer streamer(context.decompression_buffer->data(), context.decompression_buffer->size());
for (int y = 0; y < context.height; ++y) {
u8 filter;
@ -726,7 +726,7 @@ static bool decode_adam7_pass(PNGLoadingContext& context, Streamer& streamer, in
static bool decode_png_adam7(PNGLoadingContext& context)
{
Streamer streamer(context.decompression_buffer.data(), context.decompression_buffer.size());
Streamer streamer(context.decompression_buffer->data(), context.decompression_buffer->size());
context.bitmap = Bitmap::create_purgeable(context.has_alpha() ? BitmapFormat::BGRA8888 : BitmapFormat::BGRx8888, { context.width, context.height });
if (!context.bitmap)
return false;
@ -759,7 +759,7 @@ static bool decode_png_bitmap(PNGLoadingContext& context)
context.state = PNGLoadingContext::State::Error;
return false;
}
context.decompression_buffer = result.value();
context.decompression_buffer = &result.value();
context.compressed_data.clear();
context.scanlines.ensure_capacity(context.height);
@ -777,7 +777,7 @@ static bool decode_png_bitmap(PNGLoadingContext& context)
return false;
}
context.decompression_buffer.clear();
context.decompression_buffer = nullptr;
context.state = PNGLoadingContext::State::BitmapDecoded;
return true;