Beispiel #1
0
        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);
        }
Beispiel #2
0
        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;
        }