Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_DataMatrixVersion.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 CFX_PtrArray* CBC_DataMatrixVersion::VERSIONS = NULL;\r
10 void CBC_DataMatrixVersion::Initialize()\r
11 {\r
12     VERSIONS = FX_NEW CFX_PtrArray();\r
13 }\r
14 void CBC_DataMatrixVersion::Finalize()\r
15 {\r
16     for (FX_INT32 i = 0; i < VERSIONS->GetSize(); i++) {\r
17         delete ( (CBC_DataMatrixVersion*)(VERSIONS->GetAt(i)) );\r
18     }\r
19     VERSIONS->RemoveAll();\r
20     delete VERSIONS;\r
21 }\r
22 CBC_DataMatrixVersion::CBC_DataMatrixVersion(FX_INT32 versionNumber,\r
23         FX_INT32 symbolSizeRows,\r
24         FX_INT32 symbolSizeColumns,\r
25         FX_INT32 dataRegionSizeRows,\r
26         FX_INT32 dataRegionSizeColumns,\r
27         ECBlocks *ecBlocks)\r
28 {\r
29     m_versionNumber = versionNumber;\r
30     m_symbolSizeRows = symbolSizeRows;\r
31     m_symbolSizeColumns = symbolSizeColumns;\r
32     m_dataRegionSizeRows = dataRegionSizeRows;\r
33     m_dataRegionSizeColumns = dataRegionSizeColumns;\r
34     m_ecBlocks = ecBlocks;\r
35     FX_INT32 total = 0;\r
36     FX_INT32 ecCodewords = ecBlocks->GetECCodewords();\r
37     const CFX_PtrArray &ecbArray = ecBlocks->GetECBlocks();\r
38     for (FX_INT32 i = 0; i < ecbArray.GetSize(); i++) {\r
39         total += ((ECB*)ecbArray[i])->GetCount() * (((ECB*)ecbArray[i])->GetDataCodewords() + ecCodewords);\r
40     }\r
41     m_totalCodewords = total;\r
42 }\r
43 CBC_DataMatrixVersion::~CBC_DataMatrixVersion()\r
44 {\r
45     if(m_ecBlocks != NULL) {\r
46         delete m_ecBlocks;\r
47     }\r
48     m_ecBlocks = NULL;\r
49 }\r
50 FX_INT32 CBC_DataMatrixVersion::GetVersionNumber()\r
51 {\r
52     return m_versionNumber;\r
53 }\r
54 FX_INT32 CBC_DataMatrixVersion::GetSymbolSizeRows()\r
55 {\r
56     return m_symbolSizeRows;\r
57 }\r
58 FX_INT32 CBC_DataMatrixVersion::GetSymbolSizeColumns()\r
59 {\r
60     return m_symbolSizeColumns;\r
61 }\r
62 FX_INT32 CBC_DataMatrixVersion::GetDataRegionSizeRows()\r
63 {\r
64     return m_dataRegionSizeRows;\r
65 }\r
66 FX_INT32 CBC_DataMatrixVersion::GetDataRegionSizeColumns()\r
67 {\r
68     return m_dataRegionSizeColumns;\r
69 }\r
70 FX_INT32 CBC_DataMatrixVersion::GetTotalCodewords()\r
71 {\r
72     return m_totalCodewords;\r
73 }\r
74 ECBlocks *CBC_DataMatrixVersion::GetECBlocks()\r
75 {\r
76     return m_ecBlocks;\r
77 }\r
78 void CBC_DataMatrixVersion::ReleaseAll()\r
79 {\r
80     for (FX_INT32 i = 0; i < VERSIONS->GetSize(); i++) {\r
81         delete (CBC_DataMatrixVersion*)VERSIONS->GetAt(i);\r
82     }\r
83     VERSIONS->RemoveAll();\r
84 }\r
85 CBC_DataMatrixVersion *CBC_DataMatrixVersion::GetVersionForDimensions(FX_INT32 numRows, FX_INT32 numColumns, FX_INT32 &e)\r
86 {\r
87     if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) {\r
88         e = BCExceptionNotFound;\r
89         return NULL;\r
90     }\r
91     if(VERSIONS->GetSize() == 0) {\r
92         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(1, 10, 10, 8, 8, FX_NEW ECBlocks(5, FX_NEW ECB(1, 3))));\r
93         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(2, 12, 12, 10, 10, FX_NEW ECBlocks(7, FX_NEW ECB(1, 5))));\r
94         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(3, 14, 14, 12, 12, FX_NEW ECBlocks(10, FX_NEW ECB(1, 8))));\r
95         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(4, 16, 16, 14, 14, FX_NEW ECBlocks(12, FX_NEW ECB(1, 12))));\r
96         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(5, 18, 18, 16, 16, FX_NEW ECBlocks(14, FX_NEW ECB(1, 18))));\r
97         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(6, 20, 20, 18, 18, FX_NEW ECBlocks(18, FX_NEW ECB(1, 22))));\r
98         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(7, 22, 22, 20, 20, FX_NEW ECBlocks(20, FX_NEW ECB(1, 30))));\r
99         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(8, 24, 24, 22, 22, FX_NEW ECBlocks(24, FX_NEW ECB(1, 36))));\r
100         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(9, 26, 26, 24, 24, FX_NEW ECBlocks(28, FX_NEW ECB(1, 44))));\r
101         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(10, 32, 32, 14, 14, FX_NEW ECBlocks(36, FX_NEW ECB(1, 62))));\r
102         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(11, 36, 36, 16, 16, FX_NEW ECBlocks(42, FX_NEW ECB(1, 86))));\r
103         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(12, 40, 40, 18, 18, FX_NEW ECBlocks(48, FX_NEW ECB(1, 114))));\r
104         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(13, 44, 44, 20, 20, FX_NEW ECBlocks(56, FX_NEW ECB(1, 144))));\r
105         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(14, 48, 48, 22, 22, FX_NEW ECBlocks(68, FX_NEW ECB(1, 174))));\r
106         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(15, 52, 52, 24, 24, FX_NEW ECBlocks(42, FX_NEW ECB(2, 102))));\r
107         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(16, 64, 64, 14, 14, FX_NEW ECBlocks(56, FX_NEW ECB(2, 140))));\r
108         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(17, 72, 72, 16, 16, FX_NEW ECBlocks(36, FX_NEW ECB(4, 92))));\r
109         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(18, 80, 80, 18, 18, FX_NEW ECBlocks(48, FX_NEW ECB(4, 114))));\r
110         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(19, 88, 88, 20, 20, FX_NEW ECBlocks(56, FX_NEW ECB(4, 144))));\r
111         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(20, 96, 96, 22, 22, FX_NEW ECBlocks(68, FX_NEW ECB(4, 174))));\r
112         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(21, 104, 104, 24, 24, FX_NEW ECBlocks(56, FX_NEW ECB(6, 136))));\r
113         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(22, 120, 120, 18, 18, FX_NEW ECBlocks(68, FX_NEW ECB(6, 175))));\r
114         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(23, 132, 132, 20, 20, FX_NEW ECBlocks(62, FX_NEW ECB(8, 163))));\r
115         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(24, 144, 144, 22, 22, FX_NEW ECBlocks(62, FX_NEW ECB(8, 156), FX_NEW ECB(2, 155))));\r
116         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(25, 8, 18, 6, 16, FX_NEW ECBlocks(7, FX_NEW ECB(1, 5))));\r
117         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(26, 8, 32, 6, 14, FX_NEW ECBlocks(11, FX_NEW ECB(1, 10))));\r
118         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(27, 12, 26, 10, 24, FX_NEW ECBlocks(14, FX_NEW ECB(1, 16))));\r
119         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(28, 12, 36, 10, 16, FX_NEW ECBlocks(18, FX_NEW ECB(1, 22))));\r
120         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(29, 16, 36, 14, 16, FX_NEW ECBlocks(24, FX_NEW ECB(1, 32))));\r
121         VERSIONS->Add(FX_NEW CBC_DataMatrixVersion(30, 16, 48, 14, 22, FX_NEW ECBlocks(28, FX_NEW ECB(1, 49))));\r
122     }\r
123     FX_INT32 numVersions = VERSIONS->GetSize();\r
124     for (FX_INT32 i = 0; i < numVersions; ++i) {\r
125         if (((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeRows == numRows && ((CBC_DataMatrixVersion*)((*VERSIONS)[i]))->m_symbolSizeColumns == numColumns) {\r
126             return (CBC_DataMatrixVersion*)(*VERSIONS)[i];\r
127         }\r
128     }\r
129     e = BCExceptionNotFound;\r
130     return NULL;\r
131 }\r