2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
15 #pragma off (unreferenced)
16 static char rcsid[] = "$Id: ddgfx.c,v 1.1.1.1 2001-01-19 03:30:15 bradleyb Exp $";
17 #pragma on (unreferenced)
22 #define WIN32_LEAN_AND_MEAN
26 #include "win\ddraw.h"
39 #define MAX_GFX_BITMAPS 512
44 static BOOL dd_gfx_initialized = 0;
45 static unsigned short gfxBitmapHandleCur = 1;
47 static struct _gfxBitmap {
48 LPDIRECTDRAWSURFACE lpdds;
51 } gfxBitmap[MAX_GFX_BITMAPS];
60 if (dd_gfx_initialized) return 1;
62 for (i = 0; i < MAX_GFX_BITMAPS; i++)
63 gfxBitmap[i].lpdds = NULL;
65 gfxBitmapHandleCur = 1;
70 if (FindArg("-disallowgfx")) dd_gfx_initialized = 0;
71 else if (FindArg("-forcegfx")) dd_gfx_initialized = 1;
73 if (ddDriverCaps.hwcolorkey)
74 logentry("Card supports HW colorkeying.\n");
76 if (ddDriverCaps.hwbltstretch)
77 logentry("Card supports HW bitmap stretching.\n");
79 if (ddDriverCaps.hwcolorkey) dd_gfx_initialized = 1;
80 else dd_gfx_initialized = 0;
91 if (!dd_gfx_initialized) return 1;
93 for (i = 0; i < MAX_GFX_BITMAPS; i++)
95 if (gfxBitmap[i].lpdds)
96 IDirectDrawSurface_Release(gfxBitmap[i].lpdds);
99 dd_gfx_initialized =0;
105 unsigned short dd_gfx_createbitmap2D(int w, int h)
108 unsigned short handle;
110 if (!dd_gfx_initialized) return 0;
112 for (i = 0; i < MAX_GFX_BITMAPS; i++)
113 if (!gfxBitmap[i].lpdds) {
114 handle = (unsigned short)(i);
118 if (i == MAX_GFX_BITMAPS) return 0;
120 // Only do this if we can benefit from it.
121 // if (ddDriverCaps.hwcolorkey && ddDriverCaps.hwbltstretch)
123 if (FindArg("-forcegfx")) force = 1;
126 if (ddDriverCaps.hwcolorkey || force)
128 LPDIRECTDRAWSURFACE lpdds;
133 memset(&ddsd, 0, sizeof(ddsd));
134 ddsd.dwSize = sizeof(ddsd);
135 ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
136 ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
140 ddresult = IDirectDraw_CreateSurface(_lpDD, &ddsd, &lpdds, NULL);
142 if (ddresult != DD_OK) {
143 mprintf((0, "DDGFX: Failed to create vidmem 2d bitmap (%x).\n", ddresult));
146 ddck.dwColorSpaceLowValue = TRANSPARENCY_COLOR;
147 ddck.dwColorSpaceHighValue = TRANSPARENCY_COLOR;
148 IDirectDrawSurface_SetColorKey(lpdds, DDCKEY_SRCBLT, &ddck);
150 gfxBitmap[handle].lpdds = lpdds;
151 gfxBitmap[handle].w = w;
152 gfxBitmap[handle].h = h;
153 handle++; // Make it a valid handle
161 int dd_gfx_loadbitmap2D(unsigned short handle, void *buf, int rleflag)
171 if (!dd_gfx_initialized) return 0;
173 handle--; // Convert to valid handle
177 memset(&ddsd, 0, sizeof(ddsd));
178 ddsd.dwSize = sizeof(ddsd);
180 ddresult = IDirectDrawSurface_Lock(gfxBitmap[handle].lpdds, NULL, &ddsd, DDLOCK_WAIT, NULL);
181 if (ddresult != DD_OK) {
182 if (ddresult == DDERR_SURFACELOST) {
183 ddresult = IDirectDrawSurface_Restore(gfxBitmap[handle].lpdds);
184 if (ddresult != DD_OK) {
185 if (ddresult != DDERR_WRONGMODE) {
186 logentry("DDGFX::Restore::Surface err: %x\n", ddresult);
190 LPDIRECTDRAWSURFACE lpdds;
193 IDirectDrawSurface_Release(lpdds);
194 gfxBitmap[handle].lpdds = NULL;
196 memset(&ddsd, 0, sizeof(ddsd));
197 ddsd.dwSize = sizeof(ddsd);
198 ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
199 ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
200 ddsd.dwWidth = gfxBitmap[handle].w;
201 ddsd.dwHeight = gfxBitmap[handle].h;
203 ddresult = IDirectDraw_CreateSurface(_lpDD, &ddsd, &lpdds, NULL);
205 if (ddresult != DD_OK) {
206 mprintf((0, "DDGFX: Failed to restore vidmem 2d bitmap.\n"));
209 ddck.dwColorSpaceLowValue = TRANSPARENCY_COLOR;
210 ddck.dwColorSpaceHighValue = TRANSPARENCY_COLOR;
211 IDirectDrawSurface_SetColorKey(lpdds, DDCKEY_SRCBLT, &ddck);
212 gfxBitmap[handle].lpdds = lpdds;
219 mprintf((0, "DDGFX:Unable to lock surface!!\n"));
225 ptr = ddsd.lpSurface;
228 gr_init_bitmap(&tbmp, BM_LINEAR, 0,0,gfxBitmap[handle].w, gfxBitmap[handle].h, gfxBitmap[handle].w, buf);
229 if (rleflag) tbmp.bm_flags = BM_FLAG_RLE;
231 for(i = 0; i < gfxBitmap[handle].h; i++)
233 extern ubyte scale_rle_data[];
236 memcpy(ptr+(i*pitch), scale_rle_data, gfxBitmap[handle].w);
238 else memcpy(ptr+(i*pitch), (ubyte*)(buf)+(i*gfxBitmap[handle].w), gfxBitmap[handle].w);
241 IDirectDrawSurface_Unlock(gfxBitmap[handle].lpdds, ptr);
249 int dd_gfx_destroybitmap2D(unsigned short handle)
251 if (!dd_gfx_initialized) return 0;
253 if (handle == 0) return 1;
254 handle--; // Convert to valid handle
256 if (gfxBitmap[handle].lpdds) {
257 IDirectDrawSurface_Release(gfxBitmap[handle].lpdds);
258 gfxBitmap[handle].lpdds = NULL;
265 int dd_gfx_resetbitmap2Dcache()
269 if (!dd_gfx_initialized) return 0;
271 for (i = 0; i < MAX_GFX_BITMAPS; i++)
272 dd_gfx_destroybitmap2D(i+1);
278 void dd_gfx_blt2D(unsigned short handle, int x, int y, int x2, int y2,
279 fix u0, fix v0, fix u1, fix v1)
283 if (!dd_gfx_initialized) return;
286 handle--; // Convert to valid handle
288 SetRect(&drect, x,y,x2,y2);
289 SetRect(&srect, f2i(u0), f2i(v0), f2i(u1), f2i(v1));
291 IDirectDrawSurface_Blt(dd_grd_curcanv->lpdds, &drect,
292 gfxBitmap[handle].lpdds,
293 &srect, DDBLT_WAIT| DDBLT_KEYSRC,