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

LibGfx: Prevent a copy in PNGWriter by storing type data at start

This commit is contained in:
Aziz Berkay Yesilyurt 2021-07-11 19:00:32 +02:00 committed by Andreas Kling
parent d84c4b94da
commit db36ddc763

View file

@ -28,6 +28,8 @@ public:
void add_u8(u8); void add_u8(u8);
void store_type();
private: private:
template<typename T> template<typename T>
requires(IsUnsigned<T>) void add(T); requires(IsUnsigned<T>) void add(T);
@ -56,6 +58,14 @@ private:
PNGChunk::PNGChunk(String type) PNGChunk::PNGChunk(String type)
: m_type(move(type)) : m_type(move(type))
{ {
store_type();
}
void PNGChunk::store_type()
{
for (auto character : type()) {
m_data.append(&character, sizeof(character));
}
} }
template<typename T> template<typename T>
@ -121,19 +131,12 @@ void NonCompressibleBlock::update_adler(u8 data)
void PNGWriter::add_chunk(PNGChunk const& png_chunk) void PNGWriter::add_chunk(PNGChunk const& png_chunk)
{ {
ByteBuffer combined; auto crc = BigEndian(Crypto::Checksum::CRC32({ (const u8*)png_chunk.data().data(), png_chunk.data().size() }).digest());
for (auto character : png_chunk.type()) { auto data_len = BigEndian(png_chunk.data().size() - png_chunk.type().length());
combined.append(&character, sizeof(character));
}
combined.append(png_chunk.data().data(), png_chunk.data().size());
auto crc = BigEndian(Crypto::Checksum::CRC32({ (const u8*)combined.data(), combined.size() }).digest());
auto data_len = BigEndian(png_chunk.data().size());
ByteBuffer buf; ByteBuffer buf;
buf.append(&data_len, sizeof(u32)); buf.append(&data_len, sizeof(u32));
buf.append(combined.data(), combined.size()); buf.append(png_chunk.data().data(), png_chunk.data().size());
buf.append(&crc, sizeof(u32)); buf.append(&crc, sizeof(u32));
m_data.append(buf.data(), buf.size()); m_data.append(buf.data(), buf.size());