Updated.
[wine] / dlls / x11drv / x11ddraw.c
1 /*
2  * DirectDraw driver interface
3  *
4  * Copyright 2001 TransGaming Technologies, Inc.
5  */
6
7 #include "windef.h"
8 #include "wingdi.h"
9 #include "ddrawi.h"
10 #include "xvidmode.h"
11 #include "debugtools.h"
12
13 DEFAULT_DEBUG_CHANNEL(x11drv);
14
15 static DWORD PASCAL X11DRV_DDHAL_DestroyDriver(LPDDHAL_DESTROYDRIVERDATA data)
16 {
17   data->ddRVal = DD_OK;
18   return DDHAL_DRIVER_HANDLED;
19 }
20
21 static DWORD PASCAL X11DRV_DDHAL_SetMode(LPDDHAL_SETMODEDATA data)
22 {
23 #ifdef HAVE_LIBXXF86VM
24   if (xf86vm_mode_count) {
25     X11DRV_XF86VM_SetCurrentMode(data->dwModeIndex);
26     data->ddRVal = DD_OK;
27     return DDHAL_DRIVER_HANDLED;
28   }
29 #endif
30   return DDHAL_DRIVER_NOTHANDLED;
31 }
32
33 static DDHAL_DDCALLBACKS hal_ddcallbacks = {
34   sizeof(DDHAL_DDCALLBACKS),
35   0x3ff, /* all callbacks are 32-bit */
36   X11DRV_DDHAL_DestroyDriver,
37   NULL, /* CreateSurface */
38   NULL, /* SetColorKey */
39   X11DRV_DDHAL_SetMode,
40   NULL, /* WaitForVerticalBlank */
41   NULL, /* CanCreateSurface */
42   NULL, /* CreatePalette */
43   NULL, /* GetScanLine */
44   NULL, /* SetExclusiveMode */
45   NULL  /* FlipToGDISurface */
46 };
47
48 static DDHALINFO hal_info = {
49   sizeof(DDHALINFO),
50   &hal_ddcallbacks,
51   /* more stuff */
52 };
53
54 static LPDDHALDDRAWFNS ddraw_fns;
55 static DWORD ddraw_ver;
56
57 INT X11DRV_DCICommand(INT cbInput, LPVOID lpInData, LPVOID lpOutData)
58 {
59   LPDCICMD lpCmd = (LPDCICMD)lpInData;
60
61   TRACE("(%d,(%ld,%ld,%ld),%p)\n", cbInput, lpCmd->dwCommand,
62         lpCmd->dwParam1, lpCmd->dwParam2, lpOutData);
63
64   switch (lpCmd->dwCommand) {
65   case DDNEWCALLBACKFNS:
66     ddraw_fns = (LPDDHALDDRAWFNS)lpCmd->dwParam1;
67     return TRUE;
68   case DDVERSIONINFO:
69     {
70       LPDDVERSIONDATA lpVer = (LPDDVERSIONDATA)lpOutData;
71       ddraw_ver = lpCmd->dwParam1;
72       if (!lpVer) break;
73       /* well, whatever... the DDK says so */
74       lpVer->dwHALVersion = DD_RUNTIME_VERSION;
75     }
76     return TRUE;
77   case DDGET32BITDRIVERNAME:
78     {
79       LPDD32BITDRIVERDATA lpData = (LPDD32BITDRIVERDATA)lpOutData;
80       /* here, we could ask ddraw to load a separate DLL, that
81        * would contain the 32-bit ddraw HAL */
82       strcpy(lpData->szName,"x11drv");
83       /* the entry point named here should initialize our hal_info
84        * with 32-bit entry points */
85       strcpy(lpData->szEntryPoint,"DriverInit");
86       lpData->dwContext = 0;
87     }
88     return TRUE;
89   case DDCREATEDRIVEROBJECT:
90     {
91       LPDWORD lpInstance = (LPDWORD)lpOutData;
92
93 #ifdef HAVE_LIBXXF86VM
94       hal_info.dwNumModes = xf86vm_mode_count;
95       hal_info.lpModeInfo = xf86vm_modes;
96       hal_info.dwModeIndex = X11DRV_XF86VM_GetCurrentMode();
97 #endif
98       /* FIXME: get x11drv's hInstance */
99
100       (ddraw_fns->lpSetInfo)(&hal_info, FALSE);
101       *lpInstance = hal_info.hInstance;
102     }
103     return TRUE;
104   }
105   return 0;
106 }