Browse Source

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

Alex Szpakowski 6 years ago
parent
commit
a6f8e7dac6

+ 13 - 5
src/libraries/ddsparse/ddsparse.cpp

@@ -82,19 +82,25 @@ static Format parseDX10Format(DXGIFormat fmt)
 	{
 	case DXGI_FORMAT_BC1_TYPELESS:
 	case DXGI_FORMAT_BC1_UNORM:
-	case DXGI_FORMAT_BC1_UNORM_SRGB:
 		f = FORMAT_DXT1;
 		break;
+	case DXGI_FORMAT_BC1_UNORM_SRGB:
+		f = FORMAT_DXT1srgb;
+		break;
 	case DXGI_FORMAT_BC2_TYPELESS:
 	case DXGI_FORMAT_BC2_UNORM:
-	case DXGI_FORMAT_BC2_UNORM_SRGB:
 		f = FORMAT_DXT3;
 		break;
+	case DXGI_FORMAT_BC2_UNORM_SRGB:
+		f = FORMAT_DXT3srgb;
+		break;
 	case DXGI_FORMAT_BC3_TYPELESS:
 	case DXGI_FORMAT_BC3_UNORM:
-	case DXGI_FORMAT_BC3_UNORM_SRGB:
 		f = FORMAT_DXT5;
 		break;
+	case DXGI_FORMAT_BC3_UNORM_SRGB:
+		f = FORMAT_DXT5srgb;
+		break;
 	case DXGI_FORMAT_BC4_TYPELESS:
 	case DXGI_FORMAT_BC4_UNORM:
 		f = FORMAT_BC4;
@@ -126,7 +132,7 @@ static Format parseDX10Format(DXGIFormat fmt)
 	default:
 		break;
 	}
-	
+
 	return f;
 }
 
@@ -147,7 +153,6 @@ bool isDDS(const void *data, size_t dataSize)
 
 	DDSHeader *header = (DDSHeader *) &readData[offset];
 
-
 	// Verify header to validate DDS data.
 	if (header->size != sizeof(DDSHeader) || header->format.size != sizeof(DDSPixelFormat))
 		return false;
@@ -242,12 +247,15 @@ size_t Parser::parseImageSize(Format fmt, int width, int height) const
 	switch (fmt)
 	{
 	case FORMAT_DXT1:
+	case FORMAT_DXT1srgb:
 	case FORMAT_BC4:
 	case FORMAT_BC4s:
 		numBytesPerBlock = 8;
 		break;
 	case FORMAT_DXT3:
+	case FORMAT_DXT3srgb:
 	case FORMAT_DXT5:
+	case FORMAT_DXT5srgb:
 	case FORMAT_BC5s:
 	case FORMAT_BC5:
 	case FORMAT_BC6H:

+ 3 - 0
src/libraries/ddsparse/ddsparse.h

@@ -36,8 +36,11 @@ namespace dds
 enum Format
 {
 	FORMAT_DXT1,
+	FORMAT_DXT1srgb,
 	FORMAT_DXT3,
+	FORMAT_DXT3srgb,
 	FORMAT_DXT5,
+	FORMAT_DXT5srgb,
 	FORMAT_BC4,
 	FORMAT_BC4s,
 	FORMAT_BC5,

+ 9 - 0
src/modules/image/magpie/ddsHandler.cpp

@@ -96,10 +96,19 @@ PixelFormat DDSHandler::convertFormat(dds::Format ddsformat, bool &sRGB)
 	{
 	case dds::FORMAT_DXT1:
 		return PIXELFORMAT_DXT1;
+	case dds::FORMAT_DXT1srgb:
+		sRGB = true;
+		return PIXELFORMAT_DXT1;
 	case dds::FORMAT_DXT3:
 		return PIXELFORMAT_DXT3;
+	case dds::FORMAT_DXT3srgb:
+		sRGB = true;
+		return PIXELFORMAT_DXT3;
 	case dds::FORMAT_DXT5:
 		return PIXELFORMAT_DXT5;
+	case dds::FORMAT_DXT5srgb:
+		sRGB = true;
+		return PIXELFORMAT_DXT5;
 	case dds::FORMAT_BC4:
 		return PIXELFORMAT_BC4;
 	case dds::FORMAT_BC4s: