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