From 98343c572f9bdb20e0471d18a26ede0b7d0c5a63 Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Mon, 28 Nov 2016 18:09:22 -0800 Subject: [PATCH] Fix for DDS header over-validation --- DirectXTex/DirectXTexDDS.cpp | 52 +++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/DirectXTex/DirectXTexDDS.cpp b/DirectXTex/DirectXTexDDS.cpp index ee9da7a..ce81701 100644 --- a/DirectXTex/DirectXTexDDS.cpp +++ b/DirectXTex/DirectXTexDDS.cpp @@ -154,7 +154,7 @@ namespace { const LegacyDDS* entry = &g_LegacyDDSMap[index]; - if (ddpf.dwFlags & entry->ddpf.dwFlags) + if ((ddpf.dwFlags & entry->ddpf.dwFlags) == entry->ddpf.dwFlags) { if (entry->ddpf.dwFlags & DDS_FOURCC) { @@ -166,15 +166,59 @@ namespace if (ddpf.dwRGBBitCount == entry->ddpf.dwRGBBitCount) break; } - else if (ddpf.dwRGBBitCount == entry->ddpf.dwRGBBitCount) + else if (entry->ddpf.dwFlags & DDS_ALPHA) { - // RGB, RGBA, ALPHA, LUMINANCE - if (ddpf.dwRBitMask == entry->ddpf.dwRBitMask + if (ddpf.dwRGBBitCount == entry->ddpf.dwRGBBitCount + && ddpf.dwABitMask == entry->ddpf.dwABitMask) + break; + } + else if (entry->ddpf.dwFlags & DDS_LUMINANCE) + { + if (entry->ddpf.dwFlags & 0x1 /*DDPF_ALPHAPIXELS*/) + { + // LUMINANCEA + if (ddpf.dwRGBBitCount == entry->ddpf.dwRGBBitCount + && ddpf.dwRBitMask == entry->ddpf.dwRBitMask + && ddpf.dwABitMask == entry->ddpf.dwABitMask) + break; + } + else + { + // LUMINANCE + if (ddpf.dwRGBBitCount == entry->ddpf.dwRGBBitCount + && ddpf.dwRBitMask == entry->ddpf.dwRBitMask) + break; + } + } + else if (entry->ddpf.dwFlags & DDS_BUMPDUDV) + { + if (ddpf.dwRGBBitCount == entry->ddpf.dwRGBBitCount + && ddpf.dwRBitMask == entry->ddpf.dwRBitMask && ddpf.dwGBitMask == entry->ddpf.dwGBitMask && ddpf.dwBBitMask == entry->ddpf.dwBBitMask && ddpf.dwABitMask == entry->ddpf.dwABitMask) break; } + else if (ddpf.dwRGBBitCount == entry->ddpf.dwRGBBitCount) + { + if (entry->ddpf.dwFlags & 0x1 /*DDPF_ALPHAPIXELS*/) + { + // RGBA + if (ddpf.dwRBitMask == entry->ddpf.dwRBitMask + && ddpf.dwGBitMask == entry->ddpf.dwGBitMask + && ddpf.dwBBitMask == entry->ddpf.dwBBitMask + && ddpf.dwABitMask == entry->ddpf.dwABitMask) + break; + } + else + { + // RGB + if (ddpf.dwRBitMask == entry->ddpf.dwRBitMask + && ddpf.dwGBitMask == entry->ddpf.dwGBitMask + && ddpf.dwBBitMask == entry->ddpf.dwBBitMask) + break; + } + } } }