From 819aca0f1cbc71255fa28923c94a283db85a2201 Mon Sep 17 00:00:00 2001 From: janwas Date: Sun, 4 Sep 2005 20:05:21 +0000 Subject: [PATCH] work around flaw in some DDS headers (not setting alpha flag). this is critical because renderer/GUI code now uses TEX_ALPHA flag instead of just checking against all known GL formats containing alpha This was SVN commit r2663. --- source/lib/res/graphics/tex_dds.cpp | 33 +++++++++++++++++------------ 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/source/lib/res/graphics/tex_dds.cpp b/source/lib/res/graphics/tex_dds.cpp index a7d12e8677..dc304328b1 100644 --- a/source/lib/res/graphics/tex_dds.cpp +++ b/source/lib/res/graphics/tex_dds.cpp @@ -241,35 +241,42 @@ fail: if(!(sd_flags & DDSD_MIPMAPCOUNT)) mipmaps = 0; - // MS DXTex tool doesn't set the required dwPitchOrLinearSize field - - // they can't even write out their own file format correctly. *sigh* - // we need to pass it to OpenGL; it's calculated from w, h, and bpp, - // which we determine from the pixel format. + + // determine flags and bpp. + // we store DXT format (one of {1,3,5}) in flags & TEX_DXT. + // + // unfortunately there are problems with some DDS headers: + // - DXTex doesn't set the required dwPitchOrLinearSize field - + // MS can't even write out their own file format correctly. *sigh* + // it's needed by OpenGL, so we calculate it from w, h, and bpp. + // - pf_flags & DDPF_ALPHAPIXELS can only be used to check for + // DXT1a (the only way to detect it); we have observed some DXT3 files + // that don't have it set. grr int bpp = 0; int flags = 0; - - if(pf_flags & DDPF_ALPHAPIXELS) - flags |= TEX_ALPHA; - switch(fourcc) { case FOURCC('D','X','T','1'): bpp = 4; - flags |= 1; // bits in TEX_DXT mask indicate format + flags |= 1; + if(pf_flags & DDPF_ALPHAPIXELS) + flags |= TEX_ALPHA; break; case FOURCC('D','X','T','3'): bpp = 8; - flags |= 3; // " + flags |= 3; + flags |= TEX_ALPHA; break; case FOURCC('D','X','T','5'): bpp = 8; - flags |= 5; // " + flags |= 5; + flags |= TEX_ALPHA; break; } - if(mipmaps) flags |= TEX_MIPMAPS; + // sanity checks const char* err = 0; if(file_size < hdr_size + img_size) @@ -301,7 +308,7 @@ fail: } -static int dds_encode(const char* UNUSED(ext), Tex* UNUSED(t), u8** UNUSED(out), size_t* UNUSED(out_size), const char** perr_msg) +static int dds_encode(const char* UNUSED(ext), Tex* UNUSED(t), u8** UNUSED(out), size_t* UNUSED(out_size), const char** UNUSED(perr_msg)) { return ERR_NOT_IMPLEMENTED; }