Fix BMP loader to distinguish between compression types
Some of the values in compression enumeration represent uncompressed formats: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-wmf/4e588f70-bd92-4a6f-b77f-35d0feaf7a57 This allows the loader to proceed with uncompressed formats. Note that loading compressed BMP's is still not supported.
This commit is contained in:
parent
d087a9e328
commit
422a8ffe02
2 changed files with 14 additions and 12 deletions
|
@ -47,9 +47,6 @@ Error ImageLoaderBMP::convert_to_image(Ref<Image> p_image,
|
||||||
size_t height = (size_t)p_header.bmp_info_header.bmp_height;
|
size_t height = (size_t)p_header.bmp_info_header.bmp_height;
|
||||||
size_t bits_per_pixel = (size_t)p_header.bmp_info_header.bmp_bit_count;
|
size_t bits_per_pixel = (size_t)p_header.bmp_info_header.bmp_bit_count;
|
||||||
|
|
||||||
if (p_header.bmp_info_header.bmp_compression != BI_RGB) {
|
|
||||||
err = FAILED;
|
|
||||||
}
|
|
||||||
// Check whether we can load it
|
// Check whether we can load it
|
||||||
|
|
||||||
if (bits_per_pixel == 1) {
|
if (bits_per_pixel == 1) {
|
||||||
|
@ -238,11 +235,16 @@ Error ImageLoaderBMP::load_image(Ref<Image> p_image, FileAccess *f,
|
||||||
bmp_header.bmp_info_header.bmp_colors_used = f->get_32();
|
bmp_header.bmp_info_header.bmp_colors_used = f->get_32();
|
||||||
bmp_header.bmp_info_header.bmp_important_colors = f->get_32();
|
bmp_header.bmp_info_header.bmp_important_colors = f->get_32();
|
||||||
|
|
||||||
// Compressed bitmaps not supported, stop parsing
|
switch (bmp_header.bmp_info_header.bmp_compression) {
|
||||||
if (bmp_header.bmp_info_header.bmp_compression != BI_RGB) {
|
case BI_RLE8:
|
||||||
ERR_EXPLAIN("Unsupported bmp file: " + f->get_path());
|
case BI_RLE4:
|
||||||
f->close();
|
case BI_CMYKRLE8:
|
||||||
ERR_FAIL_V(ERR_UNAVAILABLE);
|
case BI_CMYKRLE4: {
|
||||||
|
// Stop parsing
|
||||||
|
ERR_EXPLAIN("Compressed BMP files are not supported: " + f->get_path());
|
||||||
|
f->close();
|
||||||
|
ERR_FAIL_V(ERR_UNAVAILABLE);
|
||||||
|
} break;
|
||||||
}
|
}
|
||||||
// Don't rely on sizeof(bmp_file_header) as structure padding
|
// Don't rely on sizeof(bmp_file_header) as structure padding
|
||||||
// adds 2 bytes offset leading to misaligned color table reading
|
// adds 2 bytes offset leading to misaligned color table reading
|
||||||
|
|
|
@ -42,15 +42,15 @@ protected:
|
||||||
|
|
||||||
enum bmp_compression_s {
|
enum bmp_compression_s {
|
||||||
BI_RGB = 0x00,
|
BI_RGB = 0x00,
|
||||||
BI_RLE8 = 0x01,
|
BI_RLE8 = 0x01, // compressed
|
||||||
BI_RLE4 = 0x02,
|
BI_RLE4 = 0x02, // compressed
|
||||||
BI_BITFIELDS = 0x03,
|
BI_BITFIELDS = 0x03,
|
||||||
BI_JPEG = 0x04,
|
BI_JPEG = 0x04,
|
||||||
BI_PNG = 0x05,
|
BI_PNG = 0x05,
|
||||||
BI_ALPHABITFIELDS = 0x06,
|
BI_ALPHABITFIELDS = 0x06,
|
||||||
BI_CMYK = 0x0b,
|
BI_CMYK = 0x0b,
|
||||||
BI_CMYKRLE8 = 0x0c,
|
BI_CMYKRLE8 = 0x0c, // compressed
|
||||||
BI_CMYKRLE4 = 0x0d
|
BI_CMYKRLE4 = 0x0d // compressed
|
||||||
};
|
};
|
||||||
|
|
||||||
struct bmp_header_s {
|
struct bmp_header_s {
|
||||||
|
|
Loading…
Reference in a new issue