From e5770ffaca8dfcfbf5c7921e7481b7b70b676d83 Mon Sep 17 00:00:00 2001 From: favoritas37 Date: Tue, 18 Apr 2017 10:21:30 +0300 Subject: [PATCH] resolved bug in ReedSolomon encoder. Now the encoding tests are successfull but still the images produced can not be decoded. One step closer to #10 --- .../zxing/common/reedsolomon/GenericGF.cpp | 22 ++++++++++--------- .../common/reedsolomon/GenericGFPoly.cpp | 10 ++++----- .../zxing/common/reedsolomon/GenericGFPoly.h | 6 ++--- .../common/reedsolomon/ReedSolomonEncoder.cpp | 9 ++++++-- 4 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/zxing/zxing/common/reedsolomon/GenericGF.cpp b/src/zxing/zxing/common/reedsolomon/GenericGF.cpp index f7b779d..e2763cd 100644 --- a/src/zxing/zxing/common/reedsolomon/GenericGF.cpp +++ b/src/zxing/zxing/common/reedsolomon/GenericGF.cpp @@ -49,8 +49,8 @@ GenericGF::GenericGF(int primitive_, int size_, int b) } void GenericGF::initialize() { - expTable.resize(size); - logTable.resize(size); + expTable = std::vector(size); + logTable = std::vector(size); int x = 1; @@ -66,12 +66,14 @@ void GenericGF::initialize() { logTable[expTable[i]] = i; } //logTable[0] == 0 but this should never be used - zero = - Ref(new GenericGFPoly(Ref(this), ArrayRef(new Array(1)))); - zero->getCoefficients()[0] = 0; - one = - Ref(new GenericGFPoly(Ref(this), ArrayRef(new Array(1)))); - one->getCoefficients()[0] = 1; + ArrayRef coefficients_zero(1); + ArrayRef coefficients_one(1); + + coefficients_zero[0] = 0; + coefficients_one[0] = 1; + + zero = Ref(new GenericGFPoly(this, coefficients_zero)); + one = Ref(new GenericGFPoly(this, coefficients_one)); initialized = true; } @@ -100,10 +102,10 @@ Ref GenericGF::buildMonomial(int degree, int coefficient) { if (coefficient == 0) { return zero; } - ArrayRef coefficients(new Array(degree + 1)); + ArrayRef coefficients(degree + 1); coefficients[0] = coefficient; - return Ref(new GenericGFPoly(Ref(this), coefficients)); + return Ref(new GenericGFPoly(this, coefficients)); } int GenericGF::addOrSubtract(int a, int b) { diff --git a/src/zxing/zxing/common/reedsolomon/GenericGFPoly.cpp b/src/zxing/zxing/common/reedsolomon/GenericGFPoly.cpp index 9d5ce06..5781704 100644 --- a/src/zxing/zxing/common/reedsolomon/GenericGFPoly.cpp +++ b/src/zxing/zxing/common/reedsolomon/GenericGFPoly.cpp @@ -31,7 +31,7 @@ using zxing::Ref; // VC++ using zxing::GenericGF; -GenericGFPoly::GenericGFPoly(Ref field, +GenericGFPoly::GenericGFPoly(GenericGF *field, ArrayRef coefficients) : field_(field) { if (coefficients->size() == 0) { @@ -96,7 +96,7 @@ int GenericGFPoly::evaluateAt(int a) { } Ref GenericGFPoly::addOrSubtract(Ref other) { - if (!(field_.object_ == other->field_.object_)) { + if (!(field_ == other->field_)) { throw IllegalArgumentException("GenericGFPolys do not have same GenericGF field"); } if (isZero()) { @@ -130,7 +130,7 @@ Ref GenericGFPoly::addOrSubtract(Ref other) } Ref GenericGFPoly::multiply(Ref other) { - if (!(field_.object_ == other->field_.object_)) { + if (!(field_ == other->field_)) { throw IllegalArgumentException("GenericGFPolys do not have same GenericGF field"); } @@ -186,8 +186,8 @@ Ref GenericGFPoly::multiplyByMonomial(int degree, int coefficient return Ref(new GenericGFPoly(field_, product)); } -std::vector > GenericGFPoly::divide(Ref other) { - if (!(field_.object_ == other->field_.object_)) { +std::vector> GenericGFPoly::divide(Ref other) { + if (!(field_ == other->field_)) { throw IllegalArgumentException("GenericGFPolys do not have same GenericGF field"); } if (other->isZero()) { diff --git a/src/zxing/zxing/common/reedsolomon/GenericGFPoly.h b/src/zxing/zxing/common/reedsolomon/GenericGFPoly.h index e8ae843..de8d212 100644 --- a/src/zxing/zxing/common/reedsolomon/GenericGFPoly.h +++ b/src/zxing/zxing/common/reedsolomon/GenericGFPoly.h @@ -32,11 +32,11 @@ class GenericGF; class GenericGFPoly : public Counted { private: - Ref field_; + GenericGF *field_; ArrayRef coefficients_; public: - GenericGFPoly(Ref field, ArrayRef coefficients); + GenericGFPoly(GenericGF *field, ArrayRef coefficients); ArrayRef getCoefficients(); int getDegree(); bool isZero(); @@ -46,7 +46,7 @@ public: Ref multiply(Ref other); Ref multiply(int scalar); Ref multiplyByMonomial(int degree, int coefficient); - std::vector > divide(Ref other); + std::vector> divide(Ref other); }; diff --git a/src/zxing/zxing/common/reedsolomon/ReedSolomonEncoder.cpp b/src/zxing/zxing/common/reedsolomon/ReedSolomonEncoder.cpp index f957180..918f88c 100644 --- a/src/zxing/zxing/common/reedsolomon/ReedSolomonEncoder.cpp +++ b/src/zxing/zxing/common/reedsolomon/ReedSolomonEncoder.cpp @@ -38,7 +38,9 @@ void ReedSolomonEncoder::encode(std::vector &toEncode, int ecBytes) if (ecBytes == 0) { throw Exception("No error correction bytes"); } - int dataBytes = toEncode.size() - ecBytes; + //int dataBytes = toEncode.size() - ecBytes; + int dataBytes = toEncode.size();// - ecBytes; + toEncode.resize(toEncode.size()+ecBytes); if (dataBytes <= 0) { throw Exception("No data bytes provided"); } @@ -64,8 +66,11 @@ void ReedSolomonEncoder::encode(std::vector &toEncode, int ecBytes) //toEncode.insert(toEncode.begin() + (dataBytes-1) + numZeroCoefficients, // coefficients.array_->values().begin(), // coefficients.array_->values().end()); + + //toEncode.resize(toEncode.size() + numZeroCoefficients + coefficients->size()); + for (size_t i = 0; i < coefficients->size(); i++) - toEncode[dataBytes + numZeroCoefficients + i] = coefficients[i]; + toEncode[dataBytes + numZeroCoefficients + i] = coefficients[i]; } }