From 2555165f22fef99419153aac5b57bc9ab6af7b54 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Wed, 13 Jul 2011 14:56:21 +0200 Subject: [PATCH] decoder: decode S2TC DXT1 correctly --- s2tc_libtxc_dxtn.c | 62 ++++++++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/s2tc_libtxc_dxtn.c b/s2tc_libtxc_dxtn.c index d6edef4..2d0232a 100644 --- a/s2tc_libtxc_dxtn.c +++ b/s2tc_libtxc_dxtn.c @@ -10,10 +10,19 @@ void fetch_2d_texel_rgb_dxt1(GLint srcRowStride, const GLubyte *pixdata, // fetches a single texel (i,j) into pixdata (RGB) GLubyte *t = texel; const GLubyte *blksrc = (pixdata + ((srcRowStride + 3) / 4 * (j / 4) + (i / 4)) * 8); - unsigned int c = blksrc[0] + 256*blksrc[1] + 65536*blksrc[2] + 16777216*blksrc[3]; - t[0] = (((c >> 11) & 0x1F) + ((c >> 27) & 0x1F)) * (0.5f / 31.0f * 255.0f); - t[1] = (((c >> 5) & 0x3F) + ((c >> 21) & 0x3F)) * (0.5f / 63.0f * 255.0f); - t[2] = (((c ) & 0x1F) + ((c >> 16) & 0x1F)) * (0.5f / 31.0f * 255.0f); + unsigned int c = blksrc[0] + 256*blksrc[1]; + unsigned int c1 = blksrc[2] + 256*blksrc[3]; + int b = blksrc[4 + j] >> (2 * i); + switch(b) + { + case 0: break; + case 1: c = c1; break; + case 3: if(c1 > c) { c = 0; break; } + default: if(rand() & 1) c = c1; break; + } + t[0] = ((c >> 11) & 0x1F) << 3; + t[1] = ((c >> 5) & 0x3F) << 2; + t[2] = ((c ) & 0x1F) << 3; } void fetch_2d_texel_rgba_dxt1(GLint srcRowStride, const GLubyte *pixdata, @@ -22,46 +31,31 @@ void fetch_2d_texel_rgba_dxt1(GLint srcRowStride, const GLubyte *pixdata, // fetches a single texel (i,j) into pixdata (RGBA) GLubyte *t = texel; const GLubyte *blksrc = (pixdata + ((srcRowStride + 3) / 4 * (j / 4) + (i / 4)) * 8); - unsigned int c = blksrc[0] + 256*blksrc[1] + 65536*blksrc[2] + 16777216*blksrc[3]; - t[0] = (((c >> 11) & 0x1F) + ((c >> 27) & 0x1F)) * (0.5f / 31.0f * 255.0f); - t[1] = (((c >> 5) & 0x3F) + ((c >> 21) & 0x3F)) * (0.5f / 63.0f * 255.0f); - t[2] = (((c ) & 0x1F) + ((c >> 16) & 0x1F)) * (0.5f / 31.0f * 255.0f); - t[3] = 255; + unsigned int c = blksrc[0] + 256*blksrc[1]; + unsigned int c1 = blksrc[2] + 256*blksrc[3]; + int b = blksrc[4 + j] >> (2 * i); + switch(b) + { + case 0: t[3] = 255; break; + case 1: c = c1; t[3] = 255; break; + case 3: if(c1 > c) { c = 0; t[3] = 0; break; } + default: if(rand() & 1) c = c1; t[3] = 255; break; + } + t[0] = ((c >> 11) & 0x1F) << 3; + t[1] = ((c >> 5) & 0x3F) << 2; + t[2] = ((c ) & 0x1F) << 3; } void fetch_2d_texel_rgba_dxt3(GLint srcRowStride, const GLubyte *pixdata, GLint i, GLint j, GLvoid *texel) { - // fetches a single texel (i,j) into pixdata (RGBA) - GLubyte *t = texel; - const GLubyte *blksrc = (pixdata + ((srcRowStride + 3) / 4 * (j / 4) + (i / 4)) * 16) + 8; - unsigned int c = blksrc[0] + 256*blksrc[1] + 65536*blksrc[2] + 16777216*blksrc[3]; - t[0] = (((c >> 11) & 0x1F) + ((c >> 27) & 0x1F)) * (0.5f / 31.0f * 255.0f); - t[1] = (((c >> 5) & 0x3F) + ((c >> 21) & 0x3F)) * (0.5f / 63.0f * 255.0f); - t[2] = (((c ) & 0x1F) + ((c >> 16) & 0x1F)) * (0.5f / 31.0f * 255.0f); - t[3] = ( - (blksrc[-8] & 0x0F) - + (blksrc[-8] >> 4) - + (blksrc[-7] & 0x0F) - + (blksrc[-7] >> 4) - + (blksrc[-6] & 0x0F) - + (blksrc[-6] >> 4) - + (blksrc[-5] & 0x0F) - + (blksrc[-5] >> 4) - ) * (0.125f / 15.0f * 255.0f); + // TODO } void fetch_2d_texel_rgba_dxt5(GLint srcRowStride, const GLubyte *pixdata, GLint i, GLint j, GLvoid *texel) { - // fetches a single texel (i,j) into pixdata (RGBA) - GLubyte *t = texel; - const GLubyte *blksrc = (pixdata + ((srcRowStride + 3) / 4 * (j / 4) + (i / 4)) * 16) + 8; - unsigned int c = blksrc[0] + 256*blksrc[1] + 65536*blksrc[2] + 16777216*blksrc[3]; - t[0] = (((c >> 11) & 0x1F) + ((c >> 27) & 0x1F)) * (0.5f / 31.0f * 255.0f); - t[1] = (((c >> 5) & 0x3F) + ((c >> 21) & 0x3F)) * (0.5f / 63.0f * 255.0f); - t[2] = (((c ) & 0x1F) + ((c >> 16) & 0x1F)) * (0.5f / 31.0f * 255.0f); - t[3] = (0.5 * blksrc[-8] + 0.5 * blksrc[-7]); + // TODO } void tx_compress_dxtn(GLint srccomps, GLint width, GLint height, -- 2.11.0