public Sheet(EndianBinaryReader reader) { Images = new List <byte[]>(); reader.Skip(4); FirstCode = reader.ReadInt16(); LastCode = reader.ReadInt16(); CellWidth = reader.ReadInt16(); CellHeight = reader.ReadInt16(); int total_sheet_size = reader.ReadInt32(); TextureFormat = (BinaryTextureImage.TextureFormats)reader.ReadInt16(); RowCount = reader.ReadInt16(); ColumnCount = reader.ReadInt16(); SheetWidth = reader.ReadInt16(); SheetHeight = reader.ReadInt16(); reader.SkipInt16(); int num_sheets = (LastCode - FirstCode) / (RowCount * ColumnCount) + 1; for (int i = 0; i < num_sheets; i++) { Images.Add(BinaryTextureImage.DecodeData(reader, (uint)SheetWidth, (uint)SheetHeight, TextureFormat)); } }
public void SaveImage(int index, string directory) { BinaryTextureImage aa = new BinaryTextureImage(); for (int i = 0; i < Images.Count; i++) { aa.SaveImageToDisk(Path.Combine(directory, $"sheet_{ index }_{ i }.png"), Images[i], SheetWidth, SheetHeight); } }
public void LoadImages(int index, string directory) { IEnumerable <string> files = Directory.EnumerateFiles(directory, $"sheet_{ index }_*.png"); for (int i = 0; i < files.Count(); i++) { string img_name = files.ElementAt(i); Bitmap img = new Bitmap(img_name); Images.Add(BinaryTextureImage.EncodeData(img, (uint)SheetWidth, (uint)SheetHeight, TextureFormat)); } }
static void Main(string[] args) { font fnt; fontPages pages; fontChars chars; byte[] finalSheetArray; List<byte> finalCompiledSheet = new List<byte>(); using (FileStream stream = new FileStream(@"C:\Program Files (x86)\SZS Tools\TestFont\TestFont.fnt", FileMode.Open)) { XmlSerializer serializer = new XmlSerializer(typeof(font)); fnt = (font)serializer.Deserialize(stream); pages = (fontPages)fnt.Items[2]; chars = (fontChars)fnt.Items[3]; List<Bitmap> alignedGlyphSheets = new List<Bitmap>(); int charCount = 0; while (charCount != chars.count) { Bitmap alignedGlyphSheet = new Bitmap(160, 160); int baseXPixel = 0; int baseYPixel = 0; int numCharsBlockY = 0; int numCharsBlockX = 0; for (int alignedY = 0; alignedY < alignedGlyphSheet.Height; alignedY++) { for (int alignedX = 0; alignedX < alignedGlyphSheet.Width; alignedX++) { alignedGlyphSheet.SetPixel(alignedX, alignedY, Color.Black); } } for (int glyphBlockY = 0; glyphBlockY < 5; glyphBlockY++) { if (charCount >= chars.count) break; baseXPixel = 0; for (int glyphBlockX = 0; glyphBlockX < 5; glyphBlockX++) { using (FileStream glyphSheet = new FileStream(@"C:\Program Files (x86)\SZS Tools\TestFont\" + pages.page[chars.@char[charCount].page].file, FileMode.Open)) { using (Bitmap sourceGlyphSheet = new Bitmap(glyphSheet)) { for (int y = 0; y < chars.@char[charCount].height; y++) { for (int x = 0; x < chars.@char[charCount].width; x++) { int charOffsetX = 32 / 2 - chars.@char[charCount].width / 2; int charOffsetY = 32 / 2 - chars.@char[charCount].height / 2; alignedGlyphSheet.SetPixel(baseXPixel + charOffsetX + x, baseYPixel + charOffsetY + y, sourceGlyphSheet.GetPixel(chars.@char[charCount].x + x, chars.@char[charCount].y + y)); } } charCount++; if (charCount >= chars.count) break; } } numCharsBlockX++; baseXPixel += 32; } numCharsBlockY++; baseYPixel += 32; } alignedGlyphSheets.Add(alignedGlyphSheet); alignedGlyphSheet.Save(@"C:\Program Files (x86)\SZS Tools\TestFont\alignedSheet_at_" + charCount + ".bmp"); } foreach (Bitmap bmp in alignedGlyphSheets) { finalCompiledSheet.AddRange(BinaryTextureImage.EncodeData(bmp, (uint)bmp.Width, (uint)bmp.Height, BinaryTextureImage.TextureFormats.I4)); } finalSheetArray = BinaryTextureImage.DecodeData(new EndianBinaryReader(finalCompiledSheet.ToArray(), Endian.Big), 160, 160 * 4, BinaryTextureImage.TextureFormats.I4); BinaryTextureImage tex = new BinaryTextureImage(); tex.SaveImageToDisk(@"C:\Program Files (x86)\SZS Tools\TestFont\finalSheetTest.png", finalSheetArray, 160, 160 * 4); } Bitmap pngOrig = new Bitmap(@"C:\Program Files (x86)\SZS Tools\fontres.arc_dir\fontres\rock_24_20_4i_usa_noheader.bmp"); byte[] origIdea = BinaryTextureImage.EncodeData(pngOrig, 128, 1152, BinaryTextureImage.TextureFormats.I4); using (EndianBinaryWriter writ = new EndianBinaryWriter(new FileStream(@"C:\Program Files (x86)\SZS Tools\TestFont\testOutput.bin", FileMode.Create), Endian.Big)) { writ.Write(origIdea); } using(EndianBinaryWriter writer = new EndianBinaryWriter(new FileStream(@"C:\Program Files (x86)\SZS Tools\TestFont\test.bfn",FileMode.Create), Endian.Big)) { WriteBFN(writer, chars, finalCompiledSheet.ToArray()); } }