WWActorEdit.Kazari.RARC.DecompressYaz0 C# (CSharp) Method

DecompressYaz0() private static method

private static DecompressYaz0 ( byte Input, uint Offset, byte &Output ) : void
Input byte
Offset uint
Output byte
return void
        private static void DecompressYaz0(byte[] Input, uint Offset, ref byte[] Output)
        {
            UInt32 Size = Helpers.Read32(Input, (int)(Offset + 4));
            Output = new byte[Size];

            int SrcPlace = (int)Offset + 0x10, DstPlace = 0;

            uint ValidBitCount = 0;
            byte CodeByte = 0;
            while (DstPlace < Size)
            {
                if (ValidBitCount == 0)
                {
                    CodeByte = Input[SrcPlace];
                    ++SrcPlace;
                    ValidBitCount = 8;
                }

                if ((CodeByte & 0x80) != 0)
                {
                    Output[DstPlace] = Input[SrcPlace];
                    DstPlace++;
                    SrcPlace++;
                }
                else
                {
                    byte Byte1 = Input[SrcPlace];
                    byte Byte2 = Input[SrcPlace + 1];
                    SrcPlace += 2;

                    uint Dist = (uint)(((Byte1 & 0xF) << 8) | Byte2);
                    uint CopySource = (uint)(DstPlace - (Dist + 1));
                    uint NumBytes = (uint)(Byte1 >> 4);
                    if (NumBytes == 0)
                    {
                        NumBytes = (uint)(Input[SrcPlace] + 0x12);
                        SrcPlace++;
                    }
                    else
                        NumBytes += 2;

                    int i;
                    for (i = 0; i < NumBytes; ++i)
                    {
                        Output[DstPlace] = Output[CopySource];
                        CopySource++;
                        DstPlace++;
                    }
                }

                CodeByte <<= 1;
                ValidBitCount -= 1;
            }
        }