source: trunk/src/ddraw/new/ddraw.cpp

Last change on this file was 21916, checked in by dmik, 14 years ago

Merge branch gcc-kmk to trunk.

File size: 7.7 KB
RevLine 
[4970]1/* $Id: ddraw.CPP,v 1.2 2001-01-19 02:06:55 mike Exp $ */
[3345]2
3/*
4 * DXDraw DLL implementaion
5 *
[4970]6 * Copyright 1998 Sander van Leeuwen
[3345]7 * Copyright 1999 Markus Montkowski
8 *
[4970]9 * WARNING: DirectDrawCreate defaults to ddraw v4 if lpGUID == NULL!!
10 *
11 *
[3345]12 * Project Odin Software License can be found in LICENSE.TXT
13 *
14 */
15
16#include <memory.h>
17#include <stdio.h>
18#include <builtin.h>
19#define INITGUID
20#define CINTERFACE
21
22#include "os2ddraw.h"
23#include "winerror.h"
24// define the following as we include winnt.h
25#define _OS2WIN_H
26#define FAR
27
28#include <misc.h>
29
30//******************************************************************************
31//******************************************************************************
32HRESULT WIN32API OS2DirectDrawCreate( GUID FAR *lpGUID,
33 LPDIRECTDRAW FAR *lplpDD,
34 IUnknown FAR *pUnkOuter)
35{
36 OS2IDirectDraw *newdraw;
37 HRESULT rc;
38
39 dprintf(("DDRAW: DirectDrawCreate %X %X %X\n", lpGUID, lplpDD, pUnkOuter));
40
41 newdraw = new OS2IDirectDraw(lpGUID);
42
43 if(newdraw == NULL)
44 {
45 rc = DDERR_NODIRECTDRAWHW;
46 }
47 else
48 {
49 newdraw->Vtbl.AddRef((IDirectDraw2 *)newdraw);
[4970]50
[3345]51 rc = newdraw->GetLastError();
52 if(rc != DD_OK)
53 {
54 *lplpDD = NULL;
55
56 delete newdraw;
57 }
58 else
59 *lplpDD = (LPDIRECTDRAW)newdraw;
60 }
61 return(rc);
62}
63//******************************************************************************
[4970]64//******************************************************************************
65HRESULT WIN32API DirectDrawCreateEx(LPGUID lpGUID, LPVOID* lplpDD, REFIID iid, LPUNKNOWN pUnkOuter)
66{
67 dprintf(("DirectDrawCreateEx: %x %x %x %x", lpGUID, lplpDD, iid, pUnkOuter));
68 /* I don't know about what functionality is unique to Ex */
69 return OS2DirectDrawCreate(lpGUID,(LPDIRECTDRAW*)lplpDD,pUnkOuter);
70}
71
72//******************************************************************************
[3345]73typedef BOOL (FAR PASCAL * LPDDENUMCALLBACKA)(GUID FAR *, LPSTR, LPSTR, LPVOID);
74//******************************************************************************
75HRESULT WIN32API OS2DirectDrawEnumerateA(LPDDENUMCALLBACKA lpCallback,
76 LPVOID lpContext)
77{
78 dprintf(("DDRAW: DirectDrawEnumerateA\n Callback for DIVE\n"));
79 //call it twice for the DirectDraw & Direct3D classes
80 if(lpCallback(NULL, "DIVE DirectDraw for OS/2",
81 "DirectDraw/2 v0.2", lpContext) == DDENUMRET_CANCEL)
82 {
83 dprintf(("DDRAW: Cancel Callback\n"));
84 return(DD_OK);
85 }
86 else //now for Direct3D
87 {
88 dprintf(("DDRAW: Callback for 3Dfx Voodoo"));
89 if(lpCallback((GUID *)&IID_IDirect3D, "3Dfx Voodoo Direct3D/2",
90 "Direct3D/2 v0.2", lpContext) == DDENUMRET_CANCEL)
91 {
92 dprintf(("DDRAW: Cancel Callback\n"));
93 return(DD_OK);
94 }
95 }
96 dprintf(("DDRAW: Done Enumeration\n\n"));
97
98 return(DD_OK);
99}
100
101//******************************************************************************
102typedef struct
103{
104 LPDDENUMCALLBACKEXA lpCallbackEx;
105 LPVOID lpContext;
106} ENUMDATA, *PENUMDATA;
107
108BOOL FAR PASCAL SimpleEnum ( GUID FAR *lpGUID,
109 LPSTR lpDriverDescription,
110 LPSTR lpDriverName,
111 LPVOID lpContext)
112{
113 BOOL rc;
114 PENUMDATA pData;
115
116 dprintf(("DDRAW: SimpleEnum\n"));
117
118 pData = (PENUMDATA)lpContext;
119 rc = pData->lpCallbackEx( lpGUID,
120 lpDriverDescription,
121 lpDriverName,
122 pData->lpContext,
123 NULL);
124
125 dprintf(("DDRAW: Callback returned\n"));
126 return rc;
127}
128
129//******************************************************************************
130HRESULT WIN32API OS2DirectDrawEnumerateExA( LPDDENUMCALLBACKEXA lpCallbackEx,
131 LPVOID lpContext,
132 DWORD dwFlags)
133{
134 ENUMDATA data;
135
136 dprintf(("DDRAW: DirectDrawEnumerateExA\n"));
137
138 data.lpCallbackEx = lpCallbackEx;
139 data.lpContext = lpContext;
140
141 OS2DirectDrawEnumerateA( SimpleEnum,
142 &data);
143 return (DD_OK);
144}
145//******************************************************************************
146//******************************************************************************
147DWORD WIN32API DDHAL32_VidMemFree(DWORD address)
148{
149 dprintf(("DDRAW: DDHAL32_VidMemFree, not supported\n"));
150 return(0);
151}
152//******************************************************************************
153//******************************************************************************
154DWORD WIN32API DDHAL32_VidMemAlloc(DWORD size)
155{
156 dprintf(("DDRAW: DDHAL32_VidMemAlloc, not supported\n"));
157 return(0);
158}
159//******************************************************************************
160
161/*******************************************************************************
162 * DirectDraw ClassFactory
163 *
164 */
165
166typedef struct
167{
168 /* IUnknown fields */
169 ICOM_VTABLE(IClassFactory) *lpvtbl;
170 DWORD ref;
171} IClassFactoryImpl;
172
173static HRESULT WINAPI
174DDCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
175{
176 ICOM_THIS(IClassFactoryImpl,iface);
177 char buf[80];
178
179 if (HIWORD(riid))
180 WINE_StringFromCLSID(riid,buf);
181 else
182 sprintf(buf,"<guid-0x%04x>",LOWORD(riid));
183 dprintf(("DDRAW:(%p)->(%s,%p),stub!\n",This,buf,ppobj));
184 return E_NOINTERFACE;
185}
186
187static ULONG WINAPI
188DDCF_AddRef(LPCLASSFACTORY iface)
189{
190 ICOM_THIS(IClassFactoryImpl,iface);
191 return ++(This->ref);
192}
193
194static ULONG WINAPI DDCF_Release(LPCLASSFACTORY iface)
195{
196 ICOM_THIS(IClassFactoryImpl,iface);
197 /* static class, won't be freed */
198 return --(This->ref);
199}
200
201static HRESULT WINAPI DDCF_CreateInstance( LPCLASSFACTORY iface,
202 LPUNKNOWN pOuter,
203 REFIID riid,
204 LPVOID *ppobj)
205{
206 ICOM_THIS(IClassFactoryImpl,iface);
207 LPGUID lpGUID;
208 lpGUID = (LPGUID) riid;
209
210 dprintf(("DDRAW:DDCF_CreateInstance\n"));
211 if( lpGUID &&
212 ( (*lpGUID == IID_IDirectDraw ) ||
213 (*lpGUID == IID_IDirectDraw2) ||
214 (*lpGUID == IID_IDirectDraw4))
215 )
216 {
217 /* FIXME: reuse already created DirectDraw if present? */
218 return OS2DirectDrawCreate(lpGUID,(LPDIRECTDRAW*)ppobj,pOuter);
219 }
220 return E_NOINTERFACE;
221}
222
223static HRESULT WINAPI DDCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
224{
225 ICOM_THIS(IClassFactoryImpl,iface);
226 dprintf(("DDRAW:(%p)->(%d),stub!\n",This,dolock));
227 return S_OK;
228}
229
230static ICOM_VTABLE(IClassFactory) DDCF_Vtbl =
231{
232 DDCF_QueryInterface,
233 DDCF_AddRef,
234 DDCF_Release,
235 DDCF_CreateInstance,
236 DDCF_LockServer
237};
238
239static IClassFactoryImpl DDRAW_CF = {&DDCF_Vtbl, 1 };
240
241
242HRESULT WINAPI DllGetClassObject( REFCLSID rclsid,
243 REFIID riid,
244 LPVOID *ppv)
245{
246 char buf[80],xbuf[80];
247
248 if (HIWORD(rclsid))
249 WINE_StringFromCLSID(rclsid,xbuf);
250 else
251 sprintf(xbuf,"<guid-0x%04x>",LOWORD(rclsid));
252 if (HIWORD(riid))
253 WINE_StringFromCLSID(riid,buf);
254 else
255 sprintf(buf,"<guid-0x%04x>",LOWORD(riid));
256 WINE_StringFromCLSID(riid,xbuf);
257
258 dprintf(("DDRAW:(%p,%p,%p)\n", xbuf, buf, ppv));
259 if (!memcmp(riid,&IID_IClassFactory,sizeof(IID_IClassFactory)))
260 {
261 *ppv = (LPVOID)&DDRAW_CF;
262 DDRAW_CF.lpvtbl->AddRef((IClassFactory*)&DDRAW_CF);
263 return S_OK;
264 }
265 dprintf(("DDRAW: (%p,%p,%p): no interface found.\n", xbuf, buf, ppv));
266 return E_NOINTERFACE;
267}
268
269
270/*******************************************************************************
271 * DllCanUnloadNow [DDRAW.12] Determines whether the DLL is in use.
272 *
273 * RETURNS
274 * Success: S_OK
275 * Failure: S_FALSE
276 */
277HRESULT WINAPI DllCanUnloadNow(void)
278{
279 dprintf(("DllCanUnloadNow(void) stub\n"));
280 return S_FALSE;
281}//******************************************************************************
282
Note: See TracBrowser for help on using the repository browser.