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); }
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; } }
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; }
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; } } }
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; } } } }
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++]; } } } } }
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; } } } }