public Glyph[] GetGlyphs() { FHeader = new FntHeader(); PHeader = new ProHeader(); Tools.ReadStruct(FNTData, ref FHeader); Tools.ReadStruct(PROData, ref PHeader); uint FHLen = (uint)Tools.GetStructLength(FHeader); Glyph[] Glyphs = new Glyph[FHeader.CharCnt]; for (uint i = 0; i < FHeader.CharCnt; i++) { byte[] Buffer = new byte[2]; Buffer[0] = FNTData[(i * 2) + FHLen]; Buffer[1] = FNTData[(i * 2) + FHLen + 1]; if (Buffer[1] == 0x00) { Buffer = new byte[] { Buffer[0] } } ; else { Buffer = Buffer.Reverse().ToArray(); } char Character = Encoding.GetString(Buffer).First(); Glyphs[i] = new Glyph(); Glyphs[i].Char = Character; Glyphs[i].Changed = false; } for (uint i = 0; i < FHeader.CharCnt; i++) { uint TIndex = FHLen + (FHeader.CharCnt * 2); byte[] Pixels = new byte[0]; if (FHeader.BitType == 0) { TIndex += (uint)((FHeader.Width / 2) * FHeader.Height) * i; byte[] Buffer = new byte[(FHeader.Width * FHeader.Height) / 2]; for (uint z = 0; z < Buffer.LongLength; z++) { Buffer[z] = FNTData[TIndex + z]; } Pixels = new byte[Buffer.Length * 2]; for (uint z = 0; z < Buffer.LongLength; z++) { Pixels[(z * 2) + 0] = (byte)((Buffer[z] & 0xF0) | ((Buffer[z] & 0xF0) >> 4)); Pixels[(z * 2) + 1] = (byte)((Buffer[z] & 0x0F) | ((Buffer[z] & 0x0F) << 4)); } } if (FHeader.BitType == 3) { TIndex += (uint)((FHeader.Width * FHeader.Height) * i); Pixels = new byte[FHeader.Width * FHeader.Height]; for (uint z = 0; z < Pixels.Length; z++) { Pixels[z] = FNTData[z + TIndex]; } } if (FHeader.BitType != 0 && FHeader.BitType != 3) { throw new FormatException("Unsupported Pixel Format");//BitType = 1 (2bpp), = 2 (1bpp) } Bitmap Bitmap = new Bitmap(FHeader.Width, FHeader.Height); uint Pos = 0; for (ushort y = 0; y < FHeader.Height; y++) { for (ushort x = 0; x < FHeader.Width; x++) { byte Val = Pixels[Pos++]; Bitmap.SetPixel(x, y, Color.FromArgb(Val, Val, Val, Val)); } } int PIndex = GetProIndex(Glyphs[i].Char); if (PIndex >= 0) { ProEntry Entry = PHeader.Entries[PIndex]; if (Entry.Size == 0) { Entry.Size = (byte)(FHeader.Width - Entry.x); } if (Entry.Size + Entry.x > FHeader.Width) { Entry.Size = (byte)(FHeader.Width - Entry.x); } Bitmap Trimmed = new Bitmap(Entry.Size, FHeader.Height); var Rect = new Rectangle(Entry.x, Entry.y, Entry.Size, FHeader.Height - Entry.y); Trimmed = Bitmap.Clone(Rect, PixelFormat.Format32bppArgb); } Glyphs[i].Texture = Bitmap; } return(Glyphs); }
public void UpdateGlyphs(Glyph[] Glyphs, out byte[] FNT, out byte[] PRO) { uint FHLen = (uint)Tools.GetStructLength(FHeader); var OriGlyphs = GetGlyphs(); FNT = new byte[FNTData.Length]; FNTData.CopyTo(FNT, 0); PRO = new byte[PROData.Length]; PROData.CopyTo(PRO, 0); FntHeader NewHeader = new FntHeader(); Tools.CopyStruct(FHeader, ref NewHeader); if (Force8bpp) { NewHeader.BitType = 3; uint InfoLen = FHLen + (FHeader.CharCnt * 2); FNT = new byte[InfoLen + ((FHeader.Width * FHeader.Height) * FHeader.CharCnt)]; for (uint i = 0; i < InfoLen; i++) { FNT[i] = FNTData[i]; } } Tools.BuildStruct(ref NewHeader).CopyTo(FNT, 0); for (uint i = 0; i < Glyphs.Length; i++) { if (Glyphs[i].Changed) { BitConverter.GetBytes(Tools.Reverse(GetSJIS(Glyphs[i].Char))).CopyTo(FNT, FHLen + (i * 2)); } uint Pos = 0; Bitmap Temp = new Bitmap(FHeader.Width, FHeader.Height); for (ushort y = 0; y < Glyphs[i].Texture.Height; y++) { for (ushort x = 0; x < Glyphs[i].Texture.Width; x++) { Temp.SetPixel(x, y, Glyphs[i].Texture.GetPixel(x, y)); } } Temp = ConvertTo8bppFormat(Temp); byte[] Pixels = new byte[FHeader.Width * FHeader.Height]; for (ushort y = 0; y < FHeader.Height; y++) { for (ushort x = 0; x < FHeader.Width; x++) { var Color = Temp.GetPixel(x, y); byte Val = (byte)((Color.R + Color.G + Color.B) / 3); Pixels[Pos++] = Val; } } if (NewHeader.BitType == 3) { Pixels.CopyTo(FNT, (FHLen + (FHeader.CharCnt * 2) + ((FHeader.Width * FHeader.Height) * i))); } else if (NewHeader.BitType == 0) { uint TIndex = (uint)(FHLen + (FHeader.CharCnt * 2) + (((FHeader.Width / 2) * FHeader.Height) * i)); byte[] Buffer = new byte[Pixels.Length / 2]; for (uint y = 0; y < Buffer.Length; y++) { byte A = Pixels[(y * 2) + 0]; byte B = Pixels[(y * 2) + 1]; Buffer[y] = (byte)((A & 0xF0) | (B >> 4)); } Buffer.CopyTo(FNT, TIndex); } else { throw new FormatException("Unsupported Pixel Format"); } int PI = GetProIndex(Glyphs[i].Char); uint PIndex = (uint)(PI * 3) + 0x10; if (PI > 0 && Glyphs[i].Changed) { new byte[] { 0x00, 0x00, (byte)Glyphs[i].Texture.Width } }