📄 main.c
字号:
return DD_OK;}/* I really don't understand how this is supposed to work. * We only consider dwHeight, dwWidth and ddpfPixelFormat.dwFlags. */HRESULTMain_DirectDraw_EnumCreateableSurfaces(IDirectDrawImpl *This, DWORD dwFlags, LPDDSURFACEDESC2 lpDDSD2, LPVOID context, LPDDENUMSURFACESCALLBACK7 callback){ FIXME("This isn't going to work.\n"); if ((dwFlags & DDENUMSURFACES_MATCHTYPE) != DDENUMSURFACES_MATCH) return DDERR_INVALIDPARAMS; /* TODO: implement this. * Does this work before SCL is called? * Does it only consider off-screen surfaces? */ return E_FAIL;}/* For unsigned x. 0 is not a power of 2. */#define IS_POW_2(x) (((x) & ((x) - 1)) == 0)HRESULT WINAPIMain_DirectDraw_EnumSurfaces(LPDIRECTDRAW7 iface, DWORD dwFlags, LPDDSURFACEDESC2 lpDDSD2, LPVOID context, LPDDENUMSURFACESCALLBACK7 callback){ ICOM_THIS(IDirectDrawImpl, iface); TRACE("(%p)->(0x%lx, %p, %p, %p)\n", iface, dwFlags, lpDDSD2, context, callback); if (callback == NULL) return DDERR_INVALIDPARAMS; if (dwFlags & ~(DDENUMSURFACES_SEARCHTYPE|DDENUMSURFACES_MATCHTYPE)) return DDERR_INVALIDPARAMS; if (!IS_POW_2(dwFlags & DDENUMSURFACES_SEARCHTYPE) || !IS_POW_2(dwFlags & DDENUMSURFACES_MATCHTYPE)) return DDERR_INVALIDPARAMS; if (dwFlags & DDENUMSURFACES_DOESEXIST) { return Main_DirectDraw_EnumExistingSurfaces(This, dwFlags, lpDDSD2, context, callback); } else { return Main_DirectDraw_EnumCreateableSurfaces(This, dwFlags, lpDDSD2, context, callback); }}HRESULT WINAPIMain_DirectDraw_EvaluateMode(LPDIRECTDRAW7 iface,DWORD a,DWORD* b){ ICOM_THIS(IDirectDrawImpl,iface); FIXME("(%p)->() stub\n", This); return DD_OK;}HRESULT WINAPIMain_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface){ ICOM_THIS(IDirectDrawImpl,iface); TRACE("(%p)->()\n",This); return DD_OK;}HRESULT WINAPIMain_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps, LPDDCAPS pHELCaps){ ICOM_THIS(IDirectDrawImpl,iface); TRACE("(%p,%p,%p)\n",This,pDriverCaps,pHELCaps); if (pDriverCaps != NULL) { DD_STRUCT_COPY_BYSIZE(pDriverCaps,&This->caps); if (TRACE_ON(ddraw)) { TRACE("Driver Caps : \n"); DDRAW_dump_DDCAPS(pDriverCaps); } } if (pHELCaps != NULL) { DD_STRUCT_COPY_BYSIZE(pHELCaps,&This->caps); if (TRACE_ON(ddraw)) { TRACE("HEL Caps : \n"); DDRAW_dump_DDCAPS(pHELCaps); } } return DD_OK;}/* GetCaps *//* GetDeviceIdentifier *//* GetDIsplayMode */HRESULT WINAPIMain_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface, LPDWORD pNumCodes, LPDWORD pCodes){ ICOM_THIS(IDirectDrawImpl,iface); if (*pNumCodes) { *pNumCodes=0; } FIXME("(%p,%p,%p), stub\n",This,pNumCodes,pCodes); return DD_OK;}HRESULT WINAPIMain_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface, LPDIRECTDRAWSURFACE7 *lplpGDIDDSSurface){ ICOM_THIS(IDirectDrawImpl,iface); TRACE("(%p)->(%p)\n", This, lplpGDIDDSSurface); TRACE("returning primary (%p)\n", This->primary_surface); *lplpGDIDDSSurface = ICOM_INTERFACE(This->primary_surface, IDirectDrawSurface7); if (*lplpGDIDDSSurface) IDirectDrawSurface7_AddRef(*lplpGDIDDSSurface); return DD_OK;}HRESULT WINAPIMain_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface,LPDWORD freq){ ICOM_THIS(IDirectDrawImpl,iface); FIXME("(%p)->(%p) returns 60 Hz always\n",This,freq); *freq = 60*100; /* 60 Hz */ return DD_OK;}HRESULT WINAPIMain_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD lpdwScanLine){ ICOM_THIS(IDirectDrawImpl,iface); FIXME("(%p)->(%p)\n", This, lpdwScanLine); *lpdwScanLine = 1; return DD_OK;}HRESULT WINAPIMain_DirectDraw_GetSurfaceFromDC(LPDIRECTDRAW7 iface, HDC hdc, LPDIRECTDRAWSURFACE7 *lpDDS){ ICOM_THIS(IDirectDrawImpl,iface); FIXME("(%p)->(%08ld,%p)\n", This, (DWORD) hdc, lpDDS); return DD_OK;}HRESULT WINAPIMain_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface, LPBOOL status){ ICOM_THIS(IDirectDrawImpl,iface); TRACE("(%p)->(%p)\n",This,status); *status = TRUE; return DD_OK;}/* If we were not initialised then Uninit_Main_IDirectDraw7_Initialize would * have been called instead. */HRESULT WINAPIMain_DirectDraw_Initialize(LPDIRECTDRAW7 iface, LPGUID lpGuid){ TRACE("(%p)->(%s)\n", iface, debugstr_guid(lpGuid)); return DDERR_ALREADYINITIALIZED;}HRESULT WINAPIMain_DirectDraw_RestoreAllSurfaces(LPDIRECTDRAW7 iface){ ICOM_THIS(IDirectDrawImpl,iface); IDirectDrawSurfaceImpl* surf; TRACE("(%p)->()\n", This); for (surf = This->surfaces; surf != NULL; surf = surf->next_ddraw) IDirectDrawSurface7_Restore(ICOM_INTERFACE(surf, IDirectDrawSurface7)); return DD_OK;}static void DDRAW_SubclassWindow(IDirectDrawImpl* This){ /* Well we don't actually subclass the window yet. */ SetPropA(This->window, ddProp, This);}static void DDRAW_UnsubclassWindow(IDirectDrawImpl* This){ RemovePropA(This->window, ddProp);}HRESULT WINAPIMain_DirectDraw_SetCooperativeLevel(LPDIRECTDRAW7 iface, HWND hwnd, DWORD cooplevel){ ICOM_THIS(IDirectDrawImpl,iface); FIXME("(%p)->(%08lx,%08lx)\n",This,(DWORD)hwnd,cooplevel); DDRAW_dump_cooperativelevel(cooplevel); /* Makes realMYST test happy. */ if (This->cooperative_level == cooplevel && This->window == hwnd) return DD_OK; /* XXX "It cannot be reset while the process has surfaces or palettes * created." Otherwise the window can be changed??? * * This appears to be wrong - comment it out for now. if (This->window) return DDERR_HWNDALREADYSET; */ if (!(cooplevel & (DDSCL_EXCLUSIVE|DDSCL_NORMAL))) return DDERR_INVALIDPARAMS; This->window = hwnd; This->cooperative_level = cooplevel; This->local.hWnd = (ULONG_PTR)hwnd; This->local.dwLocalFlags |= DDRAWILCL_SETCOOPCALLED; /* not entirely sure about these */ if (cooplevel & DDSCL_EXCLUSIVE) This->local.dwLocalFlags |= DDRAWILCL_HASEXCLUSIVEMODE; if (cooplevel & DDSCL_FULLSCREEN) This->local.dwLocalFlags |= DDRAWILCL_ISFULLSCREEN; if (cooplevel & DDSCL_ALLOWMODEX) This->local.dwLocalFlags |= DDRAWILCL_ALLOWMODEX; if (cooplevel & DDSCL_MULTITHREADED) This->local.dwLocalFlags |= DDRAWILCL_MULTITHREADED; if (cooplevel & DDSCL_FPUSETUP) This->local.dwLocalFlags |= DDRAWILCL_FPUSETUP; if (cooplevel & DDSCL_FPUPRESERVE) This->local.dwLocalFlags |= DDRAWILCL_FPUPRESERVE; if (This->local.lpGbl) { /* assume that this app is the active app (in wine, there's * probably only one app per global ddraw object anyway) */ if (cooplevel & DDSCL_EXCLUSIVE) This->local.lpGbl->lpExclusiveOwner = &This->local; else if (This->local.lpGbl->lpExclusiveOwner == &This->local) This->local.lpGbl->lpExclusiveOwner = NULL; if (This->set_exclusive_mode) This->set_exclusive_mode(This, (cooplevel & DDSCL_EXCLUSIVE) != 0); } ShowWindow(hwnd, SW_SHOW); DDRAW_SubclassWindow(This); /* TODO Does it also get resized to the current screen size? */ return DD_OK;}HRESULT WINAPIMain_DirectDraw_SetDisplayMode(LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeight, LONG lPitch, DWORD dwRefreshRate, DWORD dwFlags, const DDPIXELFORMAT* pixelformat){ short screenX; short screenY; ICOM_THIS(IDirectDrawImpl,iface); TRACE("(%p)->SetDisplayMode(%ld,%ld)\n",This,dwWidth,dwHeight); if (!(This->cooperative_level & DDSCL_EXCLUSIVE)) return DDERR_NOEXCLUSIVEMODE; if (!IsWindow(This->window)) return DDERR_GENERIC; /* unchecked */ LosePrimarySurface(This); screenX = GetSystemMetrics(SM_CXSCREEN); screenY = GetSystemMetrics(SM_CYSCREEN); This->width = dwWidth; This->height = dwHeight; This->pitch = lPitch; This->pixelformat = *pixelformat; /* Position the window in the center of the screen - don't center for now */ /* MoveWindow(This->window, (screenX-dwWidth)/2, (screenY-dwHeight)/2, dwWidth, dwHeight, TRUE);*/ MoveWindow(This->window, 0, 0, dwWidth, dwHeight, TRUE); SetFocus(This->window); return DD_OK;}HRESULT WINAPIMain_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface){ ICOM_THIS(IDirectDrawImpl,iface); TRACE("(%p)\n",This); if (!(This->cooperative_level & DDSCL_EXCLUSIVE)) return DDERR_NOEXCLUSIVEMODE; /* Lose the primary surface if the resolution changes. */ if (This->orig_width != This->width || This->orig_height != This->height || This->orig_pitch != This->pitch || This->orig_pixelformat.dwFlags != This->pixelformat.dwFlags || !Main_DirectDraw_DDPIXELFORMAT_Match(&This->pixelformat, &This->orig_pixelformat)) { LosePrimarySurface(This); } /* TODO Move the window back where it belongs. */ return DD_OK;}HRESULT WINAPIMain_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD dwFlags, HANDLE h){ ICOM_THIS(IDirectDrawImpl,iface); FIXME("(%p)->(flags=0x%08lx,handle=%p)\n",This,dwFlags,h); return DD_OK;}HRESULT WINAPIMain_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD){ ICOM_THIS(IDirectDrawImpl,iface); TRACE("(%p)->GetDisplayMode(%p)\n",This,pDDSD); pDDSD->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_PIXELFORMAT|DDSD_REFRESHRATE; pDDSD->dwHeight = This->height; pDDSD->dwWidth = This->width; pDDSD->u1.lPitch = This->pitch; pDDSD->u2.dwRefreshRate = 60; pDDSD->u4.ddpfPixelFormat = This->pixelformat; pDDSD->ddsCaps.dwCaps = 0; return DD_OK;}static INT32 allocate_memory(IDirectDrawImpl *This, DWORD mem){ if (mem > This->available_vidmem) return -1; This->available_vidmem -= mem; return This->available_vidmem;}static void free_memory(IDirectDrawImpl *This, DWORD mem){ This->available_vidmem += mem;}HRESULT WINAPIMain_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface, LPDDSCAPS2 ddscaps, LPDWORD total, LPDWORD free){ ICOM_THIS(IDirectDrawImpl,iface); TRACE("(%p)->(%p,%p,%p)\n", This,ddscaps,total,free); if (TRACE_ON(ddraw)) { TRACE(" Asking for memory of type : "); DDRAW_dump_DDSCAPS2(ddscaps); TRACE("\n"); } /* We have 16 MB videomemory */ if (total) *total= This->total_vidmem; if (free) *free = This->available_vidmem; TRACE(" returning (total) %ld / (free) %ld\n", total != NULL ? *total : 0, free != NULL ? *free : 0); return DD_OK;}HRESULT WINAPI Main_DirectDraw_TestCooperativeLevel(LPDIRECTDRAW7 iface) { ICOM_THIS(IDirectDrawImpl,iface); TRACE("(%p)->(): stub\n", This); return DD_OK;}HRESULT WINAPIMain_DirectDraw_StartModeTest(LPDIRECTDRAW7 iface, LPSIZE pModes, DWORD dwNumModes, DWORD dwFlags){ ICOM_THIS(IDirectDrawImpl,iface); FIXME("(%p)->() stub\n", This); return DD_OK;}/*** Owned object management. */void Main_DirectDraw_AddSurface(IDirectDrawImpl* This, IDirectDrawSurfaceImpl* surface){ assert(surface->ddraw_owner == NULL || surface->ddraw_owner == This); surface->ddraw_owner = This; /* where should it go? */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -