DDS: Fix loading files without DDSD_CAPS or DDSD_PIXELFORMAT

MSDN says:

> When you write .dds files, you should set the DDSD_CAPS and
> DDSD_PIXELFORMAT flags, and for mipmapped textures you should also
> set the DDSD_MIPMAPCOUNT flag. However, when you read a .dds file,
> you should not rely on the DDSD_CAPS, DDSD_PIXELFORMAT, and
> DDSD_MIPMAPCOUNT flags being set because some writers of such a file
> might not set these flags.

https://docs.microsoft.com/en-us/windows/win32/direct3ddds/dds-header

¯\_(ツ)_/¯

Fixes #39516.

(cherry picked from commit 0f21249a2d)
This commit is contained in:
Rémi Verschelde 2020-06-15 13:10:21 +02:00
parent 4d7ac36e84
commit d8b543c991
1 changed files with 6 additions and 5 deletions

View File

@ -29,14 +29,15 @@
/*************************************************************************/ /*************************************************************************/
#include "texture_loader_dds.h" #include "texture_loader_dds.h"
#include "core/os/file_access.h" #include "core/os/file_access.h"
#define PF_FOURCC(s) ((uint32_t)(((s)[3] << 24U) | ((s)[2] << 16U) | ((s)[1] << 8U) | ((s)[0]))) #define PF_FOURCC(s) ((uint32_t)(((s)[3] << 24U) | ((s)[2] << 16U) | ((s)[1] << 8U) | ((s)[0])))
// Reference: https://docs.microsoft.com/en-us/windows/win32/direct3ddds/dds-header
enum { enum {
DDS_MAGIC = 0x20534444, DDS_MAGIC = 0x20534444,
DDSD_CAPS = 0x00000001,
DDSD_PIXELFORMAT = 0x00001000,
DDSD_PITCH = 0x00000008, DDSD_PITCH = 0x00000008,
DDSD_LINEARSIZE = 0x00080000, DDSD_LINEARSIZE = 0x00080000,
DDSD_MIPMAPCOUNT = 0x00020000, DDSD_MIPMAPCOUNT = 0x00020000,
@ -47,7 +48,6 @@ enum {
}; };
enum DDSFormat { enum DDSFormat {
DDS_DXT1, DDS_DXT1,
DDS_DXT3, DDS_DXT3,
DDS_DXT5, DDS_DXT5,
@ -125,8 +125,9 @@ RES ResourceFormatDDS::load(const String &p_path, const String &p_original_path,
//validate //validate
if (magic != DDS_MAGIC || hsize != 124 || !(flags & DDSD_PIXELFORMAT) || !(flags & DDSD_CAPS)) { // We don't check DDSD_CAPS or DDSD_PIXELFORMAT, as they're mandatory when writing,
// but non-mandatory when reading (as some writers don't set them)...
if (magic != DDS_MAGIC || hsize != 124) {
ERR_FAIL_V_MSG(RES(), "Invalid or unsupported DDS texture file '" + p_path + "'."); ERR_FAIL_V_MSG(RES(), "Invalid or unsupported DDS texture file '" + p_path + "'.");
} }