add more code.
start create a protype of hal, that can be use also for
software emulation mode.
Modified: trunk/reactos/lib/ddraw/Makefile
Modified: trunk/reactos/lib/ddraw/ddraw.c
Added: trunk/reactos/lib/ddraw/ddraw_hal.c
Added: trunk/reactos/lib/ddraw/ddraw_private.h
Added: trunk/reactos/lib/ddraw/ddraw_user.c
Modified: trunk/reactos/lib/ddraw/rosddraw.h
_____
Modified: trunk/reactos/lib/ddraw/Makefile
--- trunk/reactos/lib/ddraw/Makefile 2005-03-19 20:29:19 UTC (rev
14200)
+++ trunk/reactos/lib/ddraw/Makefile 2005-03-19 20:39:25 UTC (rev
14201)
@@ -10,15 +10,18 @@
TARGET_CFLAGS = -D__USE_W32API -I$(PATH_TO_TOP)/include/wine
# require os code to explicitly request A/W version of
structs/functions
-TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall -Werror
+TARGET_CFLAGS += -D_DISABLE_TIDENTS -Wall
TARGET_SDKLIBS = ntdll.a gdi32.a dxguid.a ole32.a user32.a d3d8thk.a
TARGET_OBJECTS = \
regsvr.o \
- ddraw.o
+ ddraw.o \
+ ddraw_hal.o
+
+
DEP_OBJECTS = $(TARGET_OBJECTS)
include $(PATH_TO_TOP)/rules.mak
_____
Modified: trunk/reactos/lib/ddraw/ddraw.c
--- trunk/reactos/lib/ddraw/ddraw.c 2005-03-19 20:29:19 UTC (rev
14200)
+++ trunk/reactos/lib/ddraw/ddraw.c 2005-03-19 20:39:25 UTC (rev
14201)
@@ -12,14 +12,14 @@
#include <windows.h>
#include "ddraw.h"
#include "rosddraw.h"
-
-
-HRESULT WINAPI DirectDrawCreate(LPGUID lpGUID, LPVOID* lplpDD,
LPUNKNOWN pUnkOuter)
+
+HRESULT WINAPI DirectDrawCreate(LPGUID lpGUID, LPDIRECTDRAW* lplpDD,
LPUNKNOWN pUnkOuter)
{
if (pUnkOuter==NULL) return DDERR_INVALIDPARAMS;
return DDRAW_Create(lpGUID, (LPVOID*) lplpDD, pUnkOuter,
&IID_IDirectDraw, FALSE);
}
+
HRESULT WINAPI DirectDrawCreateEx(LPGUID lpGUID, LPVOID* lplpDD, REFIID
iid, LPUNKNOWN pUnkOuter)
{
if (pUnkOuter==NULL) return DDERR_INVALIDPARAMS;
@@ -29,7 +29,7 @@
}
HRESULT WINAPI DirectDrawEnumerateA(
- DWORD *lpCallback,
+ LPDDENUMCALLBACKA lpCallback,
LPVOID lpContext
)
{
@@ -38,7 +38,7 @@
HRESULT WINAPI DirectDrawEnumerateW(
- DWORD *lpCallback,
+ LPDDENUMCALLBACKW lpCallback,
LPVOID lpContext
)
{
@@ -46,7 +46,7 @@
}
HRESULT WINAPI DirectDrawEnumerateExA(
- DWORD lpCallback,
+ LPDDENUMCALLBACKEXA lpCallback,
LPVOID lpContext,
DWORD dwFlags
)
@@ -55,18 +55,18 @@
}
HRESULT WINAPI DirectDrawEnumerateExW(
- DWORD lpCallback,
+ LPDDENUMCALLBACKEXW lpCallback,
LPVOID lpContext,
DWORD dwFlags
)
{
return DD_OK;
}
-
+
HRESULT WINAPI DirectDrawCreateClipper(
DWORD dwFlags,
- DWORD FAR* lplpDDClipper,
- IUnknown FAR* pUnkOuter
+ LPDIRECTDRAWCLIPPER* lplpDDClipper,
+ LPUNKNOWN pUnkOuter
)
{
return DD_OK;
@@ -75,8 +75,12 @@
HRESULT DDRAW_Create(
LPGUID lpGUID, LPVOID *lplpDD, LPUNKNOWN pUnkOuter, REFIID iid,
BOOL ex)
{
- HDC desktop;
+
+
+
+ //HDC desktop;
+
/* BOOL ex == TRUE it is DirectDrawCreateEx call here. */
/* TODO:
_____
Added: trunk/reactos/lib/ddraw/ddraw_hal.c
--- trunk/reactos/lib/ddraw/ddraw_hal.c 2005-03-19 20:29:19 UTC (rev
14200)
+++ trunk/reactos/lib/ddraw/ddraw_hal.c 2005-03-19 20:39:25 UTC (rev
14201)
@@ -0,0 +1,330 @@
+/* DirectDraw HAL driver
+ *
+ * Copyright 2001 TransGaming Technologies Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
+ */
+
+
+
+#include <windows.h>
+#include "ddraw.h"
+#include "rosddraw.h"
+#include "ddraw_private.h"
+
+static IDirectDraw7Vtbl HAL_DirectDraw_VTable;
+
+
+HRESULT HAL_DirectDraw_Construct(IDirectDrawImpl *This, BOOL ex)
+{
+ //This->local.lpGbl = &dd_gbl;
+
+ This->final_release = HAL_DirectDraw_final_release;
+ This->set_exclusive_mode = HAL_DirectDrawSet_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);
+ return S_OK;
+}
+
+void HAL_DirectDraw_final_release(IDirectDrawImpl *This)
+{
+
+}
+
+HRESULT HAL_DirectDrawSet_exclusive_mode(IDirectDrawImpl *This, DWORD
dwEnterExcl)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+
+HRESULT HAL_DirectDraw_create_primary(IDirectDrawImpl* This, const
DDSURFACEDESC2* pDDSD, LPDIRECTDRAWSURFACE7* ppSurf,
+ IUnknown* pUnkOuter)
+
+{
+ return DDERR_UNSUPPORTED;
+ }
+
+HRESULT HAL_DirectDraw_create_backbuffer(IDirectDrawImpl* This,
+ const DDSURFACEDESC2* pDDSD,
+ LPDIRECTDRAWSURFACE7* ppSurf,
+ IUnknown* pUnkOuter,
+ IDirectDrawSurfaceImpl*
primary)
+{
+ return DDERR_UNSUPPORTED;
+ }
+
+HRESULT HAL_DirectDraw_create_texture(IDirectDrawImpl* This,
+ const DDSURFACEDESC2* pDDSD,
+ LPDIRECTDRAWSURFACE7* ppSurf,
+ LPUNKNOWN pOuter,
+ DWORD dwMipMapLevel)
+{
+ return DDERR_UNSUPPORTED;
+ }
+
+
+
+
+
+
+/* basic funtion for the com object */
+HRESULT WINAPI HAL_DirectDraw_QueryInterface(LPDIRECTDRAW7 iface,REFIID
refiid,LPVOID *obj)
+{
+ return DDERR_UNSUPPORTED;
+ }
+
+ULONG WINAPI HAL_DirectDraw_AddRef(LPDIRECTDRAW7 iface)
+{
+ IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ //TRACE("(%p)->() incrementing from %lu.\n", This, ref -1);
+
+ return ref;
+}
+
+ULONG WINAPI HAL_DirectDraw_Release(LPDIRECTDRAW7 iface)
+{
+ IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ if (ref == 0)
+ {
+ if (This->final_release != NULL)
+ This->final_release(This);
+
+ /* We free the private. This is an artifact of the fact that I
don't
+ * have the destructors set up correctly. */
+ if (This->private != (This+1))
+ HeapFree(GetProcessHeap(), 0, This->private);
+
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+HRESULT WINAPI HAL_DirectDraw_Compact(LPDIRECTDRAW7 iface)
+{
+
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_CreateClipper(LPDIRECTDRAW7 iface, DWORD
dwFlags,
+
LPDIRECTDRAWCLIPPER *ppClipper, IUnknown *pUnkOuter)
+{
+ return DDERR_UNSUPPORTED;
+}
+HRESULT WINAPI HAL_DirectDraw_CreatePalette(LPDIRECTDRAW7 iface, DWORD
dwFlags,
+ LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE*
ppPalette,LPUNKNOWN pUnknown)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_CreateSurface(LPDIRECTDRAW7 iface,
LPDDSURFACEDESC2 pDDSD,
+ LPDIRECTDRAWSURFACE7 *ppSurf,IUnknown
*pUnkOuter)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_DuplicateSurface(LPDIRECTDRAW7 iface,
LPDIRECTDRAWSURFACE7 src,
+ LPDIRECTDRAWSURFACE7* dst)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface,
DWORD dwFlags,
+ LPDDSURFACEDESC2 pDDSD, LPVOID context,
LPDDENUMMODESCALLBACK2 callback)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_EnumSurfaces(LPDIRECTDRAW7 iface, DWORD
dwFlags,
+ LPDDSURFACEDESC2 lpDDSD2, LPVOID context,
+ LPDDENUMSURFACESCALLBACK7 callback)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface)
+{
+return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS
pDriverCaps,
+ LPDDCAPS pHELCaps)
+{
+return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface,
LPDDSURFACEDESC2 pDDSD)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+
+HRESULT WINAPI HAL_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface,
LPDWORD pNumCodes, LPDWORD pCodes)
+{
+
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface,
+
LPDIRECTDRAWSURFACE7 *lplpGDIDDSSurface)
+{
+
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7
iface,LPDWORD freq)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD
lpdwScanLine)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7
iface, LPBOOL status)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_Initialize(LPDIRECTDRAW7 iface, LPGUID
lpGuid)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_SetCooperativeLevel(LPDIRECTDRAW7 iface,
HWND hwnd,
+
DWORD cooplevel)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_SetDisplayMode(LPDIRECTDRAW7 iface, DWORD
dwWidth,
+ DWORD dwHeight, DWORD dwBPP, DWORD
dwRefreshRate, DWORD dwFlags)
+{
+
+ return DDERR_UNSUPPORTED;
+}
+
+
+HRESULT WINAPI HAL_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface,
DWORD dwFlags,
+
HANDLE h)
+{
+
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface,
LPDDSCAPS2 ddscaps,
+ LPDWORD total, LPDWORD free)
+
+{
+
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_GetSurfaceFromDC(LPDIRECTDRAW7 iface, HDC
hdc,
+
LPDIRECTDRAWSURFACE7 *lpDDS)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_RestoreAllSurfaces(LPDIRECTDRAW7 iface)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_TestCooperativeLevel(LPDIRECTDRAW7 iface)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_GetDeviceIdentifier(LPDIRECTDRAW7 iface,
+ LPDDDEVICEIDENTIFIER2 pDDDI, DWORD
dwFlags)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_StartModeTest(LPDIRECTDRAW7 iface, LPSIZE
pModes,
+ DWORD dwNumModes, DWORD dwFlags)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+HRESULT WINAPI HAL_DirectDraw_EvaluateMode(LPDIRECTDRAW7 iface,DWORD
a,DWORD* b)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+/* End com interface */
+
+
+
+
+HRESULT WINAPI HAL_DirectDraw_Create(const GUID* pGUID, LPDIRECTDRAW7*
pIface,
+ IUnknown* pUnkOuter, BOOL ex)
+{
+
+ IDirectDrawImpl* This;
+ *pIface = ICOM_INTERFACE(This, IDirectDraw7);
+
+ return DD_OK;
+}
+
+static IDirectDraw7Vtbl HAL_DirectDraw_VTable =
+{
+ HAL_DirectDraw_QueryInterface,
+ HAL_DirectDraw_AddRef,
+ HAL_DirectDraw_Release,
+ HAL_DirectDraw_Compact,
+ HAL_DirectDraw_CreateClipper,
+ HAL_DirectDraw_CreatePalette,
+ HAL_DirectDraw_CreateSurface,
+ HAL_DirectDraw_DuplicateSurface,
+ HAL_DirectDraw_EnumDisplayModes,
+ HAL_DirectDraw_EnumSurfaces,
+ HAL_DirectDraw_FlipToGDISurface,
+ HAL_DirectDraw_GetCaps,
+ HAL_DirectDraw_GetDisplayMode,
+ HAL_DirectDraw_GetFourCCCodes,
+ HAL_DirectDraw_GetGDISurface,
+ HAL_DirectDraw_GetMonitorFrequency,
+ HAL_DirectDraw_GetScanLine,
+ HAL_DirectDraw_GetVerticalBlankStatus,
+ HAL_DirectDraw_Initialize,
+ HAL_DirectDraw_RestoreDisplayMode,
+ HAL_DirectDraw_SetCooperativeLevel,
+ HAL_DirectDraw_SetDisplayMode,
+ HAL_DirectDraw_WaitForVerticalBlank,
+ HAL_DirectDraw_GetAvailableVidMem,
+ HAL_DirectDraw_GetSurfaceFromDC,
+ HAL_DirectDraw_RestoreAllSurfaces,
+ HAL_DirectDraw_TestCooperativeLevel,
+ HAL_DirectDraw_GetDeviceIdentifier,
+ HAL_DirectDraw_StartModeTest,
+ HAL_DirectDraw_EvaluateMode
+};
_____
Added: trunk/reactos/lib/ddraw/ddraw_private.h
--- trunk/reactos/lib/ddraw/ddraw_private.h 2005-03-19 20:29:19 UTC
(rev 14200)
+++ trunk/reactos/lib/ddraw/ddraw_private.h 2005-03-19 20:39:25 UTC
(rev 14201)
@@ -0,0 +1,481 @@
+/*
+ * Copyright 2000-2001 TransGaming Technologies Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
+ */
+#ifndef _DDCOMIMPL_H_
+#define _DDCOMIMPL_H_
+
+#include <stddef.h>
+
+/* Generates the name for a vtable pointer for a given interface. */
+/* The canonical name for a single interface is "lpVtbl". */
+#define ICOM_VFIELD_MULTI_NAME2(iface) ITF_##iface
+#define ICOM_VFIELD_MULTI_NAME(iface) ICOM_VFIELD_MULTI_NAME2(iface)
+
+/* Declares a vtable pointer field in an implementation. */
+#define ICOM_VFIELD_MULTI(iface) \
+ iface ICOM_VFIELD_MULTI_NAME(iface)
+
+/* Returns the offset of a vtable pointer within an implementation
object. */
+#define ICOM_VFIELD_OFFSET(impltype, iface) \
+ offsetof(impltype, ICOM_VFIELD_MULTI_NAME(iface))
+
+/* Given an interface pointer, returns the implementation pointer. */
+#define ICOM_OBJECT(impltype, ifacename, ifaceptr) \
+ (impltype*)((ifaceptr) == NULL ? NULL \
+ : (char*)(ifaceptr) -
ICOM_VFIELD_OFFSET(impltype,ifacename))
+
+#define ICOM_THIS_FROM(impltype, ifacename, ifaceptr) \
+ impltype* This = ICOM_OBJECT(impltype, ifacename, ifaceptr)
+
+/* Given an object and interface name, returns a pointer to that
interface. */
+#define ICOM_INTERFACE(implobj, iface) \
+ (&((implobj)->ICOM_VFIELD_MULTI_NAME(iface)))
+
+#define ICOM_INIT_INTERFACE(implobj, ifacename, vtblname) \
+ do { \
+ (implobj)->ICOM_VFIELD_MULTI_NAME(ifacename).lpVtbl =
&(vtblname); \
+ } while (0)
+
+#define COM_INTERFACE_CAST(impltype, ifnamefrom, ifnameto, ifaceptr)
\
+ ICOM_INTERFACE(ICOM_OBJECT(impltype, ifnamefrom, ifaceptr),
ifnameto)
+
+#endif /* _DDCOMIMPL_H_ */
+
+#ifndef __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H
+#define __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H
+
+/* MAY NOT CONTAIN X11 or DGA specific includes/defines/structs! */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "wtypes.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "ddraw.h"
+#include "d3d.h"
+#include "ddrawi.h"
+
+/* XXX Put this somewhere proper. */
+#define DD_STRUCT_INIT(x) \
+ do { \
+ memset((x), 0, sizeof(*(x))); \
+ (x)->dwSize = sizeof(*x); \
+ } while (0)
+
+#define DD_STRUCT_COPY_BYSIZE(to,from) \
+ do { \
+ DWORD __size = (to)->dwSize; \
+ DWORD __copysize = __size; \
+ DWORD __resetsize = __size; \
+ if (__resetsize > sizeof(*to)) \
+ __resetsize = sizeof(*to); \
+ memset(to,0,__resetsize); \
+ if ((from)->dwSize < __size) \
+ __copysize = (from)->dwSize; \
+ memcpy(to,from,__copysize); \
+ (to)->dwSize = __size;/*restore size*/ \
+ } while (0)
+
+#define MAKE_FOURCC(a,b,c,d) ((a << 0) | (b << 8) | (c << 16) | (d
<<
24))
+
+/**********************************************************************
*******
+ * IDirectDraw implementation structure
+ */
+
+typedef struct IDirectDrawImpl IDirectDrawImpl;
+typedef struct IDirectDrawPaletteImpl IDirectDrawPaletteImpl;
+typedef struct IDirectDrawClipperImpl IDirectDrawClipperImpl;
+typedef struct IDirectDrawSurfaceImpl IDirectDrawSurfaceImpl;
+typedef struct IDirect3DDeviceImpl IDirect3DDeviceImpl;
+
+typedef void (*pixel_convert_func)(void *src, void *dst, DWORD width,
+ DWORD height, LONG pitch,
+ IDirectDrawPaletteImpl *palette);
+
+typedef void (*palette_convert_func)(LPPALETTEENTRY palent,
+ void *screen_palette, DWORD start,
+ DWORD count);
+
+struct IDirectDrawImpl
+{
+ ICOM_VFIELD_MULTI(IDirectDraw7);
+ ICOM_VFIELD_MULTI(IDirectDraw4);
+ ICOM_VFIELD_MULTI(IDirectDraw2);
+ ICOM_VFIELD_MULTI(IDirectDraw);
+ // ICOM_VFIELD_MULTI(IDirect3D7);
+ // ICOM_VFIELD_MULTI(IDirect3D3);
+ // ICOM_VFIELD_MULTI(IDirect3D2);
+ // ICOM_VFIELD_MULTI(IDirect3D);
+
+ DWORD ref;
+
+ /* TRUE if created via DirectDrawCreateEx or CoCreateInstance,
+ * FALSE if created via DirectDrawCreate. */
+ BOOL ex;
+
+ /* Linked list of surfaces, joined by next_ddraw in
IDirectSurfaceImpl. */
+ IDirectDrawSurfaceImpl* surfaces;
+ /* Linked list of palettes, joined by next_ddraw. */
+ IDirectDrawPaletteImpl* palettes;
+ /* Linked list of clippers, joined by next_ddraw. */
+ IDirectDrawClipperImpl* clippers;
+
+ IDirectDrawSurfaceImpl* primary_surface;
+
+ DDRAWI_DIRECTDRAW_LCL local;
+ DDCAPS caps;
+
+ HWND window;
+ DWORD cooperative_level;
+ WNDPROC original_wndproc;
+
+ DWORD width, height;
+ LONG pitch;
+ DDPIXELFORMAT pixelformat;
+ DWORD cur_scanline;
+
+ /* Should each of these go into some structure? */
+ DWORD orig_width, orig_height;
+ LONG orig_pitch;
+ DDPIXELFORMAT orig_pixelformat;
+
+ /* Called when the refcount goes to 0. */
+ void (*final_release)(IDirectDrawImpl *This);
+
+ HRESULT (*set_exclusive_mode)(IDirectDrawImpl *This, DWORD dwExcl);
+
+ HRESULT (*create_palette)(IDirectDrawImpl* This, DWORD dwFlags,
+ LPDIRECTDRAWPALETTE* ppPalette,
+ LPUNKNOWN pUnkOuter);
+
+ /* Surface creation functions. For all of these, pOuter == NULL. */
+
+ /* Do not create any backbuffers or the flipping chain. */
+ HRESULT (*create_primary)(IDirectDrawImpl* This,
+ const DDSURFACEDESC2* pDDSD,
+ LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN
pOuter);
+
+ /* Primary may be NULL if we are creating an unattached backbuffer.
*/
+ HRESULT (*create_backbuffer)(IDirectDrawImpl* This,
+ const DDSURFACEDESC2* pDDSD,
+ LPDIRECTDRAWSURFACE7* ppSurf,
+ LPUNKNOWN pOuter,
+ IDirectDrawSurfaceImpl* primary);
+
+ /* shiny happy offscreenplain surfaces */
+ HRESULT (*create_offscreen)(IDirectDrawImpl* This,
+ const DDSURFACEDESC2* pDDSD,
+ LPDIRECTDRAWSURFACE7* ppSurf,
+ LPUNKNOWN pOuter);
+
+ /* dwMipMapLevel is specified as per OpenGL. (i.e. 0 is base) */
+ HRESULT (*create_texture)(IDirectDrawImpl* This,
+ const DDSURFACEDESC2* pDDSD,
+ LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN
pOuter,
+ DWORD dwMipMapLevel);
+
+ HRESULT (*create_zbuffer)(IDirectDrawImpl* This,
+ const DDSURFACEDESC2* pDDSD,
+ LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN
pOuter);
+
+ LPVOID private;
+
+ /* Everything below here is still questionable. */
+
+ DDPIXELFORMAT screen_pixelformat;
+
+ int pixmap_depth;
+ // pixel_convert_func pixel_convert;
+ // palette_convert_func palette_convert;
+
+ /* Use to fool some too strict games */
+ INT32 (*allocate_memory)(IDirectDrawImpl *This, DWORD mem);
+ void (*free_memory)(IDirectDrawImpl *This, DWORD mem);
+ DWORD total_vidmem, available_vidmem;
+
+ /* IDirect3D fields */
+ LPVOID d3d_private;
+
+ /* Used as a callback function to create a texture */
+ HRESULT (*d3d_create_texture)(IDirectDrawImpl *d3d,
IDirectDrawSurfaceImpl *tex, BOOLEAN at_creation, IDirectDrawSurfaceImpl
*main);
+
+ /* Used as a callback for Devices to tell to the D3D object it's
been created */
+ HRESULT (*d3d_added_device)(IDirectDrawImpl *d3d,
IDirect3DDeviceImpl *device);
+ HRESULT (*d3d_removed_device)(IDirectDrawImpl *d3d,
IDirect3DDeviceImpl *device);
+
+ /* This is needed for delayed texture creation and Z buffer blits
*/
+ IDirect3DDeviceImpl *current_device;
+
+ /* This is for the fake mainWindow */
+ ATOM winclass;
+ PAINTSTRUCT ps;
+ BOOL paintable;
+};
+
+/**********************************************************************
*******
+ * IDirectDrawPalette implementation structure
+ */
+struct IDirectDrawPaletteImpl
+{
+ /* IUnknown fields */
+ ICOM_VFIELD_MULTI(IDirectDrawPalette);
+ DWORD ref;
+
+ DDRAWI_DDRAWPALETTE_LCL local;
+ DDRAWI_DDRAWPALETTE_GBL global;
+
+ /* IDirectDrawPalette fields */
+ HPALETTE hpal;
+ WORD palVersion, palNumEntries; /* LOGPALETTE */
+ PALETTEENTRY palents[256];
+ /* This is to store the palette in 'screen format' */
+ int screen_palents[256];
+
+ VOID (*final_release)(IDirectDrawPaletteImpl* This);
+
+ IDirectDrawImpl* ddraw_owner;
+ IDirectDrawPaletteImpl* prev_ddraw;
+ IDirectDrawPaletteImpl* next_ddraw;
+
+ LPVOID private;
+};
+
+/**********************************************************************
*******
+ * IDirectDrawClipper implementation structure
+ */
+struct IDirectDrawClipperImpl
+{
+ /* IUnknown fields */
+ ICOM_VFIELD_MULTI(IDirectDrawClipper);
+ DWORD ref;
+
+ /* IDirectDrawClipper fields */
+ HWND hWnd;
+
+ IDirectDrawImpl* ddraw_owner;
+ IDirectDrawClipperImpl* prev_ddraw;
+ IDirectDrawClipperImpl* next_ddraw;
+};
+
+/**********************************************************************
*******
+ * IDirectDrawSurface implementation structure
+ */
+
+struct IDirectDrawSurfaceImpl
+{
+ /* IUnknown fields */
+ ICOM_VFIELD_MULTI(IDirectDrawSurface7);
+ ICOM_VFIELD_MULTI(IDirectDrawSurface3);
+ ICOM_VFIELD_MULTI(IDirectDrawGammaControl);
+ //ICOM_VFIELD_MULTI(IDirect3DTexture2);
+ //ICOM_VFIELD_MULTI(IDirect3DTexture);
+ DWORD ref;
+
+ struct IDirectDrawSurfaceImpl* attached; /* attached surfaces */
+
+ struct IDirectDrawSurfaceImpl* next_ddraw; /* ddraw surface chain
*/
+ struct IDirectDrawSurfaceImpl* prev_ddraw;
+ struct IDirectDrawSurfaceImpl* next_attached; /* attached surface
chain */
+ struct IDirectDrawSurfaceImpl* prev_attached;
+
+ IDirectDrawImpl* ddraw_owner;
+ IDirectDrawSurfaceImpl* surface_owner;
+
+ IDirectDrawPaletteImpl* palette; /* strong ref */
+ IDirectDrawClipperImpl* clipper; /* strong ref */
+
+ DDRAWI_DDRAWSURFACE_LCL local;
+ DDRAWI_DDRAWSURFACE_MORE more;
+ /* FIXME: since Flip should swap the GBL structures, they should
+ * probably not be embedded into the IDirectDrawSurfaceImpl
structure... */
+ LPDDRAWI_DDRAWSURFACE_GBL_MORE gmore;
+ DDRAWI_DDRAWSURFACE_GBL global;
+ DDRAWI_DDRAWSURFACE_GBL_MORE global_more;
+
+ DDSURFACEDESC2 surface_desc;
+
+ HDC hDC;
+ RECT lastlockrect;
+ DWORD lastlocktype;
+ BOOL dc_in_use;
+ BOOL locked;
+
+ HRESULT (*duplicate_surface)(IDirectDrawSurfaceImpl* src,
+ LPDIRECTDRAWSURFACE7* dst);
+ void (*final_release)(IDirectDrawSurfaceImpl *This);
+ HRESULT (*late_allocate)(IDirectDrawSurfaceImpl *This);
+ BOOL (*attach)(IDirectDrawSurfaceImpl *This, IDirectDrawSurfaceImpl
*to);
+ BOOL (*detach)(IDirectDrawSurfaceImpl *This);
+ void (*lock_update)(IDirectDrawSurfaceImpl* This, LPCRECT pRect,
DWORD dwFlags);
+ void (*unlock_update)(IDirectDrawSurfaceImpl* This, LPCRECT pRect);
+ void (*lose_surface)(IDirectDrawSurfaceImpl* This);
+ BOOL (*flip_data)(IDirectDrawSurfaceImpl* front,
+ IDirectDrawSurfaceImpl* back,
+ DWORD dwFlags);
+ void (*flip_update)(IDirectDrawSurfaceImpl* front, DWORD dwFlags);
+ HRESULT (*get_dc)(IDirectDrawSurfaceImpl* This, HDC* phDC);
+ HRESULT (*release_dc)(IDirectDrawSurfaceImpl* This, HDC hDC);
+ void (*set_palette)(IDirectDrawSurfaceImpl* This,
IDirectDrawPaletteImpl* pal);
+ void (*update_palette)(IDirectDrawSurfaceImpl* This,
IDirectDrawPaletteImpl* pal,
+ DWORD dwStart, DWORD dwCount, LPPALETTEENTRY
palent);
+ HWND (*get_display_window)(IDirectDrawSurfaceImpl *This);
+ HRESULT (*get_gamma_ramp)(IDirectDrawSurfaceImpl *This, DWORD
dwFlags, LPDDGAMMARAMP lpGammaRamp);
+ HRESULT (*set_gamma_ramp)(IDirectDrawSurfaceImpl *This, DWORD
dwFlags, LPDDGAMMARAMP lpGammaRamp);
+
+ struct PrivateData* private_data;
+
+ DWORD max_lod;
+ DWORD priority;
+
+ BOOL lost;
+
+ DWORD uniqueness_value;
+
+ LPVOID private;
+
+ /* Everything below here is dodgy. */
+ /* For Direct3D use */
+ LPVOID aux_ctx, aux_data;
+ void (*aux_release)(LPVOID ctx, LPVOID data);
+ BOOL (*aux_flip)(LPVOID ctx, LPVOID data);
+ void (*aux_unlock)(LPVOID ctx, LPVOID data, LPRECT lpRect);
+ HRESULT (*aux_blt)(struct IDirectDrawSurfaceImpl *This, LPRECT
rdst, LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, DWORD dwFlags, LPDDBLTFX
lpbltfx);
+ HRESULT (*aux_bltfast)(struct IDirectDrawSurfaceImpl *This, DWORD
dstx, DWORD dsty, LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, DWORD trans);
+ HRESULT (*aux_setcolorkey_cb)(struct IDirectDrawSurfaceImpl
*texture, DWORD dwFlags, LPDDCOLORKEY ckey );
+ /* This is to get the D3DDevice object associated to this surface
*/
+ struct IDirect3DDeviceImpl *d3ddevice;
+ /* This is for texture */
+ IDirectDrawSurfaceImpl *mip_main;
+ int mipmap_level;
+ LPVOID tex_private;
+ void (*lock_update_prev)(IDirectDrawSurfaceImpl* This, LPCRECT
pRect, DWORD dwFlags);
+ void (*unlock_update_prev)(IDirectDrawSurfaceImpl* This, LPCRECT
pRect);
+ BOOLEAN (*get_dirty_status)(IDirectDrawSurfaceImpl* This, LPCRECT
pRect);
+};
+
+/**********************************************************************
*******
+ * Driver initialisation functions.
+ */
+BOOL DDRAW_HAL_Init(HINSTANCE, DWORD, LPVOID);
+BOOL DDRAW_User_Init(HINSTANCE, DWORD, LPVOID);
+
+typedef struct {
+ const DDDEVICEIDENTIFIER2* info;
+ int preference; /* how good we are. dga might get 100,
xlib 50*/
+ HRESULT (*create)(const GUID*, LPDIRECTDRAW7*, LPUNKNOWN, BOOL ex);
+
+ /* For IDirectDraw7::Initialize. */
+ HRESULT (*init)(IDirectDrawImpl *, const GUID*);
+} ddraw_driver;
+
+void DDRAW_register_driver(const ddraw_driver*);
+
+const ddraw_driver* DDRAW_FindDriver(const GUID* guid);
+
+/**********************************************************************
********
+ * Random utilities
+ */
+
+/* Get DDSCAPS of surface (shortcutmacro) */
+#define SDDSCAPS(iface) ((iface)->s.surface_desc.ddsCaps.dwCaps)
+/* Get the number of bytes per pixel for a given surface */
+#define PFGET_BPP(pf)
(pf.dwFlags&DDPF_PALETTEINDEXED8?1:((pf.u1.dwRGBBitCount+7)/8))
+#define GET_BPP(desc) PFGET_BPP(desc.u4.ddpfPixelFormat)
+
+LONG DDRAW_width_bpp_to_pitch(DWORD width, DWORD bpp);
+
+typedef struct {
+ unsigned short bpp,depth;
+ unsigned int rmask,gmask,bmask;
+} ConvertMode;
+
+typedef struct {
+ void (*pixel_convert)(void *src, void *dst, DWORD width, DWORD
height, LONG pitch, IDirectDrawPaletteImpl* palette);
+ void (*palette_convert)(LPPALETTEENTRY palent, void
*screen_palette, DWORD start, DWORD count);
+} ConvertFuncs;
+
+typedef struct {
+ ConvertMode screen, dest;
+ ConvertFuncs funcs;
+} Convert;
+
+extern Convert ModeEmulations[8];
+extern int _common_depth_to_pixelformat(DWORD depth,LPDIRECTDRAW
ddraw);
+extern BOOL opengl_initialized;
+extern BOOL s3tc_initialized;
+
+typedef void (*FUNC_FETCH_2D_TEXEL_RGBA_DXT1)(int srcRowStride, const
BYTE *pixdata, int i, int j, void *texel);
+typedef void (*FUNC_FETCH_2D_TEXEL_RGBA_DXT3)(int srcRowStride, const
BYTE *pixdata, int i, int j, void *texel);
+typedef void (*FUNC_FETCH_2D_TEXEL_RGBA_DXT5)(int srcRowStride, const
BYTE *pixdata, int i, int j, void *texel);
+
+extern FUNC_FETCH_2D_TEXEL_RGBA_DXT1 fetch_2d_texel_rgba_dxt1;
+extern FUNC_FETCH_2D_TEXEL_RGBA_DXT3 fetch_2d_texel_rgba_dxt3;
+extern FUNC_FETCH_2D_TEXEL_RGBA_DXT5 fetch_2d_texel_rgba_dxt5;
+
+/**********************************************************************
********
+ * Structure conversion (for thunks)
+ */
+void DDRAW_Convert_DDSCAPS_1_To_2(const DDSCAPS* pIn, DDSCAPS2* pOut);
+void DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(const DDDEVICEIDENTIFIER2*
pIn,
+ DDDEVICEIDENTIFIER* pOut);
+
+/**********************************************************************
********
+ * Debugging / Flags output functions
+ */
+extern void DDRAW_dump_DDBLTFX(DWORD flagmask);
+extern void DDRAW_dump_DDBLTFAST(DWORD flagmask);
+extern void DDRAW_dump_DDBLT(DWORD flagmask);
+extern void DDRAW_dump_DDSCAPS(const DDSCAPS *in);
+extern void DDRAW_dump_DDSCAPS2(const DDSCAPS2 *in);
+extern void DDRAW_dump_pixelformat_flag(DWORD flagmask);
+extern void DDRAW_dump_paletteformat(DWORD dwFlags);
+extern void DDRAW_dump_pixelformat(const DDPIXELFORMAT *in);
+extern void DDRAW_dump_colorkeyflag(DWORD ck);
+extern void DDRAW_dump_surface_desc(const DDSURFACEDESC2 *lpddsd);
+extern void DDRAW_dump_cooperativelevel(DWORD cooplevel);
+extern void DDRAW_dump_lockflag(DWORD lockflag);
+extern void DDRAW_dump_DDCOLORKEY(const DDCOLORKEY *in);
+extern void DDRAW_dump_DDCAPS(const DDCAPS *lpcaps);
+extern void DDRAW_dump_surface_to_disk(IDirectDrawSurfaceImpl *surface,
FILE *f, int scale) ;
+
+/* Used for generic dumping */
+typedef struct
+{
+ DWORD val;
+ const char* name;
+} flag_info;
+
+#define FE(x) { x, #x }
+
+typedef struct
+{
+ DWORD val;
+ const char* name;
+ void (*func)(const void *);
+ ptrdiff_t offset;
+} member_info;
+
+#define DDRAW_dump_flags(flags,names,num_names)
DDRAW_dump_flags_(flags, names, num_names, 1)
+#define ME(x,f,e) { x, #x, (void (*)(const void *))(f),
offsetof(STRUCT, e) }
+
+extern void DDRAW_dump_flags_(DWORD flags, const flag_info* names,
size_t num_names, int newline);
+extern void DDRAW_dump_members(DWORD flags, const void* data, const
member_info* mems, size_t num_mems);
+
+#endif /* __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H */
_____
Added: trunk/reactos/lib/ddraw/ddraw_user.c
--- trunk/reactos/lib/ddraw/ddraw_user.c 2005-03-19 20:29:19 UTC
(rev 14200)
+++ trunk/reactos/lib/ddraw/ddraw_user.c 2005-03-19 20:39:25 UTC
(rev 14201)
@@ -0,0 +1,330 @@
+/* DirectDraw HAL driver
+ *
+ * Copyright 2001 TransGaming Technologies Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
+ */
+
+
+
+#include <windows.h>
+#include "ddraw.h"
+#include "rosddraw.h"
+#include "ddraw_private.h"
+
+static IDirectDraw7Vtbl MAIN_DirectDraw_VTable;
+
+
+HRESULT MAIN_DirectDraw_Construct(IDirectDrawImpl *This, BOOL ex)
+{
+ //This->local.lpGbl = &dd_gbl;
+
+ This->final_release = MAIN_DirectDraw_final_release;
+ This->set_exclusive_mode = MAIN_DirectDrawSet_exclusive_mode;
+ // This->create_palette = MAIN_DirectDrawPalette_Create;
+
+ This->create_primary = MAIN_DirectDraw_create_primary;
+ This->create_backbuffer = MAIN_DirectDraw_create_backbuffer;
+ This->create_texture = MAIN_DirectDraw_create_texture;
+
+ ICOM_INIT_INTERFACE(This, IDirectDraw7, MAIN_DirectDraw_VTable);
+ return S_OK;
+}
+
+void MAIN_DirectDraw_final_release(IDirectDrawImpl *This)
+{
+
+}
+
+HRESULT MAIN_DirectDrawSet_exclusive_mode(IDirectDrawImpl *This, DWORD
dwEnterExcl)
+{
+ return DDERR_UNSUPPORTED;
+}
+
+
+HRESULT MAIN_DirectDraw_create_primary(IDirectDrawImpl* This, const
DDSURFACEDESC2* pDDSD, LPDIRECTDRAWSURFACE7* ppSurf,
+ IUnknown* pUnkOuter)
+
+{
+ return DDERR_UNSUPPORTED;
+ }
+
[truncated at 1000 lines; 392 more skipped]