mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 19:37:36 +00:00
LibGfx: Add scaffolding for applying transforms to webp lossless decoder
Each of the four transforms will inherit from this class.
This commit is contained in:
parent
b15d3b2329
commit
cdc77f7512
1 changed files with 19 additions and 0 deletions
|
@ -626,6 +626,18 @@ static ErrorOr<NonnullRefPtr<Bitmap>> decode_webp_chunk_VP8L_image(WebPLoadingCo
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class Transform {
|
||||||
|
public:
|
||||||
|
virtual ~Transform();
|
||||||
|
virtual ErrorOr<void> transform(Bitmap&) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
Transform::~Transform() = default;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// https://developers.google.com/speed/webp/docs/riff_container#simple_file_format_lossless
|
// 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
|
// https://developers.google.com/speed/webp/docs/webp_lossless_bitstream_specification#7_overall_structure_of_the_format
|
||||||
static ErrorOr<void> decode_webp_chunk_VP8L(WebPLoadingContext& context, Chunk const& vp8l_chunk)
|
static ErrorOr<void> decode_webp_chunk_VP8L(WebPLoadingContext& context, Chunk const& vp8l_chunk)
|
||||||
|
@ -656,6 +668,7 @@ static ErrorOr<void> decode_webp_chunk_VP8L(WebPLoadingContext& context, Chunk c
|
||||||
// optional-transform = (%b1 transform optional-transform) / %b0
|
// optional-transform = (%b1 transform optional-transform) / %b0
|
||||||
// "Each transform is allowed to be used only once."
|
// "Each transform is allowed to be used only once."
|
||||||
u8 seen_transforms = 0;
|
u8 seen_transforms = 0;
|
||||||
|
Vector<NonnullOwnPtr<Transform>, 4> transforms;
|
||||||
while (TRY(bit_stream.read_bits(1))) {
|
while (TRY(bit_stream.read_bits(1))) {
|
||||||
// transform = predictor-tx / color-tx / subtract-green-tx
|
// transform = predictor-tx / color-tx / subtract-green-tx
|
||||||
// transform =/ color-indexing-tx
|
// transform =/ color-indexing-tx
|
||||||
|
@ -697,6 +710,12 @@ static ErrorOr<void> decode_webp_chunk_VP8L(WebPLoadingContext& context, Chunk c
|
||||||
|
|
||||||
auto format = vp8l_header.is_alpha_used ? BitmapFormat::BGRA8888 : BitmapFormat::BGRx8888;
|
auto format = vp8l_header.is_alpha_used ? BitmapFormat::BGRA8888 : BitmapFormat::BGRx8888;
|
||||||
context.bitmap = TRY(decode_webp_chunk_VP8L_image(context, ImageKind::SpatiallyCoded, format, context.size.value(), bit_stream));
|
context.bitmap = TRY(decode_webp_chunk_VP8L_image(context, ImageKind::SpatiallyCoded, format, context.size.value(), bit_stream));
|
||||||
|
|
||||||
|
// Transforms have to be applied in the reverse order they appear in in the file.
|
||||||
|
// (As far as I can tell, this isn't mentioned in the spec.)
|
||||||
|
for (auto const& transform : transforms.in_reverse())
|
||||||
|
TRY(transform->transform(*context.bitmap));
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue