source: trunk/src/ddraw/OS2DDRAW.CPP@ 97

Last change on this file since 97 was 97, checked in by phaller, 26 years ago

Add: added cvs variable $Id$ to source files.

File size: 15.8 KB
Line 
1/* $Id: OS2DDRAW.CPP,v 1.3 1999-06-10 17:10:56 phaller Exp $ */
2
3/*
4 * DirectDraw main class
5 *
6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11/*@Const************************************************************************
12* Defined Constants *
13*******************************************************************************/
14#define WIN32SDK_NOPOSTWRAPPER
15
16/*@Header***********************************************************************
17* Header Files *
18*******************************************************************************/
19#include <os2win.h>
20#include <dive.h>
21
22#include <memory.h>
23#include <builtin.h>
24
25#include "no.h"
26#include <w_windows.h>
27#include <ddraw.h>
28#include <d3d.h>
29#include <Win32SDKPostWrapper.h>
30
31#include <fourcc.h>
32
33#include "os2ddraw.h"
34#include "os2clipper.h"
35#include "os2palette.h"
36#include "os2surface.h"
37#include "misc.h"
38#include "os2util.h"
39
40
41/* KSO Apr 19 1999: Set correct interface. *
42 * (INTERFACE is used in the THIS and THIS_ macros) */
43#undef INTERFACE
44#define INTERFACE IDirectDraw2
45
46
47
48DIVE_CAPS dcaps = {0};
49FOURCC fccFormats[100] = {0}; /* Color format code */
50
51
52//******************************************************************************
53//******************************************************************************
54OS2IDirectDraw::OS2IDirectDraw(GUID *lpGUID) :
55 Referenced(0), lastError(DD_OK),
56 pFrameBuffer(NULL), hwndClient(0), screenwidth(640),
57 screenheight(480), screenbpp(8), fFullScreen(TRUE)
58{
59 if(lpGUID && *lpGUID == IID_IDirect3D) {
60 lpVtbl = (IDirectDraw2Vtbl *)&Vtbl3D;
61 Vtbl3D.AddRef = D3DAddRef;
62 Vtbl3D.Release = D3DRelease;
63 Vtbl3D.QueryInterface = D3DQueryInterface;
64 Vtbl3D.Initialize = D3DInitialize;
65 Vtbl3D.EnumDevices = D3DEnumDevices;
66 Vtbl3D.CreateLight = D3DCreateLight;
67 Vtbl3D.CreateMaterial = D3DCreateMaterial;
68 Vtbl3D.CreateViewport = D3DCreateViewport;
69 Vtbl3D.FindDevice = D3DFindDevice;
70 }
71 else {
72 lpVtbl = &Vtbl;
73 Vtbl.AddRef = DrawAddRef;
74 Vtbl.Release = DrawRelease;
75 Vtbl.QueryInterface = DrawQueryInterface;
76 Vtbl.Compact = DrawCompact;
77 Vtbl.CreateClipper = DrawCreateClipper;
78 Vtbl.W32_CreatePalette = DrawCreatePalette; //KSO Apr 19 1999: Sideeffect of the wrapping...
79 Vtbl.CreateSurface = DrawCreateSurface;
80 Vtbl.DuplicateSurface = DrawDuplicateSurface;
81 Vtbl.EnumDisplayModes = DrawEnumDisplayModes;
82 Vtbl.EnumSurfaces = DrawEnumSurfaces;
83 Vtbl.FlipToGDISurface = DrawFlipToGDISurface;
84 Vtbl.GetCaps = DrawGetCaps;
85 Vtbl.GetDisplayMode = DrawGetDisplayMode;
86 Vtbl.GetFourCCCodes = DrawGetFourCCCodes;
87 Vtbl.GetGDISurface = DrawGetGDISurface;
88 Vtbl.GetMonitorFrequency = DrawGetMonitorFrequency;
89 Vtbl.GetScanLine = DrawGetScanLine;
90 Vtbl.GetVerticalBlankStatus = DrawGetVerticalBlankStatus;
91 Vtbl.Initialize = DrawInitialize;
92 Vtbl.RestoreDisplayMode = DrawRestoreDisplayMode;
93 Vtbl.SetCooperativeLevel = DrawSetCooperativeLevel;
94
95 if(lpGUID && *lpGUID == IID_IDirectDraw2)
96 *(ULONG *)&Vtbl.SetDisplayMode = (ULONG)DrawSetDisplayMode2;
97 else *(ULONG *)&Vtbl.SetDisplayMode = (ULONG)DrawSetDisplayMode;
98
99 Vtbl.WaitForVerticalBlank = DrawWaitForVerticalBlank;
100 Vtbl.GetAvailableVidMem = DrawGetAvailableVidMem;
101 }
102
103 ULONG rc = DiveOpen(&hDive, FALSE, &pFrameBuffer);
104 if(rc) {
105 dprintf(("ERROR: DiveOpen returned %d\n", rc));
106 lastError = DDERR_GENERIC;
107 hDive = NULL;
108 }
109 dcaps.pFormatData = fccFormats;
110 dcaps.ulFormatLength = sizeof(fccFormats);
111 dcaps.ulStructLen = sizeof(dcaps);
112 DiveQueryCaps(&dcaps, DIVE_BUFFER_SCREEN);
113}
114//******************************************************************************
115//******************************************************************************
116OS2IDirectDraw::~OS2IDirectDraw()
117{
118 dprintf(("OS2IDirectDraw::~OS2IDirectDraw()\n"));
119 if(hDive) DiveClose(hDive);
120}
121//******************************************************************************
122//******************************************************************************
123HRESULT __stdcall DrawQueryInterface(THIS, REFIID riid, LPVOID FAR * ppvObj)
124{
125#ifdef DEBUG
126 WriteLog("OS2IDirectDraw::QueryInterface\n");
127#endif
128 *ppvObj = NULL;
129
130 if(!IsEqualGUID(riid, CLSID_DirectDraw) &&
131 !IsEqualGUID(riid, IID_IDirectDraw) &&
132 !IsEqualGUID(riid, IID_IDirectDraw2))
133//&& !IsEqualGUID(riid, IID_IUnknown))
134 return E_NOINTERFACE;
135
136 *ppvObj = This;
137
138 DrawAddRef(This);
139 return(DD_OK);
140}
141//******************************************************************************
142//******************************************************************************
143ULONG __stdcall DrawAddRef(THIS)
144{
145 OS2IDirectDraw *me = (OS2IDirectDraw *)This;
146
147#ifdef DEBUG
148 WriteLog("OS2IDirectDraw::AddRef %d\n", me->Referenced+1);
149#endif
150 return ++me->Referenced;
151}
152//******************************************************************************
153//******************************************************************************
154ULONG __stdcall DrawRelease(THIS)
155{
156 OS2IDirectDraw *me = (OS2IDirectDraw *)This;
157
158#ifdef DEBUG
159 WriteLog("OS2IDirectDraw::Release %d\n", me->Referenced-1);
160 WriteLog("OS2IDirectDraw::%X \n", me);
161#endif
162 if(me->Referenced) {
163 me->Referenced--;
164 if(me->Referenced == 0) {
165 delete me;
166 return(0);
167 }
168 else return me->Referenced;
169 }
170 else return(0);
171}
172//******************************************************************************
173//******************************************************************************
174HRESULT __stdcall DrawCompact(THIS)
175{
176#ifdef DEBUG
177 WriteLog("Compact\n");
178#endif
179 return(DD_OK);
180}
181//******************************************************************************
182//******************************************************************************
183HRESULT __stdcall DrawCreateClipper(THIS, DWORD, LPDIRECTDRAWCLIPPER FAR *lplpDD, IUnknown FAR * )
184{
185 OS2IDirectDraw *me = (OS2IDirectDraw *)This;
186 OS2IDirectDrawClipper *newclip = new OS2IDirectDrawClipper(me);
187 HRESULT rc;
188
189#ifdef DEBUG
190 WriteLog("CreateClipper\n");
191#endif
192 if(newclip == NULL) return(DDERR_OUTOFMEMORY);
193
194 newclip->Vtbl.AddRef((IDirectDrawClipper *)newclip);
195 rc = newclip->GetLastError();
196 if(rc != DD_OK) {
197 *lplpDD = NULL;
198 delete newclip;
199 }
200 else *lplpDD = (IDirectDrawClipper *)newclip;
201
202 return(rc);
203}
204//******************************************************************************
205//******************************************************************************
206HRESULT __stdcall DrawCreatePalette(THIS, DWORD dwFlags,
207 W32_LPPALETTEENTRY lpColorTable,
208 LPDIRECTDRAWPALETTE FAR *lplpDD,
209 IUnknown FAR *pUnkOuter)
210{
211 OS2IDirectDraw *me = (OS2IDirectDraw *)This;
212 OS2IDirectDrawPalette *newpal;
213 HRESULT rc;
214 int palsize = 0;
215
216 if(dwFlags & (DDPCAPS_2BIT | DDPCAPS_4BIT) && !(dwFlags & DDPCAPS_8BITENTRIES)) {
217 //only support 8 bits color palettes...
218 return DDERR_INVALIDPARAMS;
219 }
220 if(dwFlags & DDPCAPS_2BIT) palsize = 4;
221 if(dwFlags & DDPCAPS_4BIT) palsize = 16;
222 if(dwFlags & DDPCAPS_8BIT) palsize = 256;
223 if(dwFlags & DDPCAPS_ALLOW256) palsize = 256;
224 if(palsize == 0) return DDERR_INVALIDPARAMS;
225
226 dprintf(("CreatePalette with %d colors\n", palsize));
227
228 newpal = new OS2IDirectDrawPalette(me, palsize, lpColorTable);
229 if(newpal == NULL) return(DDERR_OUTOFMEMORY);
230
231 newpal->Vtbl.AddRef((IDirectDrawPalette *)newpal);
232 rc = newpal->GetLastError();
233 if(rc != DD_OK) {
234 *lplpDD = NULL;
235 delete newpal;
236 }
237 else *lplpDD = (IDirectDrawPalette *)newpal;
238
239 return(rc);
240}
241//******************************************************************************
242//******************************************************************************
243HRESULT __stdcall DrawCreateSurface(THIS, LPDDSURFACEDESC lpDDSurfaceDesc,
244 LPDIRECTDRAWSURFACE FAR *lplpDD,
245 IUnknown FAR *pUnkOuter)
246{
247 OS2IDirectDraw *me = (OS2IDirectDraw *)This;
248 OS2IDirectDrawSurface *newsurf;
249 HRESULT rc;
250
251#ifdef DEBUG
252 WriteLog("CreateSurface\n");
253 WriteLog(" dwSize %d\n", lpDDSurfaceDesc->dwSize);
254 WriteLog(" dwFlags %X\n", lpDDSurfaceDesc->dwFlags);
255 WriteLog(" dwHeight %d\n", lpDDSurfaceDesc->dwHeight);
256 WriteLog(" dwWidth %d\n", lpDDSurfaceDesc->dwWidth);
257 WriteLog(" lPitch %d\n", lpDDSurfaceDesc->lPitch);
258 WriteLog(" lpSurface %d\n", lpDDSurfaceDesc->lpSurface);
259 WriteLog(" dwBackBufferCount %d\n", lpDDSurfaceDesc->dwBackBufferCount);
260 WriteLog(" dwMipMapCount %d\n", lpDDSurfaceDesc->dwMipMapCount);
261 WriteLog(" dwAlphaBitDepth %d\n", lpDDSurfaceDesc->dwAlphaBitDepth);
262 WriteLog(" ddsCaps.dwCaps %X\n", lpDDSurfaceDesc->ddsCaps.dwCaps);
263#endif
264
265 newsurf = new OS2IDirectDrawSurface(me, lpDDSurfaceDesc);
266 if(newsurf == NULL) return(DDERR_OUTOFMEMORY);
267
268 newsurf->Vtbl.AddRef((IDirectDrawSurface2 *)newsurf);
269 rc = newsurf->GetLastError();
270 if(rc != DD_OK) {
271 *lplpDD = NULL;
272 delete newsurf;
273 }
274 else *lplpDD = (IDirectDrawSurface *)newsurf;
275
276 return(rc);
277}
278//******************************************************************************
279//******************************************************************************
280HRESULT __stdcall DrawDuplicateSurface(THIS, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR * )
281{
282#ifdef DEBUG
283 WriteLog("DuplicateSurface\n");
284#endif
285 return(DD_OK);
286}
287//******************************************************************************
288//******************************************************************************
289HRESULT __stdcall DrawEnumDisplayModes(THIS, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK )
290{
291#ifdef DEBUG
292 WriteLog("EnumDisplayModes\n");
293#endif
294 return(DD_OK);
295}
296//******************************************************************************
297//******************************************************************************
298HRESULT __stdcall DrawEnumSurfaces(THIS, DWORD, LPDDSURFACEDESC, LPVOID,LPDDENUMSURFACESCALLBACK )
299{
300#ifdef DEBUG
301 WriteLog("EnumSurfaces\n");
302#endif
303 return(DD_OK);
304}
305//******************************************************************************
306//******************************************************************************
307HRESULT __stdcall DrawFlipToGDISurface(THIS)
308{
309#ifdef DEBUG
310 WriteLog("FlipToGDISurface\n");
311#endif
312 return(DD_OK);
313}
314//******************************************************************************
315//******************************************************************************
316HRESULT __stdcall DrawGetCaps(THIS, LPDDCAPS, LPDDCAPS)
317{
318#ifdef DEBUG
319 WriteLog("GetCaps\n");
320#endif
321 return(DD_OK);
322}
323//******************************************************************************
324//******************************************************************************
325HRESULT __stdcall DrawGetDisplayMode(THIS, LPDDSURFACEDESC)
326{
327#ifdef DEBUG
328 WriteLog("GetDisplayMode\n");
329#endif
330 return(DD_OK);
331}
332//******************************************************************************
333//******************************************************************************
334HRESULT __stdcall DrawGetFourCCCodes(THIS, LPDWORD, LPDWORD)
335{
336#ifdef DEBUG
337 WriteLog("GetFourCCCodes\n");
338#endif
339 return(DD_OK);
340}
341//******************************************************************************
342//******************************************************************************
343HRESULT __stdcall DrawGetGDISurface(THIS, LPDIRECTDRAWSURFACE FAR *)
344{
345#ifdef DEBUG
346 WriteLog("GetGDISurface\n");
347#endif
348 return(DD_OK);
349}
350//******************************************************************************
351//******************************************************************************
352HRESULT __stdcall DrawGetMonitorFrequency(THIS, LPDWORD)
353{
354#ifdef DEBUG
355 WriteLog("GetMonitorFrequency\n");
356#endif
357 return(DD_OK);
358}
359//******************************************************************************
360//******************************************************************************
361HRESULT __stdcall DrawGetScanLine(THIS, LPDWORD)
362{
363#ifdef DEBUG
364 WriteLog("GetScanLine\n");
365#endif
366 return(DD_OK);
367}
368//******************************************************************************
369//******************************************************************************
370HRESULT __stdcall DrawGetVerticalBlankStatus(THIS, LPBOOL)
371{
372#ifdef DEBUG
373 WriteLog("GetVerticalBlankStatus\n");
374#endif
375 return(DD_OK);
376}
377//******************************************************************************
378//******************************************************************************
379HRESULT __stdcall DrawInitialize(THIS, GUID FAR *)
380{
381#ifdef DEBUG
382 WriteLog("Initialize\n");
383#endif
384 return(DD_OK);
385}
386//******************************************************************************
387//******************************************************************************
388HRESULT __stdcall DrawRestoreDisplayMode(THIS)
389{
390#ifdef DEBUG
391 WriteLog("RestoreDisplayMod\n");
392#endif
393 return(DD_OK);
394}
395//******************************************************************************
396//******************************************************************************
397HRESULT __stdcall DrawSetCooperativeLevel(THIS, W32_HWND hwndClient, DWORD dwFlags)
398{
399 OS2IDirectDraw *me = (OS2IDirectDraw *)This;
400
401 dprintf(("SetCooperativeLevel: hwnd %X, Flags %X\n", hwndClient, dwFlags));
402 if(dwFlags & DDSCL_FULLSCREEN) {
403 me->fFullScreen = TRUE;
404 }
405 else me->fFullScreen = FALSE;
406
407 me->hwndClient = hwndClient;
408 OS2MaximizeWindow((HWND)hwndClient);
409 return(DD_OK);
410}
411//******************************************************************************
412//Backwards compatibility, what's that??
413//******************************************************************************
414HRESULT __stdcall DrawSetDisplayMode2(THIS, DWORD dwWidth, DWORD dwHeight,
415 DWORD dwBPP, DWORD dwRefreshRate,
416 DWORD dwFlags)
417{
418 OS2IDirectDraw *me = (OS2IDirectDraw *)This;
419
420 dprintf(("SetDisplayMode2 to %dx%d with %d bits colors\n", dwWidth, dwHeight, dwBPP));
421 me->screenwidth = dwWidth;
422 me->screenheight = dwHeight;
423 me->screenbpp = dwBPP;
424 return(DD_OK);
425}
426//******************************************************************************
427//******************************************************************************
428HRESULT __stdcall DrawSetDisplayMode(THIS, DWORD dwWidth, DWORD dwHeight,
429 DWORD dwBPP)
430{
431 OS2IDirectDraw *me = (OS2IDirectDraw *)This;
432
433// _interrupt(3);
434 dprintf(("SetDisplayMode to %dx%d with %d bits colors\n", dwWidth, dwHeight, dwBPP));
435 me->screenwidth = dwWidth;
436 me->screenheight = dwHeight;
437 me->screenbpp = dwBPP;
438 return(DD_OK);
439}
440//******************************************************************************
441//******************************************************************************
442HRESULT __stdcall DrawWaitForVerticalBlank(THIS, DWORD, W32_HANDLE)
443{
444 dprintf(("WaitForVerticalBlank\n"));
445 return(DD_OK);
446}
447//******************************************************************************
448/*** Added in the v2 interface ***/
449//******************************************************************************
450HRESULT __stdcall DrawGetAvailableVidMem(THIS, LPDDSCAPS, LPDWORD, LPDWORD)
451{
452 dprintf(("GetAvailableVidMem\n"));
453 return(DD_OK);
454}
455//******************************************************************************
456//******************************************************************************
Note: See TracBrowser for help on using the repository browser.