Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }