예제 #1
0
파일: Format2.cs 프로젝트: epicelite/OpenRA
        public static int DecodeInto(byte[] src, byte[] dest)
        {
            FastByteReader r = new FastByteReader(src);

            int i = 0;

            while (!r.Done())
            {
                byte cmd = r.ReadByte();
                if (cmd == 0)
                {
                    byte count = r.ReadByte();
                    while (count-- > 0)
                    {
                        dest[i++] = 0;
                    }
                }
                else
                {
                    dest[i++] = cmd;
                }
            }

            return(i);
        }
예제 #2
0
파일: Format2.cs 프로젝트: Roger-luo/OpenRA
		public static void DecodeInto(byte[] src, byte[] dest, int destIndex)
		{
			var r = new FastByteReader(src);

			while (!r.Done())
			{
				var cmd = r.ReadByte();
				if (cmd == 0)
				{
					var count = r.ReadByte();
					while (count-- > 0)
						dest[destIndex++] = 0;
				}
				else
					dest[destIndex++] = cmd;
			}
		}
예제 #3
0
        public static int DecodeInto(byte[] src, byte[] dest)
        {
            FastByteReader r = new FastByteReader(src);

            int i = 0;
            while (!r.Done())
            {
                byte cmd = r.ReadByte();
                if (cmd == 0)
                {
                    byte count = r.ReadByte();
                    while (count-- > 0)
                        dest[i++] = 0;
                }
                else
                    dest[i++] = cmd;
            }

            return i;
        }
예제 #4
0
        public static void DecodeInto(byte[] src, byte[] dest, int destIndex)
        {
            var r = new FastByteReader(src);

            while (!r.Done())
            {
                var cmd = r.ReadByte();
                if (cmd == 0)
                {
                    var count = r.ReadByte();
                    while (count-- > 0)
                    {
                        dest[destIndex++] = 0;
                    }
                }
                else
                {
                    dest[destIndex++] = cmd;
                }
            }
        }
예제 #5
0
        public static int DecodeInto(byte[] src, byte[] dest, int srcOffset)
        {
            var ctx       = new FastByteReader(src, srcOffset);
            var destIndex = 0;

            while (true)
            {
                var i = ctx.ReadByte();
                if ((i & 0x80) == 0)
                {
                    var count = i & 0x7F;
                    if (count == 0)
                    {
                        // case 6
                        count = ctx.ReadByte();
                        var value = ctx.ReadByte();
                        for (var end = destIndex + count; destIndex < end; destIndex++)
                        {
                            dest[destIndex] ^= value;
                        }
                    }
                    else
                    {
                        // case 5
                        for (var end = destIndex + count; destIndex < end; destIndex++)
                        {
                            dest[destIndex] ^= ctx.ReadByte();
                        }
                    }
                }
                else
                {
                    var 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 (var end = destIndex + (count & 0x3FFF); destIndex < end; destIndex++)
                            {
                                dest[destIndex] ^= ctx.ReadByte();
                            }
                        }
                        else
                        {
                            // case 4
                            var value = ctx.ReadByte();
                            for (var end = destIndex + (count & 0x3FFF); destIndex < end; destIndex++)
                            {
                                dest[destIndex] ^= value;
                            }
                        }
                    }
                    else
                    {
                        // case 1
                        destIndex += count;
                    }
                }
            }
        }
예제 #6
0
        public static int DecodeInto(byte[] src, byte[] dest, int srcOffset = 0, bool reverse = false)
        {
            var ctx       = new FastByteReader(src, srcOffset);
            var destIndex = 0;

            while (true)
            {
                var i = ctx.ReadByte();
                if ((i & 0x80) == 0)
                {
                    // case 2
                    var secondByte = ctx.ReadByte();
                    var count      = ((i & 0x70) >> 4) + 3;
                    var rpos       = ((i & 0xf) << 8) + secondByte;

                    if (destIndex + count > dest.Length)
                    {
                        return(destIndex);
                    }

                    ReplicatePrevious(dest, destIndex, destIndex - rpos, count);
                    destIndex += count;
                }
                else if ((i & 0x40) == 0)
                {
                    // case 1
                    var count = i & 0x3F;
                    if (count == 0)
                    {
                        return(destIndex);
                    }

                    ctx.CopyTo(dest, destIndex, count);
                    destIndex += count;
                }
                else
                {
                    var count3 = i & 0x3F;
                    if (count3 == 0x3E)
                    {
                        // case 4
                        var count = ctx.ReadWord();
                        var color = ctx.ReadByte();

                        for (var end = destIndex + count; destIndex < end; destIndex++)
                        {
                            dest[destIndex] = color;
                        }
                    }
                    else
                    {
                        // If count3 == 0x3F it's case 5, else case 3
                        var count    = count3 == 0x3F ? ctx.ReadWord() : count3 + 3;
                        var srcIndex = reverse ? destIndex - ctx.ReadWord() : ctx.ReadWord();
                        if (srcIndex >= destIndex)
                        {
                            throw new NotImplementedException($"srcIndex >= destIndex {srcIndex} {destIndex}");
                        }

                        for (var end = destIndex + count; destIndex < end; destIndex++)
                        {
                            dest[destIndex] = dest[srcIndex++];
                        }
                    }
                }
            }
        }
예제 #7
0
        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;
                    }
                }
            }
        }