summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNico Weber <thakis@chromium.org>2023-05-07 11:21:03 -0400
committerAndreas Kling <kling@serenityos.org>2023-05-08 12:52:05 +0200
commit9d4da5af4356f6c9ccb996230a75ad159fcd67cc (patch)
treee43a4a188bf94aecd3a652b9a4a95dd8e3ab4fa1
parent5252f1cd60f406bc78a1d2c6dc899226e1166646 (diff)
downloadserenity-9d4da5af4356f6c9ccb996230a75ad159fcd67cc.zip
LibGfx/WebP: Store pointer to lossless data in VP8LHeader struct
This way, the size of the header in bytes is only known in decode_webp_chunk_VP8L_header().
-rw-r--r--Userland/Libraries/LibGfx/ImageFormats/WebPLoader.cpp16
1 files changed, 8 insertions, 8 deletions
diff --git a/Userland/Libraries/LibGfx/ImageFormats/WebPLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/WebPLoader.cpp
index 7d7ca4a01d..3deb132890 100644
--- a/Userland/Libraries/LibGfx/ImageFormats/WebPLoader.cpp
+++ b/Userland/Libraries/LibGfx/ImageFormats/WebPLoader.cpp
@@ -71,6 +71,7 @@ struct VP8LHeader {
u16 width;
u16 height;
bool is_alpha_used;
+ ReadonlyBytes lossless_data;
};
struct VP8XHeader {
@@ -344,7 +345,7 @@ static ErrorOr<VP8LHeader> decode_webp_chunk_VP8L_header(Chunk const& vp8l_chunk
if (version_number != 0)
return Error::from_string_literal("WebPImageDecoderPlugin: VP8L chunk invalid version_number");
- return VP8LHeader { width, height, is_alpha_used };
+ return VP8LHeader { width, height, is_alpha_used, vp8l_chunk.data.slice(5) };
}
namespace {
@@ -1228,7 +1229,7 @@ ErrorOr<NonnullRefPtr<Bitmap>> ColorIndexingTransform::transform(NonnullRefPtr<B
// https://developers.google.com/speed/webp/docs/riff_container#simple_file_format_lossless
// https://developers.google.com/speed/webp/docs/webp_lossless_bitstream_specification#7_overall_structure_of_the_format
-static ErrorOr<NonnullRefPtr<Bitmap>> decode_webp_chunk_VP8L_contents(VP8LHeader const& vp8l_header, ReadonlyBytes lossless_data);
+static ErrorOr<NonnullRefPtr<Bitmap>> decode_webp_chunk_VP8L_contents(VP8LHeader const& vp8l_header);
static ErrorOr<NonnullRefPtr<Bitmap>> decode_webp_chunk_VP8L(WebPLoadingContext& context, Chunk const& vp8l_chunk)
{
@@ -1236,14 +1237,13 @@ static ErrorOr<NonnullRefPtr<Bitmap>> decode_webp_chunk_VP8L(WebPLoadingContext&
VERIFY(vp8l_chunk.type == FourCC("VP8L"));
auto vp8l_header = TRY(decode_webp_chunk_VP8L_header(vp8l_chunk));
- ReadonlyBytes lossless_data = vp8l_chunk.data.slice(5);
- return decode_webp_chunk_VP8L_contents(vp8l_header, lossless_data);
+ return decode_webp_chunk_VP8L_contents(vp8l_header);
}
// Decodes the lossless webp bitstream following the 5-byte header information.
-static ErrorOr<NonnullRefPtr<Bitmap>> decode_webp_chunk_VP8L_contents(VP8LHeader const& vp8l_header, ReadonlyBytes lossless_data)
+static ErrorOr<NonnullRefPtr<Bitmap>> decode_webp_chunk_VP8L_contents(VP8LHeader const& vp8l_header)
{
- FixedMemoryStream memory_stream { lossless_data };
+ FixedMemoryStream memory_stream { vp8l_header.lossless_data };
LittleEndianInputBitStream bit_stream { MaybeOwned<Stream>(memory_stream) };
// image-stream = optional-transform spatially-coded-image
@@ -1346,8 +1346,8 @@ static ErrorOr<void> decode_webp_chunk_ALPH(WebPLoadingContext& context, Chunk c
// of implicit dimension width x height. That is, this image-stream does NOT contain any headers describing the image dimension.
// Once the image-stream is decoded into ARGB color values, following the process described in the lossless format specification,
// the transparency information must be extracted from the green channel of the ARGB quadruplet."
- VP8LHeader vp8l_header = { static_cast<u16>(bitmap.width()), static_cast<u16>(bitmap.height()), /*is_alpha_used=*/false };
- auto lossless_bitmap = TRY(decode_webp_chunk_VP8L_contents(vp8l_header, alpha_data));
+ VP8LHeader vp8l_header { static_cast<u16>(bitmap.width()), static_cast<u16>(bitmap.height()), /*is_alpha_used=*/false, alpha_data };
+ auto lossless_bitmap = TRY(decode_webp_chunk_VP8L_contents(vp8l_header));
if (pixel_count != static_cast<size_t>(lossless_bitmap->width() * lossless_bitmap->height()))
return context.error("WebPImageDecoderPlugin: decompressed ALPH dimensions don't match VP8 dimensions");