Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_CommonBitMatrix.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 #include "include/BC_CommonBitMatrix.h"\r
10 CBC_CommonBitMatrix::CBC_CommonBitMatrix()\r
11 {\r
12     m_width = 0;\r
13     m_height = 0;\r
14     m_rowSize = 0;\r
15     m_bits = NULL;\r
16 }\r
17 void CBC_CommonBitMatrix::Init(FX_INT32 dimension)\r
18 {\r
19     m_width = dimension;\r
20     m_height = dimension;\r
21     FX_INT32 rowSize = (m_height + 31) >> 5;\r
22     m_rowSize = rowSize;\r
23     m_bits = FX_Alloc(FX_INT32, m_rowSize * m_height);\r
24     FXSYS_memset32(m_bits, 0, m_rowSize * m_height * sizeof(FX_INT32));\r
25 }\r
26 void CBC_CommonBitMatrix::Init(FX_INT32 width, FX_INT32 height)\r
27 {\r
28     m_width = width;\r
29     m_height = height;\r
30     FX_INT32 rowSize = (width + 31) >> 5;\r
31     m_rowSize = rowSize;\r
32     m_bits = FX_Alloc(FX_INT32, m_rowSize * m_height);\r
33     FXSYS_memset32(m_bits, 0, m_rowSize * m_height * sizeof(FX_INT32));\r
34 }\r
35 CBC_CommonBitMatrix::~CBC_CommonBitMatrix()\r
36 {\r
37     if (m_bits != NULL) {\r
38         FX_Free(m_bits);\r
39     }\r
40     m_bits = NULL;\r
41     m_height = m_width = m_rowSize = 0;\r
42 }\r
43 FX_BOOL CBC_CommonBitMatrix::Get(FX_INT32 x, FX_INT32 y)\r
44 {\r
45     FX_INT32 offset = y * m_rowSize + (x >> 5);\r
46     if (offset >= m_rowSize * m_height || offset < 0) {\r
47         return false;\r
48     }\r
49     return ((((FX_DWORD)m_bits[offset]) >> (x & 0x1f)) & 1) != 0;\r
50 }\r
51 FX_INT32* CBC_CommonBitMatrix::GetBits()\r
52 {\r
53     return m_bits;\r
54 }\r
55 void CBC_CommonBitMatrix::Set(FX_INT32 x, FX_INT32 y)\r
56 {\r
57     FX_INT32 offset = y * m_rowSize + (x >> 5);\r
58     if (offset >= m_rowSize * m_height || offset < 0) {\r
59         return;\r
60     }\r
61     m_bits[offset] |= 1 << (x & 0x1f);\r
62 }\r
63 void CBC_CommonBitMatrix::Flip(FX_INT32 x, FX_INT32 y)\r
64 {\r
65     FX_INT32 offset = y * m_rowSize + (x >> 5);\r
66     m_bits[offset] ^= 1 << (x & 0x1f);\r
67 }\r
68 void CBC_CommonBitMatrix::Clear()\r
69 {\r
70     FXSYS_memset32(m_bits, 0, m_rowSize * m_height * sizeof(FX_INT32));\r
71 }\r
72 void CBC_CommonBitMatrix::SetRegion(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height, FX_INT32 &e)\r
73 {\r
74     if (top < 0 || left < 0) {\r
75         e = BCExceptionLeftAndTopMustBeNonnegative;\r
76         return;\r
77     }\r
78     if (height < 1 || width < 1) {\r
79         e = BCExceptionHeightAndWidthMustBeAtLeast1;\r
80         return;\r
81     }\r
82     FX_INT32 right = left + width;\r
83     FX_INT32 bottom = top + height;\r
84     if (m_height < bottom || m_width < right) {\r
85         e = BCExceptionRegionMustFitInsideMatrix;\r
86         return;\r
87     }\r
88     FX_INT32 y;\r
89     for (y = top; y < bottom; y++) {\r
90         FX_INT32 offset = y * m_rowSize;\r
91         FX_INT32 x;\r
92         for (x = left; x < right; x++) {\r
93             m_bits[offset + (x >> 5)] |= 1 << (x & 0x1f);\r
94         }\r
95     }\r
96 }\r
97 CBC_CommonBitArray* CBC_CommonBitMatrix::GetRow(FX_INT32 y, CBC_CommonBitArray* row)\r
98 {\r
99     CBC_CommonBitArray* rowArray = NULL;\r
100     if (row == NULL || row->GetSize() < m_width) {\r
101         rowArray = FX_NEW CBC_CommonBitArray(m_width);\r
102     } else {\r
103         rowArray = FX_NEW CBC_CommonBitArray(row);\r
104     }\r
105     FX_INT32 offset = y * m_rowSize;\r
106     FX_INT32 x;\r
107     for (x = 0; x < m_rowSize; x++) {\r
108         rowArray->SetBulk(x << 5, m_bits[offset + x]);\r
109     }\r
110     return rowArray;\r
111 }\r
112 void CBC_CommonBitMatrix::SetRow(FX_INT32 y, CBC_CommonBitArray* row)\r
113 {\r
114     FX_INT32 l = y * m_rowSize;\r
115     for (FX_INT32 i = 0; i < m_rowSize; i++) {\r
116         m_bits[l] = row->GetBitArray()[i];\r
117         l++;\r
118     }\r
119 }\r
120 void CBC_CommonBitMatrix::SetCol(FX_INT32 y, CBC_CommonBitArray* col)\r
121 {\r
122     for (FX_INT32 i = 0; i < col->GetBits().GetSize(); i++) {\r
123         m_bits[i * m_rowSize + y] = col->GetBitArray()[i];\r
124     }\r
125 }\r
126 FX_INT32 CBC_CommonBitMatrix::GetWidth()\r
127 {\r
128     return m_width;\r
129 }\r
130 FX_INT32 CBC_CommonBitMatrix::GetHeight()\r
131 {\r
132     return m_height;\r
133 }\r
134 FX_INT32 CBC_CommonBitMatrix::GetRowSize()\r
135 {\r
136     return m_rowSize;\r
137 }\r
138 FX_INT32 CBC_CommonBitMatrix::GetDimension(FX_INT32 &e)\r
139 {\r
140     if (m_width != m_height) {\r
141         e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix;\r
142         return 0;\r
143     }\r
144     return m_width;\r
145 }\r