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