rendered paste bodyvoid decompressDXTC(GLint format, int w, int h, size_t size, unsigned char *src, unsigned char *dest)
{
// sort of copied from linghuye
int bsx = (w<4) ? w : 4;
int bsy = (h<4) ? h : 4;
for(int y=0; y<h; y += bsy) {
for(int x=0; x<w; x += bsx) {
unsigned long long alpha = 0;
unsigned int a0 = 0, a1 = 0;
if (format == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT) {
alpha = *(unsigned long long*)src;
src += 8;
}
unsigned int c0 = *(unsigned short*)(src + 0);
unsigned int c1 = *(unsigned short*)(src + 2);
src += 4;
Color color[4];
color[0].b = (unsigned char) ((c0 >> 11) & 0x1f) << 3;
color[0].g = (unsigned char) ((c0 >> 5) & 0x3f) << 2;
color[0].r = (unsigned char) ((c0 ) & 0x1f) << 3;
color[1].b = (unsigned char) ((c1 >> 11) & 0x1f) << 3;
color[1].g = (unsigned char) ((c1 >> 5) & 0x3f) << 2;
color[1].r = (unsigned char) ((c1 ) & 0x1f) << 3;
if(c0 > c1) {
color[2].r = (color[0].r * 2 + color[1].r) / 3;
color[2].g = (color[0].g * 2 + color[1].g) / 3;
color[2].b = (color[0].b * 2 + color[1].b) / 3;
color[3].r = (color[0].r + color[1].r * 2) / 3;
color[3].g = (color[0].g + color[1].g * 2) / 3;
color[3].b = (color[0].b + color[1].b * 2) / 3;
} else {
color[2].r = (color[0].r + color[1].r) / 2;
color[2].g = (color[0].g + color[1].g) / 2;
color[2].b = (color[0].b + color[1].b) / 2;
color[3].r = 0;
color[3].g = 0;
color[3].b = 0;
}
for (int j=0; j<bsy; j++) {
unsigned int index = *src++;
unsigned char* dd = dest + (w*(y+j)+x)*4;
for (int i=0; i<bsx; i++) {
*dd++ = color[index & 0x03].b;
*dd++ = color[index & 0x03].g;
*dd++ = color[index & 0x03].r;
if (format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) {
*dd++ = ((index & 0x03) == 3 && c0 <= c1) ? 0 : 255;
}
else if (format == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT) {
*dd++ = (unsigned char)(alpha & 0x0f) << 4;
alpha >>= 4;
}
index >>= 2;
}
}
}
}
}