windows-nt/Source/XPSP1/NT/shell/osshell/control/scrnsave/dolphin/dxinit.cpp
2020-09-26 16:20:57 +08:00

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);
}
}