Clean up CPDF_AnnotList.
[pdfium.git] / core / src / fxcodec / jbig2 / JBig2_BitStream.cpp
1 // Copyright 2015 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 #include "../../../include/fpdfapi/fpdf_objects.h"
8 #include "JBig2_BitStream.h"
9
10 #include <algorithm>
11
12 CJBig2_BitStream::CJBig2_BitStream(CPDF_StreamAcc* pSrcStream)
13     : m_pBuf(pSrcStream->GetData()),
14       m_dwLength(pSrcStream->GetSize()),
15       m_dwByteIdx(0),
16       m_dwBitIdx(0),
17       m_dwObjNum(pSrcStream->GetStream() ? pSrcStream->GetStream()->GetObjNum()
18                                          : 0) {
19   if (m_dwLength > 256 * 1024 * 1024) {
20     m_dwLength = 0;
21     m_pBuf = nullptr;
22   }
23 }
24
25 CJBig2_BitStream::~CJBig2_BitStream() {
26 }
27
28 int32_t CJBig2_BitStream::readNBits(FX_DWORD dwBits, FX_DWORD* dwResult) {
29   FX_DWORD dwBitPos = getBitPos();
30   if (dwBitPos > LengthInBits())
31     return -1;
32
33   *dwResult = 0;
34   if (dwBitPos + dwBits <= LengthInBits())
35     dwBitPos = dwBits;
36   else
37     dwBitPos = LengthInBits() - dwBitPos;
38
39   for (; dwBitPos > 0; --dwBitPos) {
40     *dwResult =
41         (*dwResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);
42     AdvanceBit();
43   }
44   return 0;
45 }
46
47 int32_t CJBig2_BitStream::readNBits(FX_DWORD dwBits, int32_t* nResult) {
48   FX_DWORD dwBitPos = getBitPos();
49   if (dwBitPos > LengthInBits())
50     return -1;
51
52   *nResult = 0;
53   if (dwBitPos + dwBits <= LengthInBits())
54     dwBitPos = dwBits;
55   else
56     dwBitPos = LengthInBits() - dwBitPos;
57
58   for (; dwBitPos > 0; --dwBitPos) {
59     *nResult =
60         (*nResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);
61     AdvanceBit();
62   }
63   return 0;
64 }
65
66 int32_t CJBig2_BitStream::read1Bit(FX_DWORD* dwResult) {
67   if (!IsInBound())
68     return -1;
69
70   *dwResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;
71   AdvanceBit();
72   return 0;
73 }
74
75 int32_t CJBig2_BitStream::read1Bit(FX_BOOL* bResult) {
76   if (!IsInBound())
77     return -1;
78
79   *bResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;
80   AdvanceBit();
81   return 0;
82 }
83
84 int32_t CJBig2_BitStream::read1Byte(uint8_t* cResult) {
85   if (!IsInBound())
86     return -1;
87
88   *cResult = m_pBuf[m_dwByteIdx];
89   ++m_dwByteIdx;
90   return 0;
91 }
92
93 int32_t CJBig2_BitStream::readInteger(FX_DWORD* dwResult) {
94   if (m_dwByteIdx + 3 >= m_dwLength)
95     return -1;
96
97   *dwResult = (m_pBuf[m_dwByteIdx] << 24) | (m_pBuf[m_dwByteIdx + 1] << 16) |
98               (m_pBuf[m_dwByteIdx + 2] << 8) | m_pBuf[m_dwByteIdx + 3];
99   m_dwByteIdx += 4;
100   return 0;
101 }
102
103 int32_t CJBig2_BitStream::readShortInteger(FX_WORD* dwResult) {
104   if (m_dwByteIdx + 1 >= m_dwLength)
105     return -1;
106
107   *dwResult = (m_pBuf[m_dwByteIdx] << 8) | m_pBuf[m_dwByteIdx + 1];
108   m_dwByteIdx += 2;
109   return 0;
110 }
111
112 void CJBig2_BitStream::alignByte() {
113   if (m_dwBitIdx != 0) {
114     ++m_dwByteIdx;
115     m_dwBitIdx = 0;
116   }
117 }
118
119 uint8_t CJBig2_BitStream::getCurByte() const {
120   return IsInBound() ? m_pBuf[m_dwByteIdx] : 0;
121 }
122
123 void CJBig2_BitStream::incByteIdx() {
124   if (IsInBound())
125     ++m_dwByteIdx;
126 }
127
128 uint8_t CJBig2_BitStream::getCurByte_arith() const {
129   return IsInBound() ? m_pBuf[m_dwByteIdx] : 0xFF;
130 }
131
132 uint8_t CJBig2_BitStream::getNextByte_arith() const {
133   return m_dwByteIdx + 1 < m_dwLength ? m_pBuf[m_dwByteIdx + 1] : 0xFF;
134 }
135
136 FX_DWORD CJBig2_BitStream::getOffset() const {
137   return m_dwByteIdx;
138 }
139
140 void CJBig2_BitStream::setOffset(FX_DWORD dwOffset) {
141   m_dwByteIdx = std::min(dwOffset, m_dwLength);
142 }
143
144 FX_DWORD CJBig2_BitStream::getBitPos() const {
145   return (m_dwByteIdx << 3) + m_dwBitIdx;
146 }
147
148 void CJBig2_BitStream::setBitPos(FX_DWORD dwBitPos) {
149   m_dwByteIdx = dwBitPos >> 3;
150   m_dwBitIdx = dwBitPos & 7;
151 }
152
153 const uint8_t* CJBig2_BitStream::getBuf() const {
154   return m_pBuf;
155 }
156
157 const uint8_t* CJBig2_BitStream::getPointer() const {
158   return m_pBuf + m_dwByteIdx;
159 }
160
161 void CJBig2_BitStream::offset(FX_DWORD dwOffset) {
162   m_dwByteIdx += dwOffset;
163 }
164
165 FX_DWORD CJBig2_BitStream::getByteLeft() const {
166   return m_dwLength - m_dwByteIdx;
167 }
168
169 void CJBig2_BitStream::AdvanceBit() {
170   if (m_dwBitIdx == 7) {
171     ++m_dwByteIdx;
172     m_dwBitIdx = 0;
173   } else {
174     ++m_dwBitIdx;
175   }
176 }
177
178 bool CJBig2_BitStream::IsInBound() const {
179   return m_dwByteIdx < m_dwLength;
180 }
181
182 FX_DWORD CJBig2_BitStream::LengthInBits() const {
183   return m_dwLength << 3;
184 }
185
186 FX_DWORD CJBig2_BitStream::getObjNum() const {
187   return m_dwObjNum;
188 }