aboutsummaryrefslogtreecommitdiff
path: root/src/qt/networkstyle.cpp
diff options
context:
space:
mode:
authorJonas Schnelli <jonas.schnelli@include7.ch>2014-11-06 16:28:29 +0100
committerWladimir J. van der Laan <laanwj@gmail.com>2014-12-16 11:15:05 +0100
commit54f2571a00632e9813b9fabb447c7cc80f74ad29 (patch)
tree61367fc9f103d08a4708a01fde086bbb8b98a4c1 /src/qt/networkstyle.cpp
parentf3af0c898f1ba280761101844c4694c7427f304a (diff)
downloadbitcoin-54f2571a00632e9813b9fabb447c7cc80f74ad29.tar.xz
Qt: HiDPI (retina) support for splash screen
- remove splash screen images (reduce binary size) - dynamicly draw splash screen with available icon. - remove testnet icon - dynamicly colorize testnet icon
Diffstat (limited to 'src/qt/networkstyle.cpp')
-rw-r--r--src/qt/networkstyle.cpp92
1 files changed, 80 insertions, 12 deletions
diff --git a/src/qt/networkstyle.cpp b/src/qt/networkstyle.cpp
index 62c44703f4..b8112799df 100644
--- a/src/qt/networkstyle.cpp
+++ b/src/qt/networkstyle.cpp
@@ -11,22 +11,22 @@
static const struct {
const char *networkId;
const char *appName;
- const char *appIcon;
+ const int iconColorHueShift;
+ const int iconColorSaturationReduction;
const char *titleAddText;
- const char *splashImage;
} network_styles[] = {
- {"main", QAPP_APP_NAME_DEFAULT, ":/icons/bitcoin", "", ":/images/splash"},
- {"test", QAPP_APP_NAME_TESTNET, ":/icons/bitcoin_testnet", QT_TRANSLATE_NOOP("SplashScreen", "[testnet]"), ":/images/splash_testnet"},
- {"regtest", QAPP_APP_NAME_TESTNET, ":/icons/bitcoin_testnet", "[regtest]", ":/images/splash_testnet"}
+ {"main", QAPP_APP_NAME_DEFAULT, 0, 0, ""},
+ {"test", QAPP_APP_NAME_TESTNET, 70, 30, QT_TRANSLATE_NOOP("SplashScreen", "[testnet]")},
+ {"regtest", QAPP_APP_NAME_TESTNET, 70, 30, "[regtest]"}
};
static const unsigned network_styles_count = sizeof(network_styles)/sizeof(*network_styles);
// titleAddText needs to be const char* for tr()
-NetworkStyle::NetworkStyle(const QString &appName, const QString &appIcon, const char *titleAddText, const QString &splashImage):
+NetworkStyle::NetworkStyle(const QString &appName, const int iconColorHueShift, const int iconColorSaturationReduction, const char *titleAddText):
appName(appName),
- appIcon(appIcon),
- titleAddText(qApp->translate("SplashScreen", titleAddText)),
- splashImage(splashImage)
+ iconColorHueShift(iconColorHueShift),
+ iconColorSaturationReduction(iconColorSaturationReduction),
+ titleAddText(qApp->translate("SplashScreen", titleAddText))
{
}
@@ -38,10 +38,78 @@ const NetworkStyle *NetworkStyle::instantiate(const QString &networkId)
{
return new NetworkStyle(
network_styles[x].appName,
- network_styles[x].appIcon,
- network_styles[x].titleAddText,
- network_styles[x].splashImage);
+ network_styles[x].iconColorHueShift,
+ network_styles[x].iconColorSaturationReduction,
+ network_styles[x].titleAddText);
}
}
return 0;
}
+
+QIcon NetworkStyle::getAppIcon() const
+{
+ return getAppIcon(QSize(256,256));
+}
+
+QIcon NetworkStyle::getAppIcon(const QSize size) const
+{
+ // load pixmap
+ QPixmap pixmap(":/icons/bitcoin");
+
+ if(pixmap.size().width() != size.width() && pixmap.size().height() != size.height())
+ {
+ QPixmap scaledPixmap = pixmap.scaled(size, Qt::KeepAspectRatio);
+ if(!scaledPixmap.isNull())
+ {
+ pixmap = scaledPixmap;
+ }
+ }
+
+ if(iconColorHueShift != 0 && iconColorSaturationReduction != 0)
+ {
+ // copy the pixmap because on linux the original pixmap will be affected
+ pixmap = pixmap.copy();
+
+ // generate QImage from QPixmap
+ QImage img = pixmap.toImage();
+
+ int h,s,l,a;
+
+ // traverse though lines
+ for(int y=0;y<img.height();y++)
+ {
+ QRgb *scL = reinterpret_cast< QRgb *>( img.scanLine( y ) );
+
+ // loop through pixels
+ for(int x=0;x<img.width();x++)
+ {
+ // preserve alpha because QColor::getHsl doesen't return the alpha value
+ a = qAlpha(scL[x]);
+ QColor col(scL[x]);
+
+ // get hue value
+ col.getHsl(&h,&s,&l);
+
+ // rotate color on RGB color circle
+ // 70° should end up with the typical "testnet" green
+ h+=iconColorHueShift;
+
+ // change saturation value
+ if(s>iconColorSaturationReduction)
+ {
+ s -= iconColorSaturationReduction;
+ }
+ col.setHsl(h,s,l,a);
+
+ // set the pixel
+ scL[x] = col.rgba();
+ }
+ }
+
+ //convert back to QPixmap
+ pixmap.convertFromImage(img);
+ }
+
+ QIcon icon(pixmap);
+ return icon;
+}