Exemplo n.º 1
0
        private static int DdsGetDxtColor1(int c, int a, DdsOrder order)
        {
            var r = Bit5[(c & 0xFC00) >> 11];
            var g = Bit6[(c & 0x07E0) >> 5];
            var b = Bit5[(c & 0x001F)];

            return((a << order.AlphaShift) | (r << order.RedShift) | (g << order.GreenShift) | (b << order.BlueShift));
        }
Exemplo n.º 2
0
        private static int ddsGetDXTColor1_1(int c0, int c1, int a, DdsOrder order)
        {
            // (c0+c1) / 2
            var r = (Bit5[(c0 & 0xFC00) >> 11] + Bit5[(c1 & 0xFC00) >> 11]) / 2;
            var g = (Bit6[(c0 & 0x07E0) >> 5] + Bit6[(c1 & 0x07E0) >> 5]) / 2;
            var b = (Bit5[c0 & 0x001F] + Bit5[c1 & 0x001F]) / 2;

            return((a << order.AlphaShift) | (r << order.RedShift) | (g << order.GreenShift) | (b << order.BlueShift));
        }
Exemplo n.º 3
0
        private static int DdsGetDxtColor(int c0, int c1, int a, int t, DdsOrder order)
        {
            switch (t)
            {
            case 0: return(DdsGetDxtColor1(c0, a, order));

            case 1: return(DdsGetDxtColor1(c1, a, order));

            case 2: return((c0 > c1) ? ddsGetDXTColor2_1(c0, c1, a, order) : ddsGetDXTColor1_1(c0, c1, a, order));

            case 3: return((c0 > c1) ? ddsGetDXTColor2_1(c1, c0, a, order) : 0);
            }
            return(0);
        }
Exemplo n.º 4
0
        private static int[] DdsReadX8R8G8B8(int width, int height, int offset, byte[] buffer, DdsOrder order)
        {
            var index = offset;

            int[] pixels = new int [4 * width * height];
            for (int i = 0; i < height * width; i++)
            {
                var b = buffer[index++] & 0xFF;
                var g = buffer[index++] & 0xFF;
                var r = buffer[index++] & 0xFF;
                var a = 255;
                index++;
                pixels[i] = (a << order.AlphaShift) | (r << order.RedShift) | (g << order.GreenShift) |
                            (b << order.BlueShift);
            }
            return(pixels);
        }
Exemplo n.º 5
0
        private static int[] DdsReadX4R4G4B4(int width, int height, int offset, byte[] buffer, DdsOrder order)
        {
            var index  = offset;
            var pixels = new int [4 * width * height];

            for (var i = 0; i < height * width; i++)
            {
                var rgba = (buffer[index] & 0xFF) | (buffer[index + 1] & 0xFF) << 8;
                index += 2;
                var       r = 17 * ((rgba & A4R4G4B4Masks[0]) >> 8);
                var       g = 17 * ((rgba & A4R4G4B4Masks[1]) >> 4);
                var       b = 17 * (rgba & A4R4G4B4Masks[2]);
                const int a = 255;
                pixels[i] = (a << order.AlphaShift) | (r << order.RedShift) | (g << order.GreenShift) |
                            (b << order.BlueShift);
            }
            return(pixels);
        }
Exemplo n.º 6
0
        private static int[] DdsReadR5G6B5(int width, int height, int offset, byte[] buffer, DdsOrder order)
        {
            var index  = offset;
            var pixels = new int [4 * width * height];

            for (var i = 0; i < height * width; i++)
            {
                var rgba = (buffer[index] & 0xFF) | (buffer[index + 1] & 0xFF) << 8;
                index += 2;
                var       r = Bit5[((rgba & R5G6B5Masks[0]) >> 11)];
                var       g = Bit6[((rgba & R5G6B5Masks[1]) >> 5)];
                var       b = Bit5[((rgba & R5G6B5Masks[2]))];
                const int a = 255;
                pixels[i] = (a << order.AlphaShift) | (r << order.RedShift) | (g << order.GreenShift) |
                            (b << order.BlueShift);
            }
            return(pixels);
        }
Exemplo n.º 7
0
        private static int[] DdsDecodeDxt5(int width, int height, int offset, byte[] buffer, DdsOrder order)
        {
            var pixels     = new int [4 * width * height];
            var index      = offset;
            var w          = (width + 3) / 4;
            var h          = (height + 3) / 4;
            var alphaTable = new int[16];

            for (var i = 0; i < h; i++)
            {
                for (var j = 0; j < w; j++)
                {
                    // create alpha table
                    var a0 = buffer[index++] & 0xFF;
                    var a1 = buffer[index++] & 0xFF;
                    var b0 = (buffer[index] & 0xFF) | (buffer[index + 1] & 0xFF) << 8 |
                             (buffer[index + 2] & 0xFF) << 16;
                    index += 3;
                    var b1 = (buffer[index] & 0xFF) | (buffer[index + 1] & 0xFF) << 8 |
                             (buffer[index + 2] & 0xFF) << 16;
                    index         += 3;
                    alphaTable[0]  = b0 & 0x07;
                    alphaTable[1]  = (b0 >> 3) & 0x07;
                    alphaTable[2]  = (b0 >> 6) & 0x07;
                    alphaTable[3]  = (b0 >> 9) & 0x07;
                    alphaTable[4]  = (b0 >> 12) & 0x07;
                    alphaTable[5]  = (b0 >> 15) & 0x07;
                    alphaTable[6]  = (b0 >> 18) & 0x07;
                    alphaTable[7]  = (b0 >> 21) & 0x07;
                    alphaTable[8]  = b1 & 0x07;
                    alphaTable[9]  = (b1 >> 3) & 0x07;
                    alphaTable[10] = (b1 >> 6) & 0x07;
                    alphaTable[11] = (b1 >> 9) & 0x07;
                    alphaTable[12] = (b1 >> 12) & 0x07;
                    alphaTable[13] = (b1 >> 15) & 0x07;
                    alphaTable[14] = (b1 >> 18) & 0x07;
                    alphaTable[15] = (b1 >> 21) & 0x07;
                    var c0 = (buffer[index] & 0xFF) | (buffer[index + 1] & 0xFF) << 8;
                    index += 2;
                    var c1 = (buffer[index] & 0xFF) | (buffer[index + 1] & 0xFF) << 8;
                    index += 2;
                    for (var k = 0; k < 4; k++)
                    {
                        if (4 * i + k >= height)
                        {
                            break;
                        }
                        var t0 = buffer[index] & 0x03;
                        var t1 = (buffer[index] & 0x0C) >> 2;
                        var t2 = (buffer[index] & 0x30) >> 4;
                        var t3 = (buffer[index++] & 0xC0) >> 6;
                        pixels[4 * width * i + 4 * j + width * k + 0] = DdsGetDxtColor(c0, c1,
                                                                                       DdsGetDxt5Alpha(a0, a1, alphaTable[4 * k + 0]), t0, order);
                        if (4 * j + 1 >= width)
                        {
                            continue;
                        }
                        pixels[4 * width * i + 4 * j + width * k + 1] = DdsGetDxtColor(c0, c1,
                                                                                       DdsGetDxt5Alpha(a0, a1, alphaTable[4 * k + 1]), t1, order);
                        if (4 * j + 2 >= width)
                        {
                            continue;
                        }
                        pixels[4 * width * i + 4 * j + width * k + 2] = DdsGetDxtColor(c0, c1,
                                                                                       DdsGetDxt5Alpha(a0, a1, alphaTable[4 * k + 2]), t2, order);
                        if (4 * j + 3 >= width)
                        {
                            continue;
                        }
                        pixels[4 * width * i + 4 * j + width * k + 3] = DdsGetDxtColor(c0, c1,
                                                                                       DdsGetDxt5Alpha(a0, a1, alphaTable[4 * k + 3]), t3, order);
                    }
                }
            }
            return(pixels);
        }
Exemplo n.º 8
0
 private static int[] DdsDecodeDxt4(int width, int height, int offset, byte[] buffer, DdsOrder order)
 {
     return(DdsDecodeDxt5(width, height, offset, buffer, order));
 }
Exemplo n.º 9
0
        private static int[] DdsDecodeDxt3(int width, int height, int offset, byte[] buffer, DdsOrder order)
        {
            var pixels     = new int [4 * width * height];
            var index      = offset;
            var w          = (width + 3) / 4;
            var h          = (height + 3) / 4;
            var alphaTable = new int[16];

            for (var i = 0; i < h; i++)
            {
                for (var j = 0; j < w; j++)
                {
                    // create alpha table(4bit to 8bit)
                    for (var k = 0; k < 4; k++)
                    {
                        var a0 = buffer[index++] & 0xFF;
                        var a1 = buffer[index++] & 0xFF;
                        // 4bit alpha to 8bit alpha
                        alphaTable[4 * k + 0] = 17 * ((a0 & 0xF0) >> 4);
                        alphaTable[4 * k + 1] = 17 * (a0 & 0x0F);
                        alphaTable[4 * k + 2] = 17 * ((a1 & 0xF0) >> 4);
                        alphaTable[4 * k + 3] = 17 * (a1 & 0x0F);
                    }
                    var c0 = (buffer[index] & 0xFF) | (buffer[index + 1] & 0xFF) << 8;
                    index += 2;
                    var c1 = (buffer[index] & 0xFF) | (buffer[index + 1] & 0xFF) << 8;
                    index += 2;
                    for (var k = 0; k < 4; k++)
                    {
                        if (4 * i + k >= height)
                        {
                            break;
                        }
                        var t0 = (buffer[index] & 0x03);
                        var t1 = (buffer[index] & 0x0C) >> 2;
                        var t2 = (buffer[index] & 0x30) >> 4;
                        var t3 = (buffer[index++] & 0xC0) >> 6;
                        pixels[4 * width * i + 4 * j + width * k + 0] =
                            DdsGetDxtColor(c0, c1, alphaTable[4 * k + 0], t0, order);
                        if (4 * j + 1 >= width)
                        {
                            continue;
                        }
                        pixels[4 * width * i + 4 * j + width * k + 1] =
                            DdsGetDxtColor(c0, c1, alphaTable[4 * k + 1], t1, order);
                        if (4 * j + 2 >= width)
                        {
                            continue;
                        }
                        pixels[4 * width * i + 4 * j + width * k + 2] =
                            DdsGetDxtColor(c0, c1, alphaTable[4 * k + 2], t2, order);
                        if (4 * j + 3 >= width)
                        {
                            continue;
                        }
                        pixels[4 * width * i + 4 * j + width * k + 3] =
                            DdsGetDxtColor(c0, c1, alphaTable[4 * k + 3], t3, order);
                    }
                }
            }
            return(pixels);
        }
Exemplo n.º 10
0
        private static int[] DdsDecodeDxt1(int width, int height, int offset, byte[] buffer, DdsOrder order)
        {
            var pixels = new int[4 * width * height];
            var index  = offset;
            var w      = (width + 3) / 4;
            var h      = (height + 3) / 4;

            for (var i = 0; i < h; i++)
            {
                for (var j = 0; j < w; j++)
                {
                    var c0 = (buffer[index] & 0xFF) | (buffer[index + 1] & 0xFF) << 8;
                    index += 2;
                    var c1 = (buffer[index] & 0xFF) | (buffer[index + 1] & 0xFF) << 8;
                    index += 2;
                    for (var k = 0; k < 4; k++)
                    {
                        if (4 * i + k >= height)
                        {
                            break;
                        }
                        var t0 = (buffer[index] & 0x03);
                        var t1 = (buffer[index] & 0x0C) >> 2;
                        var t2 = (buffer[index] & 0x30) >> 4;
                        var t3 = (buffer[index++] & 0xC0) >> 6;
                        pixels[4 * width * i + 4 * j + width * k + 0] = DdsGetDxtColor(c0, c1, 0xFF, t0, order);
                        if (4 * j + 1 >= width)
                        {
                            continue;
                        }
                        pixels[4 * width * i + 4 * j + width * k + 1] = DdsGetDxtColor(c0, c1, 0xFF, t1, order);
                        if (4 * j + 2 >= width)
                        {
                            continue;
                        }
                        pixels[4 * width * i + 4 * j + width * k + 2] = DdsGetDxtColor(c0, c1, 0xFF, t2, order);
                        if (4 * j + 3 >= width)
                        {
                            continue;
                        }
                        pixels[4 * width * i + 4 * j + width * k + 3] = DdsGetDxtColor(c0, c1, 0xFF, t3, order);
                    }
                }
            }
            return(pixels);
        }
Exemplo n.º 11
0
        public static int[] DdsRead(byte[] buffer, DdsOrder order, int mipmapLevel)
        {
            // header
            var width  = DdsGetWidth(buffer);
            var height = DdsGetHeight(buffer);
            var mipmap = DdsGetMipmap(buffer);

            // type
            var type = DdsGetType(buffer);

            if (type == 0)
            {
                return(null);
            }

            // offset
            var offset = 128;

            if (mipmapLevel > 0 && mipmapLevel < mipmap)
            {
                for (var i = 0; i < mipmapLevel; i++)
                {
                    switch (type)
                    {
                    case Dxt1:
                        offset += 8 * ((width + 3) / 4) * ((height + 3) / 4);
                        break;

                    case Dxt2:
                    case Dxt3:
                    case Dxt4:
                    case Dxt5:
                        offset += 16 * ((width + 3) / 4) * ((height + 3) / 4);
                        break;

                    case A1R5G5B5:
                    case X1R5G5B5:
                    case A4R4G4B4:
                    case X4R4G4B4:
                    case R5G6B5:
                    case R8G8B8:
                    case A8B8G8R8:
                    case X8B8G8R8:
                    case A8R8G8B8:
                    case X8R8G8B8:
                        offset += (type & 0xFF) * width * height;
                        break;
                    }
                    width  /= 2;
                    height /= 2;
                }
                if (width <= 0)
                {
                    width = 1;
                }
                if (height <= 0)
                {
                    height = 1;
                }
            }

            //	System.out.println("Width:" + width + ", Height:" + height + ", Mipmap: " + mipmap + ", Offset:" + offset + ", Type:" + type);
            {
                int[] pixels = null;
                switch (type)
                {
                case Dxt1:
                    pixels = DdsDecodeDxt1(width, height, offset, buffer, order);
                    break;

                case Dxt2:
                    pixels = DdsDecodeDxt2(width, height, offset, buffer, order);
                    break;

                case Dxt3:
                    pixels = DdsDecodeDxt3(width, height, offset, buffer, order);
                    break;

                case Dxt4:
                    pixels = DdsDecodeDxt4(width, height, offset, buffer, order);
                    break;

                case Dxt5:
                    pixels = DdsDecodeDxt5(width, height, offset, buffer, order);
                    break;

                case A1R5G5B5:
                    pixels = DdsReadA1R5G5B5(width, height, offset, buffer, order);
                    break;

                case X1R5G5B5:
                    pixels = DdsReadX1R5G5B5(width, height, offset, buffer, order);
                    break;

                case A4R4G4B4:
                    pixels = DdsReadA4R4G4B4(width, height, offset, buffer, order);
                    break;

                case X4R4G4B4:
                    pixels = DdsReadX4R4G4B4(width, height, offset, buffer, order);
                    break;

                case R5G6B5:
                    pixels = DdsReadR5G6B5(width, height, offset, buffer, order);
                    break;

                case R8G8B8:
                    pixels = DdsReadR8G8B8(width, height, offset, buffer, order);
                    break;

                case A8B8G8R8:
                    pixels = DdsReadA8B8G8R8(width, height, offset, buffer, order);
                    break;

                case X8B8G8R8:
                    pixels = DdsReadX8B8G8R8(width, height, offset, buffer, order);
                    break;

                case A8R8G8B8:
                    pixels = DdsReadA8R8G8B8(width, height, offset, buffer, order);
                    break;

                case X8R8G8B8:
                    pixels = DdsReadX8R8G8B8(width, height, offset, buffer, order);
                    break;
                }
                return(pixels);
            }
        }