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

LibCompress: Switch ZlibCompressor to a constructor pattern

We don't have anything fallible in the constructor yet, but what's there
should be fallible and once we switch to Core::Stream it will be
fallible.
This commit is contained in:
Tim Schumacher 2022-12-26 15:58:42 +01:00 committed by Sam Atkins
parent 23a9d62f39
commit f0b035b66c
3 changed files with 21 additions and 18 deletions

View file

@ -68,16 +68,22 @@ u32 ZlibDecompressor::checksum()
return m_checksum;
}
ZlibCompressor::ZlibCompressor(OutputStream& stream, ZlibCompressionLevel compression_level)
: m_output_stream(stream)
ErrorOr<NonnullOwnPtr<ZlibCompressor>> ZlibCompressor::construct(OutputStream& stream, ZlibCompressionLevel compression_level)
{
// Zlib only defines Deflate as a compression method.
auto compression_method = ZlibCompressionMethod::Deflate;
write_header(compression_method, compression_level);
auto zlib_compressor = TRY(adopt_nonnull_own_or_enomem(new (nothrow) ZlibCompressor(stream, compression_level)));
zlib_compressor->write_header(compression_method, compression_level);
return zlib_compressor;
}
ZlibCompressor::ZlibCompressor(OutputStream& stream, ZlibCompressionLevel compression_level)
: m_output_stream(stream)
// FIXME: Find a way to compress with Deflate's "Best" compression level.
m_compressor = make<DeflateCompressor>(stream, static_cast<DeflateCompressor::CompressionLevel>(compression_level));
, m_compressor(make<DeflateCompressor>(stream, static_cast<DeflateCompressor::CompressionLevel>(compression_level)))
{
}
ZlibCompressor::~ZlibCompressor()
@ -139,17 +145,17 @@ void ZlibCompressor::finish()
m_finished = true;
}
Optional<ByteBuffer> ZlibCompressor::compress_all(ReadonlyBytes bytes, ZlibCompressionLevel compression_level)
ErrorOr<ByteBuffer> ZlibCompressor::compress_all(ReadonlyBytes bytes, ZlibCompressionLevel compression_level)
{
DuplexMemoryStream output_stream;
ZlibCompressor zlib_stream { output_stream, compression_level };
auto zlib_stream = TRY(ZlibCompressor::construct(output_stream, compression_level));
zlib_stream.write_or_error(bytes);
zlib_stream->write_or_error(bytes);
zlib_stream.finish();
zlib_stream->finish();
if (zlib_stream.handle_any_error())
return {};
if (zlib_stream->handle_any_error())
return Error::from_string_literal("Underlying ZlibStream indicated an error");
return output_stream.copy_into_contiguous_buffer();
}

View file

@ -62,21 +62,22 @@ private:
class ZlibCompressor : public OutputStream {
public:
ZlibCompressor(OutputStream&, ZlibCompressionLevel = ZlibCompressionLevel::Default);
static ErrorOr<NonnullOwnPtr<ZlibCompressor>> construct(OutputStream&, ZlibCompressionLevel = ZlibCompressionLevel::Default);
~ZlibCompressor();
size_t write(ReadonlyBytes) override;
bool write_or_error(ReadonlyBytes) override;
void finish();
static Optional<ByteBuffer> compress_all(ReadonlyBytes bytes, ZlibCompressionLevel = ZlibCompressionLevel::Default);
static ErrorOr<ByteBuffer> compress_all(ReadonlyBytes bytes, ZlibCompressionLevel = ZlibCompressionLevel::Default);
private:
ZlibCompressor(OutputStream&, ZlibCompressionLevel);
void write_header(ZlibCompressionMethod, ZlibCompressionLevel);
bool m_finished { false };
OutputBitStream m_output_stream;
OwnPtr<OutputStream> m_compressor;
NonnullOwnPtr<OutputStream> m_compressor;
Crypto::Checksum::Adler32 m_adler32_checksum;
};

View file

@ -264,11 +264,7 @@ ErrorOr<void> PNGWriter::add_IDAT_chunk(Gfx::Bitmap const& bitmap)
TRY(uncompressed_block_data.try_append(best_filter.buffer));
}
auto maybe_zlib_buffer = Compress::ZlibCompressor::compress_all(uncompressed_block_data, Compress::ZlibCompressionLevel::Best);
if (!maybe_zlib_buffer.has_value()) {
return Error::from_string_literal("PNGWriter: ZlibCompressor failed");
}
auto zlib_buffer = maybe_zlib_buffer.release_value();
auto zlib_buffer = TRY(Compress::ZlibCompressor::compress_all(uncompressed_block_data, Compress::ZlibCompressionLevel::Best));
TRY(png_chunk.add(zlib_buffer.data(), zlib_buffer.size()));
TRY(add_chunk(png_chunk));