internal static Object ApplyDelta(BinaryReader aReader, Object aObject, long aLength)
{
byte[] delta = Inflate(aReader, aLength);
byte b;
int shift = 7;
uint deltaOffset = 0;
b = delta[deltaOffset++];
uint inputLength = b & 0x7fu;
while ((b & 0x80u) != 0)
{
b = delta[deltaOffset++];
inputLength += (b & 0x7fu) << shift;
shift += 7;
}
shift = 7;
b = delta[deltaOffset++];
uint outputLength = b & 0x7fu;
while ((b & 0x80u) != 0)
{
b = delta[deltaOffset++];
outputLength += (b & 0x7fu) << shift;
shift += 7;
}
byte[] output = new byte[outputLength];
uint outputOffset = 0;
while (deltaOffset < delta.Length)
{
byte opcode = delta[deltaOffset++];
if ((opcode & 0x80u) != 0)
{ // copy
shift = 0;
uint chunkOffset = 0;
uint chunkLength = 0;
for (uint i = 0; i < 4; i++)
{
if ((opcode & 0x01u) > 0)
{
uint x = delta[deltaOffset++];
chunkOffset += (x << shift);
}
opcode >>= 1;
shift += 8;
}
shift = 0;
for (uint i = 0; i < 3; i++)
{
if ((opcode & 0x01u) > 0)
{
uint x = delta[deltaOffset++];
chunkLength += (x << shift);
}
opcode >>= 1;
shift += 8;
}
if (chunkLength == 0)
{
chunkLength = 1 << 16;
}
Array.Copy(aObject.Contents, chunkOffset, output, outputOffset, chunkLength);
outputOffset += chunkLength;
}
else
{ // insert
uint chunkLength = (opcode & 0x7fu);
Array.Copy(delta, deltaOffset, output, outputOffset, chunkLength);
deltaOffset += chunkLength;
outputOffset += chunkLength;
}
}
return (new Object(aObject.Type, output));
}