Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_DataMatrixWriter.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_Writer.h"\r
9 #include "include/BC_TwoDimWriter.h"\r
10 #include "include/BC_Encoder.h"\r
11 #include "include/BC_DefaultPlacement.h"\r
12 #include "include/BC_BinaryBitmap.h"\r
13 #include "include/BC_CommonBitMatrix.h"\r
14 #include "include/BC_SymbolShapeHint.h"\r
15 #include "include/BC_SymbolInfo.h"\r
16 #include "include/BC_DataMatrixSymbolInfo144.h"\r
17 #include "include/BC_ErrorCorrection.h"\r
18 #include "include/BC_Dimension.h"\r
19 #include "include/BC_EncoderContext.h"\r
20 #include "include/BC_C40Encoder.h"\r
21 #include "include/BC_TextEncoder.h"\r
22 #include "include/BC_X12Encoder.h"\r
23 #include "include/BC_EdifactEncoder.h"\r
24 #include "include/BC_Base256Encoder.h"\r
25 #include "include/BC_ASCIIEncoder.h"\r
26 #include "include/BC_HighLevelEncoder.h"\r
27 #include "include/BC_CommonByteMatrix.h"\r
28 #include "include/BC_DataMatrixWriter.h"\r
29 #include "include/BC_UtilCodingConvert.h"\r
30 CBC_DataMatrixWriter::CBC_DataMatrixWriter()\r
31 {\r
32 }\r
33 CBC_DataMatrixWriter::~CBC_DataMatrixWriter()\r
34 {\r
35 }\r
36 FX_BOOL CBC_DataMatrixWriter::SetErrorCorrectionLevel (FX_INT32 level)\r
37 {\r
38     m_iCorrectLevel = level;\r
39     return TRUE;\r
40 }\r
41 FX_BYTE* CBC_DataMatrixWriter::Encode(const CFX_WideString &contents, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e)\r
42 {\r
43     if (outWidth < 0 || outHeight < 0) {\r
44         e = BCExceptionHeightAndWidthMustBeAtLeast1;\r
45         BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
46     }\r
47     CBC_SymbolShapeHint::SymbolShapeHint shape = CBC_SymbolShapeHint::FORCE_SQUARE;\r
48     CBC_Dimension* minSize = NULL;\r
49     CBC_Dimension* maxSize = NULL;\r
50     CFX_WideString ecLevel;\r
51     CFX_WideString encoded = CBC_HighLevelEncoder::encodeHighLevel(contents, ecLevel, shape, minSize, maxSize, e);\r
52     BC_EXCEPTION_CHECK_ReturnValue(e,  NULL);\r
53     CBC_SymbolInfo* symbolInfo = CBC_SymbolInfo::lookup(encoded.GetLength(), shape, minSize, maxSize, TRUE, e);\r
54     BC_EXCEPTION_CHECK_ReturnValue(e,  NULL);\r
55     CFX_WideString codewords = CBC_ErrorCorrection::encodeECC200(encoded, symbolInfo, e);\r
56     BC_EXCEPTION_CHECK_ReturnValue(e,  NULL);\r
57     CBC_DefaultPlacement* placement = FX_NEW CBC_DefaultPlacement(codewords, symbolInfo->getSymbolDataWidth(e), symbolInfo->getSymbolDataHeight(e));\r
58     BC_EXCEPTION_CHECK_ReturnValue(e,  NULL);\r
59     placement->place();\r
60     CBC_CommonByteMatrix* bytematrix = encodeLowLevel(placement, symbolInfo, e);\r
61     BC_EXCEPTION_CHECK_ReturnValue(e,  NULL);\r
62     outWidth = bytematrix->GetWidth();\r
63     outHeight = bytematrix->GetHeight();\r
64     FX_BYTE* result = FX_Alloc(FX_BYTE, outWidth * outHeight);\r
65     FXSYS_memcpy32(result, bytematrix->GetArray(), outWidth * outHeight);\r
66     delete bytematrix;\r
67     delete placement;\r
68     return result;\r
69 }\r
70 FX_BYTE *CBC_DataMatrixWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 &e)\r
71 {\r
72     return NULL;\r
73 }\r
74 FX_BYTE *CBC_DataMatrixWriter::Encode(const CFX_ByteString &contents, BCFORMAT format, FX_INT32 &outWidth, FX_INT32 &outHeight, FX_INT32 hints, FX_INT32 &e)\r
75 {\r
76     return NULL;\r
77 }\r
78 CBC_CommonByteMatrix* CBC_DataMatrixWriter::encodeLowLevel(CBC_DefaultPlacement* placement, CBC_SymbolInfo* symbolInfo, FX_INT32 &e)\r
79 {\r
80     FX_INT32 symbolWidth = symbolInfo->getSymbolDataWidth(e);\r
81     BC_EXCEPTION_CHECK_ReturnValue(e,  NULL);\r
82     FX_INT32 symbolHeight = symbolInfo->getSymbolDataHeight(e);\r
83     BC_EXCEPTION_CHECK_ReturnValue(e,  NULL);\r
84     CBC_CommonByteMatrix* matrix = FX_NEW CBC_CommonByteMatrix(symbolInfo->getSymbolWidth(e), symbolInfo->getSymbolHeight(e));\r
85     BC_EXCEPTION_CHECK_ReturnValue(e,  NULL);\r
86     matrix->Init();\r
87     FX_INT32 matrixY = 0;\r
88     for (FX_INT32 y = 0; y < symbolHeight; y++) {\r
89         FX_INT32 matrixX;\r
90         if ((y % symbolInfo->m_matrixHeight) == 0) {\r
91             matrixX = 0;\r
92             for (FX_INT32 x = 0; x < symbolInfo->getSymbolWidth(e); x++) {\r
93                 matrix->Set(matrixX, matrixY, (x % 2) == 0);\r
94                 matrixX++;\r
95             }\r
96             matrixY++;\r
97         }\r
98         matrixX = 0;\r
99         for (FX_INT32 x = 0; x < symbolWidth; x++) {\r
100             if ((x % symbolInfo->m_matrixWidth) == 0) {\r
101                 matrix->Set(matrixX, matrixY, TRUE);\r
102                 matrixX++;\r
103             }\r
104             matrix->Set(matrixX, matrixY, placement->getBit(x, y));\r
105             matrixX++;\r
106             if ((x % symbolInfo->m_matrixWidth) == symbolInfo->m_matrixWidth - 1) {\r
107                 matrix->Set(matrixX, matrixY, (y % 2) == 0);\r
108                 matrixX++;\r
109             }\r
110         }\r
111         matrixY++;\r
112         if ((y % symbolInfo->m_matrixHeight) == symbolInfo->m_matrixHeight - 1) {\r
113             matrixX = 0;\r
114             for (FX_INT32 x = 0; x < symbolInfo->getSymbolWidth(e); x++) {\r
115                 matrix->Set(matrixX, matrixY, TRUE);\r
116                 matrixX++;\r
117             }\r
118             matrixY++;\r
119         }\r
120     }\r
121     return matrix;\r
122 }\r