1
0
Fork 0
mirror of https://github.com/galaxyhaxz/devilution synced 2024-11-14 16:29:02 +00:00
devilution/2020_03_31/DiabloUI/local.cpp
PrisonOfMirrors b720183846 initial up
2020-11-28 18:24:54 -06:00

571 lines
12 KiB
C++

// ref: 0x10007825
void __cdecl local_InitUiPalette()
{
LOGPALETTE *v0; // eax MAPDST
PALETTEENTRY *v2; // eax
int v3; // ecx
v0 = (LOGPALETTE *)SMemAlloc(0x404u, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 27, 0);
if ( v0 )
{
v0->palVersion = 768;
v0->palNumEntries = 256;
v2 = v0->palPalEntry;
v3 = 0;
do
{
v2[v3].peFlags = 2;
++v3;
}
while ( v3 < 256 );
objPalette = CreatePalette(v0);
SMemFree(v0, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 41, 0);
}
}
// ref: 0x1000787D
void __cdecl local_DelUiPalette()
{
if ( objPalette )
{
DeleteObject(objPalette);
objPalette = 0;
}
}
// ref: 0x10007895
tagPALETTEENTRY *__fastcall local_GetArtPalEntry(int entry)
{
return &artpal[entry];
}
// ref: 0x1000789D
void __fastcall local_ClearPalette(PALETTEENTRY *pPal)
{
BYTE *v1; // eax
signed int v2; // ecx
v1 = &pPal->peBlue;
v2 = 256;
do
{
*(v1 - 2) = 0;
*(v1 - 1) = 0;
*v1 = 0;
v1 += 4;
--v2;
}
while ( v2 );
}
// ref: 0x100078B6
void __cdecl local_ClearSurface()
{
SDrawClearSurface(0);
}
// 1001043C: using guessed type int __stdcall SDrawClearSurface(_DWORD);
// ref: 0x100078BE
BOOL __fastcall local_LoadArtImage(const char *pszFileName, BYTE **pBuffer, DWORD *pdwSize)
{
BYTE *v4; // eax
DWORD v5; // ecx
DWORD dwHeight; // [esp+10h] [ebp-8h]
DWORD dwWidth; // [esp+14h] [ebp-4h]
*pBuffer = 0;
if ( !SBmpLoadImage(pszFileName, 0, 0, 0, &dwWidth, &dwHeight, 0) )
return 0;
v4 = (BYTE *)SMemAlloc(dwHeight * dwWidth, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 93, 0);
v5 = dwWidth;
*pBuffer = v4;
if ( !SBmpLoadImage(pszFileName, 0, v4, dwHeight * v5, 0, 0, 0) )
{
SMemFree(*pBuffer, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 95, 0);
*pBuffer = 0;
return 0;
}
if ( pdwSize )
{
*pdwSize = dwWidth;
pdwSize[1] = dwHeight;
}
return 1;
}
// ref: 0x10007944
BOOL __fastcall local_LoadArtWithPal(HWND hWnd, int a2, char *src, int mask, int flags, const char *pszFileName, BYTE **pBuffer, DWORD *pdwSize, BOOL a9)
{
BYTE *v10; // eax
DWORD v11; // ST18_4
HPALETTE v13; // edi
tagPALETTEENTRY pPalEntries[256]; // [esp+Ch] [ebp-40Ch]
DWORD pdwWidth; // [esp+410h] [ebp-8h]
DWORD dwHeight; // [esp+414h] [ebp-4h]
if ( !SBmpLoadImage(pszFileName, 0, 0, 0, &pdwWidth, &dwHeight, 0) )
return 0;
v10 = (BYTE *)SMemAlloc(dwHeight * pdwWidth, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 129, 0);
v11 = dwHeight * pdwWidth;
*pBuffer = v10;
if ( !SBmpLoadImage(pszFileName, pPalEntries, v10, v11, 0, 0, 0)
|| !SDlgSetBitmapI(hWnd, a2, src, mask, flags, *pBuffer, 0, pdwWidth, dwHeight, -1) )
{
return 0;
}
if ( !src || !*src )
{
v13 = (HPALETTE)GetStockObject(15);
GetPaletteEntries(v13, 0, 0xAu, pPalEntries);
GetPaletteEntries(v13, 0xAu, 0xAu, &pPalEntries[246]);
memcpy(artpal, pPalEntries, 0x400u);
if ( a9 )
{
SDrawUpdatePalette(0, 255, artpal, 1);
}
else
{
local_ClearPalette(pPalEntries);
SDrawUpdatePalette(0, 256, pPalEntries, 1);
}
}
if ( pdwSize )
{
*pdwSize = pdwWidth;
pdwSize[1] = dwHeight;
}
return 1;
}
// 100103FA: using guessed type int __stdcall SDrawUpdatePalette(_DWORD, _DWORD, _DWORD, _DWORD);
// ref: 0x10007A68
void __fastcall local_AdjustRectSize(tagRECT *pRect, int a2, int a3)
{
int v3; // eax
int v4; // edx
v3 = a2 - pRect->left;
pRect->left = a2;
pRect->right += v3 - 1;
v4 = a3 - pRect->top;
pRect->top = a3;
pRect->bottom += v4 - 1;
}
// ref: 0x10007A85
BOOL __fastcall local_SetStaticBmp(HWND hWnd, int nIDDlgItem, BYTE *pBuffer, DWORD *pdwSize)
{
HWND v4; // edi
HWND v5; // ebx
struct tagRECT Rect; // [esp+Ch] [ebp-10h]
v4 = hWnd;
v5 = GetDlgItem(hWnd, nIDDlgItem);
GetWindowRect(v5, &Rect);
ScreenToClient(v4, (LPPOINT)&Rect);
ScreenToClient(v4, (LPPOINT)&Rect.right);
SDlgSetBitmapI(v5, 0, "Static", -1, 1, pBuffer, (int)&Rect, *pdwSize, pdwSize[1], -1);
return 1;
}
// ref: 0x10007AEA
void __cdecl local_cpp_init()
{
local_cpp_float = 0x7F800000;
}
// 10029CB8: using guessed type int local_cpp_float;
// ref: 0x10007AF5
BOOL __fastcall local_SetButtonBmp(HWND hWnd, int flags, int a7, void *pBuffer, DWORD *pdwSize)
{
return SDlgSetBitmapI(hWnd, 0, "Button", -1, flags, pBuffer, a7, *pdwSize, pdwSize[1], -1);
}
// ref: 0x10007B1B
void __fastcall local_FitButtonDlg(HWND hWnd, int *a2, void *pBuffer, DWORD *pdwSize)
{
int v4; // eax
HWND v5; // esi
struct tagRECT Rect; // [esp+0h] [ebp-1Ch]
int a3; // [esp+14h] [ebp-8h]
int *v9; // [esp+18h] [ebp-4h]
v4 = *a2;
a3 = 0;
v9 = a2;
if ( v4 )
{
do
{
v5 = GetDlgItem(hWnd, v4);
if ( v5 )
{
GetClientRect(v5, &Rect);
local_AdjustRectSize(&Rect, 0, a3);
local_SetButtonBmp(v5, 16, (int)&Rect, pBuffer, pdwSize);
++Rect.bottom;
++Rect.right;
local_AdjustRectSize(&Rect, 0, Rect.bottom);
local_SetButtonBmp(v5, 64, (int)&Rect, pBuffer, pdwSize);
++Rect.bottom;
++Rect.right;
local_AdjustRectSize(&Rect, 0, Rect.bottom);
local_SetButtonBmp(v5, 32, (int)&Rect, pBuffer, pdwSize);
++Rect.bottom;
++Rect.right;
local_AdjustRectSize(&Rect, 0, Rect.bottom);
local_SetButtonBmp(v5, 128, (int)&Rect, pBuffer, pdwSize);
++Rect.bottom;
++Rect.right;
local_AdjustRectSize(&Rect, 0, Rect.bottom);
local_SetButtonBmp(v5, 1280, (int)&Rect, pBuffer, pdwSize);
++Rect.bottom;
++Rect.right;
a3 = Rect.bottom;
}
++v9;
v4 = *v9;
}
while ( *v9 );
}
}
// ref: 0x10007C2E
void __fastcall local_SetWhiteText(HDC hdc)
{
SetTextColor(hdc, 0xFFFFu);
}
// ref: 0x10007C3B
BOOL __fastcall local_GetBottomRect(HWND hWnd1, HWND hWnd2, int width, int height)
{
BOOL result; // eax
struct tagRECT Rect; // [esp+4h] [ebp-10h]
if ( hWnd1
&& hWnd2
&& (GetWindowRect(hWnd2, &Rect),
ScreenToClient(hWnd1, (LPPOINT)&Rect),
ScreenToClient(hWnd1, (LPPOINT)&Rect.right),
width >= Rect.left)
&& width < Rect.right
&& height >= Rect.top )
{
result = height < Rect.bottom;
}
else
{
result = 0;
}
return result;
}
// ref: 0x10007C95
void __fastcall local_DlgDoPaint(HWND hWnd)
{
char v2[64]; // [esp+4h] [ebp-40h]
SDlgBeginPaint(hWnd, v2);
SDlgEndPaint(hWnd, v2);
}
// 10010442: using guessed type int __stdcall SDlgEndPaint(_DWORD, _DWORD);
// 10010448: using guessed type int __stdcall SDlgBeginPaint(_DWORD, _DWORD);
// ref: 0x10007CB5
void __fastcall local_DoUiWndProc(HWND hWnd, DWORD *pdwMsgTbl)
{
DWORD *v2; // edi
int i; // eax
HWND v5; // eax
HWND v6; // esi
void *v7; // eax
v2 = pdwMsgTbl;
for ( i = *pdwMsgTbl; *v2; i = *v2 )
{
v5 = GetDlgItem(hWnd, i);
v6 = v5;
if ( v5 )
{
v7 = (void *)GetWindowLongA(v5, -4);
SetPropA(v6, "UIWNDPROC", v7);
SetWindowLongA(v6, -4, (LONG)local_PostUiWndProc);
}
++v2;
}
}
// ref: 0x10007D01
LRESULT __stdcall local_PostUiWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT (__stdcall *v4)(HWND, UINT, WPARAM, LPARAM); // ebx
HWND v5; // eax
HWND v6; // eax
HWND v7; // eax
WPARAM v9; // [esp-8h] [ebp-14h]
BOOL v10; // [esp-4h] [ebp-10h]
v4 = (LRESULT (__stdcall *)(HWND, UINT, WPARAM, LPARAM))GetPropA(hWnd, "UIWNDPROC");
switch ( uMsg )
{
case 2u:
RemovePropA(hWnd, "UIWNDPROC");
if ( !v4 )
return DefWindowProcA(hWnd, uMsg, wParam, lParam);
SetWindowLongA(hWnd, -4, (LONG)v4);
goto LABEL_21;
case 0xFu:
local_DlgDoPaint(hWnd);
return 0;
case 0x87u:
return 4;
}
if ( uMsg != 256 )
goto LABEL_21;
switch ( wParam )
{
case 0xDu:
goto LABEL_26;
case 0x1Bu:
v9 = 2;
LABEL_15:
v7 = GetParent(hWnd);
SendMessageA(v7, 0x111u, v9, 0);
goto LABEL_21;
case 0x20u:
LABEL_26:
v9 = 1;
goto LABEL_15;
}
if ( wParam <= 0x24 )
goto LABEL_21;
if ( wParam <= 0x26 )
{
v10 = 1;
}
else
{
if ( wParam > 0x28 )
goto LABEL_21;
v10 = 0;
}
v5 = GetParent(hWnd);
v6 = GetNextDlgGroupItem(v5, hWnd, v10);
SetFocus(v6);
LABEL_21:
if ( v4 )
return CallWindowProcA(v4, hWnd, uMsg, wParam, lParam);
return DefWindowProcA(hWnd, uMsg, wParam, lParam);
}
// ref: 0x10007DE9
void __fastcall local_DoUiWndProc2(HWND hWnd, DWORD *pdwMsgTbl)
{
DWORD *v2; // edi
int i; // eax
HWND v5; // eax
HWND v6; // esi
void *v7; // eax
v2 = pdwMsgTbl;
for ( i = *pdwMsgTbl; *v2; i = *v2 )
{
v5 = GetDlgItem(hWnd, i);
v6 = v5;
if ( v5 )
{
v7 = (void *)GetWindowLongA(v5, -4);
SetPropA(v6, "UIWNDPROC", v7);
SetWindowLongA(v6, -4, (LONG)local_PostUiWndProc2);
}
++v2;
}
}
// ref: 0x10007E35
LRESULT __stdcall local_PostUiWndProc2(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT (__stdcall *v4)(HWND, UINT, WPARAM, LPARAM); // ebx
WPARAM v5; // ST0C_4
HWND v6; // eax
HWND v8; // [esp+18h] [ebp+Ch]
v4 = (LRESULT (__stdcall *)(HWND, UINT, WPARAM, LPARAM))GetPropA(hWnd, "UIWNDPROC");
switch ( uMsg )
{
case 2u:
RemovePropA(hWnd, "UIWNDPROC");
if ( !v4 )
return DefWindowProcA(hWnd, uMsg, wParam, lParam);
SetWindowLongA(hWnd, -4, (LONG)v4);
break;
case 0xFu:
local_DlgDoPaint(hWnd);
return 0;
case 0x201u:
v8 = GetFocus();
SetFocus(hWnd);
InvalidateRect(v8, 0, 0);
InvalidateRect(hWnd, 0, 0);
UpdateWindow(v8);
UpdateWindow(hWnd);
v5 = (unsigned short)GetWindowLongA(hWnd, -12);
v6 = GetParent(hWnd);
PostMessageA(v6, 0x111u, v5, (LPARAM)hWnd);
return 0;
}
if ( v4 )
return CallWindowProcA(v4, hWnd, uMsg, wParam, lParam);
return DefWindowProcA(hWnd, uMsg, wParam, lParam);
}
// ref: 0x10007F04
BOOL __fastcall local_DisableKeyWaitMouse(HWND hWnd)
{
BOOL result; // eax
struct tagMSG Msg; // [esp+8h] [ebp-1Ch]
do
{
while ( PeekMessageA(&Msg, hWnd, 0x100u, 0x108u, 1u) )
;
result = PeekMessageA(&Msg, hWnd, 0x200u, 0x209u, 1u);
}
while ( result );
return result;
}
// ref: 0x10007F46
DWORD *__cdecl local_AllocWndLongData()
{
DWORD *result; // eax
result = (DWORD *)SMemAlloc(0x110u, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 480, 0);
if ( result )
{
*result = 0;
result[1] = 0;
result[2] = 0;
result[3] = 0;
*((_BYTE *)result + 16) = 0;
}
return result;
}
// ref: 0x10007F72
void __fastcall local_FreeMemPtr(void **p)
{
if ( p )
{
if ( *p )
SMemFree(*p, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 498, 0);
SMemFree(p, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 499, 0);
}
}
// ref: 0x10007FA4
void __fastcall local_SetWndLongStr(int WndLongData, const char *pszStr)
{
if ( WndLongData )
{
if ( pszStr )
{
strncpy((char *)(WndLongData + 16), pszStr, 0xFFu);
*(_BYTE *)(WndLongData + 271) = 0;
}
else
{
*(_BYTE *)(WndLongData + 16) = 0;
}
}
}
// ref: 0x10007FD0
void __cdecl local_LoadArtCursor()
{
DWORD dwHeight; // [esp+8h] [ebp-8h]
DWORD dwWidth; // [esp+Ch] [ebp-4h]
if ( SBmpLoadImage("ui_art\\cursor.pcx", 0, 0, 0, &dwWidth, &dwHeight, 0) )
{
gpCursorArt = (BYTE *)SMemAlloc(dwHeight * dwWidth, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 553, 0);
gpCursorArt2 = (BYTE *)SMemAlloc(dwHeight * dwWidth, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 554, 0);
if ( SBmpLoadImage("ui_art\\cursor.pcx", 0, gpCursorArt, dwHeight * dwWidth, 0, 0, 0) )
{
gdwCursData[0] = dwWidth;
gdwCursData[1] = dwHeight;
local_InitArtCursor();
}
}
}
// ref: 0x10008062
void __cdecl local_InitArtCursor()
{
BYTE *v0; // eax
BYTE *v1; // ecx
int i; // esi
char v3; // dl
v0 = gpCursorArt2;
v1 = gpCursorArt;
if ( gpCursorArt2 )
{
if ( gpCursorArt )
{
for ( i = 0; i < gdwCursData[0] * gdwCursData[1]; ++i )
{
v3 = *v1++;
if ( v3 )
*v0 = 0;
else
*v0 = -1;
++v0;
}
}
}
}
// ref: 0x100080AD
void __cdecl local_FreeArtCursor()
{
if ( gpCursorArt )
{
SMemFree(gpCursorArt, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 571, 0);
gpCursorArt = 0;
}
if ( gpCursorArt2 )
{
SMemFree(gpCursorArt2, "C:\\Src\\Diablo\\DiabloUI\\local.cpp", 575, 0);
gpCursorArt2 = 0;
}
}
// ref: 0x100080F1
void __cdecl local_SetCursorArt()
{
if ( !gpCursorArt )
local_LoadArtCursor();
SDlgSetSystemCursor(gpCursorArt2, gpCursorArt, (int *)gdwCursData, 32512);
}
// 1001044E: using guessed type int __stdcall SDlgSetSystemCursor(_DWORD, _DWORD, _DWORD, _DWORD);
// ref: 0x1000811B
void __cdecl local_SetCursorDefault()
{
SDlgSetSystemCursor(0, 0, 0, 32512);
}
// 1001044E: using guessed type int __stdcall SDlgSetSystemCursor(_DWORD, _DWORD, _DWORD, _DWORD);
// ref: 0x1000812B
void __fastcall local_SetDiabloCursor(HWND hWnd)
{
HCURSOR v2; // eax
int v3; // [esp+4h] [ebp-4h]
v3 = 0;
local_SetCursorDefault();
v2 = LoadCursorA(ghUiInst, "DIABLOCURSOR");
SDlgSetCursor(hWnd, v2, 32512, &v3);
}
// 10010454: using guessed type int __stdcall SDlgSetCursor(_DWORD, _DWORD, _DWORD, _DWORD);