Improve detection of sRGB texture formats in dds files (doesn't currently affect any exposed API).

This commit is contained in:
Alex Szpakowski
2019-09-15 19:08:25 -03:00
parent 33bc8aabfc
commit a6f8e7dac6
3 changed files with 25 additions and 5 deletions
+13 -5
View File
@@ -82,19 +82,25 @@ static Format parseDX10Format(DXGIFormat fmt)
{ {
case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_TYPELESS:
case DXGI_FORMAT_BC1_UNORM: case DXGI_FORMAT_BC1_UNORM:
case DXGI_FORMAT_BC1_UNORM_SRGB:
f = FORMAT_DXT1; f = FORMAT_DXT1;
break; break;
case DXGI_FORMAT_BC1_UNORM_SRGB:
f = FORMAT_DXT1srgb;
break;
case DXGI_FORMAT_BC2_TYPELESS: case DXGI_FORMAT_BC2_TYPELESS:
case DXGI_FORMAT_BC2_UNORM: case DXGI_FORMAT_BC2_UNORM:
case DXGI_FORMAT_BC2_UNORM_SRGB:
f = FORMAT_DXT3; f = FORMAT_DXT3;
break; break;
case DXGI_FORMAT_BC2_UNORM_SRGB:
f = FORMAT_DXT3srgb;
break;
case DXGI_FORMAT_BC3_TYPELESS: case DXGI_FORMAT_BC3_TYPELESS:
case DXGI_FORMAT_BC3_UNORM: case DXGI_FORMAT_BC3_UNORM:
case DXGI_FORMAT_BC3_UNORM_SRGB:
f = FORMAT_DXT5; f = FORMAT_DXT5;
break; break;
case DXGI_FORMAT_BC3_UNORM_SRGB:
f = FORMAT_DXT5srgb;
break;
case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_TYPELESS:
case DXGI_FORMAT_BC4_UNORM: case DXGI_FORMAT_BC4_UNORM:
f = FORMAT_BC4; f = FORMAT_BC4;
@@ -126,7 +132,7 @@ static Format parseDX10Format(DXGIFormat fmt)
default: default:
break; break;
} }
return f; return f;
} }
@@ -147,7 +153,6 @@ bool isDDS(const void *data, size_t dataSize)
DDSHeader *header = (DDSHeader *) &readData[offset]; DDSHeader *header = (DDSHeader *) &readData[offset];
// Verify header to validate DDS data. // Verify header to validate DDS data.
if (header->size != sizeof(DDSHeader) || header->format.size != sizeof(DDSPixelFormat)) if (header->size != sizeof(DDSHeader) || header->format.size != sizeof(DDSPixelFormat))
return false; return false;
@@ -242,12 +247,15 @@ size_t Parser::parseImageSize(Format fmt, int width, int height) const
switch (fmt) switch (fmt)
{ {
case FORMAT_DXT1: case FORMAT_DXT1:
case FORMAT_DXT1srgb:
case FORMAT_BC4: case FORMAT_BC4:
case FORMAT_BC4s: case FORMAT_BC4s:
numBytesPerBlock = 8; numBytesPerBlock = 8;
break; break;
case FORMAT_DXT3: case FORMAT_DXT3:
case FORMAT_DXT3srgb:
case FORMAT_DXT5: case FORMAT_DXT5:
case FORMAT_DXT5srgb:
case FORMAT_BC5s: case FORMAT_BC5s:
case FORMAT_BC5: case FORMAT_BC5:
case FORMAT_BC6H: case FORMAT_BC6H:
+3
View File
@@ -36,8 +36,11 @@ namespace dds
enum Format enum Format
{ {
FORMAT_DXT1, FORMAT_DXT1,
FORMAT_DXT1srgb,
FORMAT_DXT3, FORMAT_DXT3,
FORMAT_DXT3srgb,
FORMAT_DXT5, FORMAT_DXT5,
FORMAT_DXT5srgb,
FORMAT_BC4, FORMAT_BC4,
FORMAT_BC4s, FORMAT_BC4s,
FORMAT_BC5, FORMAT_BC5,
+9
View File
@@ -96,10 +96,19 @@ PixelFormat DDSHandler::convertFormat(dds::Format ddsformat, bool &sRGB)
{ {
case dds::FORMAT_DXT1: case dds::FORMAT_DXT1:
return PIXELFORMAT_DXT1; return PIXELFORMAT_DXT1;
case dds::FORMAT_DXT1srgb:
sRGB = true;
return PIXELFORMAT_DXT1;
case dds::FORMAT_DXT3: case dds::FORMAT_DXT3:
return PIXELFORMAT_DXT3; return PIXELFORMAT_DXT3;
case dds::FORMAT_DXT3srgb:
sRGB = true;
return PIXELFORMAT_DXT3;
case dds::FORMAT_DXT5: case dds::FORMAT_DXT5:
return PIXELFORMAT_DXT5; return PIXELFORMAT_DXT5;
case dds::FORMAT_DXT5srgb:
sRGB = true;
return PIXELFORMAT_DXT5;
case dds::FORMAT_BC4: case dds::FORMAT_BC4:
return PIXELFORMAT_BC4; return PIXELFORMAT_BC4;
case dds::FORMAT_BC4s: case dds::FORMAT_BC4s: