Browse Source

Merge pull request #30655 from Xrayez/bmp-compression-fix

Fix BMP loader to distinguish between compression types
Rémi Verschelde 6 years ago
parent
commit
72b5a9e476
2 changed files with 14 additions and 12 deletions
  1. 10 8
      modules/bmp/image_loader_bmp.cpp
  2. 4 4
      modules/bmp/image_loader_bmp.h

+ 10 - 8
modules/bmp/image_loader_bmp.cpp

@@ -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 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
 
 		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_important_colors = f->get_32();
 
-			// Compressed bitmaps not supported, stop parsing
-			if (bmp_header.bmp_info_header.bmp_compression != BI_RGB) {
-				ERR_EXPLAIN("Unsupported bmp file: " + f->get_path());
-				f->close();
-				ERR_FAIL_V(ERR_UNAVAILABLE);
+			switch (bmp_header.bmp_info_header.bmp_compression) {
+				case BI_RLE8:
+				case BI_RLE4:
+				case BI_CMYKRLE8:
+				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
 			// adds 2 bytes offset leading to misaligned color table reading

+ 4 - 4
modules/bmp/image_loader_bmp.h

@@ -42,15 +42,15 @@ protected:
 
 	enum bmp_compression_s {
 		BI_RGB = 0x00,
-		BI_RLE8 = 0x01,
-		BI_RLE4 = 0x02,
+		BI_RLE8 = 0x01, // compressed
+		BI_RLE4 = 0x02, // compressed
 		BI_BITFIELDS = 0x03,
 		BI_JPEG = 0x04,
 		BI_PNG = 0x05,
 		BI_ALPHABITFIELDS = 0x06,
 		BI_CMYK = 0x0b,
-		BI_CMYKRLE8 = 0x0c,
-		BI_CMYKRLE4 = 0x0d
+		BI_CMYKRLE8 = 0x0c, // compressed
+		BI_CMYKRLE4 = 0x0d // compressed
 	};
 
 	struct bmp_header_s {