mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 09:14:58 +00:00
LibGfx+Ladybird+Userland: Don't sniff for TGA images with only raw bytes
Because TGA images don't have magic bytes as a signature to be detected, instead assume a sequence of ReadonlyBytes is a possible TGA image only if we are given a path so we could check the extension of the file and see if it's a TGA image. When we know the path of the file being loaded, we will try to first check its extension, and only if there's no match to a known decoder, based on simple extension lookup, then we would probe for other formats as usual with the normal sniffing method.
This commit is contained in:
parent
9f2d4d3fd5
commit
649f78d0a4
13 changed files with 162 additions and 67 deletions
|
@ -20,6 +20,43 @@ void Client::die()
|
|||
on_death();
|
||||
}
|
||||
|
||||
Optional<DecodedImage> Client::decode_image_with_known_path(DeprecatedString const& path, ReadonlyBytes encoded_data)
|
||||
{
|
||||
if (encoded_data.is_empty())
|
||||
return {};
|
||||
|
||||
auto encoded_buffer_or_error = Core::AnonymousBuffer::create_with_size(encoded_data.size());
|
||||
if (encoded_buffer_or_error.is_error()) {
|
||||
dbgln("Could not allocate encoded buffer");
|
||||
return {};
|
||||
}
|
||||
auto encoded_buffer = encoded_buffer_or_error.release_value();
|
||||
|
||||
memcpy(encoded_buffer.data<void>(), encoded_data.data(), encoded_data.size());
|
||||
auto response_or_error = try_decode_image_with_known_path(path, move(encoded_buffer));
|
||||
|
||||
if (response_or_error.is_error()) {
|
||||
dbgln("ImageDecoder died heroically");
|
||||
return {};
|
||||
}
|
||||
|
||||
auto& response = response_or_error.value();
|
||||
|
||||
if (response.bitmaps().is_empty())
|
||||
return {};
|
||||
|
||||
DecodedImage image;
|
||||
image.is_animated = response.is_animated();
|
||||
image.loop_count = response.loop_count();
|
||||
image.frames.resize(response.bitmaps().size());
|
||||
for (size_t i = 0; i < image.frames.size(); ++i) {
|
||||
auto& frame = image.frames[i];
|
||||
frame.bitmap = response.bitmaps()[i].bitmap();
|
||||
frame.duration = response.durations()[i];
|
||||
}
|
||||
return image;
|
||||
}
|
||||
|
||||
Optional<DecodedImage> Client::decode_image(ReadonlyBytes encoded_data)
|
||||
{
|
||||
if (encoded_data.is_empty())
|
||||
|
|
|
@ -31,6 +31,7 @@ class Client final
|
|||
|
||||
public:
|
||||
Optional<DecodedImage> decode_image(ReadonlyBytes);
|
||||
Optional<DecodedImage> decode_image_with_known_path(DeprecatedString const& path, ReadonlyBytes);
|
||||
|
||||
Function<void()> on_death;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue