mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-08-04 14:04:49 +02:00
Merge branch 'qt_qrcode_sizefixes' into qt_fontsel_qrcodes-27+knots
This commit is contained in:
commit
1e265fb9ed
@ -50,36 +50,64 @@ bool QRImageWidget::setQR(const QString& data, const QString& text)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QImage qrImage = QImage(code->width + 8, code->width + 8, QImage::Format_RGB32);
|
QImage qrImage = QImage(code->width, code->width, QImage::Format_RGB32);
|
||||||
qrImage.fill(0xffffff);
|
|
||||||
unsigned char *p = code->data;
|
unsigned char *p = code->data;
|
||||||
for (int y = 0; y < code->width; ++y) {
|
for (int y = 0; y < code->width; ++y) {
|
||||||
for (int x = 0; x < code->width; ++x) {
|
for (int x = 0; x < code->width; ++x) {
|
||||||
qrImage.setPixel(x + 4, y + 4, ((*p & 1) ? 0x0 : 0xffffff));
|
qrImage.setPixel(x, y, ((*p & 1) ? 0x0 : 0xffffff));
|
||||||
++p;
|
++p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
QRcode_free(code);
|
QRcode_free(code);
|
||||||
|
|
||||||
const int qr_image_size = QR_IMAGE_SIZE + (text.isEmpty() ? 0 : 2 * QR_IMAGE_MARGIN);
|
int qr_image_width = QR_IMAGE_SIZE + (2 * QR_IMAGE_MARGIN);
|
||||||
QImage qrAddrImage(qr_image_size, qr_image_size, QImage::Format_RGB32);
|
int qr_image_height = qr_image_width;
|
||||||
|
int qr_image_x_margin = QR_IMAGE_MARGIN;
|
||||||
|
int text_lines;
|
||||||
|
QFont font;
|
||||||
|
if (text.isEmpty()) {
|
||||||
|
text_lines = 0;
|
||||||
|
} else {
|
||||||
|
// Determine font to use
|
||||||
|
font = GUIUtil::fixedPitchFont();
|
||||||
|
font.setStretch(QFont::SemiCondensed);
|
||||||
|
font.setLetterSpacing(QFont::AbsoluteSpacing, 1);
|
||||||
|
const int max_text_width = qr_image_width - (2 * QR_IMAGE_TEXT_MARGIN);
|
||||||
|
const qreal font_size = GUIUtil::calculateIdealFontSize(max_text_width, text, font);
|
||||||
|
font.setPointSizeF(font_size);
|
||||||
|
|
||||||
|
// Plan how many lines are needed
|
||||||
|
QFontMetrics fm(font);
|
||||||
|
const int text_width = GUIUtil::TextWidth(fm, text);
|
||||||
|
if (text_width > max_text_width && text_width < max_text_width * 5 / 4) {
|
||||||
|
// Allow the image to grow up to 25% wider
|
||||||
|
qr_image_width = text_width + (2 * QR_IMAGE_TEXT_MARGIN);
|
||||||
|
qr_image_x_margin = (qr_image_width - QR_IMAGE_SIZE) / 2;
|
||||||
|
text_lines = 1;
|
||||||
|
} else {
|
||||||
|
text_lines = (text_width + max_text_width - 1) / max_text_width;
|
||||||
|
}
|
||||||
|
qr_image_height += (fm.height() * text_lines) + QR_IMAGE_TEXT_MARGIN;
|
||||||
|
}
|
||||||
|
QImage qrAddrImage(qr_image_width, qr_image_height, QImage::Format_RGB32);
|
||||||
qrAddrImage.fill(0xffffff);
|
qrAddrImage.fill(0xffffff);
|
||||||
{
|
{
|
||||||
QPainter painter(&qrAddrImage);
|
QPainter painter(&qrAddrImage);
|
||||||
painter.drawImage(QR_IMAGE_MARGIN, 0, qrImage.scaled(QR_IMAGE_SIZE, QR_IMAGE_SIZE));
|
painter.drawImage(qr_image_x_margin, QR_IMAGE_MARGIN, qrImage.scaled(QR_IMAGE_SIZE, QR_IMAGE_SIZE));
|
||||||
|
|
||||||
if (!text.isEmpty()) {
|
if (!text.isEmpty()) {
|
||||||
QRect paddedRect = qrAddrImage.rect();
|
QRect paddedRect = qrAddrImage.rect();
|
||||||
paddedRect.setHeight(QR_IMAGE_SIZE + QR_IMAGE_TEXT_MARGIN);
|
paddedRect.setHeight(paddedRect.height() - QR_IMAGE_TEXT_MARGIN);
|
||||||
|
|
||||||
QFont font = GUIUtil::fixedPitchFont();
|
QString text_wrapped = text;
|
||||||
font.setStretch(QFont::SemiCondensed);
|
const int char_per_line = (text.size() + text_lines - 1) / text_lines;
|
||||||
font.setLetterSpacing(QFont::AbsoluteSpacing, 1);
|
for (int line = 1, pos = 0; line < text_lines; ++line) {
|
||||||
const qreal font_size = GUIUtil::calculateIdealFontSize(paddedRect.width() - 2 * QR_IMAGE_TEXT_MARGIN, text, font);
|
pos += char_per_line;
|
||||||
font.setPointSizeF(font_size);
|
text_wrapped.insert(pos, QChar{'\n'});
|
||||||
|
}
|
||||||
|
|
||||||
painter.setFont(font);
|
painter.setFont(font);
|
||||||
painter.drawText(paddedRect, Qt::AlignBottom | Qt::AlignCenter, text);
|
painter.drawText(paddedRect, Qt::AlignBottom | Qt::AlignCenter, text_wrapped);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,9 +12,9 @@
|
|||||||
static const int MAX_URI_LENGTH = 255;
|
static const int MAX_URI_LENGTH = 255;
|
||||||
|
|
||||||
/* Size of exported QR Code image */
|
/* Size of exported QR Code image */
|
||||||
static constexpr int QR_IMAGE_SIZE = 300;
|
static constexpr int QR_IMAGE_SIZE = 252;
|
||||||
static constexpr int QR_IMAGE_TEXT_MARGIN = 10;
|
static constexpr int QR_IMAGE_TEXT_MARGIN = 8;
|
||||||
static constexpr int QR_IMAGE_MARGIN = 2 * QR_IMAGE_TEXT_MARGIN;
|
static constexpr int QR_IMAGE_MARGIN = 24;
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QMenu;
|
class QMenu;
|
||||||
|
Loading…
Reference in New Issue
Block a user