Beispiel #1
0
// 删除表面
void DDrawSurfaceRelease(CSURFACE *surface)
{
	assert(surface);

	if (surface->clip) {
		IDirectDrawClipper_Release(surface->clip);
		surface->clip = NULL;
	}

	if (surface->lpDDS) {
		if (surface->lock) {
			IDirectDrawSurface7_Unlock(surface->lpDDS, NULL);
			surface->lock = 0;
		}
		if (IDirectDrawSurface7_IsLost(surface->lpDDS) != DD_OK) {
			IDirectDrawSurface7_Restore(surface->lpDDS);
		}
		IDirectDrawSurface7_Release(surface->lpDDS);
		surface->lpDDS = NULL;
		hSurfaceCounter--;
	}

	if (surface->primary) {
		if (lpDirectDraw7 && hFullScreenMode) {
			IDirectDraw7_RestoreDisplayMode(lpDirectDraw7);
		}
		hFullScreenMode = 0;
	}

	memset(surface, 0, sizeof(CSURFACE));
	free(surface);

	assert(hSurfaceCounter >= 0);
}
Beispiel #2
0
void renderer_dd::ddraw_delete()
{
	// free surfaces
	ddraw_delete_surfaces();

	// restore resolutions
	if (ddraw != NULL)
		IDirectDraw7_RestoreDisplayMode(ddraw);

	// reset cooperative level
	if (ddraw != NULL && window().m_hwnd != NULL)
		IDirectDraw7_SetCooperativeLevel(ddraw, window().m_hwnd, DDSCL_NORMAL);

	// release the DirectDraw object itself
	if (ddraw != NULL)
		IDirectDraw7_Release(ddraw);
	ddraw = NULL;
}
Beispiel #3
0
static void ddraw_delete(win_window_info *window)
{
	dd_info *dd = window->drawdata;

	// free surfaces
	ddraw_delete_surfaces(window);

	// restore resolutions
	if (dd->ddraw != NULL)
		IDirectDraw7_RestoreDisplayMode(dd->ddraw);

	// reset cooperative level
	if (dd->ddraw != NULL && window->hwnd != NULL)
		IDirectDraw7_SetCooperativeLevel(dd->ddraw, window->hwnd, DDSCL_NORMAL);

	// release the DirectDraw object itself
	if (dd->ddraw != NULL)
		IDirectDraw7_Release(dd->ddraw);
	dd->ddraw = NULL;
}
Beispiel #4
0
static HRESULT WINAPI
IDirectDraw4Impl_RestoreDisplayMode(LPDIRECTDRAW4 This)
{
    return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This));
}
Beispiel #5
0
// 创建 DirectDraw屏幕
// 如果 bpp为0的话则创建窗口模式,w,h失效,否则全屏幕
CSURFACE *DDrawCreateScreen(HWND hWnd, int w, int h, int bpp, HRESULT *HR)
{
	DDSURFACEDESC2 ddsd;
	CSURFACE *surface;
	HRESULT hr;

	if (lpDirectDraw7 == NULL) {
		if (DDrawInit() != 0) return NULL;
	}

	memset(&ddsd, 0, sizeof(ddsd));
	ddsd.dwSize = sizeof(ddsd);

	// 创建窗口模式
	if (bpp == 0) {
		hr = IDirectDraw7_SetCooperativeLevel(lpDirectDraw7, hWnd,
			DDSCL_NORMAL);

		if (hr != DD_OK) {
			fprintf(stderr, "DirectDraw: SetCooperativeLevel failed\n");
			fflush(stderr);
			if (HR) *HR = hr;
			return NULL;
		}

		ddsd.dwFlags = DDSD_CAPS;
		ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

		surface = DDrawCreateFromDesc(&ddsd, &hr);

		if (surface == NULL) {
			fprintf(stderr, "DirectDraw: Create Primary Surface failed\n");
			fflush(stderr);
			if (HR) *HR = hr;
			return NULL;
		}

		hr = IDirectDraw7_CreateClipper(lpDirectDraw7, 0, &surface->clip, 0);
		if (hr != DD_OK) {
			fprintf(stderr, "DirectDraw: Create Clipper failed\n");
			fflush(stderr);
			if (HR) *HR = hr;
			surface->clip = NULL;
			DDrawSurfaceRelease(surface);
			return NULL;
		}

		hr = IDirectDrawClipper_SetHWnd(surface->clip, 0, hWnd);
		if (hr != DD_OK) {
			fprintf(stderr, "DirectDraw: SetHWnd failed\n");
			fflush(stderr);
			if (HR) *HR = hr;
			DDrawSurfaceRelease(surface);
			return NULL;
		}

		hr = IDirectDrawSurface7_SetClipper(surface->lpDDS, surface->clip);
		if (hr != DD_OK) {
			fprintf(stderr, "DirectDraw: SetClipper failed\n");
			fflush(stderr);
			if (HR) *HR = hr;
			DDrawSurfaceRelease(surface);
			return NULL;
		}
	}	
	else {	// 创建全屏模式
		DWORD dwFlags;
		
		if (hFullScreenMode) {
			fprintf(stderr, "DirectDraw: Already in Full Screen Mode\n");
			fflush(stderr);
			return NULL;
		}

		dwFlags = DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT | 
			DDSCL_ALLOWMODEX;

		hr = IDirectDraw7_SetCooperativeLevel(lpDirectDraw7, hWnd, dwFlags);
		if (hr != DD_OK) {
			fprintf(stderr, "DirectDraw: SetCooperativeLevel failed\n");
			fflush(stderr);
			if (HR) *HR = hr;
			return NULL;
		}

		hr = IDirectDraw7_SetDisplayMode(lpDirectDraw7, w, h, bpp, 0,
			DDSDM_STANDARDVGAMODE);

		if (hr != DD_OK) {
			fprintf(stderr, "DirectDraw: SetDisplayMode failed\n");
			fflush(stderr);
			if (HR) *HR = hr;
			return NULL;
		}

		ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
		ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | 
			DDSCAPS_COMPLEX;
		ddsd.dwBackBufferCount = 1;

		surface = DDrawCreateFromDesc(&ddsd, &hr);

		if (surface == NULL) {
			fprintf(stderr, "DirectDraw: Create Primary Surface failed\n");
			fflush(stderr);
			IDirectDraw7_RestoreDisplayMode(lpDirectDraw7);
			if (HR) *HR = hr;
			return NULL;
		}

		hFullScreenMode = 1;
	}

	IDirectDraw7_GetDisplayMode(lpDirectDraw7, &ddsd);
	surface->primary = 1;
	surface->hWnd = hWnd;

	return surface;
}