You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
1.5 KiB
86 lines
1.5 KiB
// LZ.OutWindow
|
|
|
|
package SevenZip.Compression.LZ;
|
|
|
|
import java.io.IOException;
|
|
|
|
public class OutWindow
|
|
{
|
|
byte[] _buffer;
|
|
int _pos;
|
|
int _windowSize = 0;
|
|
int _streamPos;
|
|
java.io.OutputStream _stream;
|
|
|
|
public void Create(int windowSize)
|
|
{
|
|
if (_buffer == null || _windowSize != windowSize)
|
|
_buffer = new byte[windowSize];
|
|
_windowSize = windowSize;
|
|
_pos = 0;
|
|
_streamPos = 0;
|
|
}
|
|
|
|
public void SetStream(java.io.OutputStream stream) throws IOException
|
|
{
|
|
ReleaseStream();
|
|
_stream = stream;
|
|
}
|
|
|
|
public void ReleaseStream() throws IOException
|
|
{
|
|
Flush();
|
|
_stream = null;
|
|
}
|
|
|
|
public void Init(boolean solid)
|
|
{
|
|
if (!solid)
|
|
{
|
|
_streamPos = 0;
|
|
_pos = 0;
|
|
}
|
|
}
|
|
|
|
public void Flush() throws IOException
|
|
{
|
|
int size = _pos - _streamPos;
|
|
if (size == 0)
|
|
return;
|
|
_stream.write(_buffer, _streamPos, size);
|
|
if (_pos >= _windowSize)
|
|
_pos = 0;
|
|
_streamPos = _pos;
|
|
}
|
|
|
|
public void CopyBlock(int distance, int len) throws IOException
|
|
{
|
|
int pos = _pos - distance - 1;
|
|
if (pos < 0)
|
|
pos += _windowSize;
|
|
for (; len != 0; len--)
|
|
{
|
|
if (pos >= _windowSize)
|
|
pos = 0;
|
|
_buffer[_pos++] = _buffer[pos++];
|
|
if (_pos >= _windowSize)
|
|
Flush();
|
|
}
|
|
}
|
|
|
|
public void PutByte(byte b) throws IOException
|
|
{
|
|
_buffer[_pos++] = b;
|
|
if (_pos >= _windowSize)
|
|
Flush();
|
|
}
|
|
|
|
public byte GetByte(int distance)
|
|
{
|
|
int pos = _pos - distance - 1;
|
|
if (pos < 0)
|
|
pos += _windowSize;
|
|
return _buffer[pos];
|
|
}
|
|
}
|