Skip to content

Commit

Permalink
apply to custom images too
Browse files Browse the repository at this point in the history
  • Loading branch information
wiktorwiktor12 committed Mar 2, 2025
1 parent 8189aac commit fe6eae2
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 12 deletions.
46 changes: 34 additions & 12 deletions ConsoleLogonUI/util/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,21 @@
#include <wincodec.h>
#include <wincodecsdk.h>

HBITMAP GetHBITMAPFromImageResource(int resourceID)
HBITMAP ScaleBitmapToRes(HBITMAP oldBitmap)
{
static auto SHCreateStreamOnModuleResourceW = (HRESULT(WINAPI*)(HMODULE hModule, LPCWSTR pwszName, LPCWSTR pwszType, IStream * *ppStream))(GetProcAddress(LoadLibrary(L"shcore.dll"), (PCSTR)109));

IStream* Stream = 0;
HRESULT hr = SHCreateStreamOnModuleResourceW(duiManager::Get()->hInstance, MAKEINTRESOURCEW(resourceID), L"IMAGE", &Stream);
if (FAILED(hr))
{
return 0;
}
Gdiplus::GdiplusStartupInput gpStartupInput;
ULONG_PTR gpToken;
Gdiplus::GdiplusStartup(&gpToken, &gpStartupInput, NULL);

Gdiplus::Bitmap* bitmap = Gdiplus::Bitmap::FromStream(Stream);
Gdiplus::Bitmap* bitmap = Gdiplus::Bitmap::FromHBITMAP(oldBitmap, 0);

HBITMAP hbitmap = 0;

if (bitmap)
{
UINT newWidth = GetSystemMetrics(SM_CXSCREEN);
UINT newHeight = GetSystemMetrics(SM_CYSCREEN);
Gdiplus::Bitmap bitmap2 = Gdiplus::Bitmap(newWidth,newHeight,PixelFormat32bppARGB);
Gdiplus::Bitmap bitmap2 = Gdiplus::Bitmap(newWidth, newHeight, PixelFormat32bppARGB);

Gdiplus::Graphics* graphic = Gdiplus::Graphics::FromImage(&bitmap2);
if (graphic)
Expand All @@ -38,7 +30,7 @@ HBITMAP GetHBITMAPFromImageResource(int resourceID)
UINT oldWidth = bitmap->GetWidth();
UINT oldHeight = bitmap->GetHeight();

graphic->DrawImage(bitmap, Gdiplus::Rect(0,0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)), 0,0, bitmap->GetWidth(), bitmap->GetHeight(), Gdiplus::Unit::UnitPixel, &attributes, (Gdiplus::DrawImageAbort)0, 0);
graphic->DrawImage(bitmap, Gdiplus::Rect(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)), 0, 0, bitmap->GetWidth(), bitmap->GetHeight(), Gdiplus::Unit::UnitPixel, &attributes, (Gdiplus::DrawImageAbort)0, 0);

bitmap2.GetHBITMAP(Gdiplus::Color(0xFF000000), &hbitmap);

Expand All @@ -47,6 +39,36 @@ HBITMAP GetHBITMAPFromImageResource(int resourceID)

delete bitmap;
}
Gdiplus::GdiplusShutdown(gpToken);

return hbitmap;
}

HBITMAP GetHBITMAPFromImageResource(int resourceID)
{
static auto SHCreateStreamOnModuleResourceW = (HRESULT(WINAPI*)(HMODULE hModule, LPCWSTR pwszName, LPCWSTR pwszType, IStream * *ppStream))(GetProcAddress(LoadLibrary(L"shcore.dll"), (PCSTR)109));

IStream* Stream = 0;
HRESULT hr = SHCreateStreamOnModuleResourceW(duiManager::Get()->hInstance, MAKEINTRESOURCEW(resourceID), L"IMAGE", &Stream);
if (FAILED(hr))
{
return 0;
}
Gdiplus::GdiplusStartupInput gpStartupInput;
ULONG_PTR gpToken;
Gdiplus::GdiplusStartup(&gpToken, &gpStartupInput, NULL);

Gdiplus::Bitmap* bitmap = Gdiplus::Bitmap::FromStream(Stream);

HBITMAP hbitmap = 0;

if (bitmap)
{
bitmap->GetHBITMAP(Gdiplus::Color(0xFF000000), &hbitmap);

//inefficient, but i cba to clean up my usage of gdiplus
hbitmap = ScaleBitmapToRes(hbitmap);
}
Stream->Release();
Gdiplus::GdiplusShutdown(gpToken);

Expand Down
2 changes: 2 additions & 0 deletions ConsoleLogonUI/util/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ static std::vector<std::wstring> split(std::wstring s, std::wstring delimiter)
return res;
}

HBITMAP ScaleBitmapToRes(HBITMAP oldBitmap);
static HBITMAP GetHBITMAPFromImageFile(WCHAR* pFilePath)
{
Gdiplus::GdiplusStartupInput gpStartupInput;
Expand All @@ -73,6 +74,7 @@ static HBITMAP GetHBITMAPFromImageFile(WCHAR* pFilePath)
if (bitmap)
{
bitmap->GetHBITMAP(Gdiplus::Color(255, 255, 255), &result);
result = ScaleBitmapToRes(result);
delete bitmap;
}
Gdiplus::GdiplusShutdown(gpToken);
Expand Down

0 comments on commit fe6eae2

Please sign in to comment.