|
|
/******************************Module*Header*******************************\
* Module Name: CDirect3D.cpp * * This file contains the code to support the functionality test harness * for GDI+. This includes menu options and calling the appropriate * functions for execution. * * Created: 05-May-2000 - Jeff Vezina [t-jfvez] * * Copyright (c) 2000 Microsoft Corporation * \**************************************************************************/ #include "CDirect3D.h"
#include "CFuncTest.h"
extern CFuncTest g_FuncTest;
CDirect3D::CDirect3D(BOOL bRegression) { strcpy(m_szName,"Direct3D"); m_paDD7=NULL; m_paDDSurf7=NULL; m_bRegression=bRegression; }
CDirect3D::~CDirect3D() { if (m_paDD7!=NULL) { m_paDD7->Release(); m_paDD7=NULL; } }
BOOL CDirect3D::Init() { #if HW_ACCELERATION_SUPPORT
if (DirectDrawCreateEx(NULL,(void **)&m_paDD7,IID_IDirectDraw7,NULL)!=DD_OK) return false;
if (gDD->SetCooperativeLevel(m_hWnd,DDSCL_NORMAL)!=DD_OK) return false; #endif
return COutput::Init(); }
Graphics *CDirect3D::PreDraw(int &nOffsetX,int &nOffsetY) { Graphics *g=NULL;
#if HW_ACCELERATION_SUPPORT
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE; ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; switch(depth) { case 32: ddsd.dwFlags |= DDSD_PIXELFORMAT; ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; ddsd.ddpfPixelFormat.dwRGBBitCount = 32; ddsd.ddpfPixelFormat.dwRBitMask = 0xFF0000; ddsd.ddpfPixelFormat.dwGBitMask = 0xFF00; ddsd.ddpfPixelFormat.dwBBitMask = 0xFF; break; case 16: ddsd.dwFlags |= DDSD_PIXELFORMAT; ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; ddsd.ddpfPixelFormat.dwRGBBitCount = 16; ddsd.ddpfPixelFormat.dwRBitMask = 0xEC00; ddsd.ddpfPixelFormat.dwGBitMask = 0x3E0; ddsd.ddpfPixelFormat.dwBBitMask = 0x1F; break; default: MessageBoxA(NULL, "Unsupprted depth for D3D", "", MB_OK); return; }
ddsd.dwWidth = (int)TESTAREAWIDTH; ddsd.dwHeight = (int)TESTAREAHEIGHT; HRESULT err; err = m_paDD7->CreateSurface(&ddsd, &dds, NULL); if(err != DD_OK) { MessageBoxA(NULL, "Unable to create surface", "", MB_OK); return; } HDC hdc; err = m_paDDSurf7->GetDC(&hdc); #if 0
if(err != DD_OK) { MessageBoxA(NULL, "Unable to get DC from DDraw surface", "", MB_OK); m_paDDSurf7->Release(); return; } g = Graphics::GetFromHdc(hdc); BitBlt(hdc, 0, 0, (int)TESTAREAWIDTH, (int)TESTAREAHEIGHT, NULL, 0, 0, WHITENESS); m_paDDSurf7->ReleaseDC(hdc); #else
BitBlt(hdc, 0, 0, (int)TESTAREAWIDTH, (int)TESTAREAHEIGHT, NULL, 0, 0, WHITENESS); m_paDDSurf7->ReleaseDC(hdc); bitmap = new Bitmap(dds); g = new Graphics(bitmap); #endif
// Since we are doing the test on another surface
nOffsetX=0; nOffsetY=0; #endif
return g; }
void CDirect3D::PostDraw(RECT rTestArea) { #if HW_ACCELERATION_SUPPORT
delete bitmap;
HRESULT err; HDC hdc; HDC hdcOrig = GetDC(g_FuncTest.m_hWndMain);
err = m_paDDSurf7->GetDC(&hdc); if(err == DD_OK) { BitBlt(hdcOrig, rTestArea.left, rTestArea.top, (int)TESTAREAWIDTH, (int)TESTAREAHEIGHT, hdc, 0, 0, SRCCOPY); } m_paDDSurf7->ReleaseDC(hdc); m_paDDSurf7->Release(); ReleaseDC(g_FuncTest.m_hWndMain, hdcOrig); #endif
}
|