// // Created by neo on 2019-08-15. // #include "../pinball.h" //----- (01003803) -------------------------------------------------------- int grtext_draw_ttext_in_box(LPCSTR lpString, int mode, int a3, COLORREF color, int a5, int a6) { HDC v6; // ebx CHAR *v7; // eax unsigned int v8; // ax int v9; // eax struct tagRECT rc; // [esp+Ch] [ebp-10h] int modea; // [esp+28h] [ebp+Ch] COLORREF colora; // [esp+30h] [ebp+14h] v6 = _GetDC(gdrv_hwnd); rc.left = mode; rc.right = color + mode; rc.top = a3; rc.bottom = a5 + a3; if ( grtext_red < 0 ) { grtext_blue = 255; grtext_green = 255; grtext_red = 255; v7 = get_rc_string(189, 0); if ( v7 ) _sscanf(v7, "%d %d %d", &grtext_red, &grtext_green, &grtext_blue); } modea = SetBkMode(v6, 1); HIBYTE(v8) = grtext_blue; LOBYTE(v8) = grtext_green; colora = SetTextColor(v6, (unsigned __int8)grtext_red | (v8 << 8)); v9 = lstrlenA(lpString); DrawTextA(v6, lpString, v9, &rc, 0x810u); SetBkMode(v6, modea); SetTextColor(v6, colora); return ReleaseDC(gdrv_hwnd, v6); } // 1023050: using guessed type int grtext_red; // 1028290: using guessed type int grtext_blue; // 1028294: using guessed type int grtext_green; //----- (01004154) -------------------------------------------------------- int DibSetUsage(int a1, HPALETTE hpal, int a3) { signed int v4; // edi unsigned int v5; // cx char *v6; // esi signed int i; // eax _BYTE *v8; // eax BYTE v9; // bl struct tagPALETTEENTRY pPalEntries[256]; // [esp+4h] [ebp-400h] HPALETTE hpala; // [esp+410h] [ebp+Ch] if ( !hpal ) hpal = (HPALETTE)GetStockObject(15); if ( !a1 ) return 0; v4 = *(DWORD *)(a1 + 32); if ( !v4 ) { v5 = *(WORD *)(a1 + 14); if ( v5 <= 8u ) v4 = 1 << v5; } if ( v4 == 3 ) { if ( *(DWORD *)(a1 + 16) != 3 ) { LABEL_12: v6 = (char *)(a1 + *(DWORD *)a1); if ( (unsigned int)a3 <= 0 || (unsigned int)a3 > 2 ) { if ( v4 >= 256 ) v4 = 256; GetPaletteEntries(hpal, 0, v4, pPalEntries); hpala = 0; if ( v4 > 0 ) { v8 = v6 + 1; do { v9 = pPalEntries[(DWORD)hpala].peRed; hpala = (HPALETTE)((char *)hpala + 1); v8[1] = v9; *v8 = v8[(char *)pPalEntries - v6]; *(v8 - 1) = v8[&pPalEntries[0].peGreen - (BYTE *)v6]; v8[2] = 0; v8 += 4; } while ( (signed int)hpala < v4 ); } } else { for ( i = 0; i < v4; v6 += 2 ) *(WORD *)v6 = i++; } return 1; } v4 = 0; } if ( v4 > 0 ) goto LABEL_12; return 1; } // 1004154: using guessed type struct tagPALETTEENTRY pPalEntries[256]; //----- (0100423A) -------------------------------------------------------- DWORD *DibCreate(int a1, int a2, int a3) { unsigned int v3; // edi HGLOBAL v4; // eax DWORD *v5; // esi DWORD *result; // eax DWORD *i; // ecx DWORD *v8; // ecx int v9; // [esp+18h] [ebp+Ch] v3 = a3 * ((a2 * a1 / 8 + 3) & 0xFFFFFFFC); v4 = GlobalAlloc(0x42u, v3 + 1064); v5 = GlobalLock(v4); result = 0; if ( v5 ) { v5[5] = v3; v5[1] = a2; *v5 = 40; v5[2] = a3; *((WORD *)v5 + 6) = 1; *((WORD *)v5 + 7) = a1; v5[4] = 0; v5[6] = 0; v5[7] = 0; v5[8] = 0; v5[9] = 0; if ( a1 == 4 ) { v5[8] = 16; } else if ( a1 == 8 ) { v5[8] = 256; } v9 = 0; for ( i = v5 + 10; v9 < v5[8] / 16; ++v9 ) { *i = 0; v8 = i + 1; *v8 = 0x800000; ++v8; *v8 = 0x8000; ++v8; *v8 = 8421376; ++v8; *v8 = 128; ++v8; *v8 = 8388736; ++v8; *v8 = 32896; ++v8; *v8 = 12632256; ++v8; *v8 = 8421504; ++v8; *v8 = 16711680; ++v8; *v8 = 65280; ++v8; *v8 = 16776960; ++v8; *v8 = 255; ++v8; *v8 = 16711935; ++v8; *v8 = 0xFFFF; ++v8; *v8 = 0xFFFFFF; i = v8 + 1; } result = v5; } return result; } //----- (01004380) -------------------------------------------------------- int gdrv_init(int a1, HWND a2) { gdrv_hinst = a1; gdrv_hwnd = a2; if ( !gdrv_palette_handle ) gdrv_palette_handle = CreatePalette(¤t_palette); return 0; } // 1028284: using guessed type int gdrv_hinst; //----- (010043B9) -------------------------------------------------------- int gdrv_display_palette(int a1) { HWND v1; // eax HDC v2; // eax HDC v3; // ebx HPALETTE v4; // edi BYTE *v5; // eax int v6; // ecx BYTE *v7; // eax HWND v8; // eax HDC v10; // [esp+0h] [ebp-14h] signed int v11; // [esp+4h] [ebp-10h] char *v12; // [esp+1Ch] [ebp+8h] if ( gdrv_palette_handle ) DeleteObject(gdrv_palette_handle); gdrv_palette_handle = CreatePalette(¤t_palette); v1 = GetDesktopWindow(); v2 = _GetDC(v1); v3 = v2; v10 = v2; SetSystemPaletteUse(v2, 2u); SetSystemPaletteUse(v3, 1u); v4 = SelectPalette(v3, (HPALETTE)gdrv_palette_handle, 0); RealizePalette(v3); SelectPalette(v3, v4, 0); GetSystemPaletteEntries(v3, 0, 0x100u, &pPalEntries); v5 = &pPalEntries.peFlags; do { *v5 = 0; v5 += 4; } while ( (signed int)v5 < (signed int)&unk_102345F ); v6 = a1; v12 = (char *)&unk_102305B - a1; v7 = (BYTE *)(v6 + 41); v11 = 236; do { if ( v6 ) { v7[(DWORD)v12] = v7[1]; v7[(DWORD)&pPalEntries - v6] = *v7; v7[(DWORD)((char *)&pPalEntries - v6 + 1)] = *(v7 - 1); v3 = v10; } v7[(DWORD)((char *)&pPalEntries - v6 + 2)] = 4; v7 += 4; --v11; } while ( v11 ); if ( !(GetDeviceCaps(v3, 38) & 0x100) ) { byte_102345A = -1; byte_1023459 = -1; byte_1023458 = -1; } ResizePalette((HPALETTE)gdrv_palette_handle, 0x100u); SetPaletteEntries((HPALETTE)gdrv_palette_handle, 0, 0x100u, &pPalEntries); v8 = GetDesktopWindow(); ReleaseDC(v8, v3); return 0; } // 1023458: using guessed type char byte_1023458; // 1023459: using guessed type char byte_1023459; // 102345A: using guessed type char byte_102345A; //----- (01004508) -------------------------------------------------------- int gdrv_uninit() { if ( gdrv_palette_handle ) DeleteObject(gdrv_palette_handle); return 0; } //----- (01004520) -------------------------------------------------------- int gdrv_create_bitmap_dib(int a1, int a2, int a3) { int v3; // edi DWORD *v4; // eax DWORD *v5; // eax int v6; // ecx v3 = a2; v4 = DibCreate(8, a2, a3); *(DWORD *)a1 = v4; DibSetUsage((int)v4, (HPALETTE)gdrv_palette_handle, 1); *(DWORD *)(a1 + 12) = a2; *(DWORD *)(a1 + 20) = a2; if ( a2 % 4 ) v3 = 4 - a2 % 4 + a2; v5 = *(DWORD **)a1; *(DWORD *)(a1 + 20) = v3; *(DWORD *)(a1 + 16) = a3; *(_BYTE *)(a1 + 24) = 2; if ( v5[4] == 3 ) v6 = (int)v5 + *v5 + 12; else v6 = (int)&v5[v5[8]] + *v5; *(DWORD *)(a1 + 8) = v6; *(DWORD *)(a1 + 4) = v6; return 0; } //----- (0100459A) -------------------------------------------------------- int gdrv_create_bitmap(int a1, int a2, int a3) { return gdrv_create_bitmap_dib(a1, a2, a3); } //----- (010045AA) -------------------------------------------------------- signed int gdrv_create_raw_bitmap(int a1, int a2, int a3, int a4) { unsigned int v4; // ST04_4 int v5; // eax *(DWORD *)a1 = 0; *(DWORD *)(a1 + 12) = a2; *(DWORD *)(a1 + 20) = a2; if ( a4 && a2 % 4 ) *(DWORD *)(a1 + 20) = a2 - a2 % 4 + 4; v4 = a3 * *(DWORD *)(a1 + 20); *(DWORD *)(a1 + 16) = a3; *(_BYTE *)(a1 + 24) = 1; v5 = memoryallocate(v4); *(DWORD *)(a1 + 8) = v5; if ( !v5 ) return -1; *(DWORD *)(a1 + 4) = v5; return 0; } //----- (0100460C) -------------------------------------------------------- signed int gdrv_destroy_bitmap(int a1) { HGLOBAL v2; // eax HGLOBAL v3; // eax if ( !a1 ) return -1; if ( *(_BYTE *)(a1 + 24) == 1 ) { memoryfree(*(DWORD *)(a1 + 8)); } else if ( *(_BYTE *)(a1 + 24) == 2 ) { v2 = GlobalHandle(*(LPCVOID *)a1); GlobalUnlock(v2); v3 = GlobalHandle(*(LPCVOID *)a1); GlobalFree(v3); } memset((void *)a1, 0, 0x24u); *(_BYTE *)(a1 + 36) = 0; return 0; } //----- (01004664) -------------------------------------------------------- UINT gdrv_start_blit_sequence() { HDC v0; // eax v0 = _GetDC(gdrv_hwnd); gdrv_sequence_handle = 0; gdrv_sequence_hdc = v0; SelectPalette(v0, (HPALETTE)gdrv_palette_handle, 0); return RealizePalette(gdrv_sequence_hdc); } // 102828C: using guessed type int gdrv_sequence_handle; //----- (0100469C) -------------------------------------------------------- int gdrv_blit_sequence(int a1, int xSrc, int a3, int xDest, int yDest, int DestWidth, int DestHeight) { int result; // eax if ( !gdrv_use_wing ) result = StretchDIBits( gdrv_sequence_hdc, xDest, yDest, DestWidth, DestHeight, xSrc, *(DWORD *)(a1 + 16) - a3 - DestHeight, DestWidth, DestHeight, *(const void **)(a1 + 8), *(const BITMAPINFO **)a1, 1u, 0xCC0020u); return result; } // 1024EFC: using guessed type int gdrv_use_wing; //----- (010046ED) -------------------------------------------------------- int gdrv_end_blit_sequence() { return ReleaseDC(gdrv_hwnd, gdrv_sequence_hdc); } //----- (01004705) -------------------------------------------------------- HDC gdrv_blit(int a1, int xSrc, int a3, int xDest, int yDest, int DestWidth, int DestHeight) { HDC result; // eax HDC v8; // esi result = _GetDC(gdrv_hwnd); v8 = result; if ( result ) { SelectPalette(result, (HPALETTE)gdrv_palette_handle, 0); RealizePalette(v8); if ( !gdrv_use_wing ) StretchDIBits( v8, xDest, yDest, DestWidth, DestHeight, xSrc, *(DWORD *)(a1 + 16) - a3 - DestHeight, DestWidth, DestHeight, *(const void **)(a1 + 8), *(const BITMAPINFO **)a1, 1u, 0xCC0020u); result = (HDC)ReleaseDC(gdrv_hwnd, v8); } return result; } // 1024EFC: using guessed type int gdrv_use_wing; //----- (01004787) -------------------------------------------------------- int gdrv_blat(int a1, int xDest, int yDest) { HDC v3; // edi v3 = _GetDC(gdrv_hwnd); SelectPalette(v3, (HPALETTE)gdrv_palette_handle, 0); RealizePalette(v3); if ( !gdrv_use_wing ) StretchDIBits( v3, xDest, yDest, *(DWORD *)(a1 + 12), *(DWORD *)(a1 + 16), 0, 0, *(DWORD *)(a1 + 12), *(DWORD *)(a1 + 16), *(const void **)(a1 + 8), *(const BITMAPINFO **)a1, 1u, 0xCC0020u); return ReleaseDC(gdrv_hwnd, v3); } // 1024EFC: using guessed type int gdrv_use_wing; //----- (010047FA) -------------------------------------------------------- int gdrv_fill_bitmap(int a1, DWORD *a2, unsigned int a3, int a4, int a5, int a6, char a7) { DWORD *v7; // esi int v8; // eax int result; // eax unsigned int v10; // ecx char v11; // dl unsigned int v12; // ecx int v13; // eax char *v14; // [esp+Ch] [ebp+8h] v7 = a2; v8 = a2[4]; if ( v8 < 0 ) v8 = -v8; result = a5 + a2[2] + a2[3] * (v8 - a4 - a6); v14 = (char *)result; if ( a4 > 0 ) { v10 = a3; do { if ( (signed int)v10 > 0 ) { LOBYTE(a1) = a7; BYTE1(a1) = a7; v11 = v10; v12 = v10 >> 2; v13 = a1 << 16; LOWORD(v13) = a1; memset32(v14, v13, v12); memset(&v14[4 * v12], a7, v11 & 3); v10 = a3; v14 += a3; } result = v7[5] - v10; v14 += result; --a4; } while ( a4 ); } return result; } //----- (01004870) -------------------------------------------------------- char *gdrv_copy_bitmap(DWORD *a1, int a2, int a3, int a4, int a5, DWORD *a6, int a7, int a8) { DWORD *v8; // edx int v9; // ecx DWORD *v10; // esi int v11; // eax char *result; // eax _BYTE *v13; // ecx char v14; // bl int v15; // [esp+10h] [ebp+8h] int v16; // [esp+24h] [ebp+1Ch] v8 = a1; v9 = a1[4]; v10 = a6; v11 = a6[4]; if ( v11 < 0 ) v11 = -v11; if ( v9 < 0 ) v9 = -v9; result = (char *)(a7 + a6[2] + a6[5] * (v11 - a3 - a8)); v13 = (_BYTE *)(a4 + a1[2] + a1[5] * (v9 - a3 - a5)); if ( a3 > 0 ) { v16 = a3; do { if ( a2 > 0 ) { v15 = a2; do { v14 = *result++; *v13++ = v14; --v15; } while ( v15 ); } result += v10[5] - a2; v13 += v8[5] - a2; --v16; } while ( v16 ); } return result; } //----- (010048EC) -------------------------------------------------------- _BYTE *gdrv_copy_bitmap_w_transparency(DWORD *a1, int a2, int a3, int a4, int a5, DWORD *a6, int a7, int a8) { DWORD *v8; // edx int v9; // ecx DWORD *v10; // esi int v11; // eax _BYTE *result; // eax _BYTE *v13; // ecx int v14; // [esp+10h] [ebp+8h] int v15; // [esp+24h] [ebp+1Ch] v8 = a1; v9 = a1[4]; v10 = a6; v11 = a6[4]; if ( v11 < 0 ) v11 = -v11; if ( v9 < 0 ) v9 = -v9; result = (_BYTE *)(a7 + a6[2] + a6[5] * (v11 - a3 - a8)); v13 = (_BYTE *)(a4 + a1[2] + a1[5] * (v9 - a3 - a5)); if ( a3 > 0 ) { v15 = a3; do { if ( a2 > 0 ) { v14 = a2; do { if ( *result ) *v13 = *result; ++result; ++v13; --v14; } while ( v14 ); } result += v10[5] - a2; v13 += v8[5] - a2; --v15; } while ( v15 ); } return result; } //----- (01003F10) -------------------------------------------------------- HBRUSH sub_1003F10(LONG a1, LONG a2, int a3, int a4) { HBRUSH result; // eax HDC v5; // esi RECT rc; // [esp+0h] [ebp-18h] HGDIOBJ v7; // [esp+10h] [ebp-8h] HGDIOBJ h; // [esp+14h] [ebp-4h] result = CreateSolidBrush(0); h = result; if ( result ) { v5 = _GetDC(hWnd); v7 = SelectObject(v5, h); if ( v5 ) { rc.right = a3 + a1 + 1; rc.bottom = a4 + a2 + 1; rc.left = a1; rc.top = a2; FillRect(v5, &rc, (HBRUSH)h); ReleaseDC(hWnd, v5); } SelectObject(v5, v7); result = (HBRUSH)DeleteObject(h); } return result; } //----- (0100496C) -------------------------------------------------------- int zdrv_pad(int a1) { int result; // eax result = a1; if ( a1 & 3 ) result = a1 - (a1 & 3) + 4; return result; } //----- (01004989) -------------------------------------------------------- signed int zdrv_create_zmap(int a1, int a2, int a3) { int v3; // ax int v4; // eax v3 = zdrv_pad(a2); *(WORD *)(a1 + 4) = v3; v4 = memoryallocate(2 * a3 * v3); *(DWORD *)(a1 + 6) = v4; if ( !v4 ) return -1; *(DWORD *)(a1 + 10) = v4; *(WORD *)a1 = a2; *(WORD *)(a1 + 2) = a3; return 0; } //----- (010049D6) -------------------------------------------------------- signed int zdrv_destroy_zmap(DWORD *a1) { int v2; // edi if ( !a1 ) return -1; if ( *(DWORD *)((char *)a1 + 6) ) memoryfree(*(DWORD *)((char *)a1 + 6)); *a1 = 0; a1[1] = 0; v2 = (int)(a1 + 2); *(DWORD *)v2 = 0; *(WORD *)(v2 + 4) = 0; return 0; } //----- (01004A08) -------------------------------------------------------- int zdrv_fill(int a1, int a2, unsigned int a3, int a4, int a5, int a6, int a7) { int result; // eax int v8; // esi char *v9; // edx unsigned int v10; // ecx unsigned __int8 v11; // cf unsigned int v12; // ecx char *v13; // edi int i; // ecx bool v15; // zf int v16; // [esp+Ch] [ebp+8h] result = a4; v8 = a2; v9 = (char *)(*(DWORD *)(a2 + 6) + 2 * (a5 + *(signed int *)(a2 + 4) * (*(signed int *)(a2 + 2) - a4 - a6))); if ( a4 > 0 ) { v10 = a3; v16 = a4; do { if ( (signed int)v10 > 0 ) { LOWORD(a1) = a7; a1 <<= 16; LOWORD(a1) = a7; v11 = v10 & 1; v12 = v10 >> 1; memset32(v9, a1, v12); v13 = &v9[4 * v12]; for ( i = v11; i; --i ) { *(WORD *)v13 = a7; v13 += 2; } v10 = a3; v9 += 2 * a3; } result = *(signed int *)(v8 + 4) - v10; v15 = v16-- == 1; v9 += 2 * result; } while ( !v15 ); } return result; } //----- (01004A76) -------------------------------------------------------- WORD *zdrv_paint(int a1, int a2, DWORD *a3, int a4, int a5, int a6, int a7, int a8, DWORD *a9, int a10, int a11, int a12, int a13, int a14) { int v14; // ecx DWORD *v15; // ebx int v16; // eax WORD *v17; // edi WORD *result; // eax bool v19; // zf int v20; // [esp+18h] [ebp+Ch] int v21; // [esp+24h] [ebp+18h] _BYTE *v22; // [esp+38h] [ebp+2Ch] _BYTE *v23; // [esp+3Ch] [ebp+30h] v14 = a3[4]; v15 = a9; v16 = a9[4]; if ( v16 < 0 ) v16 = -v16; if ( v14 < 0 ) v14 = -v14; v23 = (_BYTE *)(a10 + a9[2] + a9[5] * (v16 - a2 - a11)); v22 = (_BYTE *)(a4 + a3[2] + a3[5] * (v14 - a2 - a5)); v17 = (WORD *)(*(DWORD *)(a12 + 6) + 2 * (a13 + *(signed int *)(a12 + 4) * (*(signed int *)(a12 + 2) - a2 - a14))); result = (WORD *)(*(DWORD *)(a6 + 6) + 2 * (a7 + *(signed int *)(a6 + 4) * (*(signed int *)(a6 + 2) - a2 - a8))); if ( a2 ) { v21 = a2; while ( 1 ) { if ( a1 ) { v20 = a1; do { if ( *result >= *v17 ) { *v22 = *v23; v15 = a9; *result = *v17; } ++v23; ++v22; ++v17; ++result; --v20; } while ( v20 ); } v23 += v15[5] - a1; v22 += a3[5] - a1; v17 += *(signed int *)(a12 + 4) - a1; v19 = v21-- == 1; result += *(signed int *)(a6 + 4) - a1; if ( v19 ) break; v15 = a9; } } return result; } //----- (01004B75) -------------------------------------------------------- unsigned int *zdrv_paint_flat(int a1, int a2, DWORD *a3, int a4, int a5, int a6, int a7, int a8, DWORD *a9, int a10, int a11, unsigned int a12) { DWORD *v12; // esi int v13; // ecx DWORD *v14; // edi int v15; // eax int v16; // ecx unsigned int *result; // eax bool v18; // zf int v19; // [esp+18h] [ebp+Ch] _BYTE *v20; // [esp+1Ch] [ebp+10h] _BYTE *v21; // [esp+34h] [ebp+28h] int v22; // [esp+3Ch] [ebp+30h] v12 = a3; v13 = a3[4]; v14 = a9; v15 = a9[4]; if ( v15 < 0 ) v15 = -v15; if ( v13 < 0 ) v13 = -v13; v16 = a3[2] + a3[5] * (v13 - a2 - a5); v20 = (_BYTE *)(a10 + a9[2] + a9[5] * (v15 - a2 - a11)); v21 = (_BYTE *)(a4 + v16); result = (unsigned int *)(*(DWORD *)(a6 + 6) + 2 * (a7 + *(signed int *)(a6 + 4) * (*(signed int *)(a6 + 2) - a2 - a8))); if ( a2 > 0 ) { v22 = a2; do { if ( a1 > 0 ) { v19 = a1; do { if ( *v20 ) { if ( *result > a12 ) *v21 = *v20; } ++v20; ++v21; ++result; --v19; } while ( v19 ); } v20 += v14[5] - a1; v21 += v12[5] - a1; v18 = v22-- == 1; result += *(signed int *)(a6 + 4) - a1; } while ( !v18 ); } return result; }