Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_ReedSolomonGF256.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_ReedSolomonGF256Poly.h"\r
9 #include "include/BC_ReedSolomonGF256.h"\r
10 CBC_ReedSolomonGF256 *CBC_ReedSolomonGF256::QRCodeFild = NULL;\r
11 CBC_ReedSolomonGF256 *CBC_ReedSolomonGF256::DataMatrixField = NULL;\r
12 void CBC_ReedSolomonGF256::Initialize()\r
13 {\r
14     QRCodeFild = FX_NEW CBC_ReedSolomonGF256(0x011D);\r
15     QRCodeFild->Init();\r
16     DataMatrixField = FX_NEW CBC_ReedSolomonGF256(0x012D);\r
17     DataMatrixField->Init();\r
18 }\r
19 void CBC_ReedSolomonGF256::Finalize()\r
20 {\r
21     if (QRCodeFild) {\r
22         delete QRCodeFild;\r
23     }\r
24     QRCodeFild = NULL;\r
25     if (DataMatrixField) {\r
26         delete DataMatrixField;\r
27     }\r
28     DataMatrixField = NULL;\r
29 }\r
30 CBC_ReedSolomonGF256::CBC_ReedSolomonGF256(FX_INT32 primitive)\r
31 {\r
32     FX_INT32 x = 1;\r
33     for(FX_INT32 j = 0; j < 256; j++) {\r
34         m_expTable[j] = x;\r
35         x <<= 1;\r
36         if(x >= 0x100) {\r
37             x ^= primitive;\r
38         }\r
39     }\r
40     for(FX_INT32 i = 0; i < 255; i++) {\r
41         m_logTable[m_expTable[i]] = i;\r
42     }\r
43     m_logTable[0] = 0;\r
44 }\r
45 void CBC_ReedSolomonGF256::Init()\r
46 {\r
47     m_zero = FX_NEW CBC_ReedSolomonGF256Poly(this, 0);\r
48     m_one = FX_NEW CBC_ReedSolomonGF256Poly(this, 1);\r
49 }\r
50 CBC_ReedSolomonGF256::~CBC_ReedSolomonGF256()\r
51 {\r
52     if(m_zero != NULL) {\r
53         delete m_zero;\r
54         m_zero = NULL;\r
55     }\r
56     if(m_one != NULL) {\r
57         delete m_one;\r
58         m_one = NULL;\r
59     }\r
60 }\r
61 CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::GetZero()\r
62 {\r
63     return m_zero;\r
64 }\r
65 CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::GetOne()\r
66 {\r
67     return m_one;\r
68 }\r
69 CBC_ReedSolomonGF256Poly* CBC_ReedSolomonGF256::BuildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e)\r
70 {\r
71     if(degree < 0) {\r
72         e = BCExceptionDegreeIsNegative;\r
73         BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
74     }\r
75     if(coefficient == 0) {\r
76         CBC_ReedSolomonGF256Poly* temp = m_zero->Clone(e);\r
77         BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
78         return temp;\r
79     }\r
80     CFX_Int32Array  coefficients;\r
81     coefficients.SetSize(degree + 1);\r
82     coefficients[0] = coefficient;\r
83     CBC_ReedSolomonGF256Poly *temp = FX_NEW CBC_ReedSolomonGF256Poly();\r
84     temp->Init(this, &coefficients, e);\r
85     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
86     return temp;\r
87 }\r
88 FX_INT32 CBC_ReedSolomonGF256::AddOrSubtract(FX_INT32 a, FX_INT32 b)\r
89 {\r
90     return a ^ b;\r
91 }\r
92 FX_INT32 CBC_ReedSolomonGF256::Exp(FX_INT32 a)\r
93 {\r
94     return m_expTable[a];\r
95 }\r
96 FX_INT32 CBC_ReedSolomonGF256::Log(FX_INT32 a, FX_INT32 &e)\r
97 {\r
98     if(a == 0) {\r
99         e = BCExceptionAIsZero;\r
100         BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
101     }\r
102     return m_logTable[a];\r
103 }\r
104 FX_INT32 CBC_ReedSolomonGF256::Inverse(FX_INT32 a, FX_INT32 &e)\r
105 {\r
106     if(a == 0) {\r
107         e = BCExceptionAIsZero;\r
108         BC_EXCEPTION_CHECK_ReturnValue(e, 0);\r
109     }\r
110     return m_expTable[255 - m_logTable[a]];\r
111 }\r
112 FX_INT32 CBC_ReedSolomonGF256::Multiply(FX_INT32 a, FX_INT32 b)\r
113 {\r
114     if(a == 0 || b == 0) {\r
115         return 0;\r
116     }\r
117     if(a == 1) {\r
118         return b;\r
119     }\r
120     if(b == 1) {\r
121         return a;\r
122     }\r
123     return m_expTable[(m_logTable[a] + m_logTable[b]) % 255];\r
124 }\r