From 4f63d7f20492ff76f9e1f927b2c5f5f50cc2b891 Mon Sep 17 00:00:00 2001 From: spycrab Date: Mon, 26 Mar 2018 08:13:15 +0200 Subject: [PATCH] Qt: Fix low-resolution icon --- CMakeLists.txt | 2 +- Data/dolphin-emu.png | Bin 1452 -> 10033 bytes Source/Core/DolphinQt2/CMakeLists.txt | 1 + Source/Core/DolphinQt2/DolphinQt2.vcxproj | 4 +- Source/Core/DolphinQt2/MainWindow.cpp | 2 +- .../Core/DolphinQt2/QtUtils/WinIconHelper.cpp | 94 ++++++++++++++++++ .../Core/DolphinQt2/QtUtils/WinIconHelper.h | 16 +++ Source/Core/DolphinQt2/Resources.cpp | 18 ++++ Source/Core/DolphinQt2/Resources.h | 1 + 9 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 Source/Core/DolphinQt2/QtUtils/WinIconHelper.cpp create mode 100644 Source/Core/DolphinQt2/QtUtils/WinIconHelper.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 14681c35ef..8d7b4b8c47 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -805,7 +805,7 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD|OpenBSD") install(FILES Data/dolphin-emu.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps) install(FILES Data/dolphin-emu.png - DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps) + DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/256x256/apps) install(FILES Data/dolphin-emu.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications) # Install manpages diff --git a/Data/dolphin-emu.png b/Data/dolphin-emu.png index bb0ca33dabb7f40ae77854097946274d010fe3bc..c9d5b6836a17e65206a81502bc1c311bd10b1417 100644 GIT binary patch literal 10033 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 + @@ -310,6 +311,7 @@ + @@ -414,4 +416,4 @@ - + \ No newline at end of file diff --git a/Source/Core/DolphinQt2/MainWindow.cpp b/Source/Core/DolphinQt2/MainWindow.cpp index f77e23a663..4733fc9944 100644 --- a/Source/Core/DolphinQt2/MainWindow.cpp +++ b/Source/Core/DolphinQt2/MainWindow.cpp @@ -85,7 +85,7 @@ MainWindow::MainWindow(std::unique_ptr boot_parameters) : QMainWindow(nullptr) { setWindowTitle(QString::fromStdString(Common::scm_rev_str)); - setWindowIcon(QIcon(Resources::GetMisc(Resources::LOGO_SMALL))); + setWindowIcon(Resources::GetAppIcon()); setUnifiedTitleAndToolBarOnMac(true); setAcceptDrops(true); diff --git a/Source/Core/DolphinQt2/QtUtils/WinIconHelper.cpp b/Source/Core/DolphinQt2/QtUtils/WinIconHelper.cpp new file mode 100644 index 0000000000..c076a9c250 --- /dev/null +++ b/Source/Core/DolphinQt2/QtUtils/WinIconHelper.cpp @@ -0,0 +1,94 @@ +// Copyright 2018 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include "DolphinQt2/QtUtils/WinIconHelper.h" + +#ifdef _WIN32 + +#include + +// The following code is adapted from qpixmap_win.cpp (c) The Qt Company Ltd. (https://qt.io) +// Licensed under the GNU GPL v3 +static inline BITMAPINFO GetBMI(int width, int height, bool topToBottom) +{ + BITMAPINFO bmi = {}; + auto& bih = bmi.bmiHeader; + + bih.biSize = sizeof(BITMAPINFOHEADER); + bih.biWidth = width; + bih.biHeight = topToBottom ? -height : height; + bih.biPlanes = 1; + bih.biBitCount = 32; + bih.biCompression = BI_RGB; + bih.biSizeImage = width * height * 4; + + return bmi; +} + +static QPixmap PixmapFromHICON(HICON icon) +{ + HDC screenDevice = GetDC(0); + HDC hdc = CreateCompatibleDC(screenDevice); + ReleaseDC(0, screenDevice); + ICONINFO iconinfo; + const bool result = GetIconInfo(icon, &iconinfo); // x and y Hotspot describes the icon center + if (!result) + { + qErrnoWarning("QPixmap::fromWinHICON(), failed to GetIconInfo()"); + DeleteDC(hdc); + return QPixmap(); + } + const int w = iconinfo.xHotspot * 2; + const int h = iconinfo.yHotspot * 2; + BITMAPINFO bitmapInfo = GetBMI(w, h, false); + DWORD* bits; + HBITMAP winBitmap = CreateDIBSection(hdc, &bitmapInfo, DIB_RGB_COLORS, (VOID**)&bits, NULL, 0); + HGDIOBJ oldhdc = reinterpret_cast(SelectObject(hdc, winBitmap)); + DrawIconEx(hdc, 0, 0, icon, iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 0, 0, DI_NORMAL); + + QImage image(w, h, QImage::Format_ARGB32_Premultiplied); + if (image.isNull()) + return {}; + + BITMAPINFO bmi = GetBMI(w, h, true); + + QScopedArrayPointer data(new uchar[bmi.bmiHeader.biSizeImage]); + if (!GetDIBits(hdc, winBitmap, 0, h, data.data(), &bmi, DIB_RGB_COLORS)) + return {}; + + for (int y = 0; y < image.height(); ++y) + { + void* dest = static_cast(image.scanLine(y)); + const void* src = data.data() + y * image.bytesPerLine(); + memcpy(dest, src, image.bytesPerLine()); + } + + // dispose resources created by iconinfo call + DeleteObject(iconinfo.hbmMask); + DeleteObject(iconinfo.hbmColor); + SelectObject(hdc, oldhdc); // restore state + DeleteObject(winBitmap); + DeleteDC(hdc); + return QPixmap::fromImage(image); +} + +QIcon WinIconHelper::GetNativeIcon() +{ + QIcon icon; + for (int size : {16, 32, 48, 256}) + { + HANDLE h = LoadImageW(GetModuleHandleW(nullptr), L"\"DOLPHIN\"", IMAGE_ICON, size, size, + LR_CREATEDIBSECTION); + + if (h && h != INVALID_HANDLE_VALUE) + { + auto* icon_handle = static_cast(h); + icon.addPixmap(PixmapFromHICON(icon_handle)); + } + } + + return icon; +} + +#endif diff --git a/Source/Core/DolphinQt2/QtUtils/WinIconHelper.h b/Source/Core/DolphinQt2/QtUtils/WinIconHelper.h new file mode 100644 index 0000000000..8648704f3a --- /dev/null +++ b/Source/Core/DolphinQt2/QtUtils/WinIconHelper.h @@ -0,0 +1,16 @@ +// Copyright 2018 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#pragma once + +#ifdef _WIN32 + +#include + +namespace WinIconHelper +{ +QIcon GetNativeIcon(); +}; + +#endif diff --git a/Source/Core/DolphinQt2/Resources.cpp b/Source/Core/DolphinQt2/Resources.cpp index 3698f92810..d24f8cc184 100644 --- a/Source/Core/DolphinQt2/Resources.cpp +++ b/Source/Core/DolphinQt2/Resources.cpp @@ -14,6 +14,10 @@ #include "DolphinQt2/Resources.h" #include "DolphinQt2/Settings.h" +#ifdef _WIN32 +#include "DolphinQt2/QtUtils/WinIconHelper.h" +#endif + QList Resources::m_platforms; QList Resources::m_countries; QList Resources::m_ratings; @@ -128,3 +132,17 @@ QPixmap Resources::GetMisc(int id) { return m_misc[id]; } + +QIcon Resources::GetAppIcon() +{ + QIcon icon; + +#ifdef _WIN32 + icon = WinIconHelper::GetNativeIcon(); +#else + icon.addPixmap(GetScaledPixmap("dolphin_logo")); + icon.addPixmap(GetScaledPixmap("Dolphin")); +#endif + + return icon; +} diff --git a/Source/Core/DolphinQt2/Resources.h b/Source/Core/DolphinQt2/Resources.h index bb93d4ce61..31730d6f3a 100644 --- a/Source/Core/DolphinQt2/Resources.h +++ b/Source/Core/DolphinQt2/Resources.h @@ -28,6 +28,7 @@ public: static QIcon GetScaledIcon(const std::string& name); static QIcon GetScaledThemeIcon(const std::string& name); + static QIcon GetAppIcon(); static QPixmap GetScaledPixmap(const std::string& name); static QPixmap GetScaledThemePixmap(const std::string& name);