diff --git a/Userland/Libraries/LibCompress/Zlib.cpp b/Userland/Libraries/LibCompress/Zlib.cpp index d39bdcbb37..8c9ea5e4ef 100644 --- a/Userland/Libraries/LibCompress/Zlib.cpp +++ b/Userland/Libraries/LibCompress/Zlib.cpp @@ -68,16 +68,22 @@ u32 ZlibDecompressor::checksum() return m_checksum; } -ZlibCompressor::ZlibCompressor(OutputStream& stream, ZlibCompressionLevel compression_level) - : m_output_stream(stream) +ErrorOr> 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(stream, static_cast(compression_level)); + , m_compressor(make(stream, static_cast(compression_level))) +{ } ZlibCompressor::~ZlibCompressor() @@ -139,17 +145,17 @@ void ZlibCompressor::finish() m_finished = true; } -Optional ZlibCompressor::compress_all(ReadonlyBytes bytes, ZlibCompressionLevel compression_level) +ErrorOr 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(); } diff --git a/Userland/Libraries/LibCompress/Zlib.h b/Userland/Libraries/LibCompress/Zlib.h index a69d91d6ce..1f6222e2c5 100644 --- a/Userland/Libraries/LibCompress/Zlib.h +++ b/Userland/Libraries/LibCompress/Zlib.h @@ -62,21 +62,22 @@ private: class ZlibCompressor : public OutputStream { public: - ZlibCompressor(OutputStream&, ZlibCompressionLevel = ZlibCompressionLevel::Default); + static ErrorOr> construct(OutputStream&, ZlibCompressionLevel = ZlibCompressionLevel::Default); ~ZlibCompressor(); size_t write(ReadonlyBytes) override; bool write_or_error(ReadonlyBytes) override; void finish(); - static Optional compress_all(ReadonlyBytes bytes, ZlibCompressionLevel = ZlibCompressionLevel::Default); + static ErrorOr 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 m_compressor; + NonnullOwnPtr m_compressor; Crypto::Checksum::Adler32 m_adler32_checksum; }; diff --git a/Userland/Libraries/LibGfx/PNGWriter.cpp b/Userland/Libraries/LibGfx/PNGWriter.cpp index c28d857646..6291c0dc89 100644 --- a/Userland/Libraries/LibGfx/PNGWriter.cpp +++ b/Userland/Libraries/LibGfx/PNGWriter.cpp @@ -264,11 +264,7 @@ ErrorOr 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));