Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_QRCoderBitVector.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_QRCoderBitVector.h"\r
9 CBC_QRCoderBitVector::CBC_QRCoderBitVector()\r
10 {\r
11     m_sizeInBits = 0;\r
12     m_size = 32;\r
13 }\r
14 void CBC_QRCoderBitVector::Init()\r
15 {\r
16     m_array = FX_Alloc(FX_BYTE, m_size);\r
17 }\r
18 CBC_QRCoderBitVector::~CBC_QRCoderBitVector()\r
19 {\r
20     if(m_array != NULL) {\r
21         FX_Free(m_array);\r
22     }\r
23     m_size = 0;\r
24     m_sizeInBits = 0;\r
25 }\r
26 void CBC_QRCoderBitVector::Clear()\r
27 {\r
28     if(m_array != NULL) {\r
29         FX_Free(m_array);\r
30         m_array = NULL;\r
31     }\r
32     m_sizeInBits = 0;\r
33     m_size = 32;\r
34     m_array = FX_Alloc(FX_BYTE, m_size);\r
35 }\r
36 FX_INT32 CBC_QRCoderBitVector::At(FX_INT32 index, FX_INT32 &e)\r
37 {\r
38     if(index < 0 || index >= m_sizeInBits) {\r
39         e = BCExceptionBadIndexException;\r
40         BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
41     }\r
42     FX_INT32 value = m_array[index >> 3] & 0xff;\r
43     return (value >> (7 - (index & 0x7))) & 1;\r
44 }\r
45 FX_INT32 CBC_QRCoderBitVector::sizeInBytes()\r
46 {\r
47     return (m_sizeInBits + 7) >> 3;\r
48 }\r
49 FX_INT32 CBC_QRCoderBitVector::Size()\r
50 {\r
51     return m_sizeInBits;\r
52 }\r
53 void CBC_QRCoderBitVector::AppendBit(FX_INT32 bit, FX_INT32 &e)\r
54 {\r
55     if(!(bit == 0 || bit == 1)) {\r
56         e = BCExceptionBadValueException;\r
57         BC_EXCEPTION_CHECK_ReturnVoid(e);\r
58     }\r
59     FX_INT32 numBitsInLastByte = m_sizeInBits & 0x7;\r
60     if(numBitsInLastByte == 0) {\r
61         AppendByte(0);\r
62         m_sizeInBits -= 8;\r
63     }\r
64     m_array[m_sizeInBits >> 3] |= (bit << (7 - numBitsInLastByte));\r
65     ++m_sizeInBits;\r
66 }\r
67 void CBC_QRCoderBitVector::AppendBits(FX_INT32 value, FX_INT32 numBits, FX_INT32 &e)\r
68 {\r
69     if (numBits < 0 || numBits > 32) {\r
70         e = BCExceptionBadNumBitsException;\r
71         BC_EXCEPTION_CHECK_ReturnVoid(e);\r
72     }\r
73     FX_INT32 numBitsLeft = numBits;\r
74     while (numBitsLeft > 0) {\r
75         if ((m_sizeInBits & 0x7) == 0 && numBitsLeft >= 8) {\r
76             FX_INT32 newByte = (value >> (numBitsLeft - 8)) & 0xff;\r
77             AppendByte(newByte);\r
78             numBitsLeft -= 8;\r
79         } else {\r
80             FX_INT32 bit = (value >> (numBitsLeft - 1)) & 1;\r
81             AppendBit(bit, e);\r
82             BC_EXCEPTION_CHECK_ReturnVoid(e);\r
83             --numBitsLeft;\r
84         }\r
85     }\r
86 }\r
87 void CBC_QRCoderBitVector::AppendBitVector(CBC_QRCoderBitVector *bits, FX_INT32 &e)\r
88 {\r
89     FX_INT32 size = bits->Size();\r
90     for(FX_INT32 i = 0; i < size; i++) {\r
91         FX_INT32 num = bits->At(i, e);\r
92         BC_EXCEPTION_CHECK_ReturnVoid(e);\r
93         AppendBit(num, e);\r
94         BC_EXCEPTION_CHECK_ReturnVoid(e)\r
95     }\r
96 }\r
97 void CBC_QRCoderBitVector::XOR(CBC_QRCoderBitVector *other, FX_INT32 &e)\r
98 {\r
99     if(m_sizeInBits != other->Size()) {\r
100         e = BCExceptioncanNotOperatexorOperator;\r
101         BC_EXCEPTION_CHECK_ReturnVoid(e);\r
102     }\r
103     FX_INT32 sizeInBytes = (m_sizeInBits + 7) >> 3;\r
104     for(FX_INT32 i = 0; i < sizeInBytes; ++i) {\r
105         m_array[i] ^= (other->GetArray())[i];\r
106     }\r
107 }\r
108 FX_BYTE* CBC_QRCoderBitVector::GetArray()\r
109 {\r
110     return m_array;\r
111 }\r
112 void CBC_QRCoderBitVector::AppendByte(FX_INT32 value)\r
113 {\r
114     if((m_sizeInBits >> 3) == m_size) {\r
115         FX_BYTE* newArray = FX_Alloc(FX_BYTE, m_size << 1);\r
116         FXSYS_memcpy32(newArray, m_array, m_size);\r
117         if(m_array != NULL) {\r
118             FX_Free(m_array);\r
119         }\r
120         m_array = newArray;\r
121         m_size = m_size << 1;\r
122     }\r
123     m_array[m_sizeInBits >> 3] = (FX_BYTE) value;\r
124     m_sizeInBits += 8;\r
125 }\r