2
0
Эх сурвалжийг харах

Fix Squish decompression, closes #18109

Juan Linietsky 6 жил өмнө
parent
commit
f141f747de

+ 9 - 0
core/image.cpp

@@ -1766,6 +1766,15 @@ int Image::get_image_required_mipmaps(int p_width, int p_height, Format p_format
 	return mm;
 }
 
+int Image::get_image_mipmap_offset(int p_width, int p_height, Format p_format, int p_mipmap) {
+
+	if (p_mipmap <= 0) {
+		return 0;
+	}
+	int mm;
+	return _get_dst_image_size(p_width, p_height, p_format, mm, p_mipmap - 1);
+}
+
 bool Image::is_compressed() const {
 	return format > FORMAT_RGBE9995;
 }

+ 1 - 0
core/image.h

@@ -286,6 +286,7 @@ public:
 
 	static int get_image_data_size(int p_width, int p_height, Format p_format, bool p_mipmaps = false);
 	static int get_image_required_mipmaps(int p_width, int p_height, Format p_format);
+	static int get_image_mipmap_offset(int p_width, int p_height, Format p_format, int p_mipmap);
 
 	enum CompressMode {
 		COMPRESS_S3TC,

+ 4 - 3
modules/squish/image_compress_squish.cpp

@@ -64,12 +64,13 @@ void image_decompress_squish(Image *p_image) {
 		return;
 	}
 
-	int dst_ofs = 0;
-
 	for (int i = 0; i <= mm_count; i++) {
 		int src_ofs = 0, mipmap_size = 0, mipmap_w = 0, mipmap_h = 0;
 		p_image->get_mipmap_offset_size_and_dimensions(i, src_ofs, mipmap_size, mipmap_w, mipmap_h);
-		squish::DecompressImage(&wb[dst_ofs], mipmap_w, mipmap_h, &rb[src_ofs], squish_flags);
+		int dst_ofs = Image::get_image_mipmap_offset(p_image->get_width(), p_image->get_height(), target_format, i);
+		squish::DecompressImage(&wb[dst_ofs], w, h, &rb[src_ofs], squish_flags);
+		w >>= 1;
+		h >>= 1;
 	}
 
 	p_image->create(p_image->get_width(), p_image->get_height(), p_image->has_mipmaps(), target_format, data);