Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Adding functions to increase array/list comparison speed, comparing c…
…hunks/blocks as byte arrays for speed.
  • Loading branch information
MainMemory committed May 11, 2015
1 parent 58885d6 commit 55a3fc6
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 47 deletions.
2 changes: 1 addition & 1 deletion LevelConverter/MainForm.cs
Expand Up @@ -492,7 +492,7 @@ private void ConvertLevel()
byte[] b = newchnk[i].GetBytes();
int match = -1;
for (int c = 0; c < tmpchnk.Count; c++)
if (b.SequenceEqual(tmpchnk[c].GetBytes()))
if (b.ArrayEqual(tmpchnk[c].GetBytes()))
{
match = c;
break;
Expand Down
2 changes: 1 addition & 1 deletion ObjectLayoutDiff/Program.cs
Expand Up @@ -37,7 +37,7 @@ static void Main(string[] args)
List<ObjectEntry> newobjs = LoadObjects(File.ReadAllBytes(args[3]), format);
for (int i = 0; i < origobjs.Count; i++)
for (int j = 0; j < newobjs.Count; j++)
if (origobjs[i].GetBytes().SequenceEqual(newobjs[j].GetBytes()))
if (origobjs[i].GetBytes().ArrayEqual(newobjs[j].GetBytes()))
{
origobjs.RemoveAt(i--);
newobjs.RemoveAt(j);
Expand Down
110 changes: 66 additions & 44 deletions SonLVL/MainForm.cs
Expand Up @@ -4301,7 +4301,7 @@ private void pasteBeforeToolStripMenuItem_Click(object sender, EventArgs e)
{
ushort ti = (ushort)LevelData.Tiles.Count;
for (ushort j = 0; j < LevelData.Tiles.Count; j++)
if (tile.SequenceEqual(LevelData.Tiles[j]))
if (tile.ArrayEqual(LevelData.Tiles[j]))
{
ti = j;
break;
Expand Down Expand Up @@ -4367,7 +4367,7 @@ private void pasteBeforeToolStripMenuItem_Click(object sender, EventArgs e)
{
ushort ti = (ushort)LevelData.Tiles.Count;
for (ushort j = 0; j < LevelData.Tiles.Count; j++)
if (tile.SequenceEqual(LevelData.Tiles[j]))
if (tile.ArrayEqual(LevelData.Tiles[j]))
{
ti = j;
break;
Expand Down Expand Up @@ -4436,7 +4436,7 @@ private void pasteAfterToolStripMenuItem_Click(object sender, EventArgs e)
{
ushort ti = (ushort)LevelData.Tiles.Count;
for (ushort j = 0; j < LevelData.Tiles.Count; j++)
if (tile.SequenceEqual(LevelData.Tiles[j]))
if (tile.ArrayEqual(LevelData.Tiles[j]))
{
ti = j;
break;
Expand Down Expand Up @@ -4503,7 +4503,7 @@ private void pasteAfterToolStripMenuItem_Click(object sender, EventArgs e)
{
ushort ti = (ushort)LevelData.Tiles.Count;
for (ushort j = 0; j < LevelData.Tiles.Count; j++)
if (tile.SequenceEqual(LevelData.Tiles[j]))
if (tile.ArrayEqual(LevelData.Tiles[j]))
{
ti = j;
break;
Expand Down Expand Up @@ -4639,8 +4639,14 @@ private void ImportImage(Bitmap bmp, Bitmap colbmp1, Bitmap colbmp2, Bitmap prib
byte? forcepal = bmp.PixelFormat == PixelFormat.Format1bppIndexed || bmp.PixelFormat == PixelFormat.Format4bppIndexed ? (byte)SelectedColor.Y : (byte?)null;
bool match = false;
List<BitmapBits> tiles = new List<BitmapBits>(LevelData.Tiles.Count);
foreach (byte[] t in LevelData.Tiles)
tiles.Add(BitmapBits.FromTile(t, 0));
for (int i = 0; i < LevelData.Tiles.Count; i++)
tiles.Add(BitmapBits.FromTile(LevelData.Tiles[i], 0));
List<byte[]> blocks = new List<byte[]>(LevelData.Blocks.Count);
for (int i = 0; i < LevelData.Blocks.Count; i++)
blocks.Add(LevelData.Blocks[i].GetBytes());
List<byte[]> chunks = new List<byte[]>(LevelData.Chunks.Count);
for (int i = 0; i < LevelData.Chunks.Count; i++)
chunks.Add(LevelData.Chunks[i].GetBytes());
List<byte[]> newTiles = new List<byte[]>();
List<Block> newBlocks = new List<Block>();
List<byte> newColInds1 = new List<byte>();
Expand Down Expand Up @@ -4731,10 +4737,11 @@ private void ImportImage(Bitmap bmp, Bitmap colbmp1, Bitmap colbmp2, Bitmap prib
cnk.Blocks[bx, by].YFlip ^= col.YFlip;
if (blk.Tiles[0, 0].Tile == 0 && blk.Tiles[1, 0].Tile == 0 && blk.Tiles[0, 1].Tile == 0 && blk.Tiles[1, 1].Tile == 0)
continue;
Block blkh = blk.Flip(true, false);
Block blkv = blk.Flip(false, true);
Block blkhv = blk.Flip(true, true);
for (int i = 0; i < LevelData.Blocks.Count; i++)
byte[] blkb = blk.GetBytes();
byte[] blkh = blk.Flip(true, false).GetBytes();
byte[] blkv = blk.Flip(false, true).GetBytes();
byte[] blkhv = blk.Flip(true, true).GetBytes();
for (int i = 0; i < blocks.Count; i++)
{
if (blockcoldata != null)
{
Expand All @@ -4743,27 +4750,27 @@ private void ImportImage(Bitmap bmp, Bitmap colbmp1, Bitmap colbmp2, Bitmap prib
if (!Object.ReferenceEquals(LevelData.ColInds1, LevelData.ColInds2) && LevelData.ColInds2[i] != col.ColInd2)
continue;
}
if (blk.Equals(LevelData.Blocks[i]))
if (blkb.ArrayEqual(blocks[i]))
{
match = true;
cnk.Blocks[bx, by].Block = (ushort)i;
break;
}
if (blkh.Equals(LevelData.Blocks[i]))
if (blkh.ArrayEqual(blocks[i]))
{
match = true;
cnk.Blocks[bx, by].Block = (ushort)i;
cnk.Blocks[bx, by].XFlip = true;
break;
}
if (blkv.Equals(LevelData.Blocks[i]))
if (blkv.ArrayEqual(blocks[i]))
{
match = true;
cnk.Blocks[bx, by].Block = (ushort)i;
cnk.Blocks[bx, by].YFlip = true;
break;
}
if (blkhv.Equals(LevelData.Blocks[i]))
if (blkhv.ArrayEqual(blocks[i]))
{
match = true;
cnk.Blocks[bx, by].Block = (ushort)i;
Expand All @@ -4773,19 +4780,22 @@ private void ImportImage(Bitmap bmp, Bitmap colbmp1, Bitmap colbmp2, Bitmap prib
}
}
if (match) continue;
blocks.Add(blkb);
newBlocks.Add(blk);
newColInds1.Add(col.ColInd1);
newColInds2.Add(col.ColInd2);
cnk.Blocks[bx, by].Block = (ushort)(LevelData.Blocks.Count + newBlocks.Count - 1);
}
match = false;
for (int i = 0; i < LevelData.Chunks.Count; i++)
if (cnk.Equals(LevelData.Chunks[i]))
byte[] cnkb = cnk.GetBytes();
for (int i = 0; i < chunks.Count; i++)
if (cnkb.ArrayEqual(chunks[i]))
{
match = true;
break;
}
if (match) continue;
chunks.Add(cnkb);
newChunks.Add(cnk);
}
if (LevelData.Tiles.Count + newTiles.Count >= 0x800)
Expand Down Expand Up @@ -4918,10 +4928,11 @@ private void ImportImage(Bitmap bmp, Bitmap colbmp1, Bitmap colbmp2, Bitmap prib
match = false;
if (blk.Tiles[0, 0].Tile == 0 && blk.Tiles[1, 0].Tile == 0 && blk.Tiles[0, 1].Tile == 0 && blk.Tiles[1, 1].Tile == 0)
continue;
Block blkh = blk.Flip(true, false);
Block blkv = blk.Flip(false, true);
Block blkhv = blk.Flip(true, true);
for (int i = 0; i < LevelData.Blocks.Count; i++)
byte[] blkb = blk.GetBytes();
byte[] blkh = blk.Flip(true, false).GetBytes();
byte[] blkv = blk.Flip(false, true).GetBytes();
byte[] blkhv = blk.Flip(true, true).GetBytes();
for (int i = 0; i < blocks.Count; i++)
{
if (blockcoldata != null)
{
Expand All @@ -4930,14 +4941,15 @@ private void ImportImage(Bitmap bmp, Bitmap colbmp1, Bitmap colbmp2, Bitmap prib
if (!Object.ReferenceEquals(LevelData.ColInds1, LevelData.ColInds2) && LevelData.ColInds2[i] != col.ColInd2)
continue;
}
if (blk.Equals(LevelData.Blocks[i]) || blkh.Equals(LevelData.Blocks[i])
|| blkv.Equals(LevelData.Blocks[i]) || blkhv.Equals(LevelData.Blocks[i]))
if (blkb.ArrayEqual(blocks[i]) || blkh.ArrayEqual(blocks[i])
|| blkv.ArrayEqual(blocks[i]) || blkhv.ArrayEqual(blocks[i]))
{
match = true;
break;
}
}
if (match) continue;
blocks.Add(blkb);
newBlocks.Add(blk);
newColInds1.Add(col.ColInd1);
newColInds2.Add(col.ColInd2);
Expand Down Expand Up @@ -7607,7 +7619,7 @@ private void pasteOverToolStripMenuItem_Click(object sender, EventArgs e)
{
ushort ti = (ushort)LevelData.Tiles.Count;
for (ushort j = 0; j < LevelData.Tiles.Count; j++)
if (tile.SequenceEqual(LevelData.Tiles[j]))
if (tile.ArrayEqual(LevelData.Tiles[j]))
{
ti = j;
break;
Expand Down Expand Up @@ -7671,7 +7683,7 @@ private void pasteOverToolStripMenuItem_Click(object sender, EventArgs e)
{
ushort ti = (ushort)LevelData.Tiles.Count;
for (ushort j = 0; j < LevelData.Tiles.Count; j++)
if (tile.SequenceEqual(LevelData.Tiles[j]))
if (tile.ArrayEqual(LevelData.Tiles[j]))
{
ti = j;
break;
Expand Down Expand Up @@ -7732,8 +7744,14 @@ private void pasteOverToolStripMenuItem_Click(object sender, EventArgs e)
byte? forcepal = bmp.PixelFormat == PixelFormat.Format1bppIndexed || bmp.PixelFormat == PixelFormat.Format4bppIndexed ? (byte)SelectedColor.Y : (byte?)null;
bool match = false;
List<BitmapBits> tiles = new List<BitmapBits>(LevelData.Tiles.Count);
foreach (byte[] t in LevelData.Tiles)
tiles.Add(BitmapBits.FromTile(t, 0));
for (int i = 0; i < LevelData.Tiles.Count; i++)
tiles.Add(BitmapBits.FromTile(LevelData.Tiles[i], 0));
List<byte[]> blocks = new List<byte[]>(LevelData.Blocks.Count);
for (int i = 0; i < LevelData.Blocks.Count; i++)
blocks.Add(LevelData.Blocks[i].GetBytes());
List<byte[]> chunks = new List<byte[]>(LevelData.Chunks.Count);
for (int i = 0; i < LevelData.Chunks.Count; i++)
chunks.Add(LevelData.Chunks[i].GetBytes());
List<byte[]> newTiles = new List<byte[]>();
List<Block> newBlocks = new List<Block>();
List<byte> newColInds1 = new List<byte>();
Expand Down Expand Up @@ -7821,10 +7839,11 @@ private void pasteOverToolStripMenuItem_Click(object sender, EventArgs e)
cnk.Blocks[bx, by].YFlip ^= col.YFlip;
if (blk.Tiles[0, 0].Tile == 0 && blk.Tiles[1, 0].Tile == 0 && blk.Tiles[0, 1].Tile == 0 && blk.Tiles[1, 1].Tile == 0)
continue;
Block blkh = blk.Flip(true, false);
Block blkv = blk.Flip(false, true);
Block blkhv = blk.Flip(true, true);
for (int i = 0; i < LevelData.Blocks.Count; i++)
byte[] blkb = blk.GetBytes();
byte[] blkh = blk.Flip(true, false).GetBytes();
byte[] blkv = blk.Flip(false, true).GetBytes();
byte[] blkhv = blk.Flip(true, true).GetBytes();
for (int i = 0; i < blocks.Count; i++)
{
if (blockcoldata != null)
{
Expand All @@ -7833,27 +7852,27 @@ private void pasteOverToolStripMenuItem_Click(object sender, EventArgs e)
if (!Object.ReferenceEquals(LevelData.ColInds1, LevelData.ColInds2) && LevelData.ColInds2[i] != col.ColInd2)
continue;
}
if (blk.Equals(LevelData.Blocks[i]))
if (blkb.ArrayEqual(blocks[i]))
{
match = true;
cnk.Blocks[bx, by].Block = (ushort)i;
break;
}
if (blkh.Equals(LevelData.Blocks[i]))
if (blkh.ArrayEqual(blocks[i]))
{
match = true;
cnk.Blocks[bx, by].Block = (ushort)i;
cnk.Blocks[bx, by].XFlip = true;
break;
}
if (blkv.Equals(LevelData.Blocks[i]))
if (blkv.ArrayEqual(blocks[i]))
{
match = true;
cnk.Blocks[bx, by].Block = (ushort)i;
cnk.Blocks[bx, by].YFlip = true;
break;
}
if (blkhv.Equals(LevelData.Blocks[i]))
if (blkhv.ArrayEqual(blocks[i]))
{
match = true;
cnk.Blocks[bx, by].Block = (ushort)i;
Expand All @@ -7863,20 +7882,23 @@ private void pasteOverToolStripMenuItem_Click(object sender, EventArgs e)
}
}
if (match) continue;
blocks.Add(blkb);
newBlocks.Add(blk);
newColInds1.Add(col.ColInd1);
newColInds2.Add(col.ColInd2);
cnk.Blocks[bx, by].Block = (ushort)(LevelData.Blocks.Count + newBlocks.Count - 1);
}
match = false;
for (int i = 0; i < LevelData.Chunks.Count; i++)
if (cnk.Equals(LevelData.Chunks[i]))
byte[] cnkb = cnk.GetBytes();
for (int i = 0; i < chunks.Count; i++)
if (cnkb.ArrayEqual(chunks[i]))
{
result[cx, cy] = (byte)i;
match = true;
break;
}
if (match) continue;
chunks.Add(cnkb);
newChunks.Add(cnk);
result[cx, cy] = (byte)(LevelData.Chunks.Count + newChunks.Count - 1);
}
Expand Down Expand Up @@ -7971,7 +7993,7 @@ private void pasteOverToolStripMenuItem_Click(object sender, EventArgs e)
blk2 = coldata2[x, y];
byte ind1 = 0, ind2 = 0;
bool xflip = false, yflip = false;
if ((blk1.HeightMap.SequenceEqual(LevelData.ColArr1[0xFF]) || blk1.Solidity == Solidity.NotSolid) && coldata2 != null)
if ((blk1.HeightMap.ArrayEqual(LevelData.ColArr1[0xFF]) || blk1.Solidity == Solidity.NotSolid) && coldata2 != null)
{
ind1 = (byte)(blk1.Solidity == Solidity.NotSolid ? 0 : 0xFF);
if (blk2.Solidity != Solidity.NotSolid)
Expand All @@ -7983,7 +8005,7 @@ private void pasteOverToolStripMenuItem_Click(object sender, EventArgs e)
MatchCol(blk1, out ind1, out xflip, out yflip);
if (blk2.Solidity != Solidity.NotSolid)
{
if (blk2.HeightMap.SequenceEqual(LevelData.ColArr1[0xFF]))
if (blk2.HeightMap.ArrayEqual(LevelData.ColArr1[0xFF]))
{
ind2 = 0xFF;
}
Expand All @@ -8008,7 +8030,7 @@ private void pasteOverToolStripMenuItem_Click(object sender, EventArgs e)
bool found = false;
for (int i = 0; i < LevelData.ColArr1.Length; i++)
{
if (map.SequenceEqual(LevelData.ColArr1[i]))
if (map.ArrayEqual(LevelData.ColArr1[i]))
{
ind2 = (byte)i;
found = true;
Expand All @@ -8035,7 +8057,7 @@ private void pasteOverToolStripMenuItem_Click(object sender, EventArgs e)

private void MatchCol(ColInfo blk, out byte ind, out bool xflip, out bool yflip)
{
if (blk.HeightMap.SequenceEqual(LevelData.ColArr1[0xFF]))
if (blk.HeightMap.ArrayEqual(LevelData.ColArr1[0xFF]))
{
xflip = false;
yflip = false;
Expand All @@ -8052,28 +8074,28 @@ private void MatchCol(ColInfo blk, out byte ind, out bool xflip, out bool yflip)
byte? emptymap = null;
for (int i = 0; i < LevelData.ColArr1.Length; i++)
{
if (blk.HeightMap.SequenceEqual(LevelData.ColArr1[i]))
if (blk.HeightMap.ArrayEqual(LevelData.ColArr1[i]))
{
xflip = false;
yflip = false;
ind = (byte)i;
return;
}
if (maph.SequenceEqual(LevelData.ColArr1[i]))
if (maph.ArrayEqual(LevelData.ColArr1[i]))
{
xflip = true;
yflip = false;
ind = (byte)i;
return;
}
if (mapv.SequenceEqual(LevelData.ColArr1[i]))
if (mapv.ArrayEqual(LevelData.ColArr1[i]))
{
xflip = false;
yflip = true;
ind = (byte)i;
return;
}
if (maphv.SequenceEqual(LevelData.ColArr1[i]))
if (maphv.ArrayEqual(LevelData.ColArr1[i]))
{
xflip = true;
yflip = true;
Expand Down
2 changes: 1 addition & 1 deletion SonLVLAPI/BitmapBits.cs
Expand Up @@ -558,7 +558,7 @@ public override bool Equals(object obj)
BitmapBits other = obj as BitmapBits;
if (other == null) return false;
if (Width != other.Width | Height != other.Height) return false;
return System.Linq.Enumerable.SequenceEqual(Bits, other.Bits);
return Bits.ArrayEqual(other.Bits);
}

public override int GetHashCode()
Expand Down
18 changes: 18 additions & 0 deletions SonLVLAPI/Extensions.cs
Expand Up @@ -208,5 +208,23 @@ public static string ToHex68k(this short number)
else
return "-" + Math.Abs(number).ToHex68k();
}

public static bool ArrayEqual<T>(this T[] arr1, T[] arr2)
{
if (arr1.Length != arr2.Length) return false;
for (int i = 0; i < arr1.Length; i++)
if (!arr1[i].Equals(arr2[1]))
return false;
return true;
}

public static bool ListEqual<T>(this IList<T> lst1, IList<T> lst2)
{
if (lst1.Count != lst2.Count) return false;
for (int i = 0; i < lst1.Count; i++)
if (!lst1[i].Equals(lst2[1]))
return false;
return true;
}
}
}

0 comments on commit 55a3fc6

Please sign in to comment.