public static Color[] DecodeETC1(ulong Data, ulong Alpha = ~0ul) { Color[] Result = new Color[4 * 4]; bool diffbit = ((Data >> 33) & 1) == 1; bool flipbit = ((Data >> 32) & 1) == 1; //0: |||, 1: |-| int r1, r2, g1, g2, b1, b2; if (diffbit) //'differential' mode { int r = (int)((Data >> 59) & 0x1F); int g = (int)((Data >> 51) & 0x1F); int b = (int)((Data >> 43) & 0x1F); r1 = (r << 3) | ((r & 0x1C) >> 2); g1 = (g << 3) | ((g & 0x1C) >> 2); b1 = (b << 3) | ((b & 0x1C) >> 2); r += (int)((Data >> 56) & 0x7) << 29 >> 29; g += (int)((Data >> 48) & 0x7) << 29 >> 29; b += (int)((Data >> 40) & 0x7) << 29 >> 29; r2 = (r << 3) | ((r & 0x1C) >> 2); g2 = (g << 3) | ((g & 0x1C) >> 2); b2 = (b << 3) | ((b & 0x1C) >> 2); } else //'individual' mode { r1 = (int)((Data >> 60) & 0xF) * 0x11; g1 = (int)((Data >> 52) & 0xF) * 0x11; b1 = (int)((Data >> 44) & 0xF) * 0x11; r2 = (int)((Data >> 56) & 0xF) * 0x11; g2 = (int)((Data >> 48) & 0xF) * 0x11; b2 = (int)((Data >> 40) & 0xF) * 0x11; } int Table1 = (int)((Data >> 37) & 0x7); int Table2 = (int)((Data >> 34) & 0x7); for (int y3 = 0; y3 < 4; y3++) { for (int x3 = 0; x3 < 4; x3++) { //if (x + j + x3 >= physicalwidth) continue; //if (y + i + y3 >= physicalheight) continue; int val = (int)((Data >> (x3 * 4 + y3)) & 0x1); bool neg = ((Data >> (x3 * 4 + y3 + 16)) & 0x1) == 1; uint c; if ((flipbit && y3 < 2) || (!flipbit && x3 < 2)) { int add = ETC1Modifiers[Table1, val] * (neg ? -1 : 1); c = GFXUtil.ToArgb((byte)(((Alpha >> ((x3 * 4 + y3) * 4)) & 0xF) * 0x11), (byte)ColorClamp(r1 + add), (byte)ColorClamp(g1 + add), (byte)ColorClamp(b1 + add)); } else { int add = ETC1Modifiers[Table2, val] * (neg ? -1 : 1); c = GFXUtil.ToArgb((byte)(((Alpha >> ((x3 * 4 + y3) * 4)) & 0xF) * 0x11), (byte)ColorClamp(r2 + add), (byte)ColorClamp(g2 + add), (byte)ColorClamp(b2 + add)); } Result[y3 * 4 + x3] = Color.FromArgb((int)c); //res[(i + y3) * stride + x + j + x3] = c; } } return(Result); }
public static uint[] DecodeDTX1(ushort Color0, ushort Color1, uint Data) { uint[] Palette = new uint[4]; Palette[0] = GFXUtil.ConvertColorFormat(Color0, ColorFormat.RGB565, ColorFormat.ARGB8888); Palette[1] = GFXUtil.ConvertColorFormat(Color1, ColorFormat.RGB565, ColorFormat.ARGB8888); Color a = Color.FromArgb((int)Palette[0]); Color b = Color.FromArgb((int)Palette[1]); if (Color0 > Color1) //1/3 and 2/3 { Palette[2] = GFXUtil.ToColorFormat((a.R * 2 + b.R * 1) / 3, (a.G * 2 + b.G * 1) / 3, (a.B * 2 + b.B * 1) / 3, ColorFormat.ARGB8888); Palette[3] = GFXUtil.ToColorFormat((a.R * 1 + b.R * 2) / 3, (a.G * 1 + b.G * 2) / 3, (a.B * 1 + b.B * 2) / 3, ColorFormat.ARGB8888); } else //1/2 and transparent { Palette[2] = GFXUtil.ToColorFormat((a.R + b.R) / 2, (a.G + b.G) / 2, (a.B + b.B) / 2, ColorFormat.ARGB8888); Palette[3] = 0; } uint[] Result = new uint[4 * 4]; int q = 30; for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { Result[y * 4 + x] = Palette[(Data >> q) & 3]; q -= 2; } } return(Result); }