Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fwl / src / basewidget / fxmath_barcodeimp.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 "../../../foxitlib.h"\r
8 #include "include/fxmath_barcodeimp.h"\r
9 static CBC_CodeBase* FX_Barcode_CreateBarCodeEngineObject(BC_TYPE type)\r
10 {\r
11     switch(type) {\r
12         case BC_CODE39:\r
13             return FX_NEW CBC_Code39();\r
14         case BC_CODABAR:\r
15             return FX_NEW CBC_Codabar();\r
16         case BC_CODE128:\r
17             return FX_NEW CBC_Code128(BC_CODE128_B);\r
18         case BC_CODE128_B:\r
19             return FX_NEW CBC_Code128(BC_CODE128_B);\r
20         case BC_CODE128_C:\r
21             return FX_NEW CBC_Code128(BC_CODE128_C);\r
22         case BC_EAN8:\r
23             return FX_NEW CBC_EAN8();\r
24         case BC_UPCA:\r
25             return FX_NEW CBC_UPCA();\r
26         case BC_EAN13:\r
27             return FX_NEW CBC_EAN13();\r
28         case BC_QR_CODE:\r
29             return FX_NEW CBC_QRCode();\r
30         case BC_PDF417:\r
31             return FX_NEW CBC_PDF417I();\r
32         case BC_DATAMATRIX:\r
33             return FX_NEW CBC_DataMatrix();\r
34         case BC_UNKNOWN:\r
35         default:\r
36             return NULL;\r
37     }\r
38 }\r
39 CFX_Barcode::CFX_Barcode()\r
40 {\r
41 }\r
42 CFX_Barcode::~CFX_Barcode()\r
43 {\r
44     if(m_pBCEngine) {\r
45         delete m_pBCEngine;\r
46         m_pBCEngine = NULL;\r
47     }\r
48 }\r
49 FX_BOOL CFX_Barcode::Crreate(BC_TYPE type)\r
50 {\r
51     m_pBCEngine = FX_Barcode_CreateBarCodeEngineObject(type);\r
52     return m_pBCEngine != NULL;\r
53 }\r
54 void CFX_Barcode::Release()\r
55 {\r
56     delete this;\r
57 }\r
58 BC_TYPE CFX_Barcode::GetType()\r
59 {\r
60     return m_pBCEngine ? m_pBCEngine->GetType() : BC_UNKNOWN;\r
61 }\r
62 FX_BOOL CFX_Barcode::SetCharEncoding(BC_CHAR_ENCODING encoding)\r
63 {\r
64     return m_pBCEngine ? m_pBCEngine->SetCharEncoding(encoding) : FALSE;\r
65 }\r
66 FX_BOOL CFX_Barcode::SetModuleHeight(FX_INT32 moduleHeight)\r
67 {\r
68     return m_pBCEngine ? m_pBCEngine->SetModuleHeight(moduleHeight) : FALSE;\r
69 }\r
70 FX_BOOL CFX_Barcode::SetModuleWidth(FX_INT32 moduleWidth)\r
71 {\r
72     return m_pBCEngine ? m_pBCEngine->SetModuleWidth(moduleWidth) : FALSE;\r
73 }\r
74 FX_BOOL CFX_Barcode::SetHeight(FX_INT32 height)\r
75 {\r
76     return m_pBCEngine ? m_pBCEngine->SetHeight(height) : FALSE;\r
77 }\r
78 FX_BOOL CFX_Barcode::SetWidth(FX_INT32 width)\r
79 {\r
80     return m_pBCEngine ? m_pBCEngine->SetWidth(width) : FALSE;\r
81 }\r
82 FX_BOOL CFX_Barcode::CheckContentValidity(FX_WSTR contents)\r
83 {\r
84     switch(GetType()) {\r
85         case BC_CODE39:\r
86         case BC_CODABAR:\r
87         case BC_CODE128:\r
88         case BC_CODE128_B:\r
89         case BC_CODE128_C:\r
90         case BC_EAN8:\r
91         case BC_EAN13:\r
92         case BC_UPCA:\r
93             return m_pBCEngine ? ((CBC_OneCode*)m_pBCEngine)->CheckContentValidity(contents)\r
94                    : TRUE;\r
95         default:\r
96             return TRUE;\r
97     }\r
98 }\r
99 FX_BOOL CFX_Barcode::SetPrintChecksum(FX_BOOL checksum)\r
100 {\r
101     switch(GetType()) {\r
102         case BC_CODE39:\r
103         case BC_CODABAR:\r
104         case BC_CODE128:\r
105         case BC_CODE128_B:\r
106         case BC_CODE128_C:\r
107         case BC_EAN8:\r
108         case BC_EAN13:\r
109         case BC_UPCA:\r
110             return m_pBCEngine ? (((CBC_OneCode*)m_pBCEngine)->SetPrintChecksum(checksum), TRUE)\r
111                    : FALSE;\r
112         default:\r
113             return FALSE;\r
114     }\r
115 }\r
116 FX_BOOL CFX_Barcode::SetDataLength(FX_INT32 length)\r
117 {\r
118     switch(GetType()) {\r
119         case BC_CODE39:\r
120         case BC_CODABAR:\r
121         case BC_CODE128:\r
122         case BC_CODE128_B:\r
123         case BC_CODE128_C:\r
124         case BC_EAN8:\r
125         case BC_EAN13:\r
126         case BC_UPCA:\r
127             return m_pBCEngine ? (((CBC_OneCode*)m_pBCEngine)->SetDataLength(length), TRUE)\r
128                    : FALSE;\r
129         default:\r
130             return FALSE;\r
131     }\r
132 }\r
133 FX_BOOL CFX_Barcode::SetCalChecksum(FX_INT32 state)\r
134 {\r
135     switch(GetType()) {\r
136         case BC_CODE39:\r
137         case BC_CODABAR:\r
138         case BC_CODE128:\r
139         case BC_CODE128_B:\r
140         case BC_CODE128_C:\r
141         case BC_EAN8:\r
142         case BC_EAN13:\r
143         case BC_UPCA:\r
144             return m_pBCEngine ? (((CBC_OneCode*)m_pBCEngine)->SetCalChecksum(state), TRUE)\r
145                    : FALSE;\r
146         default:\r
147             return FALSE;\r
148     }\r
149 }\r
150 FX_BOOL CFX_Barcode::SetFont(CFX_Font* pFont)\r
151 {\r
152     switch(GetType()) {\r
153         case BC_CODE39:\r
154         case BC_CODABAR:\r
155         case BC_CODE128:\r
156         case BC_CODE128_B:\r
157         case BC_CODE128_C:\r
158         case BC_EAN8:\r
159         case BC_EAN13:\r
160         case BC_UPCA:\r
161             return m_pBCEngine ? ((CBC_OneCode*)m_pBCEngine)->SetFont(pFont)\r
162                    : FALSE;\r
163         default:\r
164             return FALSE;\r
165     }\r
166 }\r
167 FX_BOOL CFX_Barcode::SetFontSize(FX_FLOAT size)\r
168 {\r
169     switch(GetType()) {\r
170         case BC_CODE39:\r
171         case BC_CODABAR:\r
172         case BC_CODE128:\r
173         case BC_CODE128_B:\r
174         case BC_CODE128_C:\r
175         case BC_EAN8:\r
176         case BC_EAN13:\r
177         case BC_UPCA:\r
178             return m_pBCEngine ? (((CBC_OneCode*)m_pBCEngine)->SetFontSize(size), TRUE)\r
179                    : FALSE;\r
180         default:\r
181             return FALSE;\r
182     }\r
183 }\r
184 FX_BOOL CFX_Barcode::SetFontStyle(FX_INT32 style)\r
185 {\r
186     switch(GetType()) {\r
187         case BC_CODE39:\r
188         case BC_CODABAR:\r
189         case BC_CODE128:\r
190         case BC_CODE128_B:\r
191         case BC_CODE128_C:\r
192         case BC_EAN8:\r
193         case BC_EAN13:\r
194         case BC_UPCA:\r
195             return m_pBCEngine ? (((CBC_OneCode*)m_pBCEngine)->SetFontStyle(style), TRUE)\r
196                    : FALSE;\r
197         default:\r
198             return FALSE;\r
199     }\r
200 }\r
201 FX_BOOL CFX_Barcode::SetFontColor(FX_ARGB color)\r
202 {\r
203     switch(GetType()) {\r
204         case BC_CODE39:\r
205         case BC_CODABAR:\r
206         case BC_CODE128:\r
207         case BC_CODE128_B:\r
208         case BC_CODE128_C:\r
209         case BC_EAN8:\r
210         case BC_EAN13:\r
211         case BC_UPCA:\r
212             return m_pBCEngine ? (((CBC_OneCode*)m_pBCEngine)->SetFontColor(color), TRUE)\r
213                    : FALSE;\r
214         default:\r
215             return FALSE;\r
216     }\r
217 }\r
218 FX_BOOL CFX_Barcode::SetTextLocation(BC_TEXT_LOC location)\r
219 {\r
220     typedef FX_BOOL (CBC_CodeBase::*memptrtype)(BC_TEXT_LOC);\r
221     memptrtype memptr = NULL;\r
222     switch(GetType()) {\r
223         case BC_CODE39:\r
224             memptr = (memptrtype)&CBC_Code39::SetTextLocation;\r
225             break;\r
226         case BC_CODABAR:\r
227             memptr = (memptrtype)&CBC_Codabar::SetTextLocation;\r
228             break;\r
229         case BC_CODE128:\r
230         case BC_CODE128_B:\r
231         case BC_CODE128_C:\r
232             memptr = (memptrtype)&CBC_Code128::SetTextLocation;\r
233             break;\r
234         default:\r
235             break;\r
236     }\r
237     return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(location)\r
238            : FALSE;\r
239 }\r
240 FX_BOOL CFX_Barcode::SetWideNarrowRatio(FX_INT32 ratio)\r
241 {\r
242     typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_INT32);\r
243     memptrtype memptr = NULL;\r
244     switch(GetType()) {\r
245         case BC_CODE39:\r
246             memptr = (memptrtype)&CBC_Code39::SetWideNarrowRatio;\r
247             break;\r
248         case BC_CODABAR:\r
249             memptr = (memptrtype)&CBC_Codabar::SetWideNarrowRatio;\r
250             break;\r
251         default:\r
252             break;\r
253     }\r
254     return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(ratio)\r
255            : FALSE;\r
256 }\r
257 FX_BOOL CFX_Barcode::SetStartChar(FX_CHAR start)\r
258 {\r
259     typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_CHAR);\r
260     memptrtype memptr = NULL;\r
261     switch(GetType()) {\r
262         case BC_CODABAR:\r
263             memptr = (memptrtype)&CBC_Codabar::SetStartChar;\r
264             break;\r
265         default:\r
266             break;\r
267     }\r
268     return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(start)\r
269            : FALSE;\r
270 }\r
271 FX_BOOL CFX_Barcode::SetEndChar(FX_CHAR end)\r
272 {\r
273     typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_CHAR);\r
274     memptrtype memptr = NULL;\r
275     switch(GetType()) {\r
276         case BC_CODABAR:\r
277             memptr = (memptrtype)&CBC_Codabar::SetEndChar;\r
278             break;\r
279         default:\r
280             break;\r
281     }\r
282     return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(end)\r
283            : FALSE;\r
284 }\r
285 FX_BOOL CFX_Barcode::SetVersion(FX_INT32 version)\r
286 {\r
287     typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_INT32);\r
288     memptrtype memptr = NULL;\r
289     switch(GetType()) {\r
290         case BC_QR_CODE:\r
291             memptr = (memptrtype)&CBC_QRCode::SetVersion;\r
292             break;\r
293         default:\r
294             break;\r
295     }\r
296     return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(version)\r
297            : FALSE;\r
298 }\r
299 FX_BOOL CFX_Barcode::SetErrorCorrectionLevel(FX_INT32 level)\r
300 {\r
301     typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_INT32);\r
302     memptrtype memptr = NULL;\r
303     switch(GetType()) {\r
304         case BC_QR_CODE:\r
305             memptr = (memptrtype)&CBC_QRCode::SetErrorCorrectionLevel;\r
306             break;\r
307         case BC_PDF417:\r
308             memptr = (memptrtype)&CBC_PDF417I::SetErrorCorrectionLevel;\r
309             break;\r
310         default:\r
311             return FALSE;\r
312     }\r
313     return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(level)\r
314            : FALSE;\r
315 }\r
316 FX_BOOL CFX_Barcode::SetTruncated(FX_BOOL truncated)\r
317 {\r
318     typedef void (CBC_CodeBase::*memptrtype)(FX_BOOL);\r
319     memptrtype memptr = NULL;\r
320     switch(GetType()) {\r
321         case BC_PDF417:\r
322             memptr = (memptrtype)&CBC_PDF417I::SetTruncated;\r
323             break;\r
324         default:\r
325             break;\r
326     }\r
327     return m_pBCEngine && memptr ? ((m_pBCEngine->*memptr)(truncated), TRUE)\r
328            : FALSE;\r
329 }\r
330 #ifndef BCExceptionNO\r
331 #define BCExceptionNO                                                                                              0\r
332 #endif\r
333 #ifndef BCExceptionFormatException\r
334 #define BCExceptionFormatException                                                                         8\r
335 #endif\r
336 #ifndef BCExceptionUnSupportedBarcode\r
337 #define BCExceptionUnSupportedBarcode                                                             18\r
338 #endif\r
339 FX_BOOL CFX_Barcode::Encode(FX_WSTR contents, FX_BOOL isDevice, FX_INT32 &e)\r
340 {\r
341     if(!m_pBCEngine) {\r
342         return FALSE;\r
343     }\r
344     return m_pBCEngine->Encode(contents, isDevice, e);\r
345 }\r
346 FX_BOOL CFX_Barcode::RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matirx, FX_INT32 &e)\r
347 {\r
348     if (!m_pBCEngine) {\r
349         return FALSE;\r
350     }\r
351     return m_pBCEngine->RenderDevice(device, matirx, e);\r
352 }\r
353 FX_BOOL CFX_Barcode::RenderBitmap(CFX_DIBitmap *&pOutBitmap, FX_INT32 &e)\r
354 {\r
355     if (!m_pBCEngine) {\r
356         return FALSE;\r
357     }\r
358     return m_pBCEngine->RenderBitmap(pOutBitmap, e);\r
359 }\r
360 #define BC_TYPE_MIN BC_CODE39\r
361 #define BC_TYPE_MAX BC_DATAMATRIX\r
362 CFX_WideString  CFX_Barcode::Decode(FX_BYTE* buf, FX_INT32 width, FX_INT32 height, FX_INT32 &errorCode)\r
363 {\r
364     for(BC_TYPE t = BC_TYPE_MIN; t <= BC_TYPE_MAX; t = (BC_TYPE)((FX_INT32)t + 1)) {\r
365         CBC_CodeBase* pTmpEngine = FX_Barcode_CreateBarCodeEngineObject(t);\r
366         if(!pTmpEngine) {\r
367             continue;\r
368         }\r
369         CFX_WideString ret = pTmpEngine->Decode(buf, width, height, errorCode);\r
370         if(errorCode == BCExceptionNO) {\r
371             return ret;\r
372         }\r
373     }\r
374     errorCode = BCExceptionUnSupportedBarcode;\r
375     return CFX_WideString();\r
376 }\r
377 CFX_WideString  CFX_Barcode::Decode(CFX_DIBitmap *pBitmap, FX_INT32 &errorCode)\r
378 {\r
379     for(BC_TYPE t = BC_TYPE_MIN; t <= BC_TYPE_MAX; t = (BC_TYPE)((FX_INT32)t + 1)) {\r
380         CBC_CodeBase* pTmpEngine = FX_Barcode_CreateBarCodeEngineObject(t);\r
381         if(!pTmpEngine) {\r
382             continue;\r
383         }\r
384         CFX_WideString ret = pTmpEngine->Decode(pBitmap, errorCode);\r
385         if(errorCode == BCExceptionNO) {\r
386             return ret;\r
387         }\r
388     }\r
389     errorCode = BCExceptionUnSupportedBarcode;\r
390     return CFX_WideString();\r
391 }\r
392 IFX_Barcode* FX_Barcode_Create(BC_TYPE type)\r
393 {\r
394     CFX_Barcode* pBarcode = FX_NEW CFX_Barcode;\r
395     if (pBarcode->Crreate(type)) {\r
396         return pBarcode;\r
397     }\r
398     pBarcode->Release();\r
399     return NULL;\r
400 }\r