79 lines
1.9 KiB
C#
79 lines
1.9 KiB
C#
#region Copyright & License Information
|
|
/*
|
|
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
|
|
* This file is part of OpenRA, which is free software. It is made
|
|
* available to you under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation. For more information,
|
|
* see COPYING.
|
|
*/
|
|
#endregion
|
|
|
|
namespace OpenRA.FileFormats
|
|
{
|
|
public static class Format40
|
|
{
|
|
public static int DecodeInto( byte[] src, byte[] dest )
|
|
{
|
|
var ctx = new FastByteReader(src);
|
|
int destIndex = 0;
|
|
|
|
while( true )
|
|
{
|
|
byte i = ctx.ReadByte();
|
|
if( ( i & 0x80 ) == 0 )
|
|
{
|
|
int count = i & 0x7F;
|
|
if( count == 0 )
|
|
{
|
|
// case 6
|
|
count = ctx.ReadByte();
|
|
byte value = ctx.ReadByte();
|
|
for( int end = destIndex + count ; destIndex < end ; destIndex++ )
|
|
dest[ destIndex ] ^= value;
|
|
}
|
|
else
|
|
{
|
|
// case 5
|
|
for( int end = destIndex + count ; destIndex < end ; destIndex++ )
|
|
dest[destIndex] ^= ctx.ReadByte();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int count = i & 0x7F;
|
|
if( count == 0 )
|
|
{
|
|
count = ctx.ReadWord();
|
|
if( count == 0 )
|
|
return destIndex;
|
|
|
|
if( ( count & 0x8000 ) == 0 )
|
|
{
|
|
// case 2
|
|
destIndex += ( count & 0x7FFF );
|
|
}
|
|
else if( ( count & 0x4000 ) == 0 )
|
|
{
|
|
// case 3
|
|
for( int end = destIndex + ( count & 0x3FFF ) ; destIndex < end ; destIndex++ )
|
|
dest[destIndex] ^= ctx.ReadByte();
|
|
}
|
|
else
|
|
{
|
|
// case 4
|
|
byte value = ctx.ReadByte();
|
|
for( int end = destIndex + ( count & 0x3FFF ) ; destIndex < end ; destIndex++ )
|
|
dest[ destIndex ] ^= value;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// case 1
|
|
destIndex += count;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|