Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fxbarcode / pdf417 / BC_PDF417ECModulusGF.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 2012 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_PDF417Common.h"\r
25 #include "BC_PDF417ECModulusPoly.h"\r
26 #include "BC_PDF417ECModulusGF.h"\r
27 CBC_PDF417ECModulusGF* CBC_PDF417ECModulusGF::PDF417_GF = NULL;\r
28 void CBC_PDF417ECModulusGF::Initialize(int32_t &e)\r
29 {\r
30     PDF417_GF = FX_NEW CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e);\r
31 }\r
32 void CBC_PDF417ECModulusGF::Finalize()\r
33 {\r
34     delete PDF417_GF;\r
35 }\r
36 CBC_PDF417ECModulusGF::CBC_PDF417ECModulusGF(int32_t modulus, int32_t generator, int32_t &e)\r
37 {\r
38     m_modulus = modulus;\r
39     m_expTable.SetSize(modulus);\r
40     m_logTable.SetSize(modulus);\r
41     int32_t x = 1;\r
42     for (int32_t i = 0; i < modulus; i++) {\r
43         m_expTable[i] = x;\r
44         x = (x * generator) % modulus;\r
45     }\r
46     for (int32_t j = 0; j < modulus - 1; j++) {\r
47         m_logTable[m_expTable[j]] = j;\r
48     }\r
49     CFX_Int32Array zero;\r
50     zero.Add(0);\r
51     m_zero = FX_NEW CBC_PDF417ECModulusPoly(this, zero, e);\r
52     CFX_Int32Array one;\r
53     one.Add(1);\r
54     m_one = FX_NEW CBC_PDF417ECModulusPoly(this, one, e);\r
55 }\r
56 CBC_PDF417ECModulusGF::~CBC_PDF417ECModulusGF()\r
57 {\r
58     delete m_zero;\r
59     delete m_one;\r
60 }\r
61 CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getZero()\r
62 {\r
63     return m_zero;\r
64 }\r
65 CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getOne()\r
66 {\r
67     return m_one;\r
68 }\r
69 CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::buildMonomial(int32_t degree, int32_t coefficient, int32_t &e)\r
70 {\r
71     if (degree < 0) {\r
72         e = BCExceptionIllegalArgument;\r
73         return NULL;\r
74     }\r
75     CBC_PDF417ECModulusPoly* modulusPoly = NULL;\r
76     if (coefficient == 0) {\r
77         modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_zero->getField(), m_zero->getCoefficients(), e);\r
78         BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
79         return modulusPoly;\r
80     }\r
81     CFX_Int32Array coefficients;\r
82     coefficients.SetSize(degree + 1);\r
83     coefficients[0] = coefficient;\r
84     modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(this, coefficients, e);\r
85     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
86     return modulusPoly;\r
87 }\r
88 int32_t CBC_PDF417ECModulusGF::add(int32_t a, int32_t b)\r
89 {\r
90     return (a + b) % m_modulus;\r
91 }\r
92 int32_t CBC_PDF417ECModulusGF::subtract(int32_t a, int32_t b)\r
93 {\r
94     return (m_modulus + a - b) % m_modulus;\r
95 }\r
96 int32_t CBC_PDF417ECModulusGF::exp(int32_t a)\r
97 {\r
98     return m_expTable[a];\r
99 }\r
100 int32_t CBC_PDF417ECModulusGF::log(int32_t a, int32_t &e)\r
101 {\r
102     if (a == 0) {\r
103         e = BCExceptionIllegalArgument;\r
104         return -1;\r
105     }\r
106     return m_logTable[a];\r
107 }\r
108 int32_t CBC_PDF417ECModulusGF::inverse(int32_t a, int32_t &e)\r
109 {\r
110     if (a == 0) {\r
111         e = BCExceptionIllegalArgument;\r
112         return -1;\r
113     }\r
114     return m_expTable[m_modulus - m_logTable[a] - 1];\r
115 }\r
116 int32_t CBC_PDF417ECModulusGF::multiply(int32_t a, int32_t b)\r
117 {\r
118     if (a == 0 || b == 0) {\r
119         return 0;\r
120     }\r
121     return m_expTable[(m_logTable[a] + m_logTable[b]) % (m_modulus - 1)];\r
122 }\r
123 int32_t CBC_PDF417ECModulusGF::getSize()\r
124 {\r
125     return m_modulus;\r
126 }\r