Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fxbarcode / datamatrix / BC_DataMatrixDecoder.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 2007 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 "../common/BC_CommonBitMatrix.h"\r
25 #include "../common/reedsolomon/BC_ReedSolomonDecoder.h"\r
26 #include "../common/reedsolomon/BC_ReedSolomonGF256.h"\r
27 #include "BC_DataMatrixDecoder.h"\r
28 #include "BC_DataMatrixBitMatrixParser.h"\r
29 #include "BC_DataMatrixVersion.h"\r
30 #include "BC_DataMatrixDataBlock.h"\r
31 #include "BC_DataMatrixDecodedBitStreamParser.h"\r
32 CBC_DataMatrixDecoder::CBC_DataMatrixDecoder()\r
33 {\r
34     m_rsDecoder = NULL;\r
35 }\r
36 void CBC_DataMatrixDecoder::Init()\r
37 {\r
38     m_rsDecoder = FX_NEW CBC_ReedSolomonDecoder(CBC_ReedSolomonGF256::DataMatrixField);\r
39 }\r
40 CBC_DataMatrixDecoder::~CBC_DataMatrixDecoder()\r
41 {\r
42     if(m_rsDecoder != NULL) {\r
43         delete m_rsDecoder;\r
44     }\r
45     m_rsDecoder = NULL;\r
46 }\r
47 CBC_CommonDecoderResult *CBC_DataMatrixDecoder::Decode(CBC_CommonBitMatrix *bits, int32_t &e)\r
48 {\r
49     CBC_DataMatrixBitMatrixParser parser;\r
50     parser.Init(bits, e);\r
51     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
52     CBC_DataMatrixVersion *version = parser.GetVersion();\r
53     CFX_ByteArray* byteTemp = parser.ReadCodewords(e);\r
54     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
55     CBC_AutoPtr<CFX_ByteArray> codewords(byteTemp);\r
56     CFX_PtrArray *dataBlocks = CBC_DataMatrixDataBlock::GetDataBlocks(codewords.get(), version, e);\r
57     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
58     int32_t dataBlocksCount = dataBlocks->GetSize();\r
59     int32_t totalBytes = 0;\r
60     int32_t i, j;\r
61     for (i = 0; i < dataBlocksCount; i++) {\r
62         totalBytes += ((CBC_DataMatrixDataBlock*)(*dataBlocks)[i])->GetNumDataCodewords();\r
63     }\r
64     CFX_ByteArray resultBytes;\r
65     resultBytes.SetSize(totalBytes);\r
66     for (j = 0; j < dataBlocksCount; j++) {\r
67         CFX_ByteArray *codewordBytes = ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetCodewords();\r
68         int32_t numDataCodewords = ((CBC_DataMatrixDataBlock*)(*dataBlocks)[j])->GetNumDataCodewords();\r
69         CorrectErrors(*codewordBytes, numDataCodewords, e);\r
70         if (e != BCExceptionNO) {\r
71             for(int32_t i = 0; i < dataBlocks->GetSize(); i++) {\r
72                 delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i];\r
73             }\r
74             delete dataBlocks;\r
75             dataBlocks = NULL;\r
76             return NULL;\r
77         }\r
78         int32_t i;\r
79         for (i = 0; i < numDataCodewords; i++) {\r
80             resultBytes[i * dataBlocksCount + j] = (*codewordBytes)[i];\r
81         }\r
82     }\r
83     for(i = 0; i < (dataBlocks->GetSize()); i++) {\r
84         delete (CBC_DataMatrixDataBlock*)(*dataBlocks)[i];\r
85     }\r
86     delete dataBlocks;\r
87     dataBlocks = NULL;\r
88     CBC_CommonDecoderResult *resultR = CBC_DataMatrixDecodedBitStreamParser::Decode(resultBytes, e);\r
89     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
90     return resultR;\r
91 }\r
92 void CBC_DataMatrixDecoder::CorrectErrors(CFX_ByteArray &codewordBytes, int32_t numDataCodewords, int32_t &e)\r
93 {\r
94     int32_t numCodewords = codewordBytes.GetSize();\r
95     CFX_Int32Array codewordsInts;\r
96     codewordsInts.SetSize(numCodewords);\r
97     int32_t i;\r
98     for (i = 0; i < numCodewords; i++) {\r
99         codewordsInts[i] = codewordBytes[i] & 0xFF;\r
100     }\r
101     int32_t numECCodewords = codewordBytes.GetSize() - numDataCodewords;\r
102     m_rsDecoder->Decode(&codewordsInts, numECCodewords, e);\r
103     if (e != BCExceptionNO) {\r
104         e = BCExceptionChecksumException;\r
105         return ;\r
106     }\r
107     for (i = 0; i < numDataCodewords; i++) {\r
108         codewordBytes[i] = (uint8_t) codewordsInts[i];\r
109     }\r
110 }\r