6dd4a8264f5a28e189ace66e2f59fb574cdfc9c8
[pdfium.git] / xfa / src / fxbarcode / pdf417 / BC_PDF417Writer.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 2012 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_TwoDimWriter.h"\r
25 #include "../common/BC_CommonBitArray.h"\r
26 #include "../common/BC_CommonBitMatrix.h"\r
27 #include "BC_PDF417Compaction.h"\r
28 #include "BC_PDF417.h"\r
29 #include "BC_PDF417BarcodeMatrix.h"\r
30 #include "BC_PDF417Writer.h"\r
31 CBC_PDF417Writer::CBC_PDF417Writer()\r
32 {\r
33     m_bFixedSize = FALSE;\r
34 }\r
35 CBC_PDF417Writer::~CBC_PDF417Writer()\r
36 {\r
37     m_bTruncated = TRUE;\r
38 }\r
39 FX_BOOL CBC_PDF417Writer:: SetErrorCorrectionLevel(int32_t level)\r
40 {\r
41     if (level < 0 || level > 8) {\r
42         return FALSE;\r
43     }\r
44     m_iCorrectLevel = level;\r
45     return TRUE;\r
46 }\r
47 void CBC_PDF417Writer::SetTruncated(FX_BOOL truncated)\r
48 {\r
49     m_bTruncated = truncated;\r
50 }\r
51 uint8_t* CBC_PDF417Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, int32_t &outWidth, int32_t &outHeight, int32_t &e)\r
52 {\r
53     if ( format != BCFORMAT_PDF_417) {\r
54         return NULL;\r
55     }\r
56     CFX_WideString encodeContents = contents.UTF8Decode();\r
57     return Encode(encodeContents, outWidth, outHeight, e );\r
58 }\r
59 uint8_t* CBC_PDF417Writer::Encode(const CFX_ByteString &contents, BCFORMAT format, int32_t &outWidth, int32_t &outHeight, int32_t hints, int32_t &e)\r
60 {\r
61     return NULL;\r
62 }\r
63 uint8_t* CBC_PDF417Writer::Encode(const CFX_WideString &contents, int32_t &outWidth, int32_t &outHeight, int32_t &e)\r
64 {\r
65     CBC_PDF417 encoder;\r
66     int32_t col = (m_Width / m_ModuleWidth - 69) / 17;\r
67     int32_t row = m_Height / (m_ModuleWidth * 20);\r
68     if (row >= 3 && row <= 90 && col >= 1 && col <= 30) {\r
69         encoder.setDimensions(col, col, row, row);\r
70     } else if (col >= 1 && col <= 30) {\r
71         encoder.setDimensions(col, col, 90, 3);\r
72     } else if (row >= 3 && row <= 90) {\r
73         encoder.setDimensions(30, 1, row, row);\r
74     }\r
75     encoder.generateBarcodeLogic(contents, m_iCorrectLevel, e);\r
76     BC_EXCEPTION_CHECK_ReturnValue(e,  NULL);\r
77     int32_t lineThickness = 2;\r
78     int32_t aspectRatio = 4;\r
79     CBC_BarcodeMatrix* barcodeMatrix = encoder.getBarcodeMatrix();\r
80     CFX_ByteArray originalScale;\r
81     originalScale.Copy(barcodeMatrix->getScaledMatrix(lineThickness, aspectRatio * lineThickness));\r
82     int32_t width = outWidth;\r
83     int32_t height = outHeight;\r
84     outWidth = barcodeMatrix->getWidth();\r
85     outHeight = barcodeMatrix->getHeight();\r
86     FX_BOOL rotated = FALSE;\r
87     if ((height > width) ^ (outWidth < outHeight)) {\r
88         rotateArray(originalScale, outHeight, outWidth);\r
89         rotated = TRUE;\r
90         int32_t temp = outHeight;\r
91         outHeight = outWidth;\r
92         outWidth = temp;\r
93     }\r
94     int32_t scaleX = width / outWidth;\r
95     int32_t scaleY = height / outHeight;\r
96     int32_t scale;\r
97     if (scaleX < scaleY) {\r
98         scale = scaleX;\r
99     } else {\r
100         scale = scaleY;\r
101     }\r
102     if (scale > 1) {\r
103         originalScale.RemoveAll();\r
104         originalScale.Copy(barcodeMatrix->getScaledMatrix(scale * lineThickness, scale * aspectRatio * lineThickness));\r
105         if (rotated) {\r
106             rotateArray(originalScale, outHeight, outWidth);\r
107             int32_t temp = outHeight;\r
108             outHeight = outWidth;\r
109             outWidth = temp;\r
110         }\r
111     }\r
112     uint8_t* result = (uint8_t*)FX_Alloc(uint8_t, outHeight * outWidth);\r
113     FXSYS_memcpy(result, originalScale.GetData(), outHeight * outWidth);\r
114     return result;\r
115 }\r
116 void CBC_PDF417Writer::rotateArray(CFX_ByteArray& bitarray, int32_t height, int32_t width)\r
117 {\r
118     CFX_ByteArray temp;\r
119     temp.Copy(bitarray);\r
120     for (int32_t ii = 0; ii < height; ii++) {\r
121         int32_t inverseii = height - ii - 1;\r
122         for (int32_t jj = 0; jj < width; jj++) {\r
123             bitarray[jj * height + inverseii] = temp[ii * width + jj];\r
124         }\r
125     }\r
126 }\r