1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 07:07:34 +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; return m_checksum;
} }
ZlibCompressor::ZlibCompressor(OutputStream& stream, ZlibCompressionLevel compression_level) ErrorOr<NonnullOwnPtr<ZlibCompressor>> ZlibCompressor::construct(OutputStream& stream, ZlibCompressionLevel compression_level)
: m_output_stream(stream)
{ {
// Zlib only defines Deflate as a compression method. // Zlib only defines Deflate as a compression method.
auto compression_method = ZlibCompressionMethod::Deflate; 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. // 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() ZlibCompressor::~ZlibCompressor()
@ -139,17 +145,17 @@ void ZlibCompressor::finish()
m_finished = true; 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; 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()) if (zlib_stream->handle_any_error())
return {}; return Error::from_string_literal("Underlying ZlibStream indicated an error");
return output_stream.copy_into_contiguous_buffer(); return output_stream.copy_into_contiguous_buffer();
} }

View file

@ -62,21 +62,22 @@ private:
class ZlibCompressor : public OutputStream { class ZlibCompressor : public OutputStream {
public: public:
ZlibCompressor(OutputStream&, ZlibCompressionLevel = ZlibCompressionLevel::Default); static ErrorOr<NonnullOwnPtr<ZlibCompressor>> construct(OutputStream&, ZlibCompressionLevel = ZlibCompressionLevel::Default);
~ZlibCompressor(); ~ZlibCompressor();
size_t write(ReadonlyBytes) override; size_t write(ReadonlyBytes) override;
bool write_or_error(ReadonlyBytes) override; bool write_or_error(ReadonlyBytes) override;
void finish(); void finish();
static Optional<ByteBuffer> compress_all(ReadonlyBytes bytes, ZlibCompressionLevel = ZlibCompressionLevel::Default); static ErrorOr<ByteBuffer> compress_all(ReadonlyBytes bytes, ZlibCompressionLevel = ZlibCompressionLevel::Default);
private: private:
ZlibCompressor(OutputStream&, ZlibCompressionLevel);
void write_header(ZlibCompressionMethod, ZlibCompressionLevel); void write_header(ZlibCompressionMethod, ZlibCompressionLevel);
bool m_finished { false }; bool m_finished { false };
OutputBitStream m_output_stream; OutputBitStream m_output_stream;
OwnPtr<OutputStream> m_compressor; NonnullOwnPtr<OutputStream> m_compressor;
Crypto::Checksum::Adler32 m_adler32_checksum; 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)); TRY(uncompressed_block_data.try_append(best_filter.buffer));
} }
auto maybe_zlib_buffer = Compress::ZlibCompressor::compress_all(uncompressed_block_data, Compress::ZlibCompressionLevel::Best); auto zlib_buffer = TRY(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();
TRY(png_chunk.add(zlib_buffer.data(), zlib_buffer.size())); TRY(png_chunk.add(zlib_buffer.data(), zlib_buffer.size()));
TRY(add_chunk(png_chunk)); TRY(add_chunk(png_chunk));