winamp/Src/auth/Loginbox/loginGui.cpp
2024-09-24 14:54:57 +02:00

278 lines
5.2 KiB
C++

#include "./loginGui.h"
#include "./common.h"
#include "./imageLoader.h"
#include "../resource.h"
#include "../api.h"
#include <strsafe.h>
static size_t threadStorage = TLS_OUT_OF_INDEXES;
LoginGuiObject::LoginGuiObject()
: ref(1), bitmapIcons(NULL), fontTitle(NULL), fontEditor(NULL), fontText(NULL)
{
}
LoginGuiObject::~LoginGuiObject()
{
Reset();
}
HRESULT LoginGuiObject::InitializeThread()
{
if (TLS_OUT_OF_INDEXES == threadStorage)
{
if (NULL == WASABI_API_APP)
return E_UNEXPECTED;
threadStorage = WASABI_API_APP->AllocateThreadStorage();
if (TLS_OUT_OF_INDEXES == threadStorage)
return E_UNEXPECTED;
}
LoginGuiObject *cache = (LoginGuiObject*)WASABI_API_APP->GetThreadStorage(threadStorage);
if (NULL != cache)
{
cache->AddRef();
return S_FALSE;
}
if (NULL == cache)
{
cache = new LoginGuiObject();
if (NULL == cache) return E_OUTOFMEMORY;
WASABI_API_APP->SetThreadStorage(threadStorage, cache);
}
return S_OK;
}
HRESULT LoginGuiObject::UninitializeThread()
{
if (TLS_OUT_OF_INDEXES == threadStorage)
return E_FAIL;
if (NULL == WASABI_API_APP)
return E_UNEXPECTED;
LoginGuiObject *cache = (LoginGuiObject*)WASABI_API_APP->GetThreadStorage(threadStorage);
if (NULL != cache && 0 == cache->Release())
WASABI_API_APP->SetThreadStorage(threadStorage, NULL);
return S_OK;
}
HRESULT LoginGuiObject::QueryInstance(LoginGuiObject **instance)
{
if (NULL == instance)
return E_POINTER;
if (TLS_OUT_OF_INDEXES == threadStorage)
return E_UNEXPECTED;
*instance = (LoginGuiObject*)WASABI_API_APP->GetThreadStorage(threadStorage);
if (NULL == *instance) return E_FAIL;
(*instance)->AddRef();
return S_OK;
}
ULONG LoginGuiObject::AddRef()
{
return InterlockedIncrement((LONG*)&ref);
}
ULONG LoginGuiObject::Release()
{
if (0 == ref)
return ref;
LONG r = InterlockedDecrement((LONG*)&ref);
if (0 == r)
delete(this);
return r;
}
HRESULT LoginGuiObject::Reset()
{
if (NULL != bitmapIcons)
{
DeleteObject(bitmapIcons);
bitmapIcons = NULL;
}
if (NULL != fontTitle)
{
DeleteObject(fontTitle);
fontTitle = NULL;
}
if (NULL != fontEditor)
{
DeleteObject(fontEditor);
fontEditor = NULL;
}
if (NULL != fontText)
{
DeleteObject(fontText);
fontText = NULL;
}
return S_OK;
}
HRESULT LoginGuiObject::GetIconDimensions(INT *pWidth, INT *pHeight)
{
if (NULL == bitmapIcons)
{
INT width, height;
bitmapIcons = ImageLoader_LoadBitmap(WASABI_API_ORIG_HINST, MAKEINTRESOURCE(IDR_NOTIFIERICONS_IMAGE),
TRUE, &width, &height);
if (NULL == bitmapIcons)
return E_FAIL;
if (height < 0) height = -height;
if (NULL != pWidth) *pWidth = width;
if (NULL != pHeight) *pHeight = width;
return S_OK;
}
BITMAP bm;
if (sizeof(bm) != GetObject(bitmapIcons, sizeof(bm), &bm))
return E_FAIL;
if (NULL != pWidth) *pWidth = bm.bmWidth;
if (NULL != pHeight) *pHeight = bm.bmWidth;
return S_OK;
}
HBITMAP LoginGuiObject::GetIcon(INT iconId, RECT *prcIcon)
{
if (NULL == prcIcon || iconId < 0)
return NULL;
INT width, height;
if (NULL != bitmapIcons)
{
BITMAP bm;
if (sizeof(bm) != GetObject(bitmapIcons, sizeof(bm), &bm))
bitmapIcons = NULL;
else
{
width = bm.bmWidth;
height = bm.bmHeight;
}
}
if (NULL == bitmapIcons)
{
bitmapIcons = ImageLoader_LoadBitmap(WASABI_API_ORIG_HINST, MAKEINTRESOURCE(IDR_NOTIFIERICONS_IMAGE),
TRUE, &width, &height);
if (NULL == bitmapIcons)
return NULL;
}
if (height < 0) height = -height;
if (width * (iconId + 1) > height)
return NULL;
prcIcon->left = 0;
prcIcon->right = width;
prcIcon->top = width * iconId;
prcIcon->bottom = prcIcon->top + width;
return bitmapIcons;
}
static HFONT LoginGuiObject_DuplicateFont(HFONT fontBase, INT heightDeltaPt)
{
if (NULL == fontBase) return NULL;
LOGFONT lf;
if (sizeof(lf) != GetObject(fontBase, sizeof(lf), &lf))
return NULL;
if (0 != heightDeltaPt)
{
HDC hdc = GetDCEx(NULL, NULL, DCX_WINDOW | DCX_CACHE | DCX_NORESETATTRS);
HDC hdcTmp = NULL;
if (NULL != hdc)
{
hdcTmp = CreateCompatibleDC(hdc);
ReleaseDC(NULL, hdc);
}
if (NULL == hdcTmp)
return NULL;
LONG pixelsY = GetDeviceCaps (hdcTmp, LOGPIXELSY);
HFONT fontOrig = (HFONT)SelectObject(hdcTmp, fontBase);
TEXTMETRIC tm;
if (FALSE != GetTextMetrics(hdcTmp, &tm))
{
INT basePt = MulDiv(tm.tmHeight - tm.tmInternalLeading, 72, pixelsY);
lf.lfHeight = -MulDiv((basePt + heightDeltaPt), pixelsY, 72);
}
SelectObject(hdcTmp, fontOrig);
DeleteDC(hdcTmp);
}
return CreateFontIndirect(&lf);
}
HFONT LoginGuiObject::GetTitleFont()
{
if (NULL == fontTitle)
{
HFONT fontBase = GetTextFont();
if (NULL != fontBase)
{
fontTitle = LoginGuiObject_DuplicateFont(fontBase, 3);
}
}
return fontTitle;
}
HFONT LoginGuiObject::GetEditorFont()
{
if (NULL == fontEditor)
{
HFONT fontBase = GetTextFont();
if (NULL != fontBase)
{
fontEditor = LoginGuiObject_DuplicateFont(fontBase, 0);
}
}
return fontEditor;
}
HFONT LoginGuiObject::GetTextFont()
{
if (NULL == fontText)
{
LOGFONT lf;
if (FALSE != SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, 0))
{
lf.lfQuality = LoginBox_GetSysFontQuality();
fontText = CreateFontIndirect(&lf);
}
}
return fontText;
}