#include #include #include #include #include #include #include #include #include #include "key.h" #include "base58.h" #include "paperwallet.h" static void printAsQR(QPainter &painter, QString &vchKey, int shift) { QRcode *qr = QRcode_encodeString(vchKey.toStdString().c_str(), 1, QR_ECLEVEL_L, QR_MODE_8, 1); if (qr) { QPaintDevice *pd = painter.device(); const double w = pd->width(); const double h = pd->height(); QColor bg("white"); QColor fg("black"); painter.setBrush(bg); painter.fillRect(0, 0, w, h, bg); painter.setPen(Qt::SolidLine); painter.setPen(fg); painter.setBrush(fg); const int s=qr->width > 0 ? qr->width : 1; const double aspect = w / h; const double scale = ((aspect > 1.0) ? h : w) / s;// * 0.3; for(int y = 0; y < s; y++) { const int yy = y*s; for(int x = 0; x < s; x++) { const int xx = yy + x; const unsigned char b = qr->data[xx]; if(b & 0x01) { const double rx1 = x*scale, ry1 = y*scale; QRectF r(rx1 + shift, ry1, scale, scale); painter.drawRects(&r, 1); } } } QRcode_free(qr); } } static bool readHtmlTemplate(const QString &res_name, QString &htmlContent) { QFile htmlFile(res_name); if (!htmlFile.open(QIODevice::ReadOnly | QIODevice::Text)) { printf("Cant open %s\n", res_name.toStdString().c_str ()); return false; } QTextStream in(&htmlFile); in.setCodec("UTF-8"); htmlContent = in.readAll(); return true; } void PrintPaperWallet (QWidget * parent) { RandAddSeedPerfmon(); CKey secret; secret.MakeNewKey(true); CPrivKey privkey = secret.GetPrivKey(); CPubKey pubkey = secret.GetPubKey(); CKeyID keyid = pubkey.GetID(); std::string secret_str = CBitcoinSecret(secret).ToString(); std::string address = CBitcoinAddress(keyid).ToString(); QString qsecret = QString::fromStdString(secret_str); QString qaddress = QString::fromStdString(address); QPrinter printer(QPrinter::HighResolution); printer.setPageMargins(0, 10, 0, 0, QPrinter::Millimeter); QPrintDialog dlg(&printer, parent); if(dlg.exec() == QDialog::Accepted) { QImage img1(200, 200, QImage::Format_ARGB32); QImage img2(200, 200, QImage::Format_ARGB32); QPainter painter(&img1); painter.setRenderHint(QPainter::Antialiasing, false); painter.setRenderHint(QPainter::TextAntialiasing, false); painter.setRenderHint(QPainter::SmoothPixmapTransform, false); painter.setRenderHint(QPainter::HighQualityAntialiasing, false); painter.setRenderHint(QPainter::NonCosmeticDefaultPen, false); printAsQR(painter, qaddress, 0); painter.end(); painter.begin(&img2); printAsQR(painter, qsecret, 0); painter.end(); QString html; readHtmlTemplate(":/html/paperwallet", html); html.replace("__ADDRESS__", qaddress); html.replace("__PRIVATE__", qsecret); QTextDocument document; document.addResource(QTextDocument::ImageResource, QUrl(":qr1.png" ), img1); document.addResource(QTextDocument::ImageResource, QUrl(":qr2.png" ), img2); document.setHtml(html); document.setPageSize(QSizeF(printer.pageRect(QPrinter::Point).size())); document.print(&printer); } }