diff options
| author | Léo Lam <leolino.lam@gmail.com> | 2018-03-27 18:08:46 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-03-27 18:08:46 +0200 |
| commit | 98f62a3ecdbc8f005f062bb9cf195d0b72587c47 (patch) | |
| tree | 468d2eb5b56943e5fab4379627436c72ba804f2e /Source/Core | |
| parent | ceed6890dfe1d55dba35b3829b9e443670365b8b (diff) | |
| parent | 4f63d7f20492ff76f9e1f927b2c5f5f50cc2b891 (diff) | |
Merge pull request #6530 from spycrab/qt_hires_icon
Various icon improvements
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/DolphinQt2/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | Source/Core/DolphinQt2/DolphinQt2.vcxproj | 4 | ||||
| -rw-r--r-- | Source/Core/DolphinQt2/MainWindow.cpp | 2 | ||||
| -rw-r--r-- | Source/Core/DolphinQt2/QtUtils/WinIconHelper.cpp | 94 | ||||
| -rw-r--r-- | Source/Core/DolphinQt2/QtUtils/WinIconHelper.h | 16 | ||||
| -rw-r--r-- | Source/Core/DolphinQt2/Resources.cpp | 18 | ||||
| -rw-r--r-- | Source/Core/DolphinQt2/Resources.h | 1 |
7 files changed, 134 insertions, 2 deletions
diff --git a/Source/Core/DolphinQt2/CMakeLists.txt b/Source/Core/DolphinQt2/CMakeLists.txt index d00bc5ee1a..e8405ade61 100644 --- a/Source/Core/DolphinQt2/CMakeLists.txt +++ b/Source/Core/DolphinQt2/CMakeLists.txt @@ -103,6 +103,7 @@ set(SRCS QtUtils/ImageConverter.cpp QtUtils/ListTabWidget.cpp QtUtils/WindowActivationEventFilter.cpp + QtUtils/WinIconHelper.cpp QtUtils/WrapInScrollArea.cpp QtUtils/AspectRatioWidget.cpp Settings/AdvancedPane.cpp diff --git a/Source/Core/DolphinQt2/DolphinQt2.vcxproj b/Source/Core/DolphinQt2/DolphinQt2.vcxproj index a87fa822cd..eafb156f0a 100644 --- a/Source/Core/DolphinQt2/DolphinQt2.vcxproj +++ b/Source/Core/DolphinQt2/DolphinQt2.vcxproj @@ -251,6 +251,7 @@ <ClCompile Include="Debugger\CodeViewWidget.cpp" /> <ClCompile Include="Debugger\CodeWidget.cpp" /> <ClCompile Include="FIFOPlayerWindow.cpp" /> + <ClCompile Include="QtUtils\WinIconHelper.cpp" /> <ClCompile Include="TAS\GCTASInputWindow.cpp" /> <ClCompile Include="TAS\WiiTASInputWindow.cpp" /> <ClCompile Include="TAS\StickWidget.cpp" /> @@ -313,6 +314,7 @@ <ClInclude Include="Config\Mapping\HotkeyGraphics.h" /> <ClInclude Include="Config\Mapping\HotkeyStates.h" /> <ClInclude Include="Config\Mapping\HotkeyTAS.h" /> + <ClInclude Include="QtUtils\WinIconHelper.h" /> <ClInclude Include="TAS\Shared.h" /> <ClInclude Include="Config\Mapping\HotkeyWii.h" /> <ClInclude Include="Config\Mapping\MappingBool.h" /> @@ -417,4 +419,4 @@ <Message Text="Copy: @(BinaryFiles) -> $(BinaryOutputDir)" Importance="High" /> <Copy SourceFiles="@(BinaryFiles)" DestinationFolder="$(BinaryOutputDir)" /> </Target> -</Project> +</Project>
\ No newline at end of file diff --git a/Source/Core/DolphinQt2/MainWindow.cpp b/Source/Core/DolphinQt2/MainWindow.cpp index 30e3ec2242..8b9b22d33e 100644 --- a/Source/Core/DolphinQt2/MainWindow.cpp +++ b/Source/Core/DolphinQt2/MainWindow.cpp @@ -85,7 +85,7 @@ MainWindow::MainWindow(std::unique_ptr<BootParameters> 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 <Windows.h> + +// 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<HBITMAP>(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<uchar> 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<void*>(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<HICON>(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 <QIcon> + +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<QPixmap> Resources::m_platforms; QList<QPixmap> Resources::m_countries; QList<QPixmap> 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); |
