using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; namespace OpenVIII { /// /// TIM data for overture textures. /// /// /// The reason for this is the lack of header, And allows compatibility with other objects that /// use TIMs. /// public sealed class TIMOverture : TIM2 { #region Constructors public TIMOverture(byte[] buffer, uint offset = 0) => _Init(buffer, offset); [SuppressMessage("ReSharper", "UnusedMember.Global")] public TIMOverture(BinaryReader br, uint offset = 0) => _Init(br, offset); #endregion Constructors #region Methods private new void _Init(byte[] buffer, uint offset) { this.Buffer = buffer; using (var br = new BinaryReader(new MemoryStream(buffer))) { Init(br, offset); } } private new void _Init(BinaryReader br, uint offset) { TrimExcess = true; br.BaseStream.Seek(offset, SeekOrigin.Begin); Buffer = br.ReadBytes((int)(br.BaseStream.Length - br.BaseStream.Position)); using (var br2 = new BinaryReader(new MemoryStream(Buffer))) Init(br2, 0); } private new void Init(BinaryReader br, uint offset) { BPP = 16; TIMOffset = offset; ReadParameters(br); } private new void ReadParameters(BinaryReader br) { br.BaseStream.Seek(TIMOffset, SeekOrigin.Begin); Texture.ImageOrgX = br.ReadUInt16(); Texture.ImageOrgY = br.ReadUInt16(); Texture.Width = br.ReadUInt16(); Texture.Height = br.ReadUInt16(); Texture.ImageSize = (uint)(br.BaseStream.Length - TIMOffset); Texture.ImageDataSize = (int)(br.BaseStream.Length - br.BaseStream.Position); TextureDataPointer = (uint)br.BaseStream.Position; br.BaseStream.Seek(TIMOffset, SeekOrigin.Begin); if (TrimExcess) Buffer = Buffer.Skip((int)TIMOffset).Take((int)(Texture.ImageDataSize + TextureDataPointer - TIMOffset)).ToArray(); } #endregion Methods ///// ///// Splash is 640x400 16BPP typical TIM with palette of ggg bbbbb a rrrrr gg ///// ///// raw 16bpp image ///// Texture2D ///// ///// These files are just the image data with no header and no clut data. Tim class doesn't ///// handle this. ///// //public static Texture2D Overture(byte[] buffer) //{ // using (MemoryStream ms = new MemoryStream(buffer)) // using (BinaryReader br = new BinaryReader(ms)) // { // //var ImageOrgX = BitConverter.ToUInt16(buffer, 0x00); // //var ImageOrgY = BitConverter.ToUInt16(buffer, 0x02); // ms.Seek(0x04, SeekOrigin.Begin); // ushort Width = br.ReadUInt16(); // ushort Height = br.ReadUInt16(); // Texture2D splashTex = new Texture2D(Memory.graphics.GraphicsDevice, Width, Height, false, SurfaceFormat.Color); // lock (splashTex) // { // Color[] rgbBuffer = new Color[Width * Height]; // for (int i = 0; i < rgbBuffer.Length && ms.Position + 2 < ms.Length; i++) // { // rgbBuffer[i] = ABGR1555toRGBA32bit(br.ReadUInt16(), true); // } // splashTex.SetData(rgbBuffer); // } // return splashTex; // } //} } }