Mercurial > hgrepos > Python2 > PyMuPDF
diff mupdf-source/thirdparty/zxing-cpp/core/src/ReedSolomonEncoder.cpp @ 2:b50eed0cc0ef upstream
ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4.
The directory name has changed: no version number in the expanded directory now.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:43:07 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mupdf-source/thirdparty/zxing-cpp/core/src/ReedSolomonEncoder.cpp Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,54 @@ +/* +* Copyright 2016 Huy Cuong Nguyen +* Copyright 2016 ZXing authors +*/ +// SPDX-License-Identifier: Apache-2.0 + +#include "ReedSolomonEncoder.h" + +#include "GenericGF.h" + +#include <algorithm> +#include <iterator> +#include <stdexcept> + +namespace ZXing { + +ReedSolomonEncoder::ReedSolomonEncoder(const GenericGF& field) +: _field(&field) +{ + _cachedGenerators.push_back(GenericGFPoly(field, { 1 })); +} + +const GenericGFPoly& +ReedSolomonEncoder::buildGenerator(int degree) +{ + int cachedGenSize = Size(_cachedGenerators); + if (degree >= cachedGenSize) { + GenericGFPoly lastGenerator = _cachedGenerators.back(); + for (int d = cachedGenSize; d <= degree; d++) { + lastGenerator.multiply(GenericGFPoly(*_field, { 1, _field->exp(d - 1 + _field->generatorBase()) })); + _cachedGenerators.push_back(lastGenerator); + } + } + + return *std::next(_cachedGenerators.begin(), degree); +} + +void +ReedSolomonEncoder::encode(std::vector<int>& message, const int numECCodeWords) +{ + if (numECCodeWords == 0 || numECCodeWords >= Size(message)) + throw std::invalid_argument("Invalid number of error correction code words"); + + GenericGFPoly info = GenericGFPoly(*_field, std::vector<int>(message.begin(), message.end() - numECCodeWords)); + info.multiplyByMonomial(1, numECCodeWords); + GenericGFPoly _; + info.divide(buildGenerator(numECCodeWords), _); + auto& coefficients = info.coefficients(); + int numZeroCoefficients = numECCodeWords - Size(coefficients); + std::fill_n(message.end() - numECCodeWords, numZeroCoefficients, 0); + std::copy(coefficients.begin(), coefficients.end(), message.end() - numECCodeWords + numZeroCoefficients); +} + +} // ZXing
