Mercurial > hgrepos > Python2 > PyMuPDF
diff mupdf-source/thirdparty/zxing-cpp/core/src/BitMatrixIO.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/BitMatrixIO.cpp Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,102 @@ +/* +* Copyright 2017 Huy Cuong Nguyen +* Copyright 2017 Axel Waggershauser +*/ +// SPDX-License-Identifier: Apache-2.0 + +#include "BitMatrixIO.h" + +#include <array> +#include <fstream> +#include <sstream> + +namespace ZXing { + +std::string ToString(const BitMatrix& matrix, char one, char zero, bool addSpace, bool printAsCString) +{ + std::string result; + result.reserve((addSpace ? 2 : 1) * (matrix.width() * matrix.height()) + matrix.height()); + for (int y = 0; y < matrix.height(); ++y) { + if (printAsCString) + result += '"'; + for (auto bit : matrix.row(y)) { + result += bit ? one : zero; + if (addSpace) + result += ' '; + } + if (printAsCString) + result += "\\n\""; + result += '\n'; + } + return result; +} + +std::string ToString(const BitMatrix& matrix, bool inverted) +{ + constexpr auto map = std::array{" ", "▀", "▄", "█"}; + std::string res; + + for (int y = 0; y < matrix.height(); y += 2) { + for (int x = 0; x < matrix.width(); ++x) { + int tp = matrix.get(x, y) ^ inverted; + int bt = (matrix.height() == 1 && tp) || (y + 1 < matrix.height() && (matrix.get(x, y + 1) ^ inverted)); + res += map[tp | (bt << 1)]; + } + res.push_back('\n'); + } + + return res; +} + +std::string ToSVG(const BitMatrix& matrix) +{ + // see https://stackoverflow.com/questions/10789059/create-qr-code-in-vector-image/60638350#60638350 + + const int width = matrix.width(); + const int height = matrix.height(); + std::ostringstream out; + + out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + << "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 " << width << " " << height + << "\" stroke=\"none\">\n" + << "<path d=\""; + + for (int y = 0; y < height; ++y) + for (int x = 0; x < width; ++x) + if (matrix.get(x, y)) + out << "M" << x << "," << y << "h1v1h-1z"; + + out << "\"/>\n</svg>"; + + return out.str(); +} + +BitMatrix ParseBitMatrix(const std::string& str, char one, bool expectSpace) +{ + auto lineLength = str.find('\n'); + if (lineLength == std::string::npos) + return {}; + + int strStride = expectSpace ? 2 : 1; + int height = narrow_cast<int>(str.length() / (lineLength + 1)); + int width = narrow_cast<int>(lineLength / strStride); + BitMatrix mat(width, height); + for (int y = 0; y < height; ++y) { + size_t offset = y * (lineLength + 1); + for (int x = 0; x < width; ++x, offset += strStride) { + if (str[offset] == one) + mat.set(x, y); + } + } + return mat; +} + +void SaveAsPBM(const BitMatrix& matrix, const std::string filename, int quietZone) +{ + auto out = ToMatrix<uint8_t>(Inflate(matrix.copy(), 0, 0, quietZone)); + std::ofstream file(filename); + file << "P5\n" << out.width() << ' ' << out.height() << "\n255\n"; + file.write(reinterpret_cast<const char*>(out.data()), out.size()); +} + +} // ZXing
