|
|
|
@ -1,8 +1,8 @@ |
|
|
|
|
#include <iostream> |
|
|
|
|
#include <vector> |
|
|
|
|
#include <assert.h> |
|
|
|
|
|
|
|
|
|
#include "QR.hpp" |
|
|
|
|
#include "qrcodegen.hpp" |
|
|
|
|
|
|
|
|
|
#include "renderers/ConsoleRenderer.hpp" |
|
|
|
|
#include "renderers/PNGRenderer.hpp" |
|
|
|
@ -12,24 +12,8 @@ |
|
|
|
|
|
|
|
|
|
namespace massivedynamic { |
|
|
|
|
|
|
|
|
|
QR::QR(const std::string& data, std::string outputFile, size_t size, Type type) : outputFile(std::move(outputFile)) { |
|
|
|
|
|
|
|
|
|
qrcodegen::QrCode::Ecc errorCorrectionLevel = qrcodegen::QrCode::Ecc::HIGH; |
|
|
|
|
|
|
|
|
|
switch(type) { |
|
|
|
|
case Type::SMALL: |
|
|
|
|
errorCorrectionLevel = qrcodegen::QrCode::Ecc::LOW; |
|
|
|
|
break; |
|
|
|
|
case Type::MEDIUM: |
|
|
|
|
errorCorrectionLevel = qrcodegen::QrCode::Ecc::MEDIUM; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
case Type::LARGE: |
|
|
|
|
errorCorrectionLevel = qrcodegen::QrCode::Ecc::HIGH; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(data.c_str(), errorCorrectionLevel); |
|
|
|
|
QR::QR(const std::string& data, std::string outputFile, size_t size, qrcodegen::QrCode::Ecc type) : outputFile(std::move(outputFile)) { |
|
|
|
|
qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(data.c_str(), type); |
|
|
|
|
|
|
|
|
|
static_assert(FormatLength == 5, "exhaustive formats: did you miss to add something here?"); |
|
|
|
|
this->renderers.insert({Format::CONSOLE, std::make_unique<ConsoleRenderer>(this->pixels, qr.getSize(), size)}); |
|
|
|
@ -38,8 +22,8 @@ QR::QR(const std::string& data, std::string outputFile, size_t size, Type type) |
|
|
|
|
this->renderers.insert({Format::JPG, std::make_unique<JPGRenderer>(this->pixels, qr.getSize(), size)}); |
|
|
|
|
this->renderers.insert({Format::BMP, std::make_unique<BMPRenderer>(this->pixels, qr.getSize(), size)}); |
|
|
|
|
|
|
|
|
|
// this is inherently stupid, but "qrcodegen" does not give access to the
|
|
|
|
|
// `segments` vector
|
|
|
|
|
// this is inherently stupid, but "qrcodegen::QrCode" does not give access to the
|
|
|
|
|
// `segments` vector member and the class itself is marked final.
|
|
|
|
|
for (int y = 0; y < qr.getSize(); y++) { |
|
|
|
|
for (int x = 0; x < qr.getSize(); x++) |
|
|
|
|
this->pixels.push_back(qr.getModule(x, y)); |
|
|
|
@ -48,10 +32,7 @@ QR::QR(const std::string& data, std::string outputFile, size_t size, Type type) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void QR::render(Format format) { |
|
|
|
|
if (this->renderers.find(format) == this->renderers.end()) { |
|
|
|
|
std::cerr << "ERROR: a non-valid renderer has been selected" << std::endl; |
|
|
|
|
exit(1); |
|
|
|
|
} |
|
|
|
|
assert(this->renderers.find(format) != this->renderers.end() && "ERROR: a non-valid renderer has been selected"); |
|
|
|
|
|
|
|
|
|
this->renderers.at(format)->render(this->outputFile); |
|
|
|
|
} |
|
|
|
|