Merge to XFA: Kill FXSYS_mem{cpy,cmp,set.move}{32,8}.
[pdfium.git] / xfa / src / fxbarcode / oned / BC_OnedUPCAWriter.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 2010 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_Writer.h"\r
25 #include "BC_OneDimWriter.h"\r
26 #include "BC_OnedEAN13Writer.h"\r
27 #include "BC_OnedUPCAWriter.h"\r
28 CBC_OnedUPCAWriter::CBC_OnedUPCAWriter()\r
29 {\r
30     m_subWriter = NULL;\r
31     m_bLeftPadding = TRUE;\r
32     m_bRightPadding = TRUE;\r
33 }\r
34 void CBC_OnedUPCAWriter::Init()\r
35 {\r
36     m_subWriter = FX_NEW CBC_OnedEAN13Writer;\r
37 }\r
38 CBC_OnedUPCAWriter::~CBC_OnedUPCAWriter()\r
39 {\r
40     if(m_subWriter != NULL) {\r
41         delete m_subWriter;\r
42     }\r
43     m_subWriter = NULL;\r
44 }\r
45 FX_BOOL CBC_OnedUPCAWriter::CheckContentValidity(const CFX_WideStringC& contents)\r
46 {\r
47     int32_t i = 0;\r
48     for (i = 0; i < contents.GetLength(); i++) {\r
49         if (contents.GetAt(i) >= '0' && contents.GetAt(i) <= '9') {\r
50             continue;\r
51         } else {\r
52             return FALSE;\r
53         }\r
54     }\r
55     return TRUE;\r
56 }\r
57 CFX_WideString  CBC_OnedUPCAWriter::FilterContents(const CFX_WideStringC& contents)\r
58 {\r
59     CFX_WideString filtercontents;\r
60     FX_WCHAR ch;\r
61     for (int32_t i = 0; i < contents.GetLength(); i++) {\r
62         ch = contents.GetAt(i);\r
63         if(ch > 175) {\r
64             i++;\r
65             continue;\r
66         }\r
67         if (ch >= '0' && ch <= '9') {\r
68             filtercontents += ch;\r
69         }\r
70     }\r
71     return filtercontents;\r
72 }\r
73 int32_t CBC_OnedUPCAWriter::CalcChecksum(const CFX_ByteString &contents)\r
74 {\r
75     int32_t odd = 0;\r
76     int32_t even = 0;\r
77     int32_t j = 1;\r
78     for(int32_t i = contents.GetLength() - 1; i >= 0; i--) {\r
79         if(j % 2) {\r
80             odd += FXSYS_atoi(contents.Mid(i, 1));\r
81         } else {\r
82             even += FXSYS_atoi(contents.Mid(i, 1));\r
83         }\r
84         j++;\r
85     }\r
86     int32_t checksum = (odd * 3 + even) % 10;\r
87     checksum = (10 - checksum) % 10;\r
88     return (checksum);\r
89 }\r
90 uint8_t *CBC_OnedUPCAWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, int32_t &outWidth, int32_t &outHeight, int32_t &e)\r
91 {\r
92     uint8_t *ret = Encode(contents, format, outWidth, outHeight, 0, e);\r
93     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
94     return ret;\r
95 }\r
96 uint8_t *CBC_OnedUPCAWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, int32_t &outWidth, int32_t &outHeight, int32_t hints, int32_t &e)\r
97 {\r
98     if (format != BCFORMAT_UPC_A) {\r
99         e = BCExceptionOnlyEncodeUPC_A;\r
100         return NULL;\r
101     }\r
102     CFX_ByteString toEAN13String = '0' + contents;\r
103     m_iDataLenth = 13;\r
104     uint8_t *ret = m_subWriter->Encode(toEAN13String, BCFORMAT_EAN_13, outWidth, outHeight, hints, e);\r
105     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
106     return ret;\r
107 }\r
108 void CBC_OnedUPCAWriter::ShowChars(const CFX_WideStringC& contents, CFX_DIBitmap *pOutBitmap, CFX_RenderDevice* device, const CFX_Matrix* matrix, int32_t barWidth, int32_t multiple, int32_t &e)\r
109 {\r
110     if (device == NULL && pOutBitmap == NULL) {\r
111         e = BCExceptionIllegalArgument;\r
112         return;\r
113     }\r
114     int32_t leftPadding = 7 * multiple;\r
115     int32_t leftPosition = 10 * multiple + leftPadding;\r
116     CFX_ByteString str = FX_UTF8Encode(contents);\r
117     int32_t iLen = str.GetLength();\r
118     FXTEXT_CHARPOS* pCharPos = FX_Alloc(FXTEXT_CHARPOS, iLen);\r
119     if (!pCharPos) {\r
120         return;\r
121     }\r
122     FXSYS_memset(pCharPos, 0, sizeof(FXTEXT_CHARPOS) * iLen);\r
123     CFX_ByteString tempStr = str.Mid(1, 5);\r
124     FX_FLOAT strWidth = (FX_FLOAT)35 * multiple;\r
125     FX_FLOAT blank = 0.0;\r
126     CFX_FxgeDevice geBitmap;\r
127     if (pOutBitmap != NULL) {\r
128         geBitmap.Attach(pOutBitmap);\r
129     }\r
130     FX_FLOAT charsWidth = 0;\r
131     iLen = tempStr.GetLength();\r
132     int32_t iFontSize = (int32_t)fabs(m_fFontSize);\r
133     int32_t iTextHeight = iFontSize + 1;\r
134     if (pOutBitmap == NULL) {\r
135         CFX_Matrix matr(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);\r
136         CFX_FloatRect rect((FX_FLOAT)leftPosition, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)(leftPosition  + strWidth - 0.5), (FX_FLOAT)m_Height);\r
137         matr.Concat(*matrix);\r
138         matr.TransformRect(rect);\r
139         FX_RECT re = rect.GetOutterRect();\r
140         device->FillRect(&re, m_backgroundColor);\r
141         CFX_Matrix matr1(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);\r
142         CFX_FloatRect rect1((FX_FLOAT)(leftPosition + 40 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)((leftPosition + 40 * multiple) + strWidth - 0.5), (FX_FLOAT)m_Height);\r
143         matr1.Concat(*matrix);\r
144         matr1.TransformRect(rect1);\r
145         re = rect1.GetOutterRect();\r
146         device->FillRect(&re, m_backgroundColor);\r
147         FX_FLOAT strWidth1 = (FX_FLOAT)multiple * 7;\r
148         CFX_Matrix matr2(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);\r
149         CFX_FloatRect rect2(0.0, (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)strWidth1 - 1, (FX_FLOAT)m_Height);\r
150         matr2.Concat(*matrix);\r
151         matr2.TransformRect(rect2);\r
152         re = rect2.GetOutterRect();\r
153         device->FillRect(&re, m_backgroundColor);\r
154         CFX_Matrix matr3(m_outputHScale, 0.0, 0.0, 1.0, 0.0, 0.0);\r
155         CFX_FloatRect rect3((FX_FLOAT)(leftPosition + 85 * multiple), (FX_FLOAT)(m_Height - iTextHeight), (FX_FLOAT)((leftPosition + 85 * multiple) + strWidth1 - 0.5), (FX_FLOAT)m_Height);\r
156         matr3.Concat(*matrix);\r
157         matr3.TransformRect(rect3);\r
158         re = rect3.GetOutterRect();\r
159         device->FillRect(&re, m_backgroundColor);\r
160     }\r
161     if (pOutBitmap == NULL) {\r
162         strWidth = strWidth * m_outputHScale;\r
163     }\r
164     CalcTextInfo(tempStr, pCharPos + 1, m_pFont, strWidth, iFontSize, blank);\r
165     CFX_AffineMatrix affine_matrix(1.0, 0.0, 0.0, -1.0, 0.0, (FX_FLOAT)iFontSize);\r
166     CFX_FxgeDevice ge;\r
167     if(pOutBitmap != NULL) {\r
168         ge.Create((int)strWidth, iTextHeight, FXDIB_Argb);\r
169         ge.GetBitmap()->Clear(m_backgroundColor);\r
170         ge.DrawNormalText(iLen,\r
171                           pCharPos + 1,\r
172                           m_pFont,\r
173                           CFX_GEModule::Get()->GetFontCache(),\r
174                           (FX_FLOAT)iFontSize ,\r
175                           (CFX_AffineMatrix *) &affine_matrix,\r
176                           m_fontColor, FXTEXT_CLEARTYPE);\r
177         geBitmap.SetDIBits(ge.GetBitmap(), leftPosition, m_Height - iTextHeight);\r
178     } else {\r
179         CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)leftPosition * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize));\r
180         if (matrix != NULL) {\r
181             affine_matrix1.Concat(*matrix);\r
182         }\r
183         device->DrawNormalText(iLen,\r
184                                pCharPos + 1,\r
185                                m_pFont,\r
186                                CFX_GEModule::Get()->GetFontCache(),\r
187                                (FX_FLOAT)iFontSize ,\r
188                                (CFX_AffineMatrix *) &affine_matrix1,\r
189                                m_fontColor, FXTEXT_CLEARTYPE);\r
190     }\r
191     tempStr = str.Mid(6, 5);\r
192     iLen = tempStr.GetLength();\r
193     charsWidth = 0.0f;\r
194     CalcTextInfo(tempStr, pCharPos + 6, m_pFont, strWidth, iFontSize, blank);\r
195     if(pOutBitmap != NULL) {\r
196         FX_RECT rect2(0, 0, (int)strWidth, iTextHeight);\r
197         ge.FillRect(&rect2, m_backgroundColor);\r
198         ge.DrawNormalText(iLen,\r
199                           pCharPos + 6,\r
200                           m_pFont,\r
201                           CFX_GEModule::Get()->GetFontCache(),\r
202                           (FX_FLOAT)iFontSize ,\r
203                           (CFX_AffineMatrix *) &affine_matrix,\r
204                           m_fontColor, FXTEXT_CLEARTYPE);\r
205         geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 40 * multiple, m_Height - iTextHeight);\r
206     } else {\r
207         CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 40 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize));\r
208         if (matrix != NULL) {\r
209             affine_matrix1.Concat(*matrix);\r
210         }\r
211         device->DrawNormalText(iLen,\r
212                                pCharPos + 6,\r
213                                m_pFont,\r
214                                CFX_GEModule::Get()->GetFontCache(),\r
215                                (FX_FLOAT)iFontSize ,\r
216                                (CFX_AffineMatrix *) &affine_matrix1,\r
217                                m_fontColor, FXTEXT_CLEARTYPE);\r
218     }\r
219     tempStr = str.Mid(0, 1);\r
220     iLen = tempStr.GetLength();\r
221     strWidth = (FX_FLOAT)multiple * 7;\r
222     if (pOutBitmap == NULL) {\r
223         strWidth = strWidth * m_outputHScale;\r
224     }\r
225     CalcTextInfo(tempStr, pCharPos, m_pFont, strWidth, iFontSize, blank);\r
226     if(pOutBitmap != NULL) {\r
227         delete ge.GetBitmap();\r
228         ge.Create((int)strWidth, iTextHeight, FXDIB_Argb);\r
229         ge.GetBitmap()->Clear(m_backgroundColor);\r
230         ge.DrawNormalText(iLen,\r
231                           pCharPos,\r
232                           m_pFont,\r
233                           CFX_GEModule::Get()->GetFontCache(),\r
234                           (FX_FLOAT)iFontSize ,\r
235                           (CFX_AffineMatrix *) &affine_matrix,\r
236                           m_fontColor, FXTEXT_CLEARTYPE);\r
237         geBitmap.SetDIBits(ge.GetBitmap(), 0, m_Height - iTextHeight);\r
238     } else {\r
239         CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, 0, (FX_FLOAT)(m_Height - iTextHeight + iFontSize));\r
240         if (matrix != NULL) {\r
241             affine_matrix1.Concat(*matrix);\r
242         }\r
243         device->DrawNormalText(iLen,\r
244                                pCharPos,\r
245                                m_pFont,\r
246                                CFX_GEModule::Get()->GetFontCache(),\r
247                                (FX_FLOAT)iFontSize ,\r
248                                (CFX_AffineMatrix *) &affine_matrix1,\r
249                                m_fontColor, FXTEXT_CLEARTYPE);\r
250     }\r
251     tempStr = str.Mid(11, 1);\r
252     iLen = tempStr.GetLength();\r
253     CalcTextInfo(tempStr, pCharPos + 11, m_pFont, strWidth, iFontSize, blank);\r
254     if (pOutBitmap != NULL) {\r
255         delete ge.GetBitmap();\r
256         ge.Create((int)strWidth, iTextHeight, FXDIB_Argb);\r
257         ge.GetBitmap()->Clear(m_backgroundColor);\r
258         ge.DrawNormalText(iLen,\r
259                           pCharPos + 11,\r
260                           m_pFont,\r
261                           CFX_GEModule::Get()->GetFontCache(),\r
262                           (FX_FLOAT)iFontSize ,\r
263                           (CFX_AffineMatrix *) &affine_matrix,\r
264                           m_fontColor, FXTEXT_CLEARTYPE);\r
265         geBitmap.SetDIBits(ge.GetBitmap(), leftPosition + 85 * multiple, m_Height - iTextHeight);\r
266     } else {\r
267         CFX_AffineMatrix affine_matrix1(1.0, 0.0, 0.0, -1.0, (FX_FLOAT)(leftPosition + 85 * multiple) * m_outputHScale, (FX_FLOAT)(m_Height - iTextHeight + iFontSize));\r
268         if (matrix != NULL) {\r
269             affine_matrix1.Concat(*matrix);\r
270         }\r
271         device->DrawNormalText(iLen,\r
272                                pCharPos + 11,\r
273                                m_pFont,\r
274                                CFX_GEModule::Get()->GetFontCache(),\r
275                                (FX_FLOAT)iFontSize ,\r
276                                (CFX_AffineMatrix *) &affine_matrix1,\r
277                                m_fontColor, FXTEXT_CLEARTYPE);\r
278     }\r
279     FX_Free(pCharPos);\r
280 }\r
281 void CBC_OnedUPCAWriter::RenderResult(const CFX_WideStringC& contents, uint8_t* code, int32_t codeLength, FX_BOOL isDevice, int32_t &e)\r
282 {\r
283     CBC_OneDimWriter::RenderResult(contents, code, codeLength, isDevice, e);\r
284 }\r
285 \r