Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_CommonBitSource.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "barcode.h"\r
8 #include "include/BC_CommonBitSource.h"\r
9 CBC_CommonBitSource::CBC_CommonBitSource(CFX_ByteArray* bytes)\r
10 {\r
11     m_bytes.Copy((*bytes));\r
12     m_bitOffset = 0;\r
13     m_byteOffset = 0;\r
14 }\r
15 CBC_CommonBitSource::~CBC_CommonBitSource()\r
16 {\r
17 }\r
18 FX_INT32 CBC_CommonBitSource::ReadBits(FX_INT32 numBits, FX_INT32 &e)\r
19 {\r
20     if (numBits < 1 || numBits > 32) {\r
21         e = BCExceptionIllegalArgument;\r
22         return 0;\r
23     }\r
24     FX_INT32 result = 0;\r
25     if (m_bitOffset > 0) {\r
26         FX_INT32 bitsLeft = 8 - m_bitOffset;\r
27         FX_INT32 toRead = numBits < bitsLeft ? numBits : bitsLeft;\r
28         FX_INT32 bitsToNotRead = bitsLeft - toRead;\r
29         FX_INT32 mask = (0xff >> (8 - toRead)) << bitsToNotRead;\r
30         result = (m_bytes[m_byteOffset] & mask) >> bitsToNotRead;\r
31         numBits -= toRead;\r
32         m_bitOffset += toRead;\r
33         if (m_bitOffset == 8) {\r
34             m_bitOffset = 0;\r
35             m_byteOffset++;\r
36         }\r
37     }\r
38     if (numBits > 0) {\r
39         while(numBits >= 8) {\r
40             result = (result << 8) | (m_bytes[m_byteOffset] & 0xff);\r
41             m_byteOffset++;\r
42             numBits -= 8;\r
43         }\r
44         if (numBits > 0) {\r
45             FX_INT32 bitsToNotRead = 8 - numBits;\r
46             FX_INT32 mask = (0xff >> bitsToNotRead) << bitsToNotRead;\r
47             result = (result << numBits) | ((m_bytes[m_byteOffset] & mask) >> bitsToNotRead);\r
48             m_bitOffset += numBits;\r
49         }\r
50     }\r
51     return result;\r
52 }\r
53 FX_INT32 CBC_CommonBitSource::Available()\r
54 {\r
55     return 8 * (m_bytes.GetSize() - m_byteOffset) - m_bitOffset;\r
56 }\r
57 FX_INT32 CBC_CommonBitSource::getByteOffset()\r
58 {\r
59     return m_byteOffset;\r
60 }\r