Exemplo n.º 1
0
        // TODO: Maybe replace this with LCWCompression.DecodeInto again later
        public static int LCWDecodeInto(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);
                    }

                    // Replicate previous
                    var srcIndex = destIndex - rpos;
                    if (srcIndex > destIndex)
                    {
                        throw new NotImplementedException("srcIndex > destIndex {0} {1}".F(srcIndex, destIndex));
                    }

                    for (var j = 0; j < count; j++)
                    {
                        if (destIndex - srcIndex == 1)
                        {
                            dest[destIndex + j] = dest[destIndex - 1];
                        }
                        else
                        {
                            dest[destIndex + j] = dest[srcIndex + j];
                        }
                    }

                    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 {0} {1}".F(srcIndex, destIndex));
                        }

                        for (var end = destIndex + count; destIndex < end; destIndex++)
                        {
                            dest[destIndex] = dest[srcIndex++];
                        }
                    }
                }
            }
        }
Exemplo n.º 2
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)
                    {
                        // case 5
                        var count = ctx.ReadWord();
                        var srcIndex = reverse ? destIndex - ctx.ReadWord() : ctx.ReadWord();
                        if (srcIndex >= destIndex)
                            throw new NotImplementedException("srcIndex >= destIndex {0} {1}".F(srcIndex, destIndex));

                        for (var end = destIndex + count; destIndex < end; destIndex++)
                            dest[destIndex] = dest[srcIndex++];
                    }
                    else
                    {
                        // case 3
                        var count = count3 + 3;
                        var srcIndex = reverse ? destIndex - ctx.ReadWord() : ctx.ReadWord();
                        if (srcIndex >= destIndex)
                            throw new NotImplementedException("srcIndex >= destIndex {0} {1}".F(srcIndex, destIndex));

                        for (var end = destIndex + count; destIndex < end; destIndex++)
                            dest[destIndex] = dest[srcIndex++];
                    }
                }
            }
        }