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 + -
显示快捷键?