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
Notes: sideshowbarker 2024-07-18 09:03:54 +09:00

View File

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