Example #1
0
        private int bitmapFormat_GetBitCount(HaloBitmap.BitmapFormat format)
        {
            //Handle Bitmap Format
            switch (format)
            {
            case HaloBitmap.BitmapFormat.P8Bump:
            case HaloBitmap.BitmapFormat.P8:
            case HaloBitmap.BitmapFormat.A8:
            case HaloBitmap.BitmapFormat.Y8:
            case HaloBitmap.BitmapFormat.Ay8: return(8);

            case HaloBitmap.BitmapFormat.V8u8:
            case HaloBitmap.BitmapFormat.G8b8:
            case HaloBitmap.BitmapFormat.A8y8:
            case HaloBitmap.BitmapFormat.R5g6b5:
            case HaloBitmap.BitmapFormat.A4r4g4b4: return(16);

            case HaloBitmap.BitmapFormat.X8r8g8b8:
            case HaloBitmap.BitmapFormat.A8r8g8b8: return(32);

            case HaloBitmap.BitmapFormat.Dxt1: return(4);

            case HaloBitmap.BitmapFormat.Dxt3:
            case HaloBitmap.BitmapFormat.Dxt5: return(8);

            case HaloBitmap.BitmapFormat.Argbfp32: return(128);

            case HaloBitmap.BitmapFormat.Rgbfp32: return(96);

            case HaloBitmap.BitmapFormat.Rgbfp16: return(48);

            default: return(0);
            }
        }
Example #2
0
        private void bitmapFormat_GetBitMask(HaloBitmap.BitmapFormat format, out uint alpha, out uint red, out uint blue, out uint green)
        {
            //Prepare
            uint eightMask = byte.MaxValue;
            uint fourMask  = 15u;
            uint fiveMask  = 31u;
            uint sixMask   = 63u;

            //Setup
            alpha = 0; red = 0; blue = 0; green = 0;

            //Handle Bitmap Format
            switch (format)
            {
            case HaloBitmap.BitmapFormat.A8: alpha = eightMask; break;

            case HaloBitmap.BitmapFormat.Y8: red = eightMask; break;

            case HaloBitmap.BitmapFormat.Ay8: alpha = eightMask; break;

            case HaloBitmap.BitmapFormat.V8u8: green = eightMask << 8; red = eightMask; break;

            case HaloBitmap.BitmapFormat.G8b8: green = eightMask << 8; blue = eightMask; break;

            case HaloBitmap.BitmapFormat.A8y8: alpha = eightMask << 8; red = eightMask; break;

            case HaloBitmap.BitmapFormat.R5g6b5: red = fiveMask << 11; green = sixMask << 5; blue = fiveMask; break;

            case HaloBitmap.BitmapFormat.A4r4g4b4: alpha = fourMask << 12; red = fourMask << 8; green = fourMask << 4; blue = fourMask; break;

            case HaloBitmap.BitmapFormat.X8r8g8b8: red = eightMask << 16; green = eightMask << 8; blue = eightMask; break;

            case HaloBitmap.BitmapFormat.A8r8g8b8: alpha = eightMask << 24; red = eightMask << 16; green = eightMask << 8; blue = eightMask; break;
            }
        }
Example #3
0
        private int bitmap_GetLength(HaloBitmap.BitmapFormat format, int width, int height)
        {
            //Return
            int bpp    = bitmapFormat_GetBitCount(format);
            int length = width * height * bpp / 8;

            switch (format)
            {
            case HaloBitmap.BitmapFormat.Dxt1: return(Math.Max(length, 8));

            case HaloBitmap.BitmapFormat.Dxt3:
            case HaloBitmap.BitmapFormat.Dxt5: return(Math.Max(length, 16));

            default: return(Math.Max(length, 1));
            }
        }
Example #4
0
        private byte[][] ddsFile_CreateBuffer(DdsFile ddsFile, out HaloBitmap.BitmapFormat format, ref int lodLevels, out bool linear, out bool swizzle, out bool deleteLods)
        {
            //Prepare
            format     = HaloBitmap.BitmapFormat.Null;
            deleteLods = true;
            swizzle    = false;
            linear     = false;

            //Get Format
            if (ddsFile.PixelFormatFlags.HasFlag(DirectDrawPixelFormatFlags.FourCC)) //Check for FourCC flag...
            {
                switch (ddsFile.FourCC)                                              //Check FourCC string
                {
                case "DXT1": format = HaloBitmap.BitmapFormat.Dxt1; break;

                case "DXT2":
                case "DXT3": format = HaloBitmap.BitmapFormat.Dxt3; break;

                case "DXT4":
                case "DXT5": format = HaloBitmap.BitmapFormat.Dxt5; break;

                case "ATI2": format = HaloBitmap.BitmapFormat.P8Bump; break;
                }
                switch (ddsFile.DwordFourCC)    //Check FourCC int
                {
                case 116: format = HaloBitmap.BitmapFormat.Argbfp32; break;
                }
            }
            else
            {
                if (ddsFile.PixelFormatFlags.HasFlag(DirectDrawPixelFormatFlags.Argb))                      //ARGB
                {
                    switch (ddsFile.RgbBitCount)
                    {
                    case 16:                                                                                //16bpp
                        if (ddsFile.AlphaBitmask == 0x8000)
                        {
                            format = HaloBitmap.BitmapFormat.A1r5g5b5;                                     //A1R5G5B5
                        }
                        else
                        {
                            format = HaloBitmap.BitmapFormat.A4r4g4b4;                                     //A4R4G4B4
                        }
                        break;

                    case 32: format = HaloBitmap.BitmapFormat.A8r8g8b8; break;                             //A8R8G8B8
                    }
                }
                else if (ddsFile.PixelFormatFlags.HasFlag(DirectDrawPixelFormatFlags.Rgb))                  //RGB
                {
                    switch (ddsFile.RgbBitCount)
                    {
                    case 16: format = HaloBitmap.BitmapFormat.R5g6b5; break;                               //R5G6B5

                    case 32: format = HaloBitmap.BitmapFormat.X8r8g8b8; break;                             //X8R8G8B8
                    }
                }
                else if (ddsFile.PixelFormatFlags.HasFlag(DirectDrawPixelFormatFlags.AlphaLuminance))       //AL
                {
                    switch (ddsFile.RgbBitCount)
                    {
                    case 16: format = HaloBitmap.BitmapFormat.A8y8; break;                                 //A8L8
                    }
                }
                else if (ddsFile.PixelFormatFlags.HasFlag(DirectDrawPixelFormatFlags.Luminance))            //L
                {
                    switch (ddsFile.RgbBitCount)
                    {
                    case 8: format = HaloBitmap.BitmapFormat.Y8; break;                                    //L8
                    }
                }
                else if (ddsFile.PixelFormatFlags.HasFlag(DirectDrawPixelFormatFlags.Argb))                 //A
                {
                    switch (ddsFile.RgbBitCount)
                    {
                    case 8: format = HaloBitmap.BitmapFormat.A8; break;                                    //A8
                    }
                }
                else if (ddsFile.PixelFormatFlags.HasFlag(DirectDrawPixelFormatFlags.VU))                   //VU
                {
                    switch (ddsFile.RgbBitCount)
                    {
                    case 16: format = HaloBitmap.BitmapFormat.V8u8; break;                                 //V8U8
                    }
                }
            }

            //Check
            if (format == HaloBitmap.BitmapFormat.Null)
            {
                switch (ddsFile.RgbBitCount)
                {
                case 8: format = HaloBitmap.BitmapFormat.Y8; break;

                case 16: format = HaloBitmap.BitmapFormat.A8y8; break;

                case 32: format = HaloBitmap.BitmapFormat.A8r8g8b8; break;

                default: throw new FormatException("DirectDraw Surface texture format is not supported.");
                }
            }

            //Confirm
            using (TextureImportOptionsDialog texDlg = new TextureImportOptionsDialog())
            {
                //Setup
                int mapCount = 1 + (int)ddsFile.MipmapCount;
                texDlg.OriginalHeight = (int)ddsFile.Height;
                texDlg.OriginalWidth  = (int)ddsFile.Width;
                texDlg.MaxLodLevels   = mapCount;
                texDlg.LodLevels      = lodLevels;
                texDlg.Format         = format;

                //Show
                if (texDlg.ShowDialog(this) == DialogResult.OK)
                {
                    lodLevels  = texDlg.LodLevels;
                    format     = texDlg.Format;
                    deleteLods = texDlg.DeleteLods;
                    swizzle    = texDlg.Swizzle;
                }
                else
                {
                    return(null);
                }
            }

            //Prepare buffers
            byte[][] buffers = new byte[lodLevels][];

            //Get BPP
            uint bitsPerPixel = 0;

            if (ddsFile.DefinitionFlags.HasFlag(DirectDrawSurfaceDefinitionFlags.LinearSize))
            {
                bitsPerPixel = ddsFile.PitchOrLinearSize * 8u / ddsFile.Width / ddsFile.Height;
            }
            else
            {
                bitsPerPixel = ddsFile.RgbBitCount;
            }

            //Get Data Length
            long length = 0; uint mipWidth = ddsFile.Width, mipHeight = ddsFile.Height;

            for (int j = 0; j <= ddsFile.MipmapCount; j++)
            {
                length   += mipWidth * mipHeight * bitsPerPixel / 8;
                mipWidth /= 2; mipHeight /= 2;
            }

            //Get Linear?
            if (ddsFile.RgbBitCount > 0)
            {
                linear = !swizzle;
            }

            //Get Data Lengths
            uint width = ddsFile.Width, height = ddsFile.Height; int position = 0;

            for (int i = 0; i < lodLevels; i++)
            {
                //Prepare
                int lodLength = 0; mipWidth = width; mipHeight = height;

                //Loop
                for (int j = i; j <= ddsFile.MipmapCount; j++)
                {
                    lodLength += (int)(mipWidth * mipHeight * bitsPerPixel / 8);
                    mipWidth  /= 2; mipHeight /= 2;
                }

                //Prepare
                int mipPosition = 0;
                buffers[i] = new byte[lodLength]; mipWidth = width; mipHeight = height;
                for (int j = i; j <= ddsFile.MipmapCount; j++)
                {
                    //Get Mip Data
                    byte[] data = new byte[mipWidth * mipHeight * bitsPerPixel / 8];
                    Array.Copy(ddsFile.Data, mipPosition + position, data, 0, data.Length);

                    //Swizzle?
                    if (swizzle)
                    {
                        data = Swizzler.Swizzle(data, (int)mipWidth, (int)mipHeight, 1, (int)bitsPerPixel, !swizzle);
                    }

                    //Copy
                    Array.Copy(data, 0, buffers[i], mipPosition, data.Length);

                    //Increment
                    mipPosition += (int)(mipWidth * mipHeight * bitsPerPixel / 8);
                    mipWidth    /= 2; mipHeight /= 2;
                }

                //Increment
                position += (int)(width * height * bitsPerPixel / 8);

                //Get next LOD
                width /= 2; height /= 2;
            }

            //Return
            return(buffers);
        }