/* * UNPUBLISHED -- Rights reserved under the copyright laws of the * United States. Use of a copyright notice is precautionary only and * does not imply publication or disclosure. * * THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION * OF BLIZZARD ENTERTAINMENT. ANY DUPLICATION, MODIFICATION, * DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR * EXPRESS WRITTEN PERMISSION OF BLIZZARD ENTERTAINMENT. */ #include "../types.h" void *sgpBackBuf; int dx_cpp_init_value; // weak IDirectDraw *lpDDInterface; IDirectDrawPalette *lpDDPalette; // idb int sgdwLockCount; Screen *gpBuffer; IDirectDrawSurface *lpDDSBackBuf; IDirectDrawSurface *lpDDSPrimary; static CRITICAL_SECTION sgMemCrit; char gbBackBuf; // weak char gbEmulate; // weak HMODULE ghDiabMod; // idb int dx_inf = 0x7F800000; // weak //----- (00415367) -------------------------------------------------------- struct dx_cpp_init_1 { dx_cpp_init_1() { dx_cpp_init_value = dx_inf; } } _dx_cpp_init_1; // 47A464: using guessed type int dx_inf; // 52A514: using guessed type int dx_cpp_init_value; //----- (00415372) -------------------------------------------------------- struct dx_cpp_init_2 { dx_cpp_init_2() { dx_init_mutex(); dx_cleanup_mutex_atexit(); } } _dx_cpp_init_2; //----- (0041537C) -------------------------------------------------------- void __cdecl dx_init_mutex() { InitializeCriticalSection(&sgMemCrit); } //----- (00415388) -------------------------------------------------------- void __cdecl dx_cleanup_mutex_atexit() { atexit(dx_cleanup_mutex); } //----- (00415394) -------------------------------------------------------- void __cdecl dx_cleanup_mutex() { DeleteCriticalSection(&sgMemCrit); } //----- (004153A0) -------------------------------------------------------- void __fastcall dx_init(HWND hWnd) { HWND v1; // esi GUID *v2; // ecx int v3; // eax int v4; // eax //int v5; // ecx int v6; // edi int v7; // eax int v8; // eax HWND hWnda; // [esp+1Ch] [ebp-4h] v1 = hWnd; hWnda = hWnd; SetFocus(hWnd); ShowWindow(v1, SW_SHOWNORMAL); v2 = NULL; if ( gbEmulate ) v2 = (GUID *)DDCREATE_EMULATIONONLY; v3 = dx_DirectDrawCreate(v2, &lpDDInterface, NULL); if ( v3 ) TermDlg(104, v3, "C:\\Src\\Diablo\\Source\\dx.cpp", 149); fullscreen = 1; v4 = IDirectDraw_SetCooperativeLevel(lpDDInterface, v1, DDSCL_EXCLUSIVE|DDSCL_ALLOWREBOOT|DDSCL_FULLSCREEN); if ( v4 == DDERR_EXCLUSIVEMODEALREADYSET ) { MI_Dummy(0); // v5 } else if ( v4 ) { TermDlg(104, v4, "C:\\Src\\Diablo\\Source\\dx.cpp", 170); } if ( IDirectDraw_SetDisplayMode(lpDDInterface, 640, 480, 8) ) { v6 = GetSystemMetrics(SM_CXSCREEN); v7 = GetSystemMetrics(SM_CYSCREEN); v8 = IDirectDraw_SetDisplayMode(lpDDInterface, v6, v7, 8); if ( v8 ) TermDlg(104, v8, "C:\\Src\\Diablo\\Source\\dx.cpp", 183); } dx_create_primary_surface(); palette_init(); GdiSetBatchLimit(1); dx_create_back_buffer(); SDrawManualInitialize(hWnda, lpDDInterface, lpDDSPrimary, 0, 0, lpDDSBackBuf, lpDDPalette, 0); } // 484364: using guessed type int fullscreen; // 52A549: using guessed type char gbEmulate; //----- (004154B5) -------------------------------------------------------- void __cdecl dx_create_back_buffer() { int v0; // eax int v1; // eax int v2; // eax int v3; // eax DDSURFACEDESC v4; // [esp+Ch] [ebp-70h] DDSCAPS v5; // [esp+78h] [ebp-4h] v0 = IDirectDrawSurface_GetCaps(lpDDSPrimary, &v5); if ( v0 ) DDErrDlg(v0, 59, "C:\\Src\\Diablo\\Source\\dx.cpp"); if ( !gbBackBuf ) { v4.dwSize = 108; v1 = IDirectDrawSurface_Lock(lpDDSPrimary, NULL, &v4, DDLOCK_WRITEONLY|DDLOCK_WAIT, NULL); if ( !v1 ) { IDirectDrawSurface_Unlock(lpDDSPrimary, NULL); sgpBackBuf = DiabloAllocPtr(0x7B000); return; } if ( v1 != DDERR_CANTLOCKSURFACE ) TermDlg(104, v1, "C:\\Src\\Diablo\\Source\\dx.cpp", 81); } memset(&v4, 0, 0x6Cu); v4.dwWidth = 768; v4.lPitch = 768; v4.dwSize = 108; v4.dwFlags = DDSD_PIXELFORMAT|DDSD_PITCH|DDSD_WIDTH|DDSD_HEIGHT|DDSD_CAPS; v4.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; v4.dwHeight = 656; v4.ddpfPixelFormat.dwSize = 32; v2 = IDirectDrawSurface_GetPixelFormat(lpDDSPrimary, &v4.ddpfPixelFormat); if ( v2 ) TermDlg(104, v2, "C:\\Src\\Diablo\\Source\\dx.cpp", 94); v3 = IDirectDraw_CreateSurface(lpDDInterface, &v4, &lpDDSBackBuf, NULL); if ( v3 ) TermDlg(104, v3, "C:\\Src\\Diablo\\Source\\dx.cpp", 96); } // 52A548: using guessed type char gbBackBuf; //----- (004155C2) -------------------------------------------------------- void __cdecl dx_create_primary_surface() { int v0; // eax DDSURFACEDESC v1; // [esp+0h] [ebp-6Ch] memset(&v1, 0, 0x6Cu); v1.dwSize = 108; v1.dwFlags = DDSD_CAPS; v1.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; v0 = IDirectDraw_CreateSurface(lpDDInterface, &v1, &lpDDSPrimary, NULL); if ( v0 ) TermDlg(104, v0, "C:\\Src\\Diablo\\Source\\dx.cpp", 109); } //----- (0041561A) -------------------------------------------------------- HRESULT __fastcall dx_DirectDrawCreate(GUID *guid, IDirectDraw **DD, void *unknown) { IDirectDraw **v3; // ebp int v4; // eax FARPROC v5; // ebx int v6; // eax GUID *v8; // [esp+10h] [ebp-4h] v3 = DD; v8 = guid; if ( !ghDiabMod ) { ghDiabMod = LoadLibraryA("ddraw.dll"); if ( !ghDiabMod ) { v4 = GetLastError(); TermDlg(107, v4, "C:\\Src\\Diablo\\Source\\dx.cpp", 122); } } v5 = GetProcAddress(ghDiabMod, "DirectDrawCreate"); if ( !v5 ) { v6 = GetLastError(); TermDlg(107, v6, "C:\\Src\\Diablo\\Source\\dx.cpp", 127); } return ((int (__stdcall *)(GUID *, IDirectDraw **, void *))v5)(v8, v3, unknown); } //----- (0041569A) -------------------------------------------------------- void __cdecl dx_lock_mutex() { Screen *v0; // eax int v1; // eax DDSURFACEDESC v2; // [esp+0h] [ebp-6Ch] EnterCriticalSection(&sgMemCrit); v0 = (Screen *)sgpBackBuf; if ( sgpBackBuf ) goto LABEL_8; if ( lpDDSBackBuf ) { if ( sgdwLockCount ) goto LABEL_9; v2.dwSize = 108; v1 = IDirectDrawSurface_Lock(lpDDSBackBuf, NULL, &v2, DDLOCK_WAIT, NULL); if ( v1 ) DDErrDlg(v1, 235, "C:\\Src\\Diablo\\Source\\dx.cpp"); v0 = (Screen *)v2.lpSurface; screen_buf_end += (int)v2.lpSurface; LABEL_8: gpBuffer = v0; goto LABEL_9; } Sleep(20000); TermMsg("lock_buf_priv"); LABEL_9: ++sgdwLockCount; } // 69CF0C: using guessed type int screen_buf_end; //----- (00415725) -------------------------------------------------------- void __cdecl dx_unlock_mutex() { Screen *v0; // eax int v1; // eax if ( !sgdwLockCount ) TermMsg("draw main unlock error"); if ( !gpBuffer ) TermMsg("draw consistency error"); if ( !--sgdwLockCount ) { v0 = gpBuffer; gpBuffer = 0; screen_buf_end -= (signed int)v0; if ( !sgpBackBuf ) { v1 = IDirectDrawSurface_Unlock(lpDDSBackBuf, NULL); if ( v1 ) DDErrDlg(v1, 273, "C:\\Src\\Diablo\\Source\\dx.cpp"); } } LeaveCriticalSection(&sgMemCrit); } // 69CF0C: using guessed type int screen_buf_end; //----- (004157A0) -------------------------------------------------------- void __cdecl dx_cleanup() { void *v0; // ecx if ( ghMainWnd ) ShowWindow(ghMainWnd, SW_HIDE); SDrawDestroy(); EnterCriticalSection(&sgMemCrit); if ( sgpBackBuf ) { v0 = sgpBackBuf; sgpBackBuf = 0; mem_free_dbg(v0); } else if ( lpDDSBackBuf ) { IDirectDrawSurface_Release(lpDDSBackBuf); lpDDSBackBuf = 0; } sgdwLockCount = 0; gpBuffer = 0; LeaveCriticalSection(&sgMemCrit); if ( lpDDSPrimary ) { IDirectDrawSurface_Release(lpDDSPrimary); lpDDSPrimary = 0; } if ( lpDDPalette ) { IDirectDrawPalette_Release(lpDDPalette); lpDDPalette = 0; } if ( lpDDInterface ) { IDirectDraw_Release(lpDDInterface); lpDDInterface = 0; } } //----- (00415848) -------------------------------------------------------- void __cdecl dx_reinit() { int v0; // esi EnterCriticalSection(&sgMemCrit); ClearCursor(); v0 = sgdwLockCount; while ( sgdwLockCount ) dx_unlock_mutex(); dx_cleanup(); drawpanflag = 255; dx_init(ghMainWnd); for ( ; v0; --v0 ) dx_lock_mutex(); LeaveCriticalSection(&sgMemCrit); } // 52571C: using guessed type int drawpanflag;