83 lines
2.4 KiB
C++
83 lines
2.4 KiB
C++
#include "stdafx.h"
|
|
#include "DXSvr.h"
|
|
|
|
//***************************************************************************************
|
|
|
|
#define SAFE_RELEASE(p) if ((p)!=NULL) { (p)->Release(); (p)=NULL; };
|
|
|
|
//***************************************************************************************
|
|
|
|
IDirectDrawSurface7* g_pPrimarySurface = NULL;
|
|
IDirectDrawSurface7* g_pBackSurface = NULL;
|
|
IDirectDraw7* g_pDD = NULL;
|
|
IDirectDrawClipper* g_pClipper = NULL;
|
|
|
|
extern BOOL g_bWait;
|
|
|
|
//***************************************************************************************
|
|
BOOL InitD3D(HWND hWnd)
|
|
{
|
|
// Initialise X-Library
|
|
if (FAILED(D3DXInitialize()))
|
|
return FALSE;
|
|
|
|
if (FAILED(D3DXCreateContext(D3DX_DEFAULT , g_bIsPreview||g_bIsTest ? 0 : D3DX_CONTEXT_FULLSCREEN , hWnd ,
|
|
D3DX_DEFAULT , D3DX_DEFAULT , &g_pXContext)))
|
|
return FALSE;
|
|
|
|
g_pDevice = g_pXContext->GetD3DDevice();
|
|
g_pBackSurface = g_pXContext->GetBackBuffer(0);
|
|
g_pPrimarySurface = g_pXContext->GetPrimary();
|
|
g_pDD = g_pXContext->GetDD();
|
|
|
|
if (g_bIsPreview)
|
|
{
|
|
g_pDD->CreateClipper(0 , &g_pClipper , 0);
|
|
g_pClipper->SetHWnd(0 , g_hRefWindow);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//***************************************************************************************
|
|
void KillD3D()
|
|
{
|
|
SAFE_RELEASE(g_pClipper);
|
|
SAFE_RELEASE(g_pDD);
|
|
SAFE_RELEASE(g_pPrimarySurface);
|
|
SAFE_RELEASE(g_pBackSurface);
|
|
SAFE_RELEASE(g_pDevice);
|
|
SAFE_RELEASE(g_pXContext);
|
|
D3DXUninitialize();
|
|
}
|
|
|
|
//***************************************************************************************
|
|
void RestoreSurfaces()
|
|
{
|
|
g_pXContext->RestoreSurfaces();
|
|
}
|
|
|
|
//***************************************************************************************
|
|
void Flip()
|
|
{
|
|
if (g_pXContext == NULL)
|
|
return;
|
|
|
|
if (g_bIsPreview)
|
|
{
|
|
RECT rect;
|
|
GetClientRect(g_hRefWindow , &rect);
|
|
ClientToScreen(g_hRefWindow , (POINT*)&rect);
|
|
rect.right += rect.left; rect.bottom += rect.top;
|
|
g_pPrimarySurface->SetClipper(g_pClipper);
|
|
HRESULT rc;
|
|
if (FAILED(rc = g_pPrimarySurface->Blt(&rect , g_pBackSurface , NULL , DDBLT_WAIT , NULL)))
|
|
g_bWait = TRUE;
|
|
|
|
g_pDD->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN , NULL);
|
|
}
|
|
else
|
|
{
|
|
g_pXContext->UpdateFrame(0);
|
|
}
|
|
} |