internal void send_compressed_block(short[] ltree, short[] dtree)
{
int distance; // distance of matched string
int lc; // match length or unmatched char (if dist == 0)
int lx = 0; // running index in l_buf
int code; // the code to send
int extra; // number of extra bits to send
if (last_lit != 0)
{
do
{
int ix = _distanceOffset + lx * 2;
distance = ((pending[ix] << 8) & 0xff00) |
(pending[ix + 1] & 0xff);
lc = (pending[_lengthOffset + lx]) & 0xff;
lx++;
if (distance == 0)
{
send_code(lc, ltree); // send a literal byte
}
else
{
// literal or match pair
// Here, lc is the match length - MIN_MATCH
code = ZTree.LengthCode[lc];
// send the length code
send_code(code + InternalConstants.LITERALS + 1, ltree);
extra = ZTree.ExtraLengthBits[code];
if (extra != 0)
{
// send the extra length bits
lc -= ZTree.LengthBase[code];
send_bits(lc, extra);
}
distance--; // dist is now the match distance - 1
code = ZTree.DistanceCode(distance);
// send the distance code
send_code(code, dtree);
extra = ZTree.ExtraDistanceBits[code];
if (extra != 0)
{
// send the extra distance bits
distance -= ZTree.DistanceBase[code];
send_bits(distance, extra);
}
}
// Check that the overlay between pending and d_buf+l_buf is ok:
}
while (lx < last_lit);
}
send_code(END_BLOCK, ltree);
last_eob_len = ltree[END_BLOCK * 2 + 1];
}