protected override bool ReadFile(BinaryReader r) { var length = (int)r.BaseStream.Length; if (length < FileHeader.ByteSize) { return(false); } byte[] h = r.ReadBytes(FileHeader.ByteSize); var seg = new ArraySegment <byte>(h); if (!Header.ReadFile(seg)) { return(false); } var offset = FileHeader.ByteSize; if (length < FileHeader.ByteSize + Header.Area * 4) { return(false); } offset += (int)Header.Area * 4; UInt32[] Positions = new UInt32[Header.Area]; var TileSize = Header.BlockHeight * Header.BlockWidth / 2; for (var i = 0; i < Header.Area; ++i) { var pos = r.ReadInt32(); if (pos + TileSize + TileHeader.ByteSize > length) { return(false); } if (pos == 0) { Tiles.Add(null); continue; } var T = new TileHeader(); T.Position = pos; Tiles.Add(T); } byte[] contents = r.ReadBytes((int)(length - offset)); foreach (var T in TilesReal) { seg = new ArraySegment <byte>(contents, T.Position - offset, 0); T.ReadFile(seg); } return(true); }
protected override bool ReadFile(BinaryReader r) { var length = (int)r.BaseStream.Length; if (length < FileHeader.ByteSize) { return false; } byte[] h = r.ReadBytes(FileHeader.ByteSize); var seg = new ArraySegment<byte>(h); if (!Header.ReadFile(seg)) { return false; } var offset = FileHeader.ByteSize; if (length < FileHeader.ByteSize + Header.Area * 4) { return false; } offset += (int)Header.Area * 4; UInt32[] Positions = new UInt32[Header.Area]; var TileSize = Header.BlockHeight * Header.BlockWidth / 2; for (var i = 0; i < Header.Area; ++i) { var pos = r.ReadInt32(); if (pos + TileSize + TileHeader.ByteSize > length) { return false; } if (pos == 0) { Tiles.Add(null); continue; } var T = new TileHeader(); T.Position = pos; Tiles.Add(T); } byte[] contents = r.ReadBytes((int)(length - offset)); foreach (var T in TilesReal) { seg = new ArraySegment<byte>(contents, T.Position - offset, 0); T.ReadFile(seg); } return true; }