void DestroyObjects(DDContext *dd) { RestoreWindow(dd); /*remove all surfaces*/ while (ChainGetCount(dd->surfaces)) { DDSurface *pS = ChainGetEntry(dd->surfaces, 0); ChainDeleteEntry(dd->surfaces, 0); SAFE_DD_RELEASE(pS->pSurface); free(pS); } SAFE_DD_RELEASE(dd->pPrimary); SAFE_DD_RELEASE(dd->pBack); SAFE_DD_RELEASE(dd->pDD); dd->ddraw_init = 0; /*delete openGL context*/ if (dd->gl_HRC) { wglDeleteContext(dd->gl_HRC); dd->gl_HRC = NULL; } if (dd->gl_HDC) { ReleaseDC(dd->hWnd, dd->gl_HDC); dd->gl_HDC = NULL; } }
M4Err GetDisplayMode(DDContext *dd) { if (dd->switch_res) { HRESULT hr; Bool temp_dd = 0;; if (!dd->pDD) { LPDIRECTDRAW ddraw; DirectDrawCreate(NULL, &ddraw, NULL); #ifdef USE_DX_3 IDirectDraw_QueryInterface(ddraw, &IID_IDirectDraw, (LPVOID *)&dd->pDD); #else IDirectDraw_QueryInterface(ddraw, &IID_IDirectDraw7, (LPVOID *)&dd->pDD); #endif temp_dd = 1; } //we start with a hugde res and downscale dd->fs_width = dd->fs_height = 50000; #ifdef USE_DX_3 hr = IDirectDraw_EnumDisplayModes(dd->pDD, 0L, NULL, dd, (LPDDENUMMODESCALLBACK) EnumDisplayModes); #else hr = IDirectDraw7_EnumDisplayModes(dd->pDD, 0L, NULL, dd, (LPDDENUMMODESCALLBACK2) EnumDisplayModes); #endif if (temp_dd) SAFE_DD_RELEASE(dd->pDD); if (FAILED(hr)) return M4IOErr; } else { dd->fs_width = GetSystemMetrics(SM_CXSCREEN); dd->fs_height = GetSystemMetrics(SM_CYSCREEN); } return M4OK; }
void DestroyObjectsEx(DDContext *dd, Bool only_3d) { if (!only_3d) { // RestoreWindow(dd); SAFE_DD_RELEASE(dd->rgb_pool.pSurface); memset(&dd->rgb_pool, 0, sizeof(DDSurface)); SAFE_DD_RELEASE(dd->yuv_pool.pSurface); memset(&dd->yuv_pool, 0, sizeof(DDSurface)); SAFE_DD_RELEASE(dd->pPrimary); SAFE_DD_RELEASE(dd->pBack); SAFE_DD_RELEASE(dd->pDD); dd->ddraw_init = 0; #ifdef GPAC_DISABLE_3D } #else /*do not destroy associated GL context*/ if (dd->output_3d_type==2) return; }