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); } }
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; } }
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)); } }
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); }