Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fxbarcode / datamatrix / BC_SymbolInfo.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_Dimension.h"\r
25 #include "../common/BC_CommonBitMatrix.h"\r
26 #include "BC_Encoder.h"\r
27 #include "BC_SymbolShapeHint.h"\r
28 #include "BC_SymbolInfo.h"\r
29 #include "BC_DataMatrixSymbolInfo144.h"\r
30 #define  SYMBOLS_COUNT  30\r
31 CBC_SymbolInfo* CBC_SymbolInfo::m_PROD_SYMBOLS[30] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};\r
32 CBC_SymbolInfo* CBC_SymbolInfo::m_symbols[30] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};\r
33 void CBC_SymbolInfo::Initialize()\r
34 {\r
35     m_PROD_SYMBOLS[0] = FX_NEW CBC_SymbolInfo(FALSE, 3, 5, 8, 8, 1);\r
36     m_PROD_SYMBOLS[1] = FX_NEW CBC_SymbolInfo(FALSE, 5, 7, 10, 10, 1);\r
37     m_PROD_SYMBOLS[2] = FX_NEW CBC_SymbolInfo(TRUE, 5, 7, 16, 6, 1);\r
38     m_PROD_SYMBOLS[3] = FX_NEW CBC_SymbolInfo(FALSE, 8, 10, 12, 12, 1);\r
39     m_PROD_SYMBOLS[4] = FX_NEW CBC_SymbolInfo(TRUE, 10, 11, 14, 6, 2);\r
40     m_PROD_SYMBOLS[5] = FX_NEW CBC_SymbolInfo(FALSE, 12, 12, 14, 14, 1);\r
41     m_PROD_SYMBOLS[6] = FX_NEW CBC_SymbolInfo(TRUE, 16, 14, 24, 10, 1);\r
42     m_PROD_SYMBOLS[7] = FX_NEW CBC_SymbolInfo(FALSE, 18, 14, 16, 16, 1);\r
43     m_PROD_SYMBOLS[8] = FX_NEW CBC_SymbolInfo(FALSE, 22, 18, 18, 18, 1);\r
44     m_PROD_SYMBOLS[9] = FX_NEW CBC_SymbolInfo(TRUE, 22, 18, 16, 10, 2);\r
45     m_PROD_SYMBOLS[10] = FX_NEW CBC_SymbolInfo(FALSE, 30, 20, 20, 20, 1);\r
46     m_PROD_SYMBOLS[11] = FX_NEW CBC_SymbolInfo(TRUE, 32, 24, 16, 14, 2);\r
47     m_PROD_SYMBOLS[12] = FX_NEW CBC_SymbolInfo(FALSE, 36, 24, 22, 22, 1);\r
48     m_PROD_SYMBOLS[13] = FX_NEW CBC_SymbolInfo(FALSE, 44, 28, 24, 24, 1);\r
49     m_PROD_SYMBOLS[14] = FX_NEW CBC_SymbolInfo(TRUE, 49, 28, 22, 14, 2);\r
50     m_PROD_SYMBOLS[15] = FX_NEW CBC_SymbolInfo(FALSE, 62, 36, 14, 14, 4);\r
51     m_PROD_SYMBOLS[16] = FX_NEW CBC_SymbolInfo(FALSE, 86, 42, 16, 16, 4);\r
52     m_PROD_SYMBOLS[17] = FX_NEW CBC_SymbolInfo(FALSE, 114, 48, 18, 18, 4);\r
53     m_PROD_SYMBOLS[18] = FX_NEW CBC_SymbolInfo(FALSE, 144, 56, 20, 20, 4);\r
54     m_PROD_SYMBOLS[19] = FX_NEW CBC_SymbolInfo(FALSE, 174, 68, 22, 22, 4);\r
55     m_PROD_SYMBOLS[20] = FX_NEW CBC_SymbolInfo(FALSE, 204, 84, 24, 24, 4, 102, 42);\r
56     m_PROD_SYMBOLS[21] = FX_NEW CBC_SymbolInfo(FALSE, 280, 112, 14, 14, 16, 140, 56);\r
57     m_PROD_SYMBOLS[22] = FX_NEW CBC_SymbolInfo(FALSE, 368, 144, 16, 16, 16, 92, 36);\r
58     m_PROD_SYMBOLS[23] = FX_NEW CBC_SymbolInfo(FALSE, 456, 192, 18, 18, 16, 114, 48);\r
59     m_PROD_SYMBOLS[24] = FX_NEW CBC_SymbolInfo(FALSE, 576, 224, 20, 20, 16, 144, 56);\r
60     m_PROD_SYMBOLS[25] = FX_NEW CBC_SymbolInfo(FALSE, 696, 272, 22, 22, 16, 174, 68);\r
61     m_PROD_SYMBOLS[26] = FX_NEW CBC_SymbolInfo(FALSE, 816, 336, 24, 24, 16, 136, 56);\r
62     m_PROD_SYMBOLS[27] = FX_NEW CBC_SymbolInfo(FALSE, 1050, 408, 18, 18, 36, 175, 68);\r
63     m_PROD_SYMBOLS[28] = FX_NEW CBC_SymbolInfo(FALSE, 1304, 496, 20, 20, 36, 163, 62);\r
64     m_PROD_SYMBOLS[29] = FX_NEW CBC_DataMatrixSymbolInfo144();\r
65     for (int32_t i = 0; i < SYMBOLS_COUNT; i++) {\r
66         m_symbols[i] = m_PROD_SYMBOLS[i];\r
67     }\r
68 }\r
69 void CBC_SymbolInfo::Finalize()\r
70 {\r
71     for (int32_t i = 0; i < SYMBOLS_COUNT; i++) {\r
72         delete m_PROD_SYMBOLS[i];\r
73         m_PROD_SYMBOLS[i] = NULL;\r
74         m_symbols[i] = NULL;\r
75     }\r
76 }\r
77 CBC_SymbolInfo::CBC_SymbolInfo(FX_BOOL rectangular, int32_t dataCapacity, int32_t errorCodewords, int32_t matrixWidth, int32_t matrixHeight, int32_t dataRegions)\r
78 {\r
79     m_rectangular = rectangular;\r
80     m_dataCapacity = dataCapacity;\r
81     m_errorCodewords = errorCodewords;\r
82     m_matrixWidth = matrixWidth;\r
83     m_matrixHeight = matrixHeight;\r
84     m_dataRegions = dataRegions;\r
85     m_rsBlockData = dataCapacity;\r
86     m_rsBlockError = errorCodewords;\r
87 }\r
88 CBC_SymbolInfo::CBC_SymbolInfo(FX_BOOL rectangular, int32_t dataCapacity, int32_t errorCodewords, int32_t matrixWidth, int32_t matrixHeight, int32_t dataRegions,\r
89                                int32_t rsBlockData, int32_t rsBlockError)\r
90 {\r
91     m_rectangular = rectangular;\r
92     m_dataCapacity = dataCapacity;\r
93     m_errorCodewords = errorCodewords;\r
94     m_matrixWidth = matrixWidth;\r
95     m_matrixHeight = matrixHeight;\r
96     m_dataRegions = dataRegions;\r
97     m_rsBlockData = rsBlockData;\r
98     m_rsBlockError = rsBlockError;\r
99 }\r
100 CBC_SymbolInfo::~CBC_SymbolInfo()\r
101 {\r
102 }\r
103 \r
104 CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords, int32_t &e)\r
105 {\r
106     return lookup(dataCodewords, FORCE_NONE, TRUE, e);\r
107 }\r
108 CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords, SymbolShapeHint shape, int32_t &e)\r
109 {\r
110     return lookup(dataCodewords, shape, TRUE, e);\r
111 }\r
112 CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords, FX_BOOL allowRectangular, FX_BOOL fail, int32_t &e)\r
113 {\r
114     SymbolShapeHint shape = allowRectangular ? FORCE_NONE : FORCE_SQUARE;\r
115     return lookup(dataCodewords, shape, fail, e);\r
116 }\r
117 CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords, SymbolShapeHint shape, FX_BOOL fail, int32_t &e)\r
118 {\r
119     return lookup(dataCodewords, shape, NULL, NULL, fail, e);\r
120 }\r
121 CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords, SymbolShapeHint shape, CBC_Dimension* minSize, CBC_Dimension* maxSize, FX_BOOL fail, int32_t &e)\r
122 {\r
123     for (int32_t i = 0; i < SYMBOLS_COUNT; i++) {\r
124         CBC_SymbolInfo* symbol = m_symbols[i];\r
125         if (shape == FORCE_SQUARE && symbol->m_rectangular) {\r
126             continue;\r
127         }\r
128         if (shape == FORCE_RECTANGLE && !symbol->m_rectangular) {\r
129             continue;\r
130         }\r
131         if (minSize != NULL && (symbol->getSymbolWidth(e) < minSize->getWidth() || symbol->getSymbolHeight(e) < minSize->getHeight())) {\r
132             BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
133             continue;\r
134         }\r
135         if (maxSize != NULL && (symbol->getSymbolWidth(e) > maxSize->getWidth() || symbol->getSymbolHeight(e) > maxSize->getHeight())) {\r
136             BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
137             continue;\r
138         }\r
139         if (dataCodewords <= symbol->m_dataCapacity) {\r
140             return symbol;\r
141         }\r
142     }\r
143     if (fail) {\r
144         e = BCExceptionIllegalDataCodewords;\r
145         return NULL;\r
146     }\r
147     return NULL;\r
148 }\r
149 int32_t CBC_SymbolInfo::getHorizontalDataRegions(int32_t &e)\r
150 {\r
151     switch (m_dataRegions) {\r
152         case 1:\r
153             return 1;\r
154         case 2:\r
155             return 2;\r
156         case 4:\r
157             return 2;\r
158         case 16:\r
159             return 4;\r
160         case 36:\r
161             return 6;\r
162         default:\r
163             e = BCExceptionCannotHandleThisNumberOfDataRegions;\r
164             return 0;\r
165     }\r
166 }\r
167 int32_t CBC_SymbolInfo::getVerticalDataRegions(int32_t &e)\r
168 {\r
169     switch (m_dataRegions) {\r
170         case 1:\r
171             return 1;\r
172         case 2:\r
173             return 1;\r
174         case 4:\r
175             return 2;\r
176         case 16:\r
177             return 4;\r
178         case 36:\r
179             return 6;\r
180         default:\r
181             e = BCExceptionCannotHandleThisNumberOfDataRegions;\r
182             return 0;\r
183     }\r
184 }\r
185 int32_t CBC_SymbolInfo::getSymbolDataWidth(int32_t &e)\r
186 {\r
187     return getHorizontalDataRegions(e) * m_matrixWidth;\r
188 }\r
189 int32_t CBC_SymbolInfo::getSymbolDataHeight(int32_t &e)\r
190 {\r
191     return getVerticalDataRegions(e) * m_matrixHeight;\r
192 }\r
193 int32_t CBC_SymbolInfo::getSymbolWidth(int32_t &e)\r
194 {\r
195     return getSymbolDataWidth(e) + (getHorizontalDataRegions(e) * 2);\r
196 }\r
197 int32_t CBC_SymbolInfo::getSymbolHeight(int32_t &e)\r
198 {\r
199     return getSymbolDataHeight(e) + (getVerticalDataRegions(e) * 2);\r
200 }\r
201 int32_t CBC_SymbolInfo::getCodewordCount()\r
202 {\r
203     return m_dataCapacity + m_errorCodewords;\r
204 }\r
205 int32_t CBC_SymbolInfo::getInterleavedBlockCount()\r
206 {\r
207     return m_dataCapacity / m_rsBlockData;\r
208 }\r
209 int32_t CBC_SymbolInfo::getDataLengthForInterleavedBlock(int32_t index)\r
210 {\r
211     return m_rsBlockData;\r
212 }\r
213 int32_t CBC_SymbolInfo::getErrorLengthForInterleavedBlock(int32_t index)\r
214 {\r
215     return m_rsBlockError;\r
216 }\r
217 CFX_WideString CBC_SymbolInfo::toString(int32_t &e)\r
218 {\r
219     CFX_WideString sb;\r
220     sb += (FX_LPWSTR)(m_rectangular ? "Rectangular Symbol:" : "Square Symbol:");\r
221     sb += (FX_LPWSTR)" data region ";\r
222     sb += m_matrixWidth;\r
223     sb += (FX_WCHAR)'x';\r
224     sb += m_matrixHeight;\r
225     sb += (FX_LPWSTR)", symbol size ";\r
226     sb += getSymbolWidth(e);\r
227     BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)"");\r
228     sb += (FX_WCHAR)'x';\r
229     sb += getSymbolHeight(e);\r
230     BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)"");\r
231     sb += (FX_LPWSTR)", symbol data size ";\r
232     sb += getSymbolDataWidth(e);\r
233     BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)"");\r
234     sb += (FX_WCHAR)'x';\r
235     sb += getSymbolDataHeight(e);\r
236     BC_EXCEPTION_CHECK_ReturnValue(e, (FX_LPWSTR)"");\r
237     sb += (FX_LPWSTR)", codewords ";\r
238     sb += m_dataCapacity;\r
239     sb += (FX_WCHAR)'+';\r
240     sb += m_errorCodewords;\r
241     return sb;\r
242 }\r