Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fxbarcode / datamatrix / BC_DataMatrixDataBlock.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 2008 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_DataMatrixVersion.h"\r
25 #include "BC_DataMatrixDataBlock.h"\r
26 CBC_DataMatrixDataBlock::~CBC_DataMatrixDataBlock()\r
27 {\r
28 }\r
29 CBC_DataMatrixDataBlock::CBC_DataMatrixDataBlock(int32_t numDataCodewords, CFX_ByteArray *codewords)\r
30 {\r
31     m_codewords.Copy(*codewords);\r
32     m_numDataCodewords = numDataCodewords;\r
33 }\r
34 CFX_PtrArray *CBC_DataMatrixDataBlock::GetDataBlocks(CFX_ByteArray* rawCodewords, CBC_DataMatrixVersion *version, int32_t &e)\r
35 {\r
36     ECBlocks *ecBlocks = version->GetECBlocks();\r
37     int32_t totalBlocks = 0;\r
38     const CFX_PtrArray &ecBlockArray = ecBlocks->GetECBlocks();\r
39     int32_t i;\r
40     for (i = 0; i < ecBlockArray.GetSize(); i++) {\r
41         totalBlocks += ((ECB*)ecBlockArray[i])->GetCount();\r
42     }\r
43     CBC_AutoPtr<CFX_PtrArray>result(FX_NEW CFX_PtrArray());\r
44     result->SetSize(totalBlocks);\r
45     int32_t numResultBlocks = 0;\r
46     int32_t j;\r
47     for (j = 0; j < ecBlockArray.GetSize(); j++) {\r
48         for (i = 0; i < ((ECB*)ecBlockArray[j])->GetCount(); i++) {\r
49             int32_t numDataCodewords = ((ECB*)ecBlockArray[j])->GetDataCodewords();\r
50             int32_t numBlockCodewords = ecBlocks->GetECCodewords() + numDataCodewords;\r
51             CFX_ByteArray codewords;\r
52             codewords.SetSize(numBlockCodewords);\r
53             (*result)[numResultBlocks++] = FX_NEW CBC_DataMatrixDataBlock(numDataCodewords, &codewords);\r
54             codewords.SetSize(0);\r
55         }\r
56     }\r
57     int32_t longerBlocksTotalCodewords = ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize();\r
58     int32_t longerBlocksNumDataCodewords = longerBlocksTotalCodewords - ecBlocks->GetECCodewords();\r
59     int32_t shorterBlocksNumDataCodewords = longerBlocksNumDataCodewords - 1;\r
60     int32_t rawCodewordsOffset = 0;\r
61     for (i = 0; i < shorterBlocksNumDataCodewords; i++) {\r
62         int32_t j;\r
63         for (j = 0; j < numResultBlocks; j++) {\r
64             if (rawCodewordsOffset < rawCodewords->GetSize()) {\r
65                 ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](i) = (*rawCodewords)[rawCodewordsOffset++];\r
66             }\r
67         }\r
68     }\r
69     FX_BOOL specialVersion = version->GetVersionNumber() == 24;\r
70     int32_t numLongerBlocks = specialVersion ? 8 : numResultBlocks;\r
71     for (j = 0; j < numLongerBlocks; j++) {\r
72         if (rawCodewordsOffset < rawCodewords->GetSize()) {\r
73             ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](longerBlocksNumDataCodewords - 1) = (*rawCodewords)[rawCodewordsOffset++];\r
74         }\r
75     }\r
76     int32_t max = ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize();\r
77     for (i = longerBlocksNumDataCodewords; i < max; i++) {\r
78         int32_t j;\r
79         for (j = 0; j < numResultBlocks; j++) {\r
80             int32_t iOffset = specialVersion && j > 7 ? i - 1 : i;\r
81             if (rawCodewordsOffset < rawCodewords->GetSize()) {\r
82                 ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](iOffset) = (*rawCodewords)[rawCodewordsOffset++];\r
83             }\r
84         }\r
85     }\r
86     if (rawCodewordsOffset != rawCodewords->GetSize()) {\r
87         e = BCExceptionIllegalArgument;\r
88         return NULL;\r
89     }\r
90     return result.release();\r
91 }\r
92 int32_t CBC_DataMatrixDataBlock::GetNumDataCodewords()\r
93 {\r
94     return m_numDataCodewords;\r
95 }\r
96 CFX_ByteArray *CBC_DataMatrixDataBlock::GetCodewords()\r
97 {\r
98     return &m_codewords;\r
99 }\r