mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 06:37:43 +00:00
LibGfx/ILBMLoader: Don't throw too early when decoding bitplanes
We were (again) throwing even though the image could be decoded.
This commit is contained in:
parent
25eb903a8f
commit
1593ff2d4c
1 changed files with 9 additions and 7 deletions
|
@ -220,18 +220,20 @@ static ErrorOr<ByteBuffer> planar_to_chunky(ReadonlyBytes bitplanes, ILBMLoading
|
||||||
u8 bit = bitplanes[offset_base + i];
|
u8 bit = bitplanes[offset_base + i];
|
||||||
u8 rgb_shift = p / 8;
|
u8 rgb_shift = p / 8;
|
||||||
|
|
||||||
// Only throw an error if we would actually attempt to write
|
|
||||||
// outside of the chunky buffer. Some apps like PPaint produce
|
|
||||||
// malformed bitplane data but files are still accepted by most readers.
|
|
||||||
if (bit && scanline + ((pitch - 1) * 8) + 7 >= chunky.size())
|
|
||||||
return Error::from_string_literal("Malformed bitplane data");
|
|
||||||
|
|
||||||
for (u8 b = 0; b < 8; b++) {
|
for (u8 b = 0; b < 8; b++) {
|
||||||
u8 mask = 1 << (7 - b);
|
u8 mask = 1 << (7 - b);
|
||||||
// get current plane
|
// get current plane
|
||||||
if (bit & mask) {
|
if (bit & mask) {
|
||||||
u16 x = (i * 8) + b;
|
u16 x = (i * 8) + b;
|
||||||
chunky[(scanline * pixel_size) + (x * pixel_size) + rgb_shift] |= plane_mask;
|
size_t offset = (scanline * pixel_size) + (x * pixel_size) + rgb_shift;
|
||||||
|
// Only throw an error if we would actually attempt to write
|
||||||
|
// outside of the chunky buffer. Some apps like PPaint produce
|
||||||
|
// malformed bitplane data but files are still accepted by most readers
|
||||||
|
// since they do not cause writing past the chunky buffer.
|
||||||
|
if (offset >= chunky.size()) {
|
||||||
|
return Error::from_string_literal("Malformed bitplane data");
|
||||||
|
}
|
||||||
|
chunky[offset] |= plane_mask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue