Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fxbarcode / datamatrix / BC_DefaultPlacement.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 2006 Jeremias Maerki.\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_Encoder.h"\r
25 #include "BC_DefaultPlacement.h"\r
26 CBC_DefaultPlacement::CBC_DefaultPlacement(CFX_WideString codewords, int32_t numcols, int32_t numrows)\r
27 {\r
28     m_codewords = codewords;\r
29     m_numcols = numcols;\r
30     m_numrows = numrows;\r
31     m_bits.SetSize(numcols * numrows);\r
32     for (int32_t i = 0; i < numcols * numrows; i++) {\r
33         m_bits[i] = (uint8_t) 2;\r
34     }\r
35 }\r
36 CBC_DefaultPlacement::~CBC_DefaultPlacement()\r
37 {\r
38     m_bits.RemoveAll();\r
39 }\r
40 int32_t CBC_DefaultPlacement::getNumrows()\r
41 {\r
42     return m_numrows;\r
43 }\r
44 int32_t CBC_DefaultPlacement::getNumcols()\r
45 {\r
46     return m_numcols;\r
47 }\r
48 CFX_ByteArray& CBC_DefaultPlacement::getBits()\r
49 {\r
50     return m_bits;\r
51 }\r
52 FX_BOOL CBC_DefaultPlacement::getBit(int32_t col, int32_t row)\r
53 {\r
54     return m_bits[row * m_numcols + col] == 1;\r
55 }\r
56 void CBC_DefaultPlacement::setBit(int32_t col, int32_t row, FX_BOOL bit)\r
57 {\r
58     m_bits[row * m_numcols + col] = bit ? (uint8_t) 1 : (uint8_t) 0;\r
59 }\r
60 FX_BOOL CBC_DefaultPlacement::hasBit(int32_t col, int32_t row)\r
61 {\r
62     return m_bits[row * m_numcols + col] != 2;\r
63 }\r
64 void CBC_DefaultPlacement::place()\r
65 {\r
66     int32_t pos = 0;\r
67     int32_t row = 4;\r
68     int32_t col = 0;\r
69     do {\r
70         if ((row == m_numrows) && (col == 0)) {\r
71             corner1(pos++);\r
72         }\r
73         if ((row == m_numrows - 2) && (col == 0) && ((m_numcols % 4) != 0)) {\r
74             corner2(pos++);\r
75         }\r
76         if ((row == m_numrows - 2) && (col == 0) && (m_numcols % 8 == 4)) {\r
77             corner3(pos++);\r
78         }\r
79         if ((row == m_numrows + 4) && (col == 2) && ((m_numcols % 8) == 0)) {\r
80             corner4(pos++);\r
81         }\r
82         do {\r
83             if ((row < m_numrows) && (col >= 0) && !hasBit(col, row)) {\r
84                 utah(row, col, pos++);\r
85             }\r
86             row -= 2;\r
87             col += 2;\r
88         } while (row >= 0 && (col < m_numcols));\r
89         row++;\r
90         col += 3;\r
91         do {\r
92             if ((row >= 0) && (col < m_numcols) && !hasBit(col, row)) {\r
93                 utah(row, col, pos++);\r
94             }\r
95             row += 2;\r
96             col -= 2;\r
97         } while ((row < m_numrows) && (col >= 0));\r
98         row += 3;\r
99         col++;\r
100     } while ((row < m_numrows) || (col < m_numcols));\r
101     if (!hasBit(m_numcols - 1, m_numrows - 1)) {\r
102         setBit(m_numcols - 1, m_numrows - 1, TRUE);\r
103         setBit(m_numcols - 2, m_numrows - 2, TRUE);\r
104     }\r
105 }\r
106 void CBC_DefaultPlacement::module(int32_t row, int32_t col, int32_t pos, int32_t bit)\r
107 {\r
108     if (row < 0) {\r
109         row += m_numrows;\r
110         col += 4 - ((m_numrows + 4) % 8);\r
111     }\r
112     if (col < 0) {\r
113         col += m_numcols;\r
114         row += 4 - ((m_numcols + 4) % 8);\r
115     }\r
116     int32_t v = m_codewords.GetAt(pos);\r
117     v &= 1 << (8 - bit);\r
118     setBit(col, row, v != 0);\r
119 }\r
120 void CBC_DefaultPlacement::utah(int32_t row, int32_t col, int32_t pos)\r
121 {\r
122     module(row - 2, col - 2, pos, 1);\r
123     module(row - 2, col - 1, pos, 2);\r
124     module(row - 1, col - 2, pos, 3);\r
125     module(row - 1, col - 1, pos, 4);\r
126     module(row - 1, col, pos, 5);\r
127     module(row, col - 2, pos, 6);\r
128     module(row, col - 1, pos, 7);\r
129     module(row, col, pos, 8);\r
130 }\r
131 void CBC_DefaultPlacement::corner1(int32_t pos)\r
132 {\r
133     module(m_numrows - 1, 0, pos, 1);\r
134     module(m_numrows - 1, 1, pos, 2);\r
135     module(m_numrows - 1, 2, pos, 3);\r
136     module(0, m_numcols - 2, pos, 4);\r
137     module(0, m_numcols - 1, pos, 5);\r
138     module(1, m_numcols - 1, pos, 6);\r
139     module(2, m_numcols - 1, pos, 7);\r
140     module(3, m_numcols - 1, pos, 8);\r
141 }\r
142 void CBC_DefaultPlacement::corner2(int32_t pos)\r
143 {\r
144     module(m_numrows - 3, 0, pos, 1);\r
145     module(m_numrows - 2, 0, pos, 2);\r
146     module(m_numrows - 1, 0, pos, 3);\r
147     module(0, m_numcols - 4, pos, 4);\r
148     module(0, m_numcols - 3, pos, 5);\r
149     module(0, m_numcols - 2, pos, 6);\r
150     module(0, m_numcols - 1, pos, 7);\r
151     module(1, m_numcols - 1, pos, 8);\r
152 }\r
153 void CBC_DefaultPlacement::corner3(int32_t pos)\r
154 {\r
155     module(m_numrows - 3, 0, pos, 1);\r
156     module(m_numrows - 2, 0, pos, 2);\r
157     module(m_numrows - 1, 0, pos, 3);\r
158     module(0, m_numcols - 2, pos, 4);\r
159     module(0, m_numcols - 1, pos, 5);\r
160     module(1, m_numcols - 1, pos, 6);\r
161     module(2, m_numcols - 1, pos, 7);\r
162     module(3, m_numcols - 1, pos, 8);\r
163 }\r
164 void CBC_DefaultPlacement::corner4(int32_t pos)\r
165 {\r
166     module(m_numrows - 1, 0, pos, 1);\r
167     module(m_numrows - 1, m_numcols - 1, pos, 2);\r
168     module(0, m_numcols - 3, pos, 3);\r
169     module(0, m_numcols - 2, pos, 4);\r
170     module(0, m_numcols - 1, pos, 5);\r
171     module(1, m_numcols - 3, pos, 6);\r
172     module(1, m_numcols - 2, pos, 7);\r
173     module(1, m_numcols - 1, pos, 8);\r
174 }\r