Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / 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 \r
7 #include "barcode.h"\r
8 #include "include/BC_DataMatrixVersion.h"\r
9 #include "include/BC_DataMatrixDataBlock.h"\r
10 CBC_DataMatrixDataBlock::~CBC_DataMatrixDataBlock()\r
11 {\r
12 }\r
13 CBC_DataMatrixDataBlock::CBC_DataMatrixDataBlock(FX_INT32 numDataCodewords, CFX_ByteArray *codewords)\r
14 {\r
15     m_codewords.Copy(*codewords);\r
16     m_numDataCodewords = numDataCodewords;\r
17 }\r
18 CFX_PtrArray *CBC_DataMatrixDataBlock::GetDataBlocks(CFX_ByteArray* rawCodewords, CBC_DataMatrixVersion *version, FX_INT32 &e)\r
19 {\r
20     ECBlocks *ecBlocks = version->GetECBlocks();\r
21     FX_INT32 totalBlocks = 0;\r
22     const CFX_PtrArray &ecBlockArray = ecBlocks->GetECBlocks();\r
23     FX_INT32 i;\r
24     for (i = 0; i < ecBlockArray.GetSize(); i++) {\r
25         totalBlocks += ((ECB*)ecBlockArray[i])->GetCount();\r
26     }\r
27     CBC_AutoPtr<CFX_PtrArray>result(FX_NEW CFX_PtrArray());\r
28     result->SetSize(totalBlocks);\r
29     FX_INT32 numResultBlocks = 0;\r
30     FX_INT32 j;\r
31     for (j = 0; j < ecBlockArray.GetSize(); j++) {\r
32         for (i = 0; i < ((ECB*)ecBlockArray[j])->GetCount(); i++) {\r
33             FX_INT32 numDataCodewords = ((ECB*)ecBlockArray[j])->GetDataCodewords();\r
34             FX_INT32 numBlockCodewords = ecBlocks->GetECCodewords() + numDataCodewords;\r
35             CFX_ByteArray codewords;\r
36             codewords.SetSize(numBlockCodewords);\r
37             (*result)[numResultBlocks++] = FX_NEW CBC_DataMatrixDataBlock(numDataCodewords, &codewords);\r
38             codewords.SetSize(0);\r
39         }\r
40     }\r
41     FX_INT32 longerBlocksTotalCodewords = ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize();\r
42     FX_INT32 longerBlocksNumDataCodewords = longerBlocksTotalCodewords - ecBlocks->GetECCodewords();\r
43     FX_INT32 shorterBlocksNumDataCodewords = longerBlocksNumDataCodewords - 1;\r
44     FX_INT32 rawCodewordsOffset = 0;\r
45     for (i = 0; i < shorterBlocksNumDataCodewords; i++) {\r
46         FX_INT32 j;\r
47         for (j = 0; j < numResultBlocks; j++) {\r
48             if (rawCodewordsOffset < rawCodewords->GetSize()) {\r
49                 ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](i) = (*rawCodewords)[rawCodewordsOffset++];\r
50             }\r
51         }\r
52     }\r
53     FX_BOOL specialVersion = version->GetVersionNumber() == 24;\r
54     FX_INT32 numLongerBlocks = specialVersion ? 8 : numResultBlocks;\r
55     for (j = 0; j < numLongerBlocks; j++) {\r
56         if (rawCodewordsOffset < rawCodewords->GetSize()) {\r
57             ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](longerBlocksNumDataCodewords - 1) = (*rawCodewords)[rawCodewordsOffset++];\r
58         }\r
59     }\r
60     FX_INT32 max = ((CBC_DataMatrixDataBlock*)(*result)[0])->GetCodewords()->GetSize();\r
61     for (i = longerBlocksNumDataCodewords; i < max; i++) {\r
62         FX_INT32 j;\r
63         for (j = 0; j < numResultBlocks; j++) {\r
64             FX_INT32 iOffset = specialVersion && j > 7 ? i - 1 : i;\r
65             if (rawCodewordsOffset < rawCodewords->GetSize()) {\r
66                 ((CBC_DataMatrixDataBlock*)(*result)[j])->GetCodewords()->operator [](iOffset) = (*rawCodewords)[rawCodewordsOffset++];\r
67             }\r
68         }\r
69     }\r
70     if (rawCodewordsOffset != rawCodewords->GetSize()) {\r
71         e = BCExceptionIllegalArgument;\r
72         return NULL;\r
73     }\r
74     return result.release();\r
75 }\r
76 FX_INT32 CBC_DataMatrixDataBlock::GetNumDataCodewords()\r
77 {\r
78     return m_numDataCodewords;\r
79 }\r
80 CFX_ByteArray *CBC_DataMatrixDataBlock::GetCodewords()\r
81 {\r
82     return &m_codewords;\r
83 }\r