// 删除表面 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); }
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; }
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; }
static HRESULT WINAPI IDirectDraw4Impl_RestoreDisplayMode(LPDIRECTDRAW4 This) { return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This)); }
// 创建 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; }