Home | History | Annotate | Download | only in pdf417
      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;
     28 void CBC_PDF417ECModulusGF::Initialize(int32_t& e) {
     29   PDF417_GF =
     30       new CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e);
     31 }
     32 void CBC_PDF417ECModulusGF::Finalize() {
     33   delete PDF417_GF;
     34 }
     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 }
     56 CBC_PDF417ECModulusGF::~CBC_PDF417ECModulusGF() {
     57   delete m_zero;
     58   delete m_one;
     59 }
     60 CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getZero() {
     61   return m_zero;
     62 }
     63 CBC_PDF417ECModulusPoly* CBC_PDF417ECModulusGF::getOne() {
     64   return m_one;
     65 }
     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 }
     88 int32_t CBC_PDF417ECModulusGF::add(int32_t a, int32_t b) {
     89   return (a + b) % m_modulus;
     90 }
     91 int32_t CBC_PDF417ECModulusGF::subtract(int32_t a, int32_t b) {
     92   return (m_modulus + a - b) % m_modulus;
     93 }
     94 int32_t CBC_PDF417ECModulusGF::exp(int32_t a) {
     95   return m_expTable[a];
     96 }
     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 }
    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 }
    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 }
    117 int32_t CBC_PDF417ECModulusGF::getSize() {
    118   return m_modulus;
    119 }
    120