private static byte[] DecompressDxt1(byte[] src, uint width, uint height) { uint dataOffset = 0; byte[] finalData = new byte[width * height * 4]; for (int y = 0; y < height; y += 4) { for (int x = 0; x < width; x += 4) { UInt16 color1 = FSHelpers.Read16Swap(src, dataOffset); UInt16 color2 = FSHelpers.Read16Swap(src, dataOffset + 2); UInt32 bits = FSHelpers.Read32Swap(src, dataOffset + 4); dataOffset += 8; byte[][] ColorTable = new byte[4][]; for (int i = 0; i < 4; i++) { ColorTable[i] = new byte[4]; } RGB565ToRGBA8(color1, ref ColorTable[0], 0); RGB565ToRGBA8(color2, ref ColorTable[1], 0); if (color1 > color2) { ColorTable[2][0] = (byte)((2 * ColorTable[0][0] + ColorTable[1][0] + 1) / 3); ColorTable[2][1] = (byte)((2 * ColorTable[0][1] + ColorTable[1][1] + 1) / 3); ColorTable[2][2] = (byte)((2 * ColorTable[0][2] + ColorTable[1][2] + 1) / 3); ColorTable[2][3] = 0xFF; ColorTable[3][0] = (byte)((ColorTable[0][0] + 2 * ColorTable[1][0] + 1) / 3); ColorTable[3][1] = (byte)((ColorTable[0][1] + 2 * ColorTable[1][1] + 1) / 3); ColorTable[3][2] = (byte)((ColorTable[0][2] + 2 * ColorTable[1][2] + 1) / 3); ColorTable[3][3] = 0xFF; } else { ColorTable[2][0] = (byte)((ColorTable[0][0] + ColorTable[1][0] + 1) / 2); ColorTable[2][1] = (byte)((ColorTable[0][1] + ColorTable[1][1] + 1) / 2); ColorTable[2][2] = (byte)((ColorTable[0][2] + ColorTable[1][2] + 1) / 2); ColorTable[2][3] = 0xFF; ColorTable[3][0] = (byte)((ColorTable[0][0] + 2 * ColorTable[1][0] + 1) / 3); ColorTable[3][1] = (byte)((ColorTable[0][1] + 2 * ColorTable[1][1] + 1) / 3); ColorTable[3][2] = (byte)((ColorTable[0][2] + 2 * ColorTable[1][2] + 1) / 3); ColorTable[3][3] = 0x00; } for (int iy = 0; iy < 4; ++iy) { for (int ix = 0; ix < 4; ++ix) { if (((x + ix) < width) && ((y + iy) < height)) { int di = (int)(4 * ((y + iy) * width + x + ix)); int si = (int)(bits & 0x3); finalData[di + 0] = ColorTable[si][0]; finalData[di + 1] = ColorTable[si][1]; finalData[di + 2] = ColorTable[si][2]; finalData[di + 3] = ColorTable[si][3]; } bits >>= 2; } } } } return(finalData); }