Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / 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 \r
7 #include "barcode.h"\r
8 #include "include/BC_PDF417Common.h"\r
9 #include "include/BC_PDF417ECModulusPoly.h"\r
10 #include "include/BC_PDF417ECModulusGF.h"\r
11 CBC_PDF417ECModulusGF* CBC_PDF417ECModulusGF::PDF417_GF = NULL;\r
12 void CBC_PDF417ECModulusGF::Initialize(FX_INT32 &e)\r
13 {\r
14     PDF417_GF = FX_NEW CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e);\r
15 }\r
16 void CBC_PDF417ECModulusGF::Finalize()\r
17 {\r
18     delete PDF417_GF;\r
19 }\r
20 CBC_PDF417ECModulusGF::CBC_PDF417ECModulusGF(FX_INT32 modulus, FX_INT32 generator, FX_INT32 &e)\r
21 {\r
22     m_modulus = modulus;\r
23     m_expTable.SetSize(modulus);\r
24     m_logTable.SetSize(modulus);\r
25     FX_INT32 x = 1;\r
26     for (FX_INT32 i = 0; i < modulus; i++) {\r
27         m_expTable[i] = x;\r
28         x = (x * generator) % modulus;\r
29     }\r
30     for (FX_INT32 j = 0; j < modulus - 1; j++) {\r
31         m_logTable[m_expTable[j]] = j;\r
32     }\r
33     CFX_Int32Array zero;\r
34     zero.Add(0);\r
35     m_zero = FX_NEW CBC_PDF417ECModulusPoly(this, zero, e);\r
36     CFX_Int32Array one;\r
37     one.Add(1);\r
38     m_one = FX_NEW CBC_PDF417ECModulusPoly(this, one, e);\r
39 }\r
40 CBC_PDF417ECModulusGF::~CBC_PDF417ECModulusGF()\r
41 {\r
42     delete m_zero;\r
43     delete m_one;\r
44 }\r
45 CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getZero()\r
46 {\r
47     return m_zero;\r
48 }\r
49 CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getOne()\r
50 {\r
51     return m_one;\r
52 }\r
53 CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::buildMonomial(FX_INT32 degree, FX_INT32 coefficient, FX_INT32 &e)\r
54 {\r
55     if (degree < 0) {\r
56         e = BCExceptionIllegalArgument;\r
57         return NULL;\r
58     }\r
59     CBC_PDF417ECModulusPoly* modulusPoly = NULL;\r
60     if (coefficient == 0) {\r
61         modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(m_zero->getField(), m_zero->getCoefficients(), e);\r
62         BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
63         return modulusPoly;\r
64     }\r
65     CFX_Int32Array coefficients;\r
66     coefficients.SetSize(degree + 1);\r
67     coefficients[0] = coefficient;\r
68     modulusPoly = FX_NEW CBC_PDF417ECModulusPoly(this, coefficients, e);\r
69     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);\r
70     return modulusPoly;\r
71 }\r
72 FX_INT32 CBC_PDF417ECModulusGF::add(FX_INT32 a, FX_INT32 b)\r
73 {\r
74     return (a + b) % m_modulus;\r
75 }\r
76 FX_INT32 CBC_PDF417ECModulusGF::subtract(FX_INT32 a, FX_INT32 b)\r
77 {\r
78     return (m_modulus + a - b) % m_modulus;\r
79 }\r
80 FX_INT32 CBC_PDF417ECModulusGF::exp(FX_INT32 a)\r
81 {\r
82     return m_expTable[a];\r
83 }\r
84 FX_INT32 CBC_PDF417ECModulusGF::log(FX_INT32 a, FX_INT32 &e)\r
85 {\r
86     if (a == 0) {\r
87         e = BCExceptionIllegalArgument;\r
88         return -1;\r
89     }\r
90     return m_logTable[a];\r
91 }\r
92 FX_INT32 CBC_PDF417ECModulusGF::inverse(FX_INT32 a, FX_INT32 &e)\r
93 {\r
94     if (a == 0) {\r
95         e = BCExceptionIllegalArgument;\r
96         return -1;\r
97     }\r
98     return m_expTable[m_modulus - m_logTable[a] - 1];\r
99 }\r
100 FX_INT32 CBC_PDF417ECModulusGF::multiply(FX_INT32 a, FX_INT32 b)\r
101 {\r
102     if (a == 0 || b == 0) {\r
103         return 0;\r
104     }\r
105     return m_expTable[(m_logTable[a] + m_logTable[b]) % (m_modulus - 1)];\r
106 }\r
107 FX_INT32 CBC_PDF417ECModulusGF::getSize()\r
108 {\r
109     return m_modulus;\r
110 }\r