Skip to content

Commit 90b1a57

Browse files
committed
Make splashscreen work on hi-DPI displays
There seem to be multiple ways of doing "hi-dpi" in Qt, one is what MacOS introduced with retina which the splashscreen already supported. This adds support for the much higher than 96DPI screens that would scale the fonts, but not the pixmaps.
1 parent f31829e commit 90b1a57

1 file changed

Lines changed: 34 additions & 21 deletions

File tree

src/qt/splashscreen.cpp

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,12 @@ SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle)
2626
QWidget(0, f), curAlignment(0)
2727
{
2828
// set reference point, paddings
29-
int paddingRight = 50;
30-
int paddingTop = 50;
31-
int titleVersionVSpace = 17;
29+
int paddingRight = 50;
30+
int paddingTop = 50;
31+
int titleVersionVSpace = 17;
3232
int titleCopyrightVSpaceCore = 40;
3333
int titleCopyrightVSpaceClassic = 54;
3434

35-
float fontFactor = 1.0;
36-
float devicePixelRatio = 1.0;
37-
#if QT_VERSION > 0x050100
38-
devicePixelRatio = ((QGuiApplication*)QCoreApplication::instance())->devicePixelRatio();
39-
#endif
40-
4135
// define text to place
4236
QString titleText = tr("Bitcoin Classic");
4337
QString versionText = QString("Version %1").arg(QString::fromStdString(FormatFullVersion()));
@@ -48,16 +42,30 @@ SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle)
4842
QString font = QApplication::font().toString();
4943

5044
// create a bitmap according to device pixelratio
51-
QSize splashSize(480*devicePixelRatio,320*devicePixelRatio);
45+
float devicePixelRatio;
46+
bool useMorePixels = false;
47+
#if QT_VERSION > 0x050100
48+
devicePixelRatio = qobject_cast<QGuiApplication*>(QCoreApplication::instance())->devicePixelRatio();
49+
if (qFuzzyCompare(devicePixelRatio, (float) 1)) {
50+
useMorePixels = true;
51+
devicePixelRatio = logicalDpiX() / (float) 96;
52+
}
53+
#else
54+
devicePixelRatio = 1.0;
55+
#endif
56+
57+
QSize splashSize(480 * devicePixelRatio, 320 * devicePixelRatio);
5258
pixmap = QPixmap(splashSize);
5359

5460
#if QT_VERSION > 0x050100
55-
// change to HiDPI if it makes sense
56-
pixmap.setDevicePixelRatio(devicePixelRatio);
61+
if (!useMorePixels) // change to HiDPI if it makes sense
62+
pixmap.setDevicePixelRatio(devicePixelRatio);
5763
#endif
5864

5965
QPainter pixPaint(&pixmap);
6066
pixPaint.setPen(QColor(100,100,100));
67+
if (useMorePixels) // change to HiDPI if it makes sense
68+
pixPaint.scale(devicePixelRatio, devicePixelRatio);
6169

6270
// draw a slightly radial gradient
6371
QRadialGradient gradient(QPoint(0,0), splashSize.width()/devicePixelRatio);
@@ -74,18 +82,20 @@ SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle)
7482

7583
pixPaint.drawPixmap(rectIcon, icon);
7684

77-
// check font size and drawing with
78-
pixPaint.setFont(QFont(font, 33*fontFactor));
79-
QFontMetrics fm = pixPaint.fontMetrics();
85+
// check font size and drawing width
86+
float fontFactor = 1.0;
87+
if (useMorePixels) // fonts are set in Point, but we used painter::scale(), so we have to counter that.
88+
fontFactor /= devicePixelRatio;
89+
pixPaint.setFont(QFont(font, 33 * fontFactor));
90+
QFontMetrics fm(pixPaint.fontMetrics());
8091
int titleTextWidth = fm.width(titleText);
81-
if(titleTextWidth > 160) {
82-
// strange font rendering, Arial probably not found
83-
fontFactor = 0.75;
92+
if (titleTextWidth > 160) { // strange font rendering, Arial probably not found
93+
fontFactor *= 0.75;
94+
pixPaint.setFont(QFont(font, 33 * fontFactor));
95+
fm = pixPaint.fontMetrics();
96+
titleTextWidth = fm.width(titleText);
8497
}
8598

86-
pixPaint.setFont(QFont(font, 33*fontFactor));
87-
fm = pixPaint.fontMetrics();
88-
titleTextWidth = fm.width(titleText);
8999
pixPaint.drawText(pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight,paddingTop,titleText);
90100

91101
pixPaint.setFont(QFont(font, 15*fontFactor));
@@ -118,6 +128,9 @@ SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle)
118128
// Set window title
119129
setWindowTitle(titleText + " " + titleAddText);
120130

131+
if (useMorePixels) // if scaling uses more pixels, actually allow the windows to have larger pixelsize
132+
devicePixelRatio = 1;
133+
121134
// Resize window and move to center of desktop, disallow resizing
122135
QRect r(QPoint(), QSize(pixmap.size().width()/devicePixelRatio,pixmap.size().height()/devicePixelRatio));
123136
resize(r.size());

0 commit comments

Comments
 (0)