hal.c
来自「Wine-20031016」· C语言 代码 · 共 587 行 · 第 1/2 页
C
587 行
data.SetMode = dd_cbs.HALDD.SetMode; data.inexcl = 0; data.useRefreshRate = FALSE; if (data.SetMode) data.SetMode(&data); hr = data.ddRVal; if (SUCCEEDED(hr)) dd_gbl.dwModeIndex = dwMode; } return hr;}static HRESULT set_exclusive_mode(IDirectDrawImpl *This, DWORD dwEnterExcl){ DDHAL_SETEXCLUSIVEMODEDATA data; data.lpDD = &dd_gbl; data.dwEnterExcl = dwEnterExcl; data.dwReserved = 0; data.ddRVal = 0; data.SetExclusiveMode = dd_cbs.HALDD.SetExclusiveMode; if (data.SetExclusiveMode) data.SetExclusiveMode(&data); return data.ddRVal;}BOOL DDRAW_HAL_Init(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv){ if (fdwReason == DLL_PROCESS_ATTACH) { if (initialize()) DDRAW_register_driver(&hal_driver); } else if (fdwReason == DLL_PROCESS_DETACH) { cleanup(); } return TRUE;}/* Not called from the vtable. */HRESULT HAL_DirectDraw_Construct(IDirectDrawImpl *This, BOOL ex){ HRESULT hr; TRACE("(%p,%d)\n", This, ex); hr = User_DirectDraw_Construct(This, ex); if (FAILED(hr)) return hr; This->local.lpGbl = &dd_gbl; This->final_release = HAL_DirectDraw_final_release; This->set_exclusive_mode = set_exclusive_mode; This->create_palette = HAL_DirectDrawPalette_Create; This->create_primary = HAL_DirectDraw_create_primary; This->create_backbuffer = HAL_DirectDraw_create_backbuffer; This->create_texture = HAL_DirectDraw_create_texture; ICOM_INIT_INTERFACE(This, IDirectDraw7, HAL_DirectDraw_VTable); /* merge HAL caps */ This->caps.dwCaps |= dd_gbl.ddCaps.dwCaps; This->caps.dwCaps2 |= dd_gbl.ddCaps.dwCaps2; This->caps.dwCKeyCaps |= dd_gbl.ddCaps.dwCKeyCaps; This->caps.dwFXCaps |= dd_gbl.ddCaps.dwFXCaps; This->caps.dwPalCaps |= dd_gbl.ddCaps.dwPalCaps; /* FIXME: merge more caps */ This->caps.ddsCaps.dwCaps |= dd_gbl.ddCaps.ddsCaps.dwCaps; This->caps.ddsCaps.dwCaps2 |= dd_gbl.ddsCapsMore.dwCaps2; This->caps.ddsCaps.dwCaps3 |= dd_gbl.ddsCapsMore.dwCaps3; This->caps.ddsCaps.dwCaps4 |= dd_gbl.ddsCapsMore.dwCaps4; This->caps.ddsOldCaps.dwCaps = This->caps.ddsCaps.dwCaps; return S_OK;}/* This function is called from DirectDrawCreate(Ex) on the most-derived * class to start construction. * Not called from the vtable. */HRESULT HAL_DirectDraw_Create(const GUID* pGUID, LPDIRECTDRAW7* pIface, IUnknown* pUnkOuter, BOOL ex){ HRESULT hr; IDirectDrawImpl* This; TRACE("\n"); assert(pUnkOuter == NULL); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl) + sizeof(HAL_DirectDrawImpl)); if (This == NULL) return E_OUTOFMEMORY; /* Note that this relation does *not* hold true if the DD object was * CoCreateInstanced then Initialized. */ This->private = (HAL_DirectDrawImpl *)(This+1); /* Initialize the DDCAPS structure */ This->caps.dwSize = sizeof(This->caps); hr = HAL_DirectDraw_Construct(This, ex); if (FAILED(hr)) HeapFree(GetProcessHeap(), 0, This); else *pIface = ICOM_INTERFACE(This, IDirectDraw7); return hr;}/* This function is called from Uninit_DirectDraw_Initialize on the * most-derived-class to start initialization. * Not called from the vtable. */HRESULT HAL_DirectDraw_Initialize(IDirectDrawImpl *This, const GUID* guid){ HRESULT hr; TRACE("\n"); This->private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(HAL_DirectDrawImpl)); if (This->private == NULL) return E_OUTOFMEMORY; /* Initialize the DDCAPS structure */ This->caps.dwSize = sizeof(This->caps); hr = HAL_DirectDraw_Construct(This, TRUE); /* XXX ex? */ if (FAILED(hr)) { HeapFree(GetProcessHeap(), 0, This->private); return hr; } return DD_OK;}/* Called from an internal function pointer. */void HAL_DirectDraw_final_release(IDirectDrawImpl *This){ if (dd_gbl.dwFlags & DDRAWI_MODECHANGED) set_mode(This, dd_gbl.dwModeIndexOrig); User_DirectDraw_final_release(This);}HRESULT HAL_DirectDraw_create_primary(IDirectDrawImpl* This, const DDSURFACEDESC2* pDDSD, LPDIRECTDRAWSURFACE7* ppSurf, IUnknown* pUnkOuter){ if (This->cooperative_level & DDSCL_EXCLUSIVE) return HAL_DirectDrawSurface_Create(This, pDDSD, ppSurf, pUnkOuter); else return User_DirectDrawSurface_Create(This, pDDSD, ppSurf, pUnkOuter);}HRESULT HAL_DirectDraw_create_backbuffer(IDirectDrawImpl* This, const DDSURFACEDESC2* pDDSD, LPDIRECTDRAWSURFACE7* ppSurf, IUnknown* pUnkOuter, IDirectDrawSurfaceImpl* primary){ if (This->cooperative_level & DDSCL_EXCLUSIVE) return HAL_DirectDrawSurface_Create(This, pDDSD, ppSurf, pUnkOuter); else return User_DirectDrawSurface_Create(This, pDDSD, ppSurf, pUnkOuter);}HRESULT HAL_DirectDraw_create_texture(IDirectDrawImpl* This, const DDSURFACEDESC2* pDDSD, LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pOuter, DWORD dwMipMapLevel){ return HAL_DirectDrawSurface_Create(This, pDDSD, ppSurf, pOuter);}HRESULT WINAPIHAL_DirectDraw_GetDeviceIdentifier(LPDIRECTDRAW7 iface, LPDDDEVICEIDENTIFIER2 pDDDI, DWORD dwFlags){ *pDDDI = hal_device; return DD_OK;}HRESULT WINAPIHAL_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface){ ICOM_THIS(IDirectDrawImpl, iface); HRESULT hr; TRACE("(%p)\n", iface); if (!(dd_gbl.dwFlags & DDRAWI_MODECHANGED)) return DD_OK; hr = Main_DirectDraw_RestoreDisplayMode(iface); if (SUCCEEDED(hr)) { hr = set_mode(This, dd_gbl.dwModeIndexOrig); if (SUCCEEDED(hr)) dd_gbl.dwFlags &= ~DDRAWI_MODECHANGED; } return hr;}HRESULT WINAPIHAL_DirectDraw_SetDisplayMode(LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags){ ICOM_THIS(IDirectDrawImpl, iface); HRESULT hr; TRACE("(%p)->(%ldx%ldx%ld,%ld Hz,%08lx)\n",This,dwWidth,dwHeight,dwBPP,dwRefreshRate,dwFlags); hr = User_DirectDraw_SetDisplayMode(iface, dwWidth, dwHeight, dwBPP, dwRefreshRate, dwFlags); if (SUCCEEDED(hr)) { if (!(dd_gbl.dwFlags & DDRAWI_MODECHANGED)) dd_gbl.dwModeIndexOrig = dd_gbl.dwModeIndex; hr = set_mode(This, choose_mode(dwWidth, dwHeight, dwBPP, dwRefreshRate, dwFlags)); if (SUCCEEDED(hr)) dd_gbl.dwFlags |= DDRAWI_MODECHANGED; } return hr;}HRESULT WINAPIHAL_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface, LPDWORD pNumCodes, LPDWORD pCodes){ int i; ICOM_THIS(IDirectDrawImpl,iface); if (*pNumCodes) *pNumCodes=dd_gbl.dwNumFourCC; if (pCodes && dd_gbl.dwNumFourCC) memcpy(pCodes,dd_gbl.lpdwFourCC,sizeof(pCodes[0])*dd_gbl.dwNumFourCC); FIXME("(%p,%p,%p)\n",This,pNumCodes,pCodes); if (dd_gbl.dwNumFourCC) { if (pCodes && FIXME_ON(ddraw)) { FIXME("returning: "); for (i=0;i<dd_gbl.dwNumFourCC;i++) { MESSAGE("%c%c%c%c,", ((LPBYTE)(pCodes+i))[0], ((LPBYTE)(pCodes+i))[1], ((LPBYTE)(pCodes+i))[2], ((LPBYTE)(pCodes+i))[3] ); } MESSAGE("\n"); } } return DD_OK;}static ICOM_VTABLE(IDirectDraw7) HAL_DirectDraw_VTable ={ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE Main_DirectDraw_QueryInterface, Main_DirectDraw_AddRef, Main_DirectDraw_Release, Main_DirectDraw_Compact, Main_DirectDraw_CreateClipper, Main_DirectDraw_CreatePalette, Main_DirectDraw_CreateSurface, Main_DirectDraw_DuplicateSurface, User_DirectDraw_EnumDisplayModes, Main_DirectDraw_EnumSurfaces, Main_DirectDraw_FlipToGDISurface, Main_DirectDraw_GetCaps, Main_DirectDraw_GetDisplayMode, HAL_DirectDraw_GetFourCCCodes, Main_DirectDraw_GetGDISurface, Main_DirectDraw_GetMonitorFrequency, Main_DirectDraw_GetScanLine, Main_DirectDraw_GetVerticalBlankStatus, Main_DirectDraw_Initialize, HAL_DirectDraw_RestoreDisplayMode, Main_DirectDraw_SetCooperativeLevel, HAL_DirectDraw_SetDisplayMode, Main_DirectDraw_WaitForVerticalBlank, Main_DirectDraw_GetAvailableVidMem, Main_DirectDraw_GetSurfaceFromDC, Main_DirectDraw_RestoreAllSurfaces, Main_DirectDraw_TestCooperativeLevel, HAL_DirectDraw_GetDeviceIdentifier, Main_DirectDraw_StartModeTest, Main_DirectDraw_EvaluateMode};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?