public TPL(byte[] file) { EndianBinaryReader er = new EndianBinaryReader(new MemoryStream(file), Endianness.BigEndian); bool OK; Header = new TPLHeader(er, out OK); if (!OK) { System.Windows.Forms.MessageBox.Show("Error 1"); goto end; } ImageHeaderOffsets = new UInt32[Header.NrImages]; PaletteHeaderOffsets = new UInt32[Header.NrImages]; for (int i = 0; i < Header.NrImages; i++) { ImageHeaderOffsets[i] = er.ReadUInt32(); PaletteHeaderOffsets[i] = er.ReadUInt32(); } Images = new TPLImageHeader[Header.NrImages]; Palettes = new TPLPaletteHeader[Header.NrImages]; for (int i = 0; i < Header.NrImages; i++) { er.BaseStream.Position = ImageHeaderOffsets[i]; Images[i] = new TPLImageHeader(er); if (PaletteHeaderOffsets[i] != 0) { er.BaseStream.Position = PaletteHeaderOffsets[i]; Palettes[i] = new TPLPaletteHeader(er); } } end: er.Close(); }
public TPLTexture(EndianBinaryReader er) { TextureHeaderOffset = er.ReadUInt32(); PaletteHeaderOffset = er.ReadUInt32(); long curpos = er.BaseStream.Position; er.BaseStream.Position = curpos; er.BaseStream.Position = TextureHeaderOffset; TextureHeader = new TPLTextureHeader(er); er.BaseStream.Position = TextureHeader.TextureDataOffset; TextureData = er.ReadBytes(GPU.Textures.GetDataSize(TextureHeader.TextureFormat, TextureHeader.Width, TextureHeader.Height)); if (PaletteHeaderOffset != 0) { er.BaseStream.Position = PaletteHeaderOffset; PaletteHeader = new TPLPaletteHeader(er); er.BaseStream.Position = PaletteHeader.PaletteDataOffset; PaletteData = er.ReadBytes((int)(PaletteHeader.NrEntries * 2)); } er.BaseStream.Position = curpos; }
public byte[] GetData(TPLPaletteHeader Pal) { List <byte> b = new List <byte>(); switch (ImageFormat) { case ImageFormats.I4: { foreach (byte d in Data) { b.Add((byte)((d & 0xF) * 0x11)); b.Add((byte)((d & 0xF) * 0x11)); b.Add((byte)((d & 0xF) * 0x11)); b.Add(0xFF); b.Add((byte)(((d >> 4) & 0xF) * 0x11)); b.Add((byte)(((d >> 4) & 0xF) * 0x11)); b.Add((byte)(((d >> 4) & 0xF) * 0x11)); b.Add(0xFF); } break; } case ImageFormats.I8: { foreach (byte d in Data) { b.Add(d); b.Add(d); b.Add(d); b.Add(0xFF); } break; } case ImageFormats.IA4: { foreach (byte d in Data) { b.Add((byte)((d & 0xF) * 0x11)); b.Add((byte)((d & 0xF) * 0x11)); b.Add((byte)((d & 0xF) * 0x11)); b.Add((byte)(((d >> 4) & 0xF) * 0x11)); } break; } case ImageFormats.IA8: { for (int i = 0; i < Data.Length; i += 2) { b.Add(Data[i]); b.Add(Data[i]); b.Add(Data[i]); b.Add(Data[i + 1]); } break; } case ImageFormats.RGB565: { for (int i = 0; i < Data.Length; i += 2) { ushort d = (ushort)(Data[i] << 8 | Data[i + 1]); b.Add((byte)((d & 31) * 8)); b.Add((byte)(((d >> 5) & 63) * 4)); b.Add((byte)(((d >> 11) & 31) * 8)); b.Add(0xFF); } break; } case ImageFormats.RGB5A3: { for (int i = 0; i < Data.Length; i += 2) { ushort d = (ushort)(Data[i] << 8 | Data[i + 1]); if ((d >> 15) == 1) //alpha { b.Add((byte)((d & 15) * 0x11)); b.Add((byte)(((d >> 4) & 15) * 0x11)); b.Add((byte)(((d >> 8) & 15) * 0x11)); b.Add((byte)(((d >> 12) & 7) * 0x20)); } else //no alpha { b.Add((byte)((d & 31) * 8)); b.Add((byte)(((d >> 5) & 31) * 8)); b.Add((byte)(((d >> 10) & 31) * 8)); b.Add(0xFF); } } break; } case ImageFormats.RGBA8: { for (int i = 0; i < Data.Length; i += 4) { b.Add(Data[i + 1]); b.Add(Data[i + 2]); b.Add(Data[i + 3]); b.Add(Data[i]); } break; } } return(b.ToArray()); }