diff options
| author | Alexander Blair <snipa@jagtech.io> | 2021-01-03 18:45:13 -0800 |
|---|---|---|
| committer | Alexander Blair <snipa@jagtech.io> | 2021-01-03 18:45:26 -0800 |
| commit | bbe371654258c25d034c07783e5ae776c2f60d90 (patch) | |
| tree | 51e2161b29317061a4ae2f02cee4d70c9071a81c /src/QR-Code-scanner/Decoder.cpp | |
| parent | 8e6a2cde0fd0e8c2a71456ea8bb36db49116d705 (diff) | |
| parent | 8d4cda030e445d2b64cc327af125b538e014ecb0 (diff) | |
| download | monzero-gui-bbe371654258c25d034c07783e5ae776c2f60d90.tar.gz monzero-gui-bbe371654258c25d034c07783e5ae776c2f60d90.tar.xz monzero-gui-bbe371654258c25d034c07783e5ae776c2f60d90.zip | |
Merge pull request #3277
8d4cda03 QR-Code-scanner: integrate QUIRC library, implement QrDecoder, drop ZBar (xiphon)
Diffstat (limited to 'src/QR-Code-scanner/Decoder.cpp')
| -rw-r--r-- | src/QR-Code-scanner/Decoder.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/QR-Code-scanner/Decoder.cpp b/src/QR-Code-scanner/Decoder.cpp new file mode 100644 index 00000000..a814969b --- /dev/null +++ b/src/QR-Code-scanner/Decoder.cpp @@ -0,0 +1,71 @@ +#include "Decoder.h" + +#include <limits> + +#include "quirc.h" + +QrDecoder::QrDecoder() + : m_qr(quirc_new()) +{ + if (m_qr == nullptr) + { + throw std::runtime_error("QUIRC: failed to allocate memory"); + } +} + +QrDecoder::~QrDecoder() +{ + quirc_destroy(m_qr); +} + +std::vector<std::string> QrDecoder::decode(const QImage &image) +{ + if (image.format() == QImage::Format_Grayscale8) + { + return decodeGrayscale8(image); + } + return decodeGrayscale8(image.convertToFormat(QImage::Format_Grayscale8)); +} + +std::vector<std::string> QrDecoder::decodeGrayscale8(const QImage &image) +{ + if (quirc_resize(m_qr, image.width(), image.height()) < 0) + { + throw std::runtime_error("QUIRC: failed to allocate video memory"); + } + + uint8_t *rawImage = quirc_begin(m_qr, nullptr, nullptr); + if (rawImage == nullptr) + { + throw std::runtime_error("QUIRC: failed to get image buffer"); + } +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + std::copy(image.constBits(), image.constBits() + image.sizeInBytes(), rawImage); +#else + std::copy(image.constBits(), image.constBits() + image.byteCount(), rawImage); +#endif + quirc_end(m_qr); + + const int count = quirc_count(m_qr); + if (count < 0) + { + throw std::runtime_error("QUIRC: failed to get the number of recognized QR-codes"); + } + + std::vector<std::string> result; + result.reserve(static_cast<size_t>(count)); + for (int index = 0; index < count; ++index) + { + quirc_code code; + quirc_extract(m_qr, index, &code); + + quirc_data data; + const quirc_decode_error_t err = quirc_decode(&code, &data); + if (err == QUIRC_SUCCESS) + { + result.emplace_back(&data.payload[0], &data.payload[data.payload_len]); + } + } + + return result; +} |
