Skip to content

Commit

Permalink
Merge pull request #6530 from spycrab/qt_hires_icon
Browse files Browse the repository at this point in the history
Various icon improvements
  • Loading branch information
leoetlino committed Mar 27, 2018
2 parents ceed689 + 4f63d7f commit 98f62a3
Show file tree
Hide file tree
Showing 9 changed files with 135 additions and 3 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Binary file modified Data/dolphin-emu.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions Source/Core/DolphinQt2/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 3 additions & 1 deletion Source/Core/DolphinQt2/DolphinQt2.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -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" />
Expand Down Expand Up @@ -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" />
Expand Down Expand Up @@ -417,4 +419,4 @@
<Message Text="Copy: @(BinaryFiles) -&gt; $(BinaryOutputDir)" Importance="High" />
<Copy SourceFiles="@(BinaryFiles)" DestinationFolder="$(BinaryOutputDir)" />
</Target>
</Project>
</Project>
2 changes: 1 addition & 1 deletion Source/Core/DolphinQt2/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
94 changes: 94 additions & 0 deletions Source/Core/DolphinQt2/QtUtils/WinIconHelper.cpp
Original file line number Diff line number Diff line change
@@ -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
16 changes: 16 additions & 0 deletions Source/Core/DolphinQt2/QtUtils/WinIconHelper.h
Original file line number Diff line number Diff line change
@@ -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
18 changes: 18 additions & 0 deletions Source/Core/DolphinQt2/Resources.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
1 change: 1 addition & 0 deletions Source/Core/DolphinQt2/Resources.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class Resources final

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);
Expand Down

0 comments on commit 98f62a3

Please sign in to comment.