Merge to XFA: Kill FXSYS_mem{cpy,cmp,set.move}{32,8}.
[pdfium.git] / xfa / src / fxbarcode / common / 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 // Original code is licensed as follows:\r
7 /*\r
8  * Copyright 2007 ZXing authors\r
9  *\r
10  * Licensed under the Apache License, Version 2.0 (the "License");\r
11  * you may not use this file except in compliance with the License.\r
12  * You may obtain a copy of the License at\r
13  *\r
14  *      http://www.apache.org/licenses/LICENSE-2.0\r
15  *\r
16  * Unless required by applicable law or agreed to in writing, software\r
17  * distributed under the License is distributed on an "AS IS" BASIS,\r
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
19  * See the License for the specific language governing permissions and\r
20  * limitations under the License.\r
21  */\r
22 \r
23 #include "../barcode.h"\r
24 #include "BC_CommonBitArray.h"\r
25 #include "BC_CommonBitMatrix.h"\r
26 CBC_CommonBitMatrix::CBC_CommonBitMatrix()\r
27 {\r
28     m_width = 0;\r
29     m_height = 0;\r
30     m_rowSize = 0;\r
31     m_bits = NULL;\r
32 }\r
33 void CBC_CommonBitMatrix::Init(int32_t dimension)\r
34 {\r
35     m_width = dimension;\r
36     m_height = dimension;\r
37     int32_t rowSize = (m_height + 31) >> 5;\r
38     m_rowSize = rowSize;\r
39     m_bits = FX_Alloc(int32_t, m_rowSize * m_height);\r
40     FXSYS_memset(m_bits, 0, m_rowSize * m_height * sizeof(int32_t));\r
41 }\r
42 void CBC_CommonBitMatrix::Init(int32_t width, int32_t height)\r
43 {\r
44     m_width = width;\r
45     m_height = height;\r
46     int32_t rowSize = (width + 31) >> 5;\r
47     m_rowSize = rowSize;\r
48     m_bits = FX_Alloc(int32_t, m_rowSize * m_height);\r
49     FXSYS_memset(m_bits, 0, m_rowSize * m_height * sizeof(int32_t));\r
50 }\r
51 CBC_CommonBitMatrix::~CBC_CommonBitMatrix()\r
52 {\r
53     if (m_bits != NULL) {\r
54         FX_Free(m_bits);\r
55     }\r
56     m_bits = NULL;\r
57     m_height = m_width = m_rowSize = 0;\r
58 }\r
59 FX_BOOL CBC_CommonBitMatrix::Get(int32_t x, int32_t y)\r
60 {\r
61     int32_t offset = y * m_rowSize + (x >> 5);\r
62     if (offset >= m_rowSize * m_height || offset < 0) {\r
63         return false;\r
64     }\r
65     return ((((FX_DWORD)m_bits[offset]) >> (x & 0x1f)) & 1) != 0;\r
66 }\r
67 int32_t* CBC_CommonBitMatrix::GetBits()\r
68 {\r
69     return m_bits;\r
70 }\r
71 void CBC_CommonBitMatrix::Set(int32_t x, int32_t y)\r
72 {\r
73     int32_t offset = y * m_rowSize + (x >> 5);\r
74     if (offset >= m_rowSize * m_height || offset < 0) {\r
75         return;\r
76     }\r
77     m_bits[offset] |= 1 << (x & 0x1f);\r
78 }\r
79 void CBC_CommonBitMatrix::Flip(int32_t x, int32_t y)\r
80 {\r
81     int32_t offset = y * m_rowSize + (x >> 5);\r
82     m_bits[offset] ^= 1 << (x & 0x1f);\r
83 }\r
84 void CBC_CommonBitMatrix::Clear()\r
85 {\r
86     FXSYS_memset(m_bits, 0, m_rowSize * m_height * sizeof(int32_t));\r
87 }\r
88 void CBC_CommonBitMatrix::SetRegion(int32_t left, int32_t top, int32_t width, int32_t height, int32_t &e)\r
89 {\r
90     if (top < 0 || left < 0) {\r
91         e = BCExceptionLeftAndTopMustBeNonnegative;\r
92         return;\r
93     }\r
94     if (height < 1 || width < 1) {\r
95         e = BCExceptionHeightAndWidthMustBeAtLeast1;\r
96         return;\r
97     }\r
98     int32_t right = left + width;\r
99     int32_t bottom = top + height;\r
100     if (m_height < bottom || m_width < right) {\r
101         e = BCExceptionRegionMustFitInsideMatrix;\r
102         return;\r
103     }\r
104     int32_t y;\r
105     for (y = top; y < bottom; y++) {\r
106         int32_t offset = y * m_rowSize;\r
107         int32_t x;\r
108         for (x = left; x < right; x++) {\r
109             m_bits[offset + (x >> 5)] |= 1 << (x & 0x1f);\r
110         }\r
111     }\r
112 }\r
113 CBC_CommonBitArray* CBC_CommonBitMatrix::GetRow(int32_t y, CBC_CommonBitArray* row)\r
114 {\r
115     CBC_CommonBitArray* rowArray = NULL;\r
116     if (row == NULL || row->GetSize() < m_width) {\r
117         rowArray = FX_NEW CBC_CommonBitArray(m_width);\r
118     } else {\r
119         rowArray = FX_NEW CBC_CommonBitArray(row);\r
120     }\r
121     int32_t offset = y * m_rowSize;\r
122     int32_t x;\r
123     for (x = 0; x < m_rowSize; x++) {\r
124         rowArray->SetBulk(x << 5, m_bits[offset + x]);\r
125     }\r
126     return rowArray;\r
127 }\r
128 void CBC_CommonBitMatrix::SetRow(int32_t y, CBC_CommonBitArray* row)\r
129 {\r
130     int32_t l = y * m_rowSize;\r
131     for (int32_t i = 0; i < m_rowSize; i++) {\r
132         m_bits[l] = row->GetBitArray()[i];\r
133         l++;\r
134     }\r
135 }\r
136 void CBC_CommonBitMatrix::SetCol(int32_t y, CBC_CommonBitArray* col)\r
137 {\r
138     for (int32_t i = 0; i < col->GetBits().GetSize(); i++) {\r
139         m_bits[i * m_rowSize + y] = col->GetBitArray()[i];\r
140     }\r
141 }\r
142 int32_t CBC_CommonBitMatrix::GetWidth()\r
143 {\r
144     return m_width;\r
145 }\r
146 int32_t CBC_CommonBitMatrix::GetHeight()\r
147 {\r
148     return m_height;\r
149 }\r
150 int32_t CBC_CommonBitMatrix::GetRowSize()\r
151 {\r
152     return m_rowSize;\r
153 }\r
154 int32_t CBC_CommonBitMatrix::GetDimension(int32_t &e)\r
155 {\r
156     if (m_width != m_height) {\r
157         e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix;\r
158         return 0;\r
159     }\r
160     return m_width;\r
161 }\r