| Index: xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp
|
| diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp
|
| index 86b9044ea9ac7bc1d2aaba068ddcb64d993aa8fc..cf02449701813fe8dab6b333fcfeda7c7daae527 100644
|
| --- a/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp
|
| +++ b/xfa/src/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp
|
| @@ -1,387 +1,387 @@
|
| -// Copyright 2014 PDFium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| -// Original code is licensed as follows:
|
| -/*
|
| - * Copyright 2012 ZXing authors
|
| - *
|
| - * Licensed under the Apache License, Version 2.0 (the "License");
|
| - * you may not use this file except in compliance with the License.
|
| - * You may obtain a copy of the License at
|
| - *
|
| - * http://www.apache.org/licenses/LICENSE-2.0
|
| - *
|
| - * Unless required by applicable law or agreed to in writing, software
|
| - * distributed under the License is distributed on an "AS IS" BASIS,
|
| - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| - * See the License for the specific language governing permissions and
|
| - * limitations under the License.
|
| - */
|
| -
|
| -#include "xfa/src/fxbarcode/barcode.h"
|
| -#include "BC_PDF417Common.h"
|
| -#include "BC_PDF417ECModulusPoly.h"
|
| -#include "BC_PDF417ECModulusGF.h"
|
| -#include "BC_PDF417ECErrorCorrection.h"
|
| -CBC_PDF417ECModulusGF* CBC_PDF417ECErrorCorrection::m_field = NULL;
|
| -void CBC_PDF417ECErrorCorrection::Initialize(int32_t& e) {
|
| - m_field =
|
| - new CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e);
|
| -}
|
| -void CBC_PDF417ECErrorCorrection::Finalize() {
|
| - delete m_field;
|
| -}
|
| -CBC_PDF417ECErrorCorrection::CBC_PDF417ECErrorCorrection() {}
|
| -CBC_PDF417ECErrorCorrection::~CBC_PDF417ECErrorCorrection() {}
|
| -int32_t CBC_PDF417ECErrorCorrection::decode(CFX_Int32Array& received,
|
| - int32_t numECCodewords,
|
| - CFX_Int32Array& erasures,
|
| - int32_t& e) {
|
| - CBC_PDF417ECModulusPoly poly(m_field, received, e);
|
| - BC_EXCEPTION_CHECK_ReturnValue(e, -1);
|
| - CFX_Int32Array S;
|
| - S.SetSize(numECCodewords);
|
| - FX_BOOL error = FALSE;
|
| - for (int32_t l = numECCodewords; l > 0; l--) {
|
| - int32_t eval = poly.evaluateAt(m_field->exp(l));
|
| - S[numECCodewords - l] = eval;
|
| - if (eval != 0) {
|
| - error = TRUE;
|
| - }
|
| - }
|
| - if (!error) {
|
| - return 0;
|
| - }
|
| - CBC_PDF417ECModulusPoly* syndrome =
|
| - new CBC_PDF417ECModulusPoly(m_field, S, e);
|
| - BC_EXCEPTION_CHECK_ReturnValue(e, -1);
|
| - CBC_PDF417ECModulusPoly* buildmonomial =
|
| - m_field->buildMonomial(numECCodewords, 1, e);
|
| - if (e != BCExceptionNO) {
|
| - delete syndrome;
|
| - return -1;
|
| - }
|
| - CFX_PtrArray* sigmaOmega =
|
| - runEuclideanAlgorithm(buildmonomial, syndrome, numECCodewords, e);
|
| - delete buildmonomial;
|
| - delete syndrome;
|
| - BC_EXCEPTION_CHECK_ReturnValue(e, -1);
|
| - CBC_PDF417ECModulusPoly* sigma =
|
| - (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(0);
|
| - CBC_PDF417ECModulusPoly* omega =
|
| - (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(1);
|
| - CFX_Int32Array* errorLocations = findErrorLocations(sigma, e);
|
| - if (e != BCExceptionNO) {
|
| - for (int32_t i = 0; i < sigmaOmega->GetSize(); i++) {
|
| - delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i);
|
| - }
|
| - sigmaOmega->RemoveAll();
|
| - delete sigmaOmega;
|
| - return -1;
|
| - }
|
| - CFX_Int32Array* errorMagnitudes =
|
| - findErrorMagnitudes(omega, sigma, *errorLocations, e);
|
| - if (e != BCExceptionNO) {
|
| - delete errorLocations;
|
| - for (int32_t i = 0; i < sigmaOmega->GetSize(); i++) {
|
| - delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i);
|
| - }
|
| - sigmaOmega->RemoveAll();
|
| - delete sigmaOmega;
|
| - return -1;
|
| - }
|
| - for (int32_t i = 0; i < errorLocations->GetSize(); i++) {
|
| - int32_t log = m_field->log(errorLocations->GetAt(i), e);
|
| - ;
|
| - BC_EXCEPTION_CHECK_ReturnValue(e, -1);
|
| - int32_t position = received.GetSize() - 1 - log;
|
| - if (position < 0) {
|
| - e = BCExceptionChecksumException;
|
| - delete errorLocations;
|
| - delete errorMagnitudes;
|
| - for (int32_t j = 0; j < sigmaOmega->GetSize(); j++) {
|
| - delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(j);
|
| - }
|
| - sigmaOmega->RemoveAll();
|
| - delete sigmaOmega;
|
| - return -1;
|
| - }
|
| - received[position] =
|
| - m_field->subtract(received[position], errorMagnitudes->GetAt(i));
|
| - }
|
| - int32_t result = errorLocations->GetSize();
|
| - delete errorLocations;
|
| - delete errorMagnitudes;
|
| - for (int32_t k = 0; k < sigmaOmega->GetSize(); k++) {
|
| - delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(k);
|
| - }
|
| - sigmaOmega->RemoveAll();
|
| - delete sigmaOmega;
|
| - return result;
|
| -}
|
| -CFX_PtrArray* CBC_PDF417ECErrorCorrection::runEuclideanAlgorithm(
|
| - CBC_PDF417ECModulusPoly* a,
|
| - CBC_PDF417ECModulusPoly* b,
|
| - int32_t R,
|
| - int32_t& e) {
|
| - if (a->getDegree() < b->getDegree()) {
|
| - CBC_PDF417ECModulusPoly* temp = a;
|
| - a = b;
|
| - b = temp;
|
| - }
|
| - CBC_PDF417ECModulusPoly* rLast = a;
|
| - CBC_PDF417ECModulusPoly* r = b;
|
| - CBC_PDF417ECModulusPoly* tLast = m_field->getZero();
|
| - CBC_PDF417ECModulusPoly* t = m_field->getOne();
|
| - CBC_PDF417ECModulusPoly* qtemp = NULL;
|
| - CBC_PDF417ECModulusPoly* rtemp = NULL;
|
| - CBC_PDF417ECModulusPoly* ttemp = NULL;
|
| - int32_t i = 0;
|
| - int32_t j = 0;
|
| - int32_t m = 0;
|
| - int32_t n = 0;
|
| - while (r->getDegree() >= R / 2) {
|
| - CBC_PDF417ECModulusPoly* rLastLast = rLast;
|
| - CBC_PDF417ECModulusPoly* tLastLast = tLast;
|
| - rLast = r;
|
| - tLast = t;
|
| - m = i;
|
| - n = j;
|
| - if (rLast->isZero()) {
|
| - e = BCExceptionChecksumException;
|
| - if (qtemp) {
|
| - delete qtemp;
|
| - }
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - if (ttemp) {
|
| - delete ttemp;
|
| - }
|
| - return NULL;
|
| - }
|
| - r = rLastLast;
|
| - CBC_PDF417ECModulusPoly* q = m_field->getZero();
|
| - int32_t denominatorLeadingTerm = rLast->getCoefficient(rLast->getDegree());
|
| - int32_t dltInverse = m_field->inverse(denominatorLeadingTerm, e);
|
| - if (e != BCExceptionNO) {
|
| - if (qtemp) {
|
| - delete qtemp;
|
| - }
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - if (ttemp) {
|
| - delete ttemp;
|
| - }
|
| - return NULL;
|
| - }
|
| - while (r->getDegree() >= rLast->getDegree() && !r->isZero()) {
|
| - int32_t degreeDiff = r->getDegree() - rLast->getDegree();
|
| - int32_t scale =
|
| - m_field->multiply(r->getCoefficient(r->getDegree()), dltInverse);
|
| - CBC_PDF417ECModulusPoly* buildmonomial =
|
| - m_field->buildMonomial(degreeDiff, scale, e);
|
| - if (e != BCExceptionNO) {
|
| - if (qtemp) {
|
| - delete qtemp;
|
| - }
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - if (ttemp) {
|
| - delete ttemp;
|
| - }
|
| - return NULL;
|
| - }
|
| - q = q->add(buildmonomial, e);
|
| - delete buildmonomial;
|
| - if (qtemp) {
|
| - delete qtemp;
|
| - }
|
| - if (e != BCExceptionNO) {
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - if (ttemp) {
|
| - delete ttemp;
|
| - }
|
| - return NULL;
|
| - }
|
| - qtemp = q;
|
| - CBC_PDF417ECModulusPoly* multiply =
|
| - rLast->multiplyByMonomial(degreeDiff, scale, e);
|
| - if (e != BCExceptionNO) {
|
| - if (qtemp) {
|
| - delete qtemp;
|
| - }
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - if (ttemp) {
|
| - delete ttemp;
|
| - }
|
| - return NULL;
|
| - }
|
| - CBC_PDF417ECModulusPoly* temp = r;
|
| - r = temp->subtract(multiply, e);
|
| - delete multiply;
|
| - if (m > 1 && i > m) {
|
| - delete temp;
|
| - temp = NULL;
|
| - }
|
| - if (e != BCExceptionNO) {
|
| - if (qtemp) {
|
| - delete qtemp;
|
| - }
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - if (ttemp) {
|
| - delete ttemp;
|
| - }
|
| - return NULL;
|
| - }
|
| - rtemp = r;
|
| - i = m + 1;
|
| - }
|
| - ttemp = q->multiply(tLast, e);
|
| - if (qtemp) {
|
| - delete qtemp;
|
| - qtemp = NULL;
|
| - }
|
| - if (e != BCExceptionNO) {
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - if (ttemp) {
|
| - delete ttemp;
|
| - }
|
| - return NULL;
|
| - }
|
| - t = ttemp->subtract(tLastLast, e);
|
| - if (n > 1 && j > n) {
|
| - delete tLastLast;
|
| - }
|
| - delete ttemp;
|
| - if (e != BCExceptionNO) {
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - return NULL;
|
| - }
|
| - ttemp = t;
|
| - t = ttemp->negative(e);
|
| - delete ttemp;
|
| - if (e != BCExceptionNO) {
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - return NULL;
|
| - }
|
| - ttemp = t;
|
| - j++;
|
| - }
|
| - int32_t sigmaTildeAtZero = t->getCoefficient(0);
|
| - if (sigmaTildeAtZero == 0) {
|
| - e = BCExceptionChecksumException;
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - if (ttemp) {
|
| - delete ttemp;
|
| - }
|
| - return NULL;
|
| - }
|
| - int32_t inverse = m_field->inverse(sigmaTildeAtZero, e);
|
| - if (e != BCExceptionNO) {
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - if (ttemp) {
|
| - delete ttemp;
|
| - }
|
| - return NULL;
|
| - }
|
| - CBC_PDF417ECModulusPoly* sigma = t->multiply(inverse, e);
|
| - if (ttemp) {
|
| - delete ttemp;
|
| - }
|
| - if (e != BCExceptionNO) {
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - return NULL;
|
| - }
|
| - CBC_PDF417ECModulusPoly* omega = r->multiply(inverse, e);
|
| - if (rtemp) {
|
| - delete rtemp;
|
| - }
|
| - BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
|
| - CFX_PtrArray* modulusPoly = new CFX_PtrArray;
|
| - modulusPoly->Add(sigma);
|
| - modulusPoly->Add(omega);
|
| - return modulusPoly;
|
| -}
|
| -CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorLocations(
|
| - CBC_PDF417ECModulusPoly* errorLocator,
|
| - int32_t& e) {
|
| - int32_t numErrors = errorLocator->getDegree();
|
| - CFX_Int32Array* result = new CFX_Int32Array;
|
| - result->SetSize(numErrors);
|
| - int32_t ee = 0;
|
| - for (int32_t i = 1; i < m_field->getSize() && ee < numErrors; i++) {
|
| - if (errorLocator->evaluateAt(i) == 0) {
|
| - result->SetAt(ee, m_field->inverse(i, e));
|
| - if (e != BCExceptionNO) {
|
| - delete result;
|
| - return NULL;
|
| - }
|
| - ee++;
|
| - }
|
| - }
|
| - if (ee != numErrors) {
|
| - e = BCExceptionChecksumException;
|
| - delete result;
|
| - return NULL;
|
| - }
|
| - return result;
|
| -}
|
| -CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorMagnitudes(
|
| - CBC_PDF417ECModulusPoly* errorEvaluator,
|
| - CBC_PDF417ECModulusPoly* errorLocator,
|
| - CFX_Int32Array& errorLocations,
|
| - int32_t& e) {
|
| - int32_t errorLocatorDegree = errorLocator->getDegree();
|
| - CFX_Int32Array formalDerivativeCoefficients;
|
| - formalDerivativeCoefficients.SetSize(errorLocatorDegree);
|
| - for (int32_t l = 1; l <= errorLocatorDegree; l++) {
|
| - formalDerivativeCoefficients[errorLocatorDegree - l] =
|
| - m_field->multiply(l, errorLocator->getCoefficient(l));
|
| - }
|
| - CBC_PDF417ECModulusPoly formalDerivative(m_field,
|
| - formalDerivativeCoefficients, e);
|
| - BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
|
| - int32_t s = errorLocations.GetSize();
|
| - CFX_Int32Array* result = new CFX_Int32Array;
|
| - result->SetSize(s);
|
| - for (int32_t i = 0; i < s; i++) {
|
| - int32_t xiInverse = m_field->inverse(errorLocations[i], e);
|
| - if (e != BCExceptionNO) {
|
| - delete result;
|
| - return NULL;
|
| - }
|
| - int32_t numerator =
|
| - m_field->subtract(0, errorEvaluator->evaluateAt(xiInverse));
|
| - int32_t denominator =
|
| - m_field->inverse(formalDerivative.evaluateAt(xiInverse), e);
|
| - if (e != BCExceptionNO) {
|
| - delete result;
|
| - return NULL;
|
| - }
|
| - result->SetAt(i, m_field->multiply(numerator, denominator));
|
| - }
|
| - return result;
|
| -}
|
| +// Copyright 2014 PDFium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| +// Original code is licensed as follows:
|
| +/*
|
| + * Copyright 2012 ZXing authors
|
| + *
|
| + * Licensed under the Apache License, Version 2.0 (the "License");
|
| + * you may not use this file except in compliance with the License.
|
| + * You may obtain a copy of the License at
|
| + *
|
| + * http://www.apache.org/licenses/LICENSE-2.0
|
| + *
|
| + * Unless required by applicable law or agreed to in writing, software
|
| + * distributed under the License is distributed on an "AS IS" BASIS,
|
| + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| + * See the License for the specific language governing permissions and
|
| + * limitations under the License.
|
| + */
|
| +
|
| +#include "xfa/src/fxbarcode/barcode.h"
|
| +#include "BC_PDF417Common.h"
|
| +#include "BC_PDF417ECModulusPoly.h"
|
| +#include "BC_PDF417ECModulusGF.h"
|
| +#include "BC_PDF417ECErrorCorrection.h"
|
| +CBC_PDF417ECModulusGF* CBC_PDF417ECErrorCorrection::m_field = NULL;
|
| +void CBC_PDF417ECErrorCorrection::Initialize(int32_t& e) {
|
| + m_field =
|
| + new CBC_PDF417ECModulusGF(CBC_PDF417Common::NUMBER_OF_CODEWORDS, 3, e);
|
| +}
|
| +void CBC_PDF417ECErrorCorrection::Finalize() {
|
| + delete m_field;
|
| +}
|
| +CBC_PDF417ECErrorCorrection::CBC_PDF417ECErrorCorrection() {}
|
| +CBC_PDF417ECErrorCorrection::~CBC_PDF417ECErrorCorrection() {}
|
| +int32_t CBC_PDF417ECErrorCorrection::decode(CFX_Int32Array& received,
|
| + int32_t numECCodewords,
|
| + CFX_Int32Array& erasures,
|
| + int32_t& e) {
|
| + CBC_PDF417ECModulusPoly poly(m_field, received, e);
|
| + BC_EXCEPTION_CHECK_ReturnValue(e, -1);
|
| + CFX_Int32Array S;
|
| + S.SetSize(numECCodewords);
|
| + FX_BOOL error = FALSE;
|
| + for (int32_t l = numECCodewords; l > 0; l--) {
|
| + int32_t eval = poly.evaluateAt(m_field->exp(l));
|
| + S[numECCodewords - l] = eval;
|
| + if (eval != 0) {
|
| + error = TRUE;
|
| + }
|
| + }
|
| + if (!error) {
|
| + return 0;
|
| + }
|
| + CBC_PDF417ECModulusPoly* syndrome =
|
| + new CBC_PDF417ECModulusPoly(m_field, S, e);
|
| + BC_EXCEPTION_CHECK_ReturnValue(e, -1);
|
| + CBC_PDF417ECModulusPoly* buildmonomial =
|
| + m_field->buildMonomial(numECCodewords, 1, e);
|
| + if (e != BCExceptionNO) {
|
| + delete syndrome;
|
| + return -1;
|
| + }
|
| + CFX_PtrArray* sigmaOmega =
|
| + runEuclideanAlgorithm(buildmonomial, syndrome, numECCodewords, e);
|
| + delete buildmonomial;
|
| + delete syndrome;
|
| + BC_EXCEPTION_CHECK_ReturnValue(e, -1);
|
| + CBC_PDF417ECModulusPoly* sigma =
|
| + (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(0);
|
| + CBC_PDF417ECModulusPoly* omega =
|
| + (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(1);
|
| + CFX_Int32Array* errorLocations = findErrorLocations(sigma, e);
|
| + if (e != BCExceptionNO) {
|
| + for (int32_t i = 0; i < sigmaOmega->GetSize(); i++) {
|
| + delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i);
|
| + }
|
| + sigmaOmega->RemoveAll();
|
| + delete sigmaOmega;
|
| + return -1;
|
| + }
|
| + CFX_Int32Array* errorMagnitudes =
|
| + findErrorMagnitudes(omega, sigma, *errorLocations, e);
|
| + if (e != BCExceptionNO) {
|
| + delete errorLocations;
|
| + for (int32_t i = 0; i < sigmaOmega->GetSize(); i++) {
|
| + delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(i);
|
| + }
|
| + sigmaOmega->RemoveAll();
|
| + delete sigmaOmega;
|
| + return -1;
|
| + }
|
| + for (int32_t i = 0; i < errorLocations->GetSize(); i++) {
|
| + int32_t log = m_field->log(errorLocations->GetAt(i), e);
|
| + ;
|
| + BC_EXCEPTION_CHECK_ReturnValue(e, -1);
|
| + int32_t position = received.GetSize() - 1 - log;
|
| + if (position < 0) {
|
| + e = BCExceptionChecksumException;
|
| + delete errorLocations;
|
| + delete errorMagnitudes;
|
| + for (int32_t j = 0; j < sigmaOmega->GetSize(); j++) {
|
| + delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(j);
|
| + }
|
| + sigmaOmega->RemoveAll();
|
| + delete sigmaOmega;
|
| + return -1;
|
| + }
|
| + received[position] =
|
| + m_field->subtract(received[position], errorMagnitudes->GetAt(i));
|
| + }
|
| + int32_t result = errorLocations->GetSize();
|
| + delete errorLocations;
|
| + delete errorMagnitudes;
|
| + for (int32_t k = 0; k < sigmaOmega->GetSize(); k++) {
|
| + delete (CBC_PDF417ECModulusPoly*)sigmaOmega->GetAt(k);
|
| + }
|
| + sigmaOmega->RemoveAll();
|
| + delete sigmaOmega;
|
| + return result;
|
| +}
|
| +CFX_PtrArray* CBC_PDF417ECErrorCorrection::runEuclideanAlgorithm(
|
| + CBC_PDF417ECModulusPoly* a,
|
| + CBC_PDF417ECModulusPoly* b,
|
| + int32_t R,
|
| + int32_t& e) {
|
| + if (a->getDegree() < b->getDegree()) {
|
| + CBC_PDF417ECModulusPoly* temp = a;
|
| + a = b;
|
| + b = temp;
|
| + }
|
| + CBC_PDF417ECModulusPoly* rLast = a;
|
| + CBC_PDF417ECModulusPoly* r = b;
|
| + CBC_PDF417ECModulusPoly* tLast = m_field->getZero();
|
| + CBC_PDF417ECModulusPoly* t = m_field->getOne();
|
| + CBC_PDF417ECModulusPoly* qtemp = NULL;
|
| + CBC_PDF417ECModulusPoly* rtemp = NULL;
|
| + CBC_PDF417ECModulusPoly* ttemp = NULL;
|
| + int32_t i = 0;
|
| + int32_t j = 0;
|
| + int32_t m = 0;
|
| + int32_t n = 0;
|
| + while (r->getDegree() >= R / 2) {
|
| + CBC_PDF417ECModulusPoly* rLastLast = rLast;
|
| + CBC_PDF417ECModulusPoly* tLastLast = tLast;
|
| + rLast = r;
|
| + tLast = t;
|
| + m = i;
|
| + n = j;
|
| + if (rLast->isZero()) {
|
| + e = BCExceptionChecksumException;
|
| + if (qtemp) {
|
| + delete qtemp;
|
| + }
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + if (ttemp) {
|
| + delete ttemp;
|
| + }
|
| + return NULL;
|
| + }
|
| + r = rLastLast;
|
| + CBC_PDF417ECModulusPoly* q = m_field->getZero();
|
| + int32_t denominatorLeadingTerm = rLast->getCoefficient(rLast->getDegree());
|
| + int32_t dltInverse = m_field->inverse(denominatorLeadingTerm, e);
|
| + if (e != BCExceptionNO) {
|
| + if (qtemp) {
|
| + delete qtemp;
|
| + }
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + if (ttemp) {
|
| + delete ttemp;
|
| + }
|
| + return NULL;
|
| + }
|
| + while (r->getDegree() >= rLast->getDegree() && !r->isZero()) {
|
| + int32_t degreeDiff = r->getDegree() - rLast->getDegree();
|
| + int32_t scale =
|
| + m_field->multiply(r->getCoefficient(r->getDegree()), dltInverse);
|
| + CBC_PDF417ECModulusPoly* buildmonomial =
|
| + m_field->buildMonomial(degreeDiff, scale, e);
|
| + if (e != BCExceptionNO) {
|
| + if (qtemp) {
|
| + delete qtemp;
|
| + }
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + if (ttemp) {
|
| + delete ttemp;
|
| + }
|
| + return NULL;
|
| + }
|
| + q = q->add(buildmonomial, e);
|
| + delete buildmonomial;
|
| + if (qtemp) {
|
| + delete qtemp;
|
| + }
|
| + if (e != BCExceptionNO) {
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + if (ttemp) {
|
| + delete ttemp;
|
| + }
|
| + return NULL;
|
| + }
|
| + qtemp = q;
|
| + CBC_PDF417ECModulusPoly* multiply =
|
| + rLast->multiplyByMonomial(degreeDiff, scale, e);
|
| + if (e != BCExceptionNO) {
|
| + if (qtemp) {
|
| + delete qtemp;
|
| + }
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + if (ttemp) {
|
| + delete ttemp;
|
| + }
|
| + return NULL;
|
| + }
|
| + CBC_PDF417ECModulusPoly* temp = r;
|
| + r = temp->subtract(multiply, e);
|
| + delete multiply;
|
| + if (m > 1 && i > m) {
|
| + delete temp;
|
| + temp = NULL;
|
| + }
|
| + if (e != BCExceptionNO) {
|
| + if (qtemp) {
|
| + delete qtemp;
|
| + }
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + if (ttemp) {
|
| + delete ttemp;
|
| + }
|
| + return NULL;
|
| + }
|
| + rtemp = r;
|
| + i = m + 1;
|
| + }
|
| + ttemp = q->multiply(tLast, e);
|
| + if (qtemp) {
|
| + delete qtemp;
|
| + qtemp = NULL;
|
| + }
|
| + if (e != BCExceptionNO) {
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + if (ttemp) {
|
| + delete ttemp;
|
| + }
|
| + return NULL;
|
| + }
|
| + t = ttemp->subtract(tLastLast, e);
|
| + if (n > 1 && j > n) {
|
| + delete tLastLast;
|
| + }
|
| + delete ttemp;
|
| + if (e != BCExceptionNO) {
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + return NULL;
|
| + }
|
| + ttemp = t;
|
| + t = ttemp->negative(e);
|
| + delete ttemp;
|
| + if (e != BCExceptionNO) {
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + return NULL;
|
| + }
|
| + ttemp = t;
|
| + j++;
|
| + }
|
| + int32_t sigmaTildeAtZero = t->getCoefficient(0);
|
| + if (sigmaTildeAtZero == 0) {
|
| + e = BCExceptionChecksumException;
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + if (ttemp) {
|
| + delete ttemp;
|
| + }
|
| + return NULL;
|
| + }
|
| + int32_t inverse = m_field->inverse(sigmaTildeAtZero, e);
|
| + if (e != BCExceptionNO) {
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + if (ttemp) {
|
| + delete ttemp;
|
| + }
|
| + return NULL;
|
| + }
|
| + CBC_PDF417ECModulusPoly* sigma = t->multiply(inverse, e);
|
| + if (ttemp) {
|
| + delete ttemp;
|
| + }
|
| + if (e != BCExceptionNO) {
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + return NULL;
|
| + }
|
| + CBC_PDF417ECModulusPoly* omega = r->multiply(inverse, e);
|
| + if (rtemp) {
|
| + delete rtemp;
|
| + }
|
| + BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
|
| + CFX_PtrArray* modulusPoly = new CFX_PtrArray;
|
| + modulusPoly->Add(sigma);
|
| + modulusPoly->Add(omega);
|
| + return modulusPoly;
|
| +}
|
| +CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorLocations(
|
| + CBC_PDF417ECModulusPoly* errorLocator,
|
| + int32_t& e) {
|
| + int32_t numErrors = errorLocator->getDegree();
|
| + CFX_Int32Array* result = new CFX_Int32Array;
|
| + result->SetSize(numErrors);
|
| + int32_t ee = 0;
|
| + for (int32_t i = 1; i < m_field->getSize() && ee < numErrors; i++) {
|
| + if (errorLocator->evaluateAt(i) == 0) {
|
| + result->SetAt(ee, m_field->inverse(i, e));
|
| + if (e != BCExceptionNO) {
|
| + delete result;
|
| + return NULL;
|
| + }
|
| + ee++;
|
| + }
|
| + }
|
| + if (ee != numErrors) {
|
| + e = BCExceptionChecksumException;
|
| + delete result;
|
| + return NULL;
|
| + }
|
| + return result;
|
| +}
|
| +CFX_Int32Array* CBC_PDF417ECErrorCorrection::findErrorMagnitudes(
|
| + CBC_PDF417ECModulusPoly* errorEvaluator,
|
| + CBC_PDF417ECModulusPoly* errorLocator,
|
| + CFX_Int32Array& errorLocations,
|
| + int32_t& e) {
|
| + int32_t errorLocatorDegree = errorLocator->getDegree();
|
| + CFX_Int32Array formalDerivativeCoefficients;
|
| + formalDerivativeCoefficients.SetSize(errorLocatorDegree);
|
| + for (int32_t l = 1; l <= errorLocatorDegree; l++) {
|
| + formalDerivativeCoefficients[errorLocatorDegree - l] =
|
| + m_field->multiply(l, errorLocator->getCoefficient(l));
|
| + }
|
| + CBC_PDF417ECModulusPoly formalDerivative(m_field,
|
| + formalDerivativeCoefficients, e);
|
| + BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
|
| + int32_t s = errorLocations.GetSize();
|
| + CFX_Int32Array* result = new CFX_Int32Array;
|
| + result->SetSize(s);
|
| + for (int32_t i = 0; i < s; i++) {
|
| + int32_t xiInverse = m_field->inverse(errorLocations[i], e);
|
| + if (e != BCExceptionNO) {
|
| + delete result;
|
| + return NULL;
|
| + }
|
| + int32_t numerator =
|
| + m_field->subtract(0, errorEvaluator->evaluateAt(xiInverse));
|
| + int32_t denominator =
|
| + m_field->inverse(formalDerivative.evaluateAt(xiInverse), e);
|
| + if (e != BCExceptionNO) {
|
| + delete result;
|
| + return NULL;
|
| + }
|
| + result->SetAt(i, m_field->multiply(numerator, denominator));
|
| + }
|
| + return result;
|
| +}
|
|
|