public static CTPKEntry FromFile(string filename, string foldername) { if (!File.Exists(filename)) { return(new CTPKEntry()); } using (XmlTextReader reader = new XmlTextReader(filename)) { reader.WhitespaceHandling = WhitespaceHandling.All; XmlSerializer serializer = new XmlSerializer(typeof(CTPKEntry)); CTPKEntry entry = (CTPKEntry)serializer.Deserialize(reader); Console.WriteLine("Reading {0}...", entry.FilePath); // Import image file entry._textureData = new Texture(); var path = entry.FilePath; if (!String.IsNullOrWhiteSpace(foldername)) { path = Path.Combine(foldername, path); } var origbmp = Bitmap.FromFile(path); var pixelSize = 3; var bmpPixelFormat = PixelFormat.Format24bppRgb; entry.Format = (int)TextureFormat.Rgb8; entry.HasAlpha = true; if (entry.HasAlpha) { bmpPixelFormat = PixelFormat.Format32bppArgb; entry.Format = (int)TextureFormat.Rgba8; pixelSize = 4; } var bmp = new Bitmap(origbmp.Width, origbmp.Height, bmpPixelFormat); using (Graphics gr = Graphics.FromImage(bmp)) { gr.DrawImage(origbmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); } entry.Width = (ushort)bmp.Width; entry.Height = (ushort)bmp.Height; var scramble = new Texture().GetScrambledTextureData(bmp); var dataSize = bmp.Width * bmp.Height * pixelSize; entry.TextureRawData = new byte[dataSize]; entry.TextureSize = (uint)dataSize; Array.Copy(scramble, entry.TextureRawData, dataSize); entry.FileTime = (uint)File.GetLastWriteTime(path).Ticks; // This is right exactly? Not sure, don't think it matters either var filenameData = Encoding.GetEncoding(932).GetBytes(entry.InternalFilePath); entry.FilenameHash = Crc32.Calculate(filenameData, filenameData.Length); return(entry); } }
public static CTPKEntry FromFile(string filename, string foldername) { if (!File.Exists(filename)) { return(new CTPKEntry()); } using (XmlTextReader reader = new XmlTextReader(filename)) { reader.WhitespaceHandling = WhitespaceHandling.All; XmlSerializer serializer = new XmlSerializer(typeof(CTPKEntry)); CTPKEntry entry = (CTPKEntry)serializer.Deserialize(reader); Console.WriteLine("Reading {0}...", entry.FilePath); var path = entry.FilePath; if (!String.IsNullOrWhiteSpace(foldername)) { path = Path.Combine(foldername, path); } /* * var pixelSize = 3; * var bmpPixelFormat = PixelFormat.Format24bppRgb; * entry.Format = (int)TextureFormat.Rgb8; * * entry.HasAlpha = true; * if (entry.HasAlpha) * { * bmpPixelFormat = PixelFormat.Format32bppArgb; * entry.Format = (int)TextureFormat.Rgba8; * pixelSize = 4; * } * * var bmp = new Bitmap(origbmp.Width, origbmp.Height, bmpPixelFormat); * using (Graphics gr = Graphics.FromImage(bmp)) * { * gr.DrawImage(origbmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); * } * * entry.Width = (ushort)bmp.Width; * entry.Height = (ushort)bmp.Height; * * var scramble = new Texture().GetScrambledTextureData(bmp); * var dataSize = bmp.Width * bmp.Height * pixelSize; * * entry.TextureRawData = new byte[dataSize]; * entry.TextureSize = (uint)dataSize; * Array.Copy(scramble, entry.TextureRawData, dataSize); */ if (entry.Raw) { using (BinaryReader bmp = new BinaryReader(File.Open(path, FileMode.Open))) { entry.TextureRawData = bmp.ReadBytes((int)bmp.BaseStream.Length); } } else { // Import image file entry._textureData = new Texture(); var origbmp = Bitmap.FromFile(path); var bmpPixelFormat = PixelFormat.Format24bppRgb; if (entry.Format != (uint)TextureFormat.Rgba8 && entry.Format != (uint)TextureFormat.Rgb8 && entry.Format != (uint)TextureFormat.Rgb565 && entry.Format != (uint)TextureFormat.Rgba4 && entry.Format != (uint)TextureFormat.La8 && entry.Format != (uint)TextureFormat.Hilo8 && entry.Format != (uint)TextureFormat.L8 && entry.Format != (uint)TextureFormat.A8 && entry.Format != (uint)TextureFormat.Etc1 && entry.Format != (uint)TextureFormat.Etc1A4) { // Set everything that isn't one of the normal formats to Rgba8 entry.Format = (uint)TextureFormat.Rgba8; bmpPixelFormat = PixelFormat.Format32bppArgb; entry.HasAlpha = true; } else if (entry.Format == (uint)TextureFormat.Rgba8 || entry.Format == (uint)TextureFormat.Rgba4 || entry.Format == (uint)TextureFormat.La8 || entry.Format == (uint)TextureFormat.A8) { bmpPixelFormat = PixelFormat.Format32bppArgb; entry.HasAlpha = true; } else if (entry.Format == (uint)TextureFormat.Etc1A4) { bmpPixelFormat = PixelFormat.Format32bppArgb; entry.HasAlpha = true; } else { bmpPixelFormat = PixelFormat.Format24bppRgb; entry.HasAlpha = false; } var bmp = new Bitmap(origbmp.Width, origbmp.Height, bmpPixelFormat); using (Graphics gr = Graphics.FromImage(bmp)) { gr.DrawImage(origbmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); } entry.Width = (ushort)bmp.Width; entry.Height = (ushort)bmp.Height; entry.TextureRawData = Texture.FromBitmap(bmp, (TextureFormat)entry.Format, true); } entry.TextureSize = (uint)entry.TextureRawData.Length; entry.FileTime = (uint)File.GetLastWriteTime(path).Ticks; // This is right exactly? Not sure, don't think it matters either var filenameData = Encoding.GetEncoding(932).GetBytes(entry.InternalFilePath); entry.FilenameHash = Crc32.Calculate(filenameData, filenameData.Length); return(entry); } }