Fix std/bmp checking bits_per_pixel too early
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 729e27b..3dbe310 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -16386,23 +16386,6 @@
goto exit;
}
self->private_impl.f_padding -= self->private_impl.f_bitmap_info_len;
- if (self->private_impl.f_bitmap_info_len == 40) {
- if (self->private_impl.f_bits_per_pixel >= 16) {
- if (self->private_impl.f_padding >= 16) {
- self->private_impl.f_bitmap_info_len = 56;
- self->private_impl.f_padding -= 16;
- } else if (self->private_impl.f_padding >= 12) {
- self->private_impl.f_bitmap_info_len = 52;
- self->private_impl.f_padding -= 12;
- }
- }
- } else if ((self->private_impl.f_bitmap_info_len != 52) &&
- (self->private_impl.f_bitmap_info_len != 56) &&
- (self->private_impl.f_bitmap_info_len != 108) &&
- (self->private_impl.f_bitmap_info_len != 124)) {
- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
- goto exit;
- }
{
WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
uint32_t t_3;
@@ -16588,6 +16571,23 @@
goto suspend;
}
iop_a_src += self->private_data.s_decode_image_config[0].scratch;
+ if (self->private_impl.f_bitmap_info_len == 40) {
+ if (self->private_impl.f_bits_per_pixel >= 16) {
+ if (self->private_impl.f_padding >= 16) {
+ self->private_impl.f_bitmap_info_len = 56;
+ self->private_impl.f_padding -= 16;
+ } else if (self->private_impl.f_padding >= 12) {
+ self->private_impl.f_bitmap_info_len = 52;
+ self->private_impl.f_padding -= 12;
+ }
+ }
+ } else if ((self->private_impl.f_bitmap_info_len != 52) &&
+ (self->private_impl.f_bitmap_info_len != 56) &&
+ (self->private_impl.f_bitmap_info_len != 108) &&
+ (self->private_impl.f_bitmap_info_len != 124)) {
+ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
+ goto exit;
+ }
if (self->private_impl.f_compression == 6) {
self->private_impl.f_compression = 3;
}
diff --git a/std/bmp/decode_bmp.wuffs b/std/bmp/decode_bmp.wuffs
index 5c37483..59355f7 100644
--- a/std/bmp/decode_bmp.wuffs
+++ b/std/bmp/decode_bmp.wuffs
@@ -106,23 +106,6 @@
}
this.padding -= this.bitmap_info_len
- if this.bitmap_info_len == 40 {
- if this.bits_per_pixel >= 16 {
- // It's poorly documented, but "length 40" data can be silently
- // augmented with RGB or RGBA channel_masks (12 or 16 bytes).
- if this.padding >= 16 {
- this.bitmap_info_len = 56
- this.padding -= 16
- } else if this.padding >= 12 {
- this.bitmap_info_len = 52
- this.padding -= 12
- }
- }
- } else if (this.bitmap_info_len <> 52) and (this.bitmap_info_len <> 56) and
- (this.bitmap_info_len <> 108) and (this.bitmap_info_len <> 124) {
- return "#unsupported BMP file"
- }
-
width = args.src.read_u32le?()
if width >= 0x8000_0000 {
return "#bad header"
@@ -164,6 +147,23 @@
// the version 3 BITMAPINFOHEADER (whose total size is 40).
args.src.skip_u32?(n: 40 - 20)
+ if this.bitmap_info_len == 40 {
+ if this.bits_per_pixel >= 16 {
+ // It's poorly documented, but "length 40" data can be silently
+ // augmented with RGB or RGBA channel_masks (12 or 16 bytes).
+ if this.padding >= 16 {
+ this.bitmap_info_len = 56
+ this.padding -= 16
+ } else if this.padding >= 12 {
+ this.bitmap_info_len = 52
+ this.padding -= 12
+ }
+ }
+ } else if (this.bitmap_info_len <> 52) and (this.bitmap_info_len <> 56) and
+ (this.bitmap_info_len <> 108) and (this.bitmap_info_len <> 124) {
+ return "#unsupported BMP file"
+ }
+
// Treat 6 (ALPHABITFIELDS) the same as 3 (BITFIELDS).
if this.compression == 6 {
this.compression = 3