* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS
* FILE: lib/ddraw/main/ddraw.c
- * PURPOSE: DirectDraw Implementation
+ * PURPOSE: IDirectDraw7 Implementation
* PROGRAMMER: Magnus Olsen, Maarten Bosma
*
*/
// get the HDC
This->hdc = GetWindowDC(GetDesktopWindow());
- This->Height = GetDeviceCaps(This->hdc, HORZRES);
- This->Width = GetDeviceCaps(This->hdc, VERTRES);
+ This->Height = GetDeviceCaps(This->hdc, VERTRES);
+ This->Width = GetDeviceCaps(This->hdc, HORZRES);
This->Bpp = GetDeviceCaps(This->hdc, BITSPIXEL);
// call software first
This->hdc = GetDC(hwnd);
This->cooperative_level = cooplevel;
- if((ret = Hel_DirectDraw_SetCooperativeLevel (iface)) != DD_OK)
- return ret;
+
if((ret = Hal_DirectDraw_SetCooperativeLevel (iface)) != DD_OK)
return ret;
+ if((ret = Hel_DirectDraw_SetCooperativeLevel (iface)) != DD_OK)
+ return ret;
+
return DD_OK;
}
if (That == NULL)
return E_OUTOFMEMORY;
- That->lpVtbl = &DDrawSurface_VTable;
+ That->lpVtbl = &DirectDrawSurface7_Vtable;
+ That->lpVtbl_v3 = &DDRAW_IDDS3_Thunk_VTable;
+
That->ref = 1;
*ppSurf = (LPDIRECTDRAWSURFACE7)That;
ULONG WINAPI Main_DirectDraw_AddRef (LPDIRECTDRAW7 iface)
{
IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
- ULONG ref = InterlockedIncrement(&This->ref);
+ ULONG ref = InterlockedIncrement((PLONG)&This->DirectDrawGlobal.dwRefCnt);
return ref;
}
ULONG WINAPI Main_DirectDraw_Release (LPDIRECTDRAW7 iface)
{
IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
- ULONG ref = InterlockedDecrement(&This->ref);
+ ULONG ref = InterlockedDecrement((PLONG)&This->DirectDrawGlobal.dwRefCnt);
if (ref == 0)
{
return ref;
}
-/**** Stubs ****/
-
-HRESULT WINAPI Main_DirectDraw_QueryInterface (LPDIRECTDRAW7 iface,REFIID refiid,LPVOID *obj)
+HRESULT WINAPI Main_DirectDraw_QueryInterface (
+ LPDIRECTDRAW7 iface, REFIID id, LPVOID *obj )
{
- return DDERR_UNSUPPORTED;
+ IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
+
+ if (IsEqualGUID(&IID_IDirectDraw7, id))
+ {
+ *obj = &This->lpVtbl;
+ }
+ else if (IsEqualGUID(&IID_IDirectDraw, id))
+ {
+ *obj = &This->lpVtbl_v1;
+ }
+ else if (IsEqualGUID(&IID_IDirectDraw2, id))
+ {
+ *obj = &This->lpVtbl_v2;
+ }
+ else if (IsEqualGUID(&IID_IDirectDraw4, id))
+ {
+ *obj = &This->lpVtbl_v4;
+ }
+ else
+ {
+ *obj = NULL;
+ return E_NOINTERFACE;
+ }
+
+ Main_DirectDraw_AddRef(iface);
+ return S_OK;
}
+/**** Stubs ****/
+
HRESULT WINAPI Main_DirectDraw_Compact(LPDIRECTDRAW7 iface)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_CreateClipper(LPDIRECTDRAW7 iface, DWORD dwFlags,
LPDIRECTDRAWCLIPPER *ppClipper, IUnknown *pUnkOuter)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_CreatePalette(LPDIRECTDRAW7 iface, DWORD dwFlags,
LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE* ppPalette,LPUNKNOWN pUnknown)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_DuplicateSurface(LPDIRECTDRAW7 iface, LPDIRECTDRAWSURFACE7 src,
LPDIRECTDRAWSURFACE7* dst)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface, DWORD dwFlags,
LPDDSURFACEDESC2 pDDSD, LPVOID context, LPDDENUMMODESCALLBACK2 callback)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_EnumSurfaces(LPDIRECTDRAW7 iface, DWORD dwFlags,
LPDDSURFACEDESC2 lpDDSD2, LPVOID context,
LPDDENUMSURFACESCALLBACK7 callback)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
LPDDCAPS pHELCaps)
{
- return DDERR_UNSUPPORTED;
+ DWORD status = DD_FALSE;
+ IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
+
+ if (pDriverCaps != NULL)
+ {
+ RtlCopyMemory(pDriverCaps,&This->DirectDrawGlobal.ddCaps,sizeof(DDCORECAPS));
+ status = DD_OK;
+ }
+
+ if (pHELCaps != NULL)
+ {
+ RtlCopyMemory(pDriverCaps,&This->DirectDrawGlobal.ddHELCaps,sizeof(DDCORECAPS));
+ status = DD_OK;
+ }
+
+ /* Both caps mixed ?? */
+ /* DDCORECAPS ddBothCaps; */
+
+ return status;
}
HRESULT WINAPI Main_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD)
-{
- return DDERR_UNSUPPORTED;
+{
+ IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
+
+ if (pDDSD == NULL)
+ {
+ return DD_FALSE;
+ }
+
+ pDDSD->dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_REFRESHRATE | DDSD_WIDTH;
+ pDDSD->dwHeight = This->DirectDrawGlobal.vmiData.dwDisplayHeight;
+ pDDSD->dwWidth = This->DirectDrawGlobal.vmiData.dwDisplayWidth;
+
+ /* FIXME Do not use DUMMYUNIONNAME1 some how union lPitch does not see by the compiler
+ but rest of the union are visable. more header problem ???
+ */
+ pDDSD->DUMMYUNIONNAME1.lPitch = This->DirectDrawGlobal.vmiData.lDisplayPitch;
+
+
+ /* have not check where I should get hold of this info yet
+ DWORD dwBackBufferCount;
+ */
+
+ pDDSD->dwRefreshRate = This->DirectDrawGlobal.dwMonitorFrequency;
+
+ /* have not check where I should get hold of this info yet
+ DWORD dwAlphaBitDepth;
+ DWORD dwReserved;
+ LPVOID lpSurface;
+ union
+ {
+ DDCOLORKEY ddckCKDestOverlay;
+ DWORD dwEmptyFaceColor;
+ }
+ DDCOLORKEY ddckCKDestBlt;
+ DDCOLORKEY ddckCKSrcOverlay;
+ DDCOLORKEY ddckCKSrcBlt;
+ */
+
+ RtlCopyMemory(&pDDSD->ddpfPixelFormat,&This->DirectDrawGlobal.vmiData.ddpfDisplay,sizeof(DDPIXELFORMAT));
+ RtlCopyMemory(&pDDSD->ddsCaps,&This->DirectDrawGlobal.ddCaps,sizeof(DDCORECAPS));
+
+ /* have not check where I should get hold of this info yet
+ DWORD dwTextureStage;
+ */
+
+ return DD_OK;
}
HRESULT WINAPI Main_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface, LPDWORD pNumCodes, LPDWORD pCodes)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface,
LPDIRECTDRAWSURFACE7 *lplpGDIDDSSurface)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface,LPDWORD freq)
{
- return DDERR_UNSUPPORTED;
+ IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
+
+ if (freq == NULL)
+ {
+ return DD_FALSE;
+ }
+
+ *freq = This->DirectDrawGlobal.dwMonitorFrequency;
+ return DD_OK;
}
HRESULT WINAPI Main_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD lpdwScanLine)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface, LPBOOL status)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD dwFlags,
HANDLE h)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface, LPDDSCAPS2 ddscaps,
LPDWORD total, LPDWORD free)
{
-
- return DDERR_UNSUPPORTED;
+
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_GetSurfaceFromDC(LPDIRECTDRAW7 iface, HDC hdc,
LPDIRECTDRAWSURFACE7 *lpDDS)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_RestoreAllSurfaces(LPDIRECTDRAW7 iface)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_TestCooperativeLevel(LPDIRECTDRAW7 iface)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_GetDeviceIdentifier(LPDIRECTDRAW7 iface,
LPDDDEVICEIDENTIFIER2 pDDDI, DWORD dwFlags)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_StartModeTest(LPDIRECTDRAW7 iface, LPSIZE pModes,
DWORD dwNumModes, DWORD dwFlags)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
HRESULT WINAPI Main_DirectDraw_EvaluateMode(LPDIRECTDRAW7 iface,DWORD a,DWORD* b)
{
- return DDERR_UNSUPPORTED;
+ DX_STUB;
}
-IDirectDraw7Vtbl DirectDraw_VTable =
+IDirectDraw7Vtbl DirectDraw7_Vtable =
{
Main_DirectDraw_QueryInterface,
Main_DirectDraw_AddRef,