1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 // Original code is licensed as follows:
7 /*
8 * Copyright 2012 ZXing authors
9 *
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
13 *
14 * http://www.apache.org/licenses/LICENSE-2.0
15 *
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
21 */
22
23 #include "xfa/src/fxbarcode/barcode.h"
24 #include "BC_PDF417Common.h"
25 #include "BC_PDF417ECModulusPoly.h"
26 #include "BC_PDF417ECModulusGF.h"
27 CBC_PDF417ECModulusGF* CBC_PDF417ECModulusGF::PDF417_GF = NULL;
Initialize(int32_t & e)28 void CBC_PDF417ECModulusGF::Initialize(int32_t& e) {
29 PDF417_GF =
30 new CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e);
31 }
Finalize()32 void CBC_PDF417ECModulusGF::Finalize() {
33 delete PDF417_GF;
34 }
CBC_PDF417ECModulusGF(int32_t modulus,int32_t generator,int32_t & e)35 CBC_PDF417ECModulusGF::CBC_PDF417ECModulusGF(int32_t modulus,
36 int32_t generator,
37 int32_t& e) {
38 m_modulus = modulus;
39 m_expTable.SetSize(modulus);
40 m_logTable.SetSize(modulus);
41 int32_t x = 1;
42 for (int32_t i = 0; i < modulus; i++) {
43 m_expTable[i] = x;
44 x = (x * generator) % modulus;
45 }
46 for (int32_t j = 0; j < modulus - 1; j++) {
47 m_logTable[m_expTable[j]] = j;
48 }
49 CFX_Int32Array zero;
50 zero.Add(0);
51 m_zero = new CBC_PDF417ECModulusPoly(this, zero, e);
52 CFX_Int32Array one;
53 one.Add(1);
54 m_one = new CBC_PDF417ECModulusPoly(this, one, e);
55 }
~CBC_PDF417ECModulusGF()56 CBC_PDF417ECModulusGF::~CBC_PDF417ECModulusGF() {
57 delete m_zero;
58 delete m_one;
59 }
getZero()60 CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getZero() {
61 return m_zero;
62 }
getOne()63 CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getOne() {
64 return m_one;
65 }
buildMonomial(int32_t degree,int32_t coefficient,int32_t & e)66 CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::buildMonomial(
67 int32_t degree,
68 int32_t coefficient,
69 int32_t& e) {
70 if (degree < 0) {
71 e = BCExceptionIllegalArgument;
72 return NULL;
73 }
74 CBC_PDF417ECModulusPoly* modulusPoly = NULL;
75 if (coefficient == 0) {
76 modulusPoly = new CBC_PDF417ECModulusPoly(m_zero->getField(),
77 m_zero->getCoefficients(), e);
78 BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
79 return modulusPoly;
80 }
81 CFX_Int32Array coefficients;
82 coefficients.SetSize(degree + 1);
83 coefficients[0] = coefficient;
84 modulusPoly = new CBC_PDF417ECModulusPoly(this, coefficients, e);
85 BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
86 return modulusPoly;
87 }
add(int32_t a,int32_t b)88 int32_t CBC_PDF417ECModulusGF::add(int32_t a, int32_t b) {
89 return (a + b) % m_modulus;
90 }
subtract(int32_t a,int32_t b)91 int32_t CBC_PDF417ECModulusGF::subtract(int32_t a, int32_t b) {
92 return (m_modulus + a - b) % m_modulus;
93 }
exp(int32_t a)94 int32_t CBC_PDF417ECModulusGF::exp(int32_t a) {
95 return m_expTable[a];
96 }
log(int32_t a,int32_t & e)97 int32_t CBC_PDF417ECModulusGF::log(int32_t a, int32_t& e) {
98 if (a == 0) {
99 e = BCExceptionIllegalArgument;
100 return -1;
101 }
102 return m_logTable[a];
103 }
inverse(int32_t a,int32_t & e)104 int32_t CBC_PDF417ECModulusGF::inverse(int32_t a, int32_t& e) {
105 if (a == 0) {
106 e = BCExceptionIllegalArgument;
107 return -1;
108 }
109 return m_expTable[m_modulus - m_logTable[a] - 1];
110 }
multiply(int32_t a,int32_t b)111 int32_t CBC_PDF417ECModulusGF::multiply(int32_t a, int32_t b) {
112 if (a == 0 || b == 0) {
113 return 0;
114 }
115 return m_expTable[(m_logTable[a] + m_logTable[b]) % (m_modulus - 1)];
116 }
getSize()117 int32_t CBC_PDF417ECModulusGF::getSize() {
118 return m_modulus;
119 }
120