1 // Windows video functions.
10 #include <Windows32/Errors.h>
21 //added 10/05/98 by Matt Mueller - make fullscreen mode optional
24 //removed 07/11/99 by adb - now option
25 ////added 02/20/99 by adb - put descent in a window, sort of. Needed for debugging
26 ////(needs a 256 color mode to be useful)
32 char *backbuffer = NULL;
36 // Min without sideeffects.
38 #define inline __inline
42 inline static int min(int x, int y) { return x < y ? x : y; }
48 LPDIRECTDRAWSURFACE lpDDSPrimary;
49 LPDIRECTDRAWSURFACE lpDDSOne;
50 LPDIRECTDRAWPALETTE lpDDPal;
53 //added 02/20/99 by adb - put descent in a window, sort of. Needed for debugging
54 //(needs a 256 color mode to be useful)
57 void gr_palette_clear(); // Function prototype for gr_init;
60 static char *DDerror(int code)
64 /* case DDERR_GENERIC:
65 error = "Undefined error!";
68 error = "Exception encountered";
70 case DDERR_INVALIDOBJECT:
71 error = "Invalid object";
73 /* case DDERR_INVALIDPARAMS:
74 error = "Invalid parameters";
77 error = "Object not found";
79 case DDERR_INVALIDRECT:
80 error = "Invalid rectangle";
82 case DDERR_INVALIDCAPS:
83 error = "Invalid caps member";
85 case DDERR_INVALIDPIXELFORMAT:
86 error = "Invalid pixel format";
88 /* case DDERR_OUTOFMEMORY:
89 error = "Out of memory";
91 case DDERR_OUTOFVIDEOMEMORY:
92 error = "Out of video memory";
94 case DDERR_SURFACEBUSY:
95 error = "Surface busy";
97 case DDERR_SURFACELOST:
98 error = "Surface was lost";
100 case DDERR_WASSTILLDRAWING:
101 error = "DirectDraw is still drawing";
103 case DDERR_INVALIDSURFACETYPE:
104 error = "Invalid surface type";
106 case DDERR_NOEXCLUSIVEMODE:
107 error = "Not in exclusive access mode";
109 case DDERR_NOPALETTEATTACHED:
110 error = "No palette attached";
112 case DDERR_NOPALETTEHW:
113 error = "No palette hardware";
115 case DDERR_NOT8BITCOLOR:
116 error = "Not 8-bit color";
118 case DDERR_EXCLUSIVEMODEALREADYSET:
119 error = "Exclusive mode was already set";
121 case DDERR_HWNDALREADYSET:
122 error = "Window handle already set";
124 case DDERR_HWNDSUBCLASSED:
125 error = "Window handle is subclassed";
128 error = "No blit hardware";
130 case DDERR_IMPLICITLYCREATED:
131 error = "Surface was implicitly created";
133 case DDERR_INCOMPATIBLEPRIMARY:
134 error = "Incompatible primary surface";
136 case DDERR_NOCOOPERATIVELEVELSET:
137 error = "No cooperative level set";
139 case DDERR_NODIRECTDRAWHW:
140 error = "No DirectDraw hardware";
142 case DDERR_NOEMULATION:
143 error = "No emulation available";
146 error = "No flip hardware";
148 case DDERR_NOTFLIPPABLE:
149 error = "Surface not flippable";
151 case DDERR_PRIMARYSURFACEALREADYEXISTS:
152 error = "Primary surface already exists";
154 case DDERR_UNSUPPORTEDMODE:
155 error = "Unsupported mode";
157 case DDERR_WRONGMODE:
158 error = "Surface created in different mode";
160 /* case DDERR_UNSUPPORTED:
161 error = "Operation not supported";
180 ddsd.dwSize=sizeof(ddsd);
181 ddrval=IDirectDrawSurface_Lock(lpDDSPrimary,NULL,&ddsd,0,NULL);
183 printf("lock failed, %s\n", DDerror(ddrval));
184 Assert(ddrval==DD_OK);
187 j=backbuffer; k=ddsd.lpSurface;
188 h=grd_curscreen->sc_canvas.cv_bitmap.bm_h;
189 w=grd_curscreen->sc_canvas.cv_bitmap.bm_w;
190 for (i=0; i<h; i++) {
192 j+=grd_curscreen->sc_canvas.cv_bitmap.bm_rowsize;
194 #ifdef NONAMELESSUNION
200 IDirectDrawSurface_Unlock(lpDDSPrimary,NULL);
203 ddrval=IDirectDrawSurface_Flip(lpDDSPrimary,NULL,0);
206 printf("Flip was successful\n");
209 if (ddrval == DDERR_SURFACELOST)
211 printf("surface was lost\n");
212 ddrval=IDirectDrawSurface_Restore(lpDDSPrimary);
215 printf("restore failed\n");
219 if (ddrval == DDERR_WASSTILLDRAWING )
221 printf("was still drawing\n");
229 int gr_set_mode(u_int32_t mode)
232 // DDSURFACEDESC DDSDesc;
243 if(lpDDSPrimary!=NULL)
245 IDirectDrawSurface_Release(lpDDSPrimary);
249 if (backbuffer) free(backbuffer);
252 //changed 07/11/99 by adb - nonfullscreen mode now option
253 if (!FindArg("-semiwin"))
255 ddrval=IDirectDraw_SetDisplayMode(lpDD,w,h,8);
259 fprintf(stderr, "Hmmm... I had a problem changing screen modes... is %ix%ix8 supported? If so, try again... :-( %s\n",w,h, DDerror(ddrval));
260 return -3; // This is **not** good...
264 ddsd.dwSize=sizeof(ddsd);
265 ddsd.dwFlags=DDSD_CAPS /*| DDSD_BACKBUFFERCOUNT*/;
266 ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE /*| DDSCAPS_FLIP | DDSCAPS_COMPLEX*/;
267 //ddsd.dwBackBufferCount=1;
269 ddrval=IDirectDraw_CreateSurface(lpDD,&ddsd,&lpDDSPrimary,NULL);
276 memset(&ddcaps,0,sizeof(ddcaps));
277 // ddcaps.dwSize=sizeof(ddcaps);
278 ddcaps.dwCaps=DDSCAPS_BACKBUFFER;
280 ddrval=IDirectDrawSurface_GetAttachedSurface(lpDDSPrimary,&ddcaps,&lpDDSOne);
281 Assert(ddrval==DD_OK);
288 ddrval=IDirectDraw_CreatePalette(lpDD,DDPCAPS_8BIT | DDPCAPS_INITIALIZE | DDPCAPS_ALLOW256,pe,&lpDDPal,NULL);
289 Assert(ddrval==DD_OK);
295 IDirectDrawSurface_SetPalette(lpDDSPrimary,lpDDPal);
296 // IDirectDrawSurface_SetPalette(lpDDSOne,lpDDPal);
300 memset( grd_curscreen, 0, sizeof(grs_screen));
301 grd_curscreen->sc_mode = mode;
302 grd_curscreen->sc_w = w;
303 grd_curscreen->sc_h = h;
304 grd_curscreen->sc_aspect = fixdiv(grd_curscreen->sc_w*3,grd_curscreen->sc_h*4);
305 grd_curscreen->sc_canvas.cv_bitmap.bm_x = 0;
306 grd_curscreen->sc_canvas.cv_bitmap.bm_y = 0;
307 grd_curscreen->sc_canvas.cv_bitmap.bm_w = w;
308 grd_curscreen->sc_canvas.cv_bitmap.bm_h = h;
309 grd_curscreen->sc_canvas.cv_bitmap.bm_type = BM_LINEAR;
311 backbuffer = malloc(w*h);
312 memset(backbuffer, 0, w*h);
313 grd_curscreen->sc_canvas.cv_bitmap.bm_data = (unsigned char *)backbuffer;
315 ddsd.dwSize=sizeof(ddsd);
316 ddrval=IDirectDrawSurface_Lock(lpDDSPrimary,NULL,&ddsd,0,NULL);
322 // bm_rowsize is for backbuffer, so always w -- adb
323 grd_curscreen->sc_canvas.cv_bitmap.bm_rowsize = w;
324 //grd_curscreen->sc_canvas.cv_bitmap.bm_rowsize = (short)ddsd.lPitch;
326 memset(ddsd.lpSurface,0,w*h); // Black the canvas out to stop nasty kludgy display
327 IDirectDrawSurface_Unlock(lpDDSPrimary,NULL);
329 gr_set_current_canvas(NULL);
331 gamefont_choose_game_font(w,h);
333 printf("Successfully completed set_mode\n");
339 void Win32_DoSetPalette (PALETTEENTRY *rgpe)
341 IDirectDraw_WaitForVerticalBlank(lpDD,DDWAITVB_BLOCKBEGIN,NULL);
342 IDirectDrawPalette_SetEntries(lpDDPal,0,0,256,rgpe);
345 void Win32_DoGetPalette (PALETTEENTRY *rgpe)
347 IDirectDrawPalette_GetEntries(lpDDPal,0,0,256,rgpe);
350 //added 07/11/99 by adb for d3d
351 void Win32_MakePalVisible(void)
354 //end additions - adb
358 int gr_init(int mode)
361 // Only do this function once!
364 MALLOC( grd_curscreen,grs_screen,1 );
365 memset( grd_curscreen, 0, sizeof(grs_screen));
368 if ((retcode=gr_set_mode(mode)))
372 grd_curscreen->sc_canvas.cv_color = 0;
373 grd_curscreen->sc_canvas.cv_drawmode = 0;
374 grd_curscreen->sc_canvas.cv_font = NULL;
375 grd_curscreen->sc_canvas.cv_font_fg_color = 0;
376 grd_curscreen->sc_canvas.cv_font_bg_color = 0;
377 gr_set_current_canvas( &grd_curscreen->sc_canvas );
380 // added on 980913 by adb to add cleanup
382 // end changes by adb