//
package net.sf.zipme;
class Deflater_deflate2 {
Deflater_deflate2( Deflater _this, byte[] output, int offset, int length){
this._this=_this;
this.output=output;
this.offset=offset;
this.length=length;
}
int execute(){
origLength=length;
if (_this.state == _this.CLOSED_STATE) throw new IllegalStateException("Deflater closed");
if (_this.state < _this.BUSY_STATE) {
header=(_this.DEFLATED + ((DeflaterConstants.MAX_WBITS - 8) << 4)) << 8;
level_flags=(_this.level - 1) >> 1;
if (level_flags < 0 || level_flags > 3) level_flags=3;
header|=level_flags << 6;
if ((_this.state & _this.IS_SETDICT) != 0) header|=DeflaterConstants.PRESET_DICT;
header+=31 - (header % 31);
_this.pending.writeShortMSB(header);
if ((_this.state & _this.IS_SETDICT) != 0) {
this.hook22();
}
_this.state=_this.BUSY_STATE | (_this.state & (_this.IS_FLUSHING | _this.IS_FINISHING));
}
for (; ; ) {
count=_this.pending.flush(output,offset,length);
offset+=count;
_this.totalOut+=count;
length-=count;
if (length == 0 || _this.state == _this.FINISHED_STATE) break;
if (!_this.engine.deflate((_this.state & _this.IS_FLUSHING) != 0,(_this.state & _this.IS_FINISHING) != 0)) {
if (_this.state == _this.BUSY_STATE) return origLength - length;
else if (_this.state == _this.FLUSHING_STATE) {
if (_this.level != _this.NO_COMPRESSION) {
neededbits=8 + ((-_this.pending.getBitCount()) & 7);
while (neededbits > 0) {
_this.pending.writeBits(2,10);
neededbits-=10;
}
}
_this.state=_this.BUSY_STATE;
}
else if (_this.state == _this.FINISHING_STATE) {
_this.pending.alignToByte();
if (!_this.noHeader) {
this.hook23();
}
_this.state=_this.FINISHED_STATE;
}
}
}
return origLength - length;
}
protected Deflater _this;
protected byte[] output;
protected int offset;
protected int length;
protected int origLength;
protected int header;
protected int level_flags;
protected int chksum;
protected int count;
protected int neededbits;
protected int adler;
protected void hook22(){
}
protected void hook23(){
}
}