Пример #1
0
        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();
        }
Пример #2
0
            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;
            }
Пример #3
0
            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());
            }