private InMemoryBlockCollection ReadBlocks(EndianReader reader, XmlNode node, InMemoryBlockCollection parent, int parentBlockIndex) { var result = new InMemoryBlockCollection(this, reader, node, parent, parentBlockIndex); var lastBlock = AllBlocks.LastOrDefault(); var nextAddress = (lastBlock?.VirtualAddress + lastBlock?.AllocatedSize) ?? 0; var nextSize = PageSize; while (nextSize < result.VirtualSize) { nextSize += PageSize; } result.Allocate(nextAddress, nextSize); AllBlocks.Add(result); var blockAddress = parent == null ? SourceItem.MetaPointer.Address : result.BlockRef.Pointer.Address; for (int i = 0; i < result.EntryCount; i++) { var indexAddress = blockAddress + result.EntrySize * i; foreach (var childNode in node.SelectNodes("tagblock").OfType <XmlNode>()) { reader.Seek(indexAddress + childNode.GetIntAttribute("offset").Value, SeekOrigin.Begin); ReadBlocks(reader, childNode, result, i); } } return(result); }
/// <summary> /// Aggregate current index with next block /// </summary> /// <param name="nextBlock">nextBlock arg should be validated before</param> /// <returns></returns> public BlocksIndex Add(Block nextBlock) { if (IsEmpty) { throw new InvalidOperationException("Index in empty"); } var allBlocks = AllBlocks.Add(nextBlock); var blocksByHash = BlocksByHash.Add(nextBlock.Signature, nextBlock); return(new BlocksIndex(allBlocks, BlocksByHash)); }
public override void Rotate(TetrisGrid tetris) { int[][] grid = tetris.GetGrid(); int maxRight = grid[0].Length - 1, maxTop = grid.Length - 1; if (BottomedOut(tetris)) { return; } UnDraw(tetris); switch (DegreesRotated) { case 0: if (PivotBlock.X + 1 > maxTop) { PivotBlock.X -= 3; } else if (PivotBlock.X + 2 > maxTop) { PivotBlock.X -= 2; } else if (PivotBlock.X + 3 > maxTop) { PivotBlock.X -= 1; } AllBlocks.Clear(); AllBlocks.Add(PivotBlock); AllBlocks.Add(new Block(PivotBlock.X + 1, PivotBlock.Y)); AllBlocks.Add(new Block(PivotBlock.X + 2, PivotBlock.Y)); AllBlocks.Add(new Block(PivotBlock.X + 3, PivotBlock.Y)); LowestPoint = PivotBlock.X + 3; this.DegreesRotated += 90; break; case 90: if (PivotBlock.Y - 1 < 0) { PivotBlock.Y += 3; } else if (PivotBlock.Y - 2 < 0) { PivotBlock.Y += 2; } else if (PivotBlock.Y - 3 < 0) { PivotBlock.Y += 1; } AllBlocks.Clear(); AllBlocks.Add(PivotBlock); AllBlocks.Add(new Block(PivotBlock.X, PivotBlock.Y - 1)); AllBlocks.Add(new Block(PivotBlock.X, PivotBlock.Y - 2)); AllBlocks.Add(new Block(PivotBlock.X, PivotBlock.Y - 3)); LowestPoint = PivotBlock.X; this.DegreesRotated += 90; break; case 180: if (PivotBlock.X - 1 < 0) { PivotBlock.X += 3; } else if (PivotBlock.X - 2 < 0) { PivotBlock.X += 2; } else if (PivotBlock.X - 3 < 0) { PivotBlock.X += 1; } AllBlocks.Clear(); AllBlocks.Add(PivotBlock); AllBlocks.Add(new Block(PivotBlock.X - 1, PivotBlock.Y)); AllBlocks.Add(new Block(PivotBlock.X - 2, PivotBlock.Y)); AllBlocks.Add(new Block(PivotBlock.X - 3, PivotBlock.Y)); LowestPoint = PivotBlock.X; this.DegreesRotated += 90; break; case 270: if (PivotBlock.Y + 1 > maxRight) { PivotBlock.Y -= 3; } else if (PivotBlock.Y + 2 > maxRight) { PivotBlock.Y -= 2; } else if (PivotBlock.Y + 3 > maxRight) { PivotBlock.Y -= 1; } AllBlocks.Clear(); AllBlocks.Add(PivotBlock); AllBlocks.Add(new Block(PivotBlock.X, PivotBlock.Y + 1)); AllBlocks.Add(new Block(PivotBlock.X, PivotBlock.Y + 2)); AllBlocks.Add(new Block(PivotBlock.X, PivotBlock.Y + 3)); LowestPoint = PivotBlock.X; this.DegreesRotated = 0; break; } Draw(tetris); }