equal
deleted
inserted
replaced
1 // LZ.OutWindow |
|
2 |
|
3 package SevenZip.Compression.LZ; |
|
4 |
|
5 import java.io.IOException; |
|
6 |
|
7 public class OutWindow |
|
8 { |
|
9 byte[] _buffer; |
|
10 int _pos; |
|
11 int _windowSize = 0; |
|
12 int _streamPos; |
|
13 java.io.OutputStream _stream; |
|
14 |
|
15 public void Create(int windowSize) |
|
16 { |
|
17 if (_buffer == null || _windowSize != windowSize) |
|
18 _buffer = new byte[windowSize]; |
|
19 _windowSize = windowSize; |
|
20 _pos = 0; |
|
21 _streamPos = 0; |
|
22 } |
|
23 |
|
24 public void SetStream(java.io.OutputStream stream) throws IOException |
|
25 { |
|
26 ReleaseStream(); |
|
27 _stream = stream; |
|
28 } |
|
29 |
|
30 public void ReleaseStream() throws IOException |
|
31 { |
|
32 Flush(); |
|
33 _stream = null; |
|
34 } |
|
35 |
|
36 public void Init(boolean solid) |
|
37 { |
|
38 if (!solid) |
|
39 { |
|
40 _streamPos = 0; |
|
41 _pos = 0; |
|
42 } |
|
43 } |
|
44 |
|
45 public void Flush() throws IOException |
|
46 { |
|
47 int size = _pos - _streamPos; |
|
48 if (size == 0) |
|
49 return; |
|
50 _stream.write(_buffer, _streamPos, size); |
|
51 if (_pos >= _windowSize) |
|
52 _pos = 0; |
|
53 _streamPos = _pos; |
|
54 } |
|
55 |
|
56 public void CopyBlock(int distance, int len) throws IOException |
|
57 { |
|
58 int pos = _pos - distance - 1; |
|
59 if (pos < 0) |
|
60 pos += _windowSize; |
|
61 for (; len != 0; len--) |
|
62 { |
|
63 if (pos >= _windowSize) |
|
64 pos = 0; |
|
65 _buffer[_pos++] = _buffer[pos++]; |
|
66 if (_pos >= _windowSize) |
|
67 Flush(); |
|
68 } |
|
69 } |
|
70 |
|
71 public void PutByte(byte b) throws IOException |
|
72 { |
|
73 _buffer[_pos++] = b; |
|
74 if (_pos >= _windowSize) |
|
75 Flush(); |
|
76 } |
|
77 |
|
78 public byte GetByte(int distance) |
|
79 { |
|
80 int pos = _pos - distance - 1; |
|
81 if (pos < 0) |
|
82 pos += _windowSize; |
|
83 return _buffer[pos]; |
|
84 } |
|
85 } |
|