summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorLéo Lam <leolino.lam@gmail.com>2018-03-27 18:08:46 +0200
committerGitHub <noreply@github.com>2018-03-27 18:08:46 +0200
commit98f62a3ecdbc8f005f062bb9cf195d0b72587c47 (patch)
tree468d2eb5b56943e5fab4379627436c72ba804f2e /Source/Core
parentceed6890dfe1d55dba35b3829b9e443670365b8b (diff)
parent4f63d7f20492ff76f9e1f927b2c5f5f50cc2b891 (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.txt1
-rw-r--r--Source/Core/DolphinQt2/DolphinQt2.vcxproj4
-rw-r--r--Source/Core/DolphinQt2/MainWindow.cpp2
-rw-r--r--Source/Core/DolphinQt2/QtUtils/WinIconHelper.cpp94
-rw-r--r--Source/Core/DolphinQt2/QtUtils/WinIconHelper.h16
-rw-r--r--Source/Core/DolphinQt2/Resources.cpp18
-rw-r--r--Source/Core/DolphinQt2/Resources.h1
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) -&gt; $(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);