Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_CommonBitArray.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_CommonBitArray.h"\r
9 CBC_CommonBitArray::CBC_CommonBitArray(CBC_CommonBitArray* array)\r
10 {\r
11     m_size = array->GetSize();\r
12     m_bits.Copy(array->GetBits());\r
13 }\r
14 CBC_CommonBitArray::CBC_CommonBitArray()\r
15 {\r
16     m_bits.SetSize(1);\r
17     m_size = 0;\r
18 }\r
19 CBC_CommonBitArray::CBC_CommonBitArray(FX_INT32 size)\r
20 {\r
21     m_bits.SetSize((size + 31) >> 5);\r
22     m_size = size;\r
23 }\r
24 CBC_CommonBitArray::~CBC_CommonBitArray()\r
25 {\r
26     m_size = 0;\r
27 }\r
28 FX_INT32 CBC_CommonBitArray::GetSize()\r
29 {\r
30     return m_size;\r
31 }\r
32 CFX_Int32Array& CBC_CommonBitArray::GetBits()\r
33 {\r
34     return m_bits;\r
35 }\r
36 FX_INT32 CBC_CommonBitArray::GetSizeInBytes()\r
37 {\r
38     return (m_size + 7) >> 3;\r
39 }\r
40 FX_BOOL CBC_CommonBitArray::Get(FX_INT32 i)\r
41 {\r
42     return (m_bits[i >> 5] & (1 << (i & 0x1f))) != 0;\r
43 }\r
44 void CBC_CommonBitArray::Set(FX_INT32 i)\r
45 {\r
46     m_bits[i >> 5] |= 1 << (i & 0x1F);\r
47 }\r
48 void CBC_CommonBitArray::Flip(FX_INT32 i)\r
49 {\r
50     m_bits[i >> 5] ^= 1 << (i & 0x1F);\r
51 }\r
52 void CBC_CommonBitArray::SetBulk(FX_INT32 i, FX_INT32 newBits)\r
53 {\r
54     m_bits[i >> 5] = newBits;\r
55 }\r
56 void CBC_CommonBitArray::Clear()\r
57 {\r
58     FXSYS_memset32(&m_bits[0], 0x00, m_bits.GetSize() * sizeof(FX_INT32));\r
59 }\r
60 FX_BOOL CBC_CommonBitArray::IsRange(FX_INT32 start, FX_INT32 end, FX_BOOL value, FX_INT32 &e)\r
61 {\r
62     if (end < start) {\r
63         e = BCExceptionEndLessThanStart;\r
64         return FALSE;\r
65     }\r
66     if (end == start) {\r
67         return TRUE;\r
68     }\r
69     end--;\r
70     FX_INT32 firstInt = start >> 5;\r
71     FX_INT32 lastInt = end >> 5;\r
72     FX_INT32 i;\r
73     for (i = firstInt; i <= lastInt; i++) {\r
74         FX_INT32 firstBit = i > firstInt ? 0 : start & 0x1F;\r
75         FX_INT32 lastBit = i < lastInt ? 31 : end & 0x1F;\r
76         FX_INT32 mask;\r
77         if (firstBit == 0 && lastBit == 31) {\r
78             mask = -1;\r
79         } else {\r
80             mask = 0;\r
81             for (FX_INT32 j = firstBit; j <= lastBit; j++) {\r
82                 mask |= 1 << j;\r
83             }\r
84         }\r
85         if ((m_bits[i] & mask) != (value ? mask : 0)) {\r
86             return FALSE;\r
87         }\r
88     }\r
89     return TRUE;\r
90 }\r
91 FX_INT32* CBC_CommonBitArray::GetBitArray()\r
92 {\r
93     return &m_bits[0];\r
94 }\r
95 void CBC_CommonBitArray::Reverse()\r
96 {\r
97     FX_INT32* newBits = FX_Alloc(FX_INT32, m_bits.GetSize());\r
98     FXSYS_memset32(newBits, 0x00, m_bits.GetSize() * sizeof(FX_INT32));\r
99     FX_INT32 size = m_size;\r
100     FX_INT32 i;\r
101     for (i = 0; i < size; i++) {\r
102         if (Get(size - i - 1)) {\r
103             newBits[i >> 5] |= 1 << (i & 0x1F);\r
104         }\r
105     }\r
106     FXSYS_memcpy32(&m_bits[0], newBits, m_bits.GetSize() * sizeof(FX_INT32));\r
107     FX_Free(newBits);\r
108 }\r