c74964473c829d0ff735c3247c4e78f17acb6fa1
[pdfium.git] / core / src / fxcodec / jbig2 / JBig2_BitStream.h
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #ifndef _JBIG2_BIT_STREAM_H_
8 #define _JBIG2_BIT_STREAM_H_
9 #include "JBig2_Define.h"
10 class CJBig2_BitStream : public CJBig2_Object {
11  public:
12   CJBig2_BitStream(uint8_t* pBuffer, FX_DWORD dwLength);
13
14   CJBig2_BitStream(CJBig2_BitStream& bs);
15
16   ~CJBig2_BitStream();
17
18   int32_t readNBits(FX_DWORD nBits, FX_DWORD* dwResult);
19
20   int32_t readNBits(FX_DWORD nBits, int32_t* nResult);
21
22   int32_t read1Bit(FX_DWORD* dwResult);
23
24   int32_t read1Bit(FX_BOOL* bResult);
25
26   int32_t read1Byte(uint8_t* cResult);
27
28   int32_t readInteger(FX_DWORD* dwResult);
29
30   int32_t readShortInteger(FX_WORD* wResult);
31
32   void alignByte();
33
34   void align4Byte();
35
36   uint8_t getAt(FX_DWORD dwOffset);
37
38   uint8_t getCurByte();
39
40   uint8_t getNextByte();
41
42   int32_t incByteIdx();
43
44   uint8_t getCurByte_arith();
45
46   uint8_t getNextByte_arith();
47
48   FX_DWORD getOffset();
49
50   void setOffset(FX_DWORD dwOffset);
51
52   FX_DWORD getBitPos();
53
54   void setBitPos(FX_DWORD dwBitPos);
55
56   uint8_t* getBuf();
57
58   FX_DWORD getLength() { return m_dwLength; }
59
60   uint8_t* getPointer();
61
62   void offset(FX_DWORD dwOffset);
63
64   FX_DWORD getByteLeft();
65
66  private:
67   uint8_t* m_pBuf;
68
69   FX_DWORD m_dwLength;
70
71   FX_DWORD m_dwByteIdx;
72
73   FX_DWORD m_dwBitIdx;
74 };
75 inline CJBig2_BitStream::CJBig2_BitStream(uint8_t* pBuffer, FX_DWORD dwLength) {
76   m_pBuf = pBuffer;
77   m_dwLength = dwLength;
78   m_dwByteIdx = 0;
79   m_dwBitIdx = 0;
80   if (m_dwLength > 256 * 1024 * 1024) {
81     m_dwLength = 0;
82     m_pBuf = NULL;
83   }
84 }
85 inline CJBig2_BitStream::CJBig2_BitStream(CJBig2_BitStream& bs) {
86   m_pBuf = bs.m_pBuf;
87   m_dwLength = bs.m_dwLength;
88   m_dwByteIdx = bs.m_dwByteIdx;
89   m_dwBitIdx = bs.m_dwBitIdx;
90 }
91 inline CJBig2_BitStream::~CJBig2_BitStream() {}
92 inline int32_t CJBig2_BitStream::readNBits(FX_DWORD dwBits,
93                                            FX_DWORD* dwResult) {
94   FX_DWORD dwTemp = (m_dwByteIdx << 3) + m_dwBitIdx;
95   if (dwTemp <= (m_dwLength << 3)) {
96     *dwResult = 0;
97     if (dwTemp + dwBits <= (m_dwLength << 3)) {
98       dwTemp = dwBits;
99     } else {
100       dwTemp = (m_dwLength << 3) - dwTemp;
101     }
102     while (dwTemp > 0) {
103       *dwResult =
104           (*dwResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);
105       if (m_dwBitIdx == 7) {
106         m_dwByteIdx++;
107         m_dwBitIdx = 0;
108       } else {
109         m_dwBitIdx++;
110       }
111       dwTemp--;
112     }
113     return 0;
114   } else {
115     return -1;
116   }
117 }
118 inline int32_t CJBig2_BitStream::readNBits(FX_DWORD dwBits, int32_t* nResult) {
119   FX_DWORD dwTemp = (m_dwByteIdx << 3) + m_dwBitIdx;
120   if (dwTemp <= (m_dwLength << 3)) {
121     *nResult = 0;
122     if (dwTemp + dwBits <= (m_dwLength << 3)) {
123       dwTemp = dwBits;
124     } else {
125       dwTemp = (m_dwLength << 3) - dwTemp;
126     }
127     while (dwTemp > 0) {
128       *nResult =
129           (*nResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);
130       if (m_dwBitIdx == 7) {
131         m_dwByteIdx++;
132         m_dwBitIdx = 0;
133       } else {
134         m_dwBitIdx++;
135       }
136       dwTemp--;
137     }
138     return 0;
139   } else {
140     return -1;
141   }
142 }
143
144 inline int32_t CJBig2_BitStream::read1Bit(FX_DWORD* dwResult) {
145   if (m_dwByteIdx < m_dwLength) {
146     *dwResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;
147     if (m_dwBitIdx == 7) {
148       m_dwByteIdx++;
149       m_dwBitIdx = 0;
150     } else {
151       m_dwBitIdx++;
152     }
153     return 0;
154   } else {
155     return -1;
156   }
157 }
158
159 inline int32_t CJBig2_BitStream::read1Bit(FX_BOOL* bResult) {
160   if (m_dwByteIdx < m_dwLength) {
161     *bResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;
162     if (m_dwBitIdx == 7) {
163       m_dwByteIdx++;
164       m_dwBitIdx = 0;
165     } else {
166       m_dwBitIdx++;
167     }
168     return 0;
169   } else {
170     return -1;
171   }
172 }
173 inline int32_t CJBig2_BitStream::read1Byte(uint8_t* cResult) {
174   if (m_dwByteIdx < m_dwLength) {
175     *cResult = m_pBuf[m_dwByteIdx];
176     m_dwByteIdx++;
177     return 0;
178   } else {
179     return -1;
180   }
181 }
182
183 inline int32_t CJBig2_BitStream::readInteger(FX_DWORD* dwResult) {
184   if (m_dwByteIdx + 3 < m_dwLength) {
185     *dwResult = (m_pBuf[m_dwByteIdx] << 24) | (m_pBuf[m_dwByteIdx + 1] << 16) |
186                 (m_pBuf[m_dwByteIdx + 2] << 8) | m_pBuf[m_dwByteIdx + 3];
187     m_dwByteIdx += 4;
188     return 0;
189   } else {
190     return -1;
191   }
192 }
193
194 inline int32_t CJBig2_BitStream::readShortInteger(FX_WORD* dwResult) {
195   if (m_dwByteIdx + 1 < m_dwLength) {
196     *dwResult = (m_pBuf[m_dwByteIdx] << 8) | m_pBuf[m_dwByteIdx + 1];
197     m_dwByteIdx += 2;
198     return 0;
199   } else {
200     return -1;
201   }
202 }
203 inline void CJBig2_BitStream::alignByte() {
204   if (m_dwBitIdx != 0) {
205     m_dwByteIdx++;
206     m_dwBitIdx = 0;
207   }
208 }
209 inline void CJBig2_BitStream::align4Byte() {
210   if (m_dwBitIdx != 0) {
211     m_dwByteIdx++;
212     m_dwBitIdx = 0;
213   }
214   m_dwByteIdx = (m_dwByteIdx + 3) & -4;
215 }
216 inline uint8_t CJBig2_BitStream::getAt(FX_DWORD dwOffset) {
217   if (dwOffset < m_dwLength) {
218     return m_pBuf[dwOffset];
219   } else {
220     return 0;
221   }
222 }
223 inline uint8_t CJBig2_BitStream::getCurByte() {
224   if (m_dwByteIdx < m_dwLength) {
225     return m_pBuf[m_dwByteIdx];
226   } else {
227     return 0;
228   }
229 }
230 inline uint8_t CJBig2_BitStream::getNextByte() {
231   if (m_dwByteIdx + 1 < m_dwLength) {
232     return m_pBuf[m_dwByteIdx + 1];
233   } else {
234     return 0;
235   }
236 }
237 inline int32_t CJBig2_BitStream::incByteIdx() {
238   if (m_dwByteIdx < m_dwLength) {
239     m_dwByteIdx++;
240     return 0;
241   } else {
242     return -1;
243   }
244 }
245 inline uint8_t CJBig2_BitStream::getCurByte_arith() {
246   if (m_dwByteIdx < m_dwLength) {
247     return m_pBuf[m_dwByteIdx];
248   } else {
249     return 0xff;
250   }
251 }
252 inline uint8_t CJBig2_BitStream::getNextByte_arith() {
253   if (m_dwByteIdx + 1 < m_dwLength) {
254     return m_pBuf[m_dwByteIdx + 1];
255   } else {
256     return 0xff;
257   }
258 }
259 inline FX_DWORD CJBig2_BitStream::getOffset() {
260   return m_dwByteIdx;
261 }
262 inline void CJBig2_BitStream::setOffset(FX_DWORD dwOffset) {
263   if (dwOffset > m_dwLength) {
264     dwOffset = m_dwLength;
265   }
266   m_dwByteIdx = dwOffset;
267 }
268 inline FX_DWORD CJBig2_BitStream::getBitPos() {
269   return (m_dwByteIdx << 3) + m_dwBitIdx;
270 }
271 inline void CJBig2_BitStream::setBitPos(FX_DWORD dwBitPos) {
272   m_dwByteIdx = dwBitPos >> 3;
273   m_dwBitIdx = dwBitPos & 7;
274 }
275 inline uint8_t* CJBig2_BitStream::getBuf() {
276   return m_pBuf;
277 }
278 inline uint8_t* CJBig2_BitStream::getPointer() {
279   return m_pBuf + m_dwByteIdx;
280 }
281 inline void CJBig2_BitStream::offset(FX_DWORD dwOffset) {
282   m_dwByteIdx += dwOffset;
283 }
284 inline FX_DWORD CJBig2_BitStream::getByteLeft() {
285   return m_dwLength - m_dwByteIdx;
286 }
287 #endif