Fix for DDS header over-validation

This commit is contained in:
Chuck Walbourn 2016-11-28 18:09:22 -08:00
parent c7c21c75d9
commit 98343c572f

View File

@ -154,7 +154,7 @@ namespace
{ {
const LegacyDDS* entry = &g_LegacyDDSMap[index]; 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) if (entry->ddpf.dwFlags & DDS_FOURCC)
{ {
@ -166,15 +166,59 @@ namespace
if (ddpf.dwRGBBitCount == entry->ddpf.dwRGBBitCount) if (ddpf.dwRGBBitCount == entry->ddpf.dwRGBBitCount)
break; break;
} }
else if (ddpf.dwRGBBitCount == entry->ddpf.dwRGBBitCount) else if (entry->ddpf.dwFlags & DDS_ALPHA)
{ {
// RGB, RGBA, ALPHA, LUMINANCE if (ddpf.dwRGBBitCount == entry->ddpf.dwRGBBitCount
if (ddpf.dwRBitMask == entry->ddpf.dwRBitMask && 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.dwGBitMask == entry->ddpf.dwGBitMask
&& ddpf.dwBBitMask == entry->ddpf.dwBBitMask && ddpf.dwBBitMask == entry->ddpf.dwBBitMask
&& ddpf.dwABitMask == entry->ddpf.dwABitMask) && ddpf.dwABitMask == entry->ddpf.dwABitMask)
break; 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;
}
}
} }
} }