2005-01-12 08:38:31 +00:00
|
|
|
#include "quakedef.h"
|
|
|
|
#include "d_local.h"
|
|
|
|
#include "SDL.h"
|
|
|
|
|
|
|
|
extern qboolean vid_isfullscreen;
|
|
|
|
|
|
|
|
extern qboolean ActiveApp;
|
2005-03-01 15:36:23 +00:00
|
|
|
#ifdef _WIN32
|
|
|
|
#include <windows.h>
|
|
|
|
HWND mainwindow;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
qboolean Minimized;
|
2005-01-12 08:38:31 +00:00
|
|
|
|
|
|
|
extern SDL_Surface *sdlsurf;
|
|
|
|
|
2005-01-29 02:13:45 +00:00
|
|
|
qbyte vid_curpal[768];
|
2005-01-12 08:38:31 +00:00
|
|
|
|
|
|
|
cvar_t in_xflip = {"in_xflip", "0"};
|
|
|
|
|
|
|
|
void ResetFrameBuffers(void)
|
|
|
|
{
|
|
|
|
int vid_surfcachesize;
|
|
|
|
void *vid_surfcache;
|
|
|
|
int buffersize;
|
|
|
|
|
|
|
|
if (d_pzbuffer)
|
|
|
|
{
|
|
|
|
D_FlushCaches();
|
|
|
|
free(d_pzbuffer);
|
|
|
|
d_pzbuffer = NULL;
|
|
|
|
}
|
|
|
|
buffersize = vid.width * vid.height * sizeof(*d_pzbuffer);
|
|
|
|
vid_surfcachesize = D_SurfaceCacheForRes (vid.width, vid.height, 0);
|
|
|
|
buffersize += vid_surfcachesize;
|
|
|
|
|
|
|
|
d_pzbuffer = malloc(buffersize);
|
|
|
|
vid_surfcache = (qbyte *) d_pzbuffer + vid.width * vid.height * sizeof(*d_pzbuffer);
|
|
|
|
|
|
|
|
D_InitCaches(vid_surfcache, vid_surfcachesize);
|
|
|
|
}
|
|
|
|
|
|
|
|
qboolean SWVID_Init (rendererstate_t *info, unsigned char *palette)
|
|
|
|
{
|
|
|
|
int flags;
|
|
|
|
Con_Printf("SDL SWVID_Init\n");
|
|
|
|
|
2005-03-01 15:36:23 +00:00
|
|
|
info->bpp = 8; //I don't know thier card details I'm afraid.
|
|
|
|
|
|
|
|
SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
|
2005-01-12 08:38:31 +00:00
|
|
|
|
|
|
|
if (info->fullscreen)
|
|
|
|
{
|
|
|
|
flags = SDL_FULLSCREEN;
|
|
|
|
vid_isfullscreen = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
flags = 0; // :( SDL_RESIZABLE;
|
|
|
|
vid_isfullscreen = false;
|
|
|
|
}
|
|
|
|
|
2005-03-01 15:36:23 +00:00
|
|
|
flags |= SDL_SWSURFACE;
|
|
|
|
|
2005-01-12 08:38:31 +00:00
|
|
|
sdlsurf = SDL_SetVideoMode(info->width, info->height, info->bpp, flags|SDL_DOUBLEBUF);
|
|
|
|
if (!sdlsurf)
|
|
|
|
return false; //bummer.
|
|
|
|
|
|
|
|
vid.width = vid.conwidth = sdlsurf->w;
|
|
|
|
vid.height = vid.conheight = sdlsurf->h;
|
|
|
|
vid.colormap = host_colormap;
|
|
|
|
|
|
|
|
vid.maxwarpwidth = WARP_WIDTH;
|
|
|
|
vid.maxwarpheight = WARP_HEIGHT;
|
|
|
|
ActiveApp = true;
|
|
|
|
|
|
|
|
SDL_SetClipRect(sdlsurf, NULL);
|
|
|
|
|
|
|
|
|
|
|
|
vid.numpages = (sdlsurf->flags & SDL_DOUBLEBUF)?2:1;
|
|
|
|
vid.aspect = ((float)vid.height/vid.width);
|
|
|
|
|
|
|
|
r_pixbytes = info->bpp/8;
|
|
|
|
|
|
|
|
SWVID_LockBuffer(); //make sure our buffer and pitch are set up right.
|
2005-03-01 15:36:23 +00:00
|
|
|
SWVID_UnlockBuffer();
|
2005-01-12 08:38:31 +00:00
|
|
|
|
|
|
|
ResetFrameBuffers();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SWVID_SetPalette(unsigned char *palette)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
SDL_Color colours[256];
|
|
|
|
memcpy(vid_curpal, palette, sizeof(vid_curpal));
|
|
|
|
for (i = 0; i < 256; i++)
|
|
|
|
{
|
|
|
|
colours[i].r = palette[i*3+0];
|
|
|
|
colours[i].g = palette[i*3+1];
|
|
|
|
colours[i].b = palette[i*3+2];
|
|
|
|
}
|
|
|
|
SDL_SetColors(sdlsurf, colours, 0, 256);
|
|
|
|
}
|
|
|
|
void SWVID_ShiftPalette(unsigned char *palette)
|
|
|
|
{
|
|
|
|
SWVID_SetPalette(palette);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SWVID_Shutdown(void)
|
|
|
|
{
|
|
|
|
ActiveApp = false;
|
|
|
|
|
|
|
|
IN_Shutdown();
|
|
|
|
Con_Printf("Restoring gamma\n");
|
|
|
|
SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SWVID_LockBuffer (void)
|
|
|
|
{
|
|
|
|
if (SDL_LockSurface(sdlsurf)<0)
|
|
|
|
if (SDL_LockSurface(sdlsurf)<0)
|
|
|
|
Sys_Error("Couldn't lock surface\n");
|
|
|
|
|
|
|
|
vid.buffer = vid.conbuffer = sdlsurf->pixels;
|
|
|
|
vid.rowbytes = vid.conrowbytes = sdlsurf->pitch/r_pixbytes;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SWVID_ForceLockState (int lk) //I detest these functions. FIXME: Remove
|
|
|
|
{
|
|
|
|
SWVID_LockBuffer();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SWVID_UnlockBuffer (void)
|
|
|
|
{
|
|
|
|
SDL_UnlockSurface(sdlsurf);
|
2005-03-01 15:36:23 +00:00
|
|
|
vid.buffer = NULL;
|
2005-01-12 08:38:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int SWVID_ForceUnlockedAndReturnState(void) //FIXME: Remove
|
|
|
|
{
|
|
|
|
SWVID_UnlockBuffer();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SWVID_Update(vrect_t *rects)
|
|
|
|
{
|
|
|
|
SDL_Flip(sdlsurf);
|
|
|
|
|
|
|
|
IN_UpdateGrabs();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SWVID_HandlePause (qboolean pause)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void SWD_BeginDirectRect (int x, int y, qbyte *pbitmap, int width, int height)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
void SWD_EndDirectRect (int x, int y, int width, int height)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|