Files

375 lines
10 KiB
C++

//
// Created by neo on 2019-08-15.
//
#include "../pinball.h"
//----- (01006D96) --------------------------------------------------------
HPALETTE splash_init_palette(LOGPALETTE *plpal)
{
LOGPALETTE *v1; // edi
HWND v2; // eax
HDC v3; // ebx
HWND v4; // eax
HPALETTE result; // eax
HPALETTE hPal; // ST1C_4
HWND v7; // eax
BYTE *v8; // eax
signed int v9; // ecx
signed int v10; // ecx
BYTE *v11; // eax
HPALETTE plpala; // [esp+18h] [ebp+8h]
v1 = plpal;
plpal->palVersion = 768;
plpal->palNumEntries = 256;
plpala = CreatePalette(plpal);
v2 = GetDesktopWindow();
v3 = _GetDC(v2);
GetDeviceCaps(v3, 38);
if ( GetDeviceCaps(v3, 104) == 256 )
{
SetSystemPaletteUse(v3, 2u);
SetSystemPaletteUse(v3, 1u);
hPal = SelectPalette(v3, plpala, 0);
RealizePalette(v3);
SelectPalette(v3, hPal, 0);
RealizePalette(v3);
GetSystemPaletteEntries(v3, 0, 0x100u, v1->palPalEntry);
v7 = GetDesktopWindow();
ReleaseDC(v7, v3);
v8 = &v1->palPalEntry[0].peFlags;
v9 = 256;
do
{
*v8 = 0;
v8 += 4;
--v9;
}
while ( v9 );
v10 = 10;
v11 = &v1[5].palPalEntry[0].peGreen;
do
{
*(v11 - 1) = v10;
*v11 = v10;
v11[1] = v10;
v11[2] = 4;
++v10;
v11 += 4;
}
while ( v10 < 246 );
ResizePalette(plpala, 0x100u);
SetPaletteEntries(plpala, 0, 0x100u, v1->palPalEntry);
result = plpala;
}
else
{
if ( plpala )
DeleteObject(plpala);
v4 = GetDesktopWindow();
ReleaseDC(v4, v3);
result = 0;
}
return result;
}
//----- (01006EB9) --------------------------------------------------------
HBITMAP load_title_bitmap(HMODULE hModule, HDC hdc, LPCSTR lpName, UINT iStart, int a5, int a6)
{
HRSRC v6; // eax
HGLOBAL v7; // eax
const BITMAPINFO *v9; // eax
const BITMAPINFO *v10; // esi
signed int v11; // edi
bool v12; // cf
bool v13; // zf
BYTE *v14; // ecx
BYTE *v15; // edx
HBITMAP v16; // esi
LOGPALETTE plpal; // [esp+0h] [ebp-40Ch]
void *pjBits; // [esp+404h] [ebp-8h]
HGLOBAL hResData; // [esp+408h] [ebp-4h]
HMODULE hModulea; // [esp+414h] [ebp+8h]
HPALETTE lpNamea; // [esp+41Ch] [ebp+10h]
v6 = FindResourceA(hModule, lpName, (LPCSTR)2);
if ( !v6 )
return 0;
v7 = LoadResource(hModule, v6);
hResData = v7;
if ( !v7 )
return 0;
v9 = (const BITMAPINFO *)LockResource(v7);
v10 = v9;
v11 = v9->bmiHeader.biClrUsed;
if ( !v11 )
v11 = 1 << LOBYTE(v9->bmiHeader.biBitCount);
v12 = v9->bmiHeader.biBitCount < 4u;
v13 = v9->bmiHeader.biBitCount == 4;
pjBits = &v9->bmiColors[v11];
if ( !v12 && !v13 )
{
lpNamea = splash_init_palette(&plpal);
*(DWORD *)a6 = lpNamea;
if ( lpNamea )
{
hModulea = 0;
if ( a5 > 0 )
{
v14 = &plpal.palPalEntry[iStart].peGreen;
v15 = &v10->bmiColors[0].rgbGreen;
do
{
if ( (signed int)hModulea >= v11 )
break;
hModulea = (HMODULE)((char *)hModulea + 1);
*(v14 - 1) = v15[1];
*v14 = *v15;
v14[1] = *(v15 - 1);
v14[2] = 4;
v15 += 4;
v14 += 4;
}
while ( (signed int)hModulea < a5 );
}
SetPaletteEntries(lpNamea, iStart, (UINT)hModulea, &plpal.palPalEntry[iStart]);
SelectPalette(hdc, *(HPALETTE *)a6, 0);
RealizePalette(hdc);
}
}
v16 = CreateDIBitmap(hdc, &v10->bmiHeader, 4u, pjBits, v10, 0);
FreeResource(hResData);
return v16;
}
//----- (01006FCB) --------------------------------------------------------
int splash_bitmap_setup(int a1)
{
HWND v1; // eax
HDC v2; // eax
HDC v3; // edi
HBITMAP v4; // eax
HWND v5; // ST14_4
HDC v6; // eax
HBITMAP v7; // eax
int result; // eax
char pv; // [esp+8h] [ebp-1Ch]
int v10; // [esp+Ch] [ebp-18h]
int v11; // [esp+10h] [ebp-14h]
HGDIOBJ h; // [esp+20h] [ebp-4h]
h = 0;
v1 = GetDesktopWindow();
v2 = _GetDC(v1);
v3 = v2;
if ( v2 )
{
*(DWORD *)(a1 + 12) = CreateCompatibleDC(v2);
v4 = CreateCompatibleBitmap(v3, 10, 10);
v5 = *(HWND *)a1;
h = v4;
ReleaseDC(v5, v3);
if ( h )
{
v6 = *(HDC *)(a1 + 12);
if ( v6 )
{
SelectObject(v6, h);
if ( GetDeviceCaps(*(HDC *)(a1 + 12), 38) & 0x100 || GetDeviceCaps(*(HDC *)(a1 + 12), 24) >= 256 )
v7 = load_title_bitmap(hInstance, *(HDC *)(a1 + 12), (LPCSTR)(a1 + 32), 0xAu, 236, a1 + 4);
else
v7 = LoadBitmapA(hInstance, (LPCSTR)(a1 + 232));
*(DWORD *)(a1 + 8) = v7;
if ( v7 )
{
SelectObject(*(HDC *)(a1 + 12), v7);
DeleteObject(h);
GetObjectA(*(HANDLE *)(a1 + 8), 24, &pv);
*(DWORD *)(a1 + 16) = v10;
result = v11;
*(DWORD *)(a1 + 20) = v11;
return result;
}
}
}
else
{
GetLastError();
}
}
if ( *(DWORD *)(a1 + 4) )
DeleteObject(*(HGDIOBJ *)(a1 + 4));
if ( *(DWORD *)a1 )
DestroyWindow(*(HWND *)a1);
if ( h )
DeleteObject(h);
result = *(DWORD *)(a1 + 12);
if ( result )
result = DeleteDC(*(HDC *)(a1 + 12));
*(DWORD *)(a1 + 8) = 0;
return result;
}
//----- (01007103) --------------------------------------------------------
void splash_paint(int a1, HDC hdc)
{
HWND v2; // eax
HPALETTE v3; // ST1C_4
struct tagRECT Rect; // [esp+4h] [ebp-10h]
if ( *(DWORD *)(a1 + 8) )
{
v2 = GetDesktopWindow();
GetWindowRect(v2, &Rect);
v3 = *(HPALETTE *)(a1 + 4);
*(DWORD *)(a1 + 24) = (Rect.right - Rect.left - *(DWORD *)(a1 + 16)) / 2;
*(DWORD *)(a1 + 28) = (Rect.bottom - Rect.top - *(DWORD *)(a1 + 20)) / 2;
SelectPalette(hdc, v3, 0);
RealizePalette(hdc);
SelectPalette(*(HDC *)(a1 + 12), *(HPALETTE *)(a1 + 4), 0);
RealizePalette(*(HDC *)(a1 + 12));
BitBlt(
hdc,
*(DWORD *)(a1 + 24),
*(DWORD *)(a1 + 28),
*(DWORD *)(a1 + 16),
*(DWORD *)(a1 + 20),
*(HDC *)(a1 + 12),
0,
0,
0xCC0020u);
}
}
//----- (010071A5) --------------------------------------------------------
void splash_hide(int a1)
{
HDC v1; // edi
if ( a1 )
{
if ( *(DWORD *)a1 )
{
v1 = _GetDC(*(HWND *)a1);
BitBlt(v1, 0, 0, *(DWORD *)(a1 + 24), *(DWORD *)(a1 + 28), v1, 0, 0, 0x42u);
ReleaseDC(*(HWND *)a1, v1);
}
}
}
//----- (010071ED) --------------------------------------------------------
HINSTANCE splash_destroy(int a1)
{
void *v1; // eax
HDC v2; // eax
HINSTANCE result; // eax
if ( a1 )
{
if ( *(DWORD *)a1 )
{
DestroyWindow(*(HWND *)a1);
v1 = *(void **)(a1 + 4);
*(DWORD *)a1 = 0;
if ( v1 )
DeleteObject(v1);
v2 = *(HDC *)(a1 + 12);
*(DWORD *)(a1 + 4) = 0;
if ( v2 )
DeleteDC(v2);
if ( *(DWORD *)(a1 + 8) )
DeleteObject(*(HGDIOBJ *)(a1 + 8));
}
memoryfree(a1);
}
result = hInstance;
if ( hInstance )
{
result = (HINSTANCE)UnregisterClassA("3DPB_SPLASH_CLASS", hInstance);
hInstance = 0;
}
return result;
}
//----- (01007264) --------------------------------------------------------
LRESULT splash_message_handler(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
HDC v5; // eax
HDC v6; // esi
LONG v7; // [esp+4h] [ebp-48h]
struct tagPAINTSTRUCT Paint; // [esp+8h] [ebp-44h]
if ( Msg == 15 )
{
v7 = GetWindowLongA(hWnd, 0);
BeginPaint(hWnd, &Paint);
EndPaint(hWnd, &Paint);
v5 = _GetDC(hWnd);
v6 = v5;
if ( v5 )
{
if ( v7 )
{
BitBlt(v5, 0, 0, 10000, 10000, v5, 0, 0, 0x42u);
splash_paint(v7, v6);
}
}
ReleaseDC(hWnd, v6);
}
else if ( Msg != 20 )
{
return DefWindowProcA(hWnd, Msg, wParam, lParam);
}
return 0;
}
//----- (01007308) --------------------------------------------------------
int splash_screen(int a1, LPCSTR lpString2, LPCSTR a3)
{
int v3; // esi
HINSTANCE v4; // ST28_4
HWND v5; // eax
HWND v7; // eax
WNDCLASSA WndClass; // [esp+8h] [ebp-38h]
struct tagRECT Rect; // [esp+30h] [ebp-10h]
v3 = memoryallocate(0x1B0u);
if ( !v3 )
return 0;
lstrcpyA((LPSTR)(v3 + 32), lpString2);
lstrcpyA((LPSTR)(v3 + 232), a3);
if ( !hInstance )
{
hInstance = (HINSTANCE)a1;
WndClass.style = 0;
WndClass.lpfnWndProc = splash_message_handler;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 4;
WndClass.hInstance = (HINSTANCE)a1;
WndClass.hIcon = 0;
WndClass.hCursor = LoadCursorA(0, (LPCSTR)0x7F00);
WndClass.hbrBackground = 0;
WndClass.lpszMenuName = WindowName;
WndClass.lpszClassName = "3DPB_SPLASH_CLASS";
RegisterClassA(&WndClass);
}
v4 = hInstance;
*(DWORD *)(v3 + 8) = 0;
v5 = CreateWindowExA(0, "3DPB_SPLASH_CLASS", WindowName, 0x80000000, -10, -10, 1, 1, 0, 0, v4, 0);
*(DWORD *)v3 = v5;
if ( !v5 )
{
memoryfree(v3);
return 0;
}
SetWindowLongA(v5, 0, v3);
v7 = GetDesktopWindow();
GetWindowRect(v7, &Rect);
splash_bitmap_setup(v3);
MoveWindow(*(HWND *)v3, 0, 0, Rect.right - Rect.left, Rect.bottom - Rect.top, 0);
ShowWindow(*(HWND *)v3, 8);
SetFocus(*(HWND *)v3);
UpdateWindow(*(HWND *)v3);
return v3;
}