From 0b06cbdca22d74f781fbba27a8eaf7e67b9d298c Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 14 May 2024 19:42:59 -0400 Subject: [PATCH] LibGfx/WebPWriter: Move frame data writing out of write_ANMF_chunk() No behavior change. This also makes it clear that the conditional alignment at the end can just be a VERIFY() instead of a conditional. --- .../Libraries/LibGfx/ImageFormats/WebPWriter.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Userland/Libraries/LibGfx/ImageFormats/WebPWriter.cpp b/Userland/Libraries/LibGfx/ImageFormats/WebPWriter.cpp index c88d498b977..3281e696e89 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/WebPWriter.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/WebPWriter.cpp @@ -370,7 +370,7 @@ static ErrorOr align_to_two(SeekableStream& stream) return align_to_two(stream, TRY(stream.tell())); } -static ErrorOr write_ANMF_chunk(Stream& stream, ANMFChunkHeader const& chunk, ReadonlyBytes frame_data) +static ErrorOr write_ANMF_chunk_header(Stream& stream, ANMFChunkHeader const& chunk, size_t payload_size) { if (chunk.frame_width > (1 << 24) || chunk.frame_height > (1 << 24)) return Error::from_string_literal("WebP dimensions too large for ANMF chunk"); @@ -384,7 +384,7 @@ static ErrorOr write_ANMF_chunk(Stream& stream, ANMFChunkHeader const& chu dbgln_if(WEBP_DEBUG, "writing ANMF frame_x {} frame_y {} frame_width {} frame_height {} frame_duration {} blending_method {} disposal_method {}", chunk.frame_x, chunk.frame_y, chunk.frame_width, chunk.frame_height, chunk.frame_duration_in_milliseconds, (int)chunk.blending_method, (int)chunk.disposal_method); - TRY(write_chunk_header(stream, "ANMF"sv, 16 + frame_data.size())); + TRY(write_chunk_header(stream, "ANMF"sv, 16 + payload_size)); LittleEndianOutputBitStream bit_stream { MaybeOwned(stream) }; @@ -426,11 +426,6 @@ static ErrorOr write_ANMF_chunk(Stream& stream, ANMFChunkHeader const& chu // FIXME: Make ~LittleEndianOutputBitStream do this, or make it VERIFY() that it has happened at least. TRY(bit_stream.flush_buffer_to_stream()); - TRY(stream.write_until_depleted(frame_data)); - - if (frame_data.size() % 2 != 0) - TRY(stream.write_value(0)); - return {}; } @@ -456,7 +451,10 @@ ErrorOr WebPAnimationWriter::add_frame(Bitmap& bitmap, int duration_ms, In chunk.blending_method = ANMFChunkHeader::BlendingMethod::DoNotBlend; chunk.disposal_method = ANMFChunkHeader::DisposalMethod::DoNotDispose; - TRY(write_ANMF_chunk(m_stream, chunk, vp8l_chunk_bytes)); + TRY(write_ANMF_chunk_header(m_stream, chunk, vp8l_chunk_bytes.size())); + + TRY(m_stream.write_until_depleted(vp8l_chunk_bytes)); + VERIFY(vp8l_chunk_bytes.size() % 2 == 0); TRY(update_size_in_header());