• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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