#include "wj_qr.h"
#include "qrcodegen.h"
WJQRImage WJ_MakeQRCode(const std::string &text, int moduleScale)
{
WJQRImage result;
uint8_t tempBuffer[qrcodegen_BUFFER_LEN_MAX];
uint8_t qrcode[qrcodegen_BUFFER_LEN_MAX];
bool ok = qrcodegen_encodeText(text.c_str(), tempBuffer, qrcode,
qrcodegen_Ecc_MEDIUM, qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX,
qrcodegen_Mask_AUTO, true);
if (!ok)
return result;
if (moduleScale < 1)
moduleScale = 1;
const int quietZoneModules = 4;
const int size = qrcodegen_getSize(qrcode);
const int totalModules = size + quietZoneModules * 2;
const int width = totalModules * moduleScale;
result.width = width;
result.rgba.resize(size_t(width) * width * 4, 0xFF);
for (int y = 0; y < width; y++)
{
int moduleY = y / moduleScale - quietZoneModules;
for (int x = 0; x < width; x++)
{
int moduleX = x / moduleScale - quietZoneModules;
bool dark = false;
if (moduleX >= 0 && moduleX < size && moduleY >= 0 && moduleY < size)
dark = qrcodegen_getModule(qrcode, moduleX, moduleY);
uint8_t v = dark ? 0x00 : 0xFF;
uint8_t *px = &result.rgba[(size_t(y) * width + x) * 4];
px[0] = v;
px[1] = v;
px[2] = v;
px[3] = 0xFF;
}
}
return result;
}