mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-23 21:03:02 +00:00
sdl2: support all windowed mode resolutions
This commit is contained in:
parent
5273989dcd
commit
715a12ff08
1 changed files with 175 additions and 44 deletions
|
@ -111,7 +111,7 @@ boolean allow_fullscreen = false;
|
|||
static SDL_bool disable_fullscreen = SDL_FALSE;
|
||||
#define USE_FULLSCREEN (disable_fullscreen||!allow_fullscreen)?0:cv_fullscreen.value
|
||||
static SDL_bool disable_mouse = SDL_FALSE;
|
||||
#define USE_MOUSEINPUT (!disable_mouse && cv_usemouse.value && SDL_GetAppState() & SDL_APPACTIVE)
|
||||
#define USE_MOUSEINPUT (!disable_mouse && cv_usemouse.value && havefocus)
|
||||
#define MOUSE_MENU false //(!disable_mouse && cv_usemouse.value && menuactive && !USE_FULLSCREEN)
|
||||
#define MOUSEBUTTONS_MAX MOUSEBUTTONS
|
||||
|
||||
|
@ -132,7 +132,7 @@ static Uint16 realheight = BASEVIDHEIGHT;
|
|||
static const Uint32 surfaceFlagsW = 0/*|SDL_RESIZABLE*/;
|
||||
static const Uint32 surfaceFlagsF = 0;
|
||||
static SDL_bool mousegrabok = SDL_TRUE;
|
||||
#define HalfWarpMouse(x,y) SDL_WarpMouse((Uint16)(x/2),(Uint16)(y/2))
|
||||
#define HalfWarpMouse(x,y) SDL_WarpMouseInWindow(window, (Uint16)(x/2),(Uint16)(y/2))
|
||||
static SDL_bool videoblitok = SDL_FALSE;
|
||||
static SDL_bool exposevideo = SDL_FALSE;
|
||||
|
||||
|
@ -140,6 +140,7 @@ static SDL_bool exposevideo = SDL_FALSE;
|
|||
static SDL_Window *window;
|
||||
static SDL_Renderer *renderer;
|
||||
static SDL_Texture *texture;
|
||||
static SDL_bool havefocus = SDL_TRUE;
|
||||
|
||||
// windowed video modes from which to choose from.
|
||||
static INT32 windowedModes[MAXWINMODES][2] =
|
||||
|
@ -173,6 +174,9 @@ static INT32 windowedModes[MAXWINMODES][2] =
|
|||
{ 320, 200}, // 1.60,1.00
|
||||
};
|
||||
|
||||
static void Impl_VideoSetupSDLBuffer(void);
|
||||
static void Impl_VideoSetupBuffer(void);
|
||||
|
||||
static void SDLSetMode(INT32 width, INT32 height, INT32 bpp, Uint32 flags)
|
||||
{
|
||||
#if 0
|
||||
|
@ -214,7 +218,7 @@ static void SDLSetMode(INT32 width, INT32 height, INT32 bpp, Uint32 flags)
|
|||
gmask = 0x00FF0000;
|
||||
bmask = 0x0000FF00;
|
||||
amask = 0x000000FF;
|
||||
#else
|
||||
#else // HEAD HEADS UP THE ASSIGNMENT ORDER IS FLIPPED, I WAS LAZY --Fury
|
||||
amask = 0xFF000000;
|
||||
bmask = 0x00FF0000;
|
||||
gmask = 0x0000FF00;
|
||||
|
@ -224,8 +228,6 @@ static void SDLSetMode(INT32 width, INT32 height, INT32 bpp, Uint32 flags)
|
|||
|
||||
SDL_SetWindowSize(window, width, height);
|
||||
SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
|
||||
|
||||
SDL2STUB();
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -447,15 +449,8 @@ static INT32 SDLatekey(SDL_Keycode sym)
|
|||
|
||||
static void SDLdoUngrabMouse(void)
|
||||
{
|
||||
// TODO SDL2 overhaul
|
||||
SDL_SetWindowGrab(window, SDL_FALSE);
|
||||
SDL2STUB();
|
||||
#if 0
|
||||
if (SDL_GRAB_ON == SDL_WM_GrabInput(SDL_GRAB_QUERY))
|
||||
{
|
||||
SDL_WM_GrabInput(SDL_GRAB_OFF);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void SDLforceUngrabMouse(void)
|
||||
|
@ -464,11 +459,6 @@ void SDLforceUngrabMouse(void)
|
|||
{
|
||||
SDL_SetWindowGrab(window, SDL_FALSE);
|
||||
}
|
||||
SDL2STUB();
|
||||
#if 0
|
||||
if (SDL_WasInit(SDL_INIT_VIDEO)==SDL_INIT_VIDEO)
|
||||
SDL_WM_GrabInput(SDL_GRAB_OFF);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void VID_Command_NumModes_f (void)
|
||||
|
@ -719,11 +709,41 @@ static INT32 SDLJoyAxis(const Sint16 axis, evtype_t which)
|
|||
|
||||
static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
|
||||
{
|
||||
static SDL_bool firsttimeonmouse = SDL_TRUE;
|
||||
switch (evt.type)
|
||||
{
|
||||
case SDL_WINDOWEVENT_FOCUS_GAINED:
|
||||
if (!firsttimeonmouse)
|
||||
{
|
||||
if (cv_usemouse.value) I_StartupMouse();
|
||||
}
|
||||
else firsttimeonmouse = SDL_FALSE;
|
||||
if (gamestate == GS_LEVEL)
|
||||
{
|
||||
if (!paused) I_ResumeSong(0); //resume it
|
||||
}
|
||||
break;
|
||||
case SDL_WINDOWEVENT_FOCUS_LOST:
|
||||
if (!disable_mouse)
|
||||
{
|
||||
SDLforceUngrabMouse();
|
||||
}
|
||||
if (!netgame && gamestate == GS_LEVEL)
|
||||
{
|
||||
paused = true;
|
||||
}
|
||||
memset(gamekeydown, 0, NUMKEYS); // TODO this is a scary memset
|
||||
if (gamestate == GS_LEVEL)
|
||||
{
|
||||
I_PauseSong(0);
|
||||
}
|
||||
|
||||
if (MOUSE_MENU)
|
||||
{
|
||||
SDLdoUngrabMouse();
|
||||
return;
|
||||
}
|
||||
|
||||
break;
|
||||
case SDL_WINDOWEVENT_MAXIMIZED:
|
||||
break;
|
||||
|
@ -751,13 +771,47 @@ static void Impl_HandleKeyboardEvent(SDL_KeyboardEvent evt, Uint32 type)
|
|||
|
||||
static void Impl_HandleMouseMotionEvent(SDL_MouseMotionEvent evt)
|
||||
{
|
||||
}
|
||||
|
||||
static void Impl_HandleMouseButtonEvent(SDL_MouseButtonEvent evt, Uint32 type)
|
||||
{
|
||||
event_t event;
|
||||
/// \todo inputEvent.button.which
|
||||
if (USE_MOUSEINPUT)
|
||||
{
|
||||
if (type == SDL_MOUSEBUTTONUP)
|
||||
event.type = ev_keyup;
|
||||
else if (type == SDL_MOUSEBUTTONDOWN)
|
||||
event.type = ev_keydown;
|
||||
else return;
|
||||
#if 0
|
||||
if (evt.which == SDL_BUTTON_WHEELUP || evt.which == SDL_BUTTON_WHEELDOWN)
|
||||
{
|
||||
if (type == SDL_MOUSEBUTTONUP)
|
||||
event.data1 = 0; //Alam: dumb! this could be a real button with some mice
|
||||
else
|
||||
event.data1 = KEY_MOUSEWHEELUP + evt.which - SDL_BUTTON_WHEELUP;
|
||||
}
|
||||
#endif
|
||||
if (evt.which == SDL_BUTTON_MIDDLE)
|
||||
event.data1 = KEY_MOUSE1+2;
|
||||
else if (evt.which == SDL_BUTTON_RIGHT)
|
||||
event.data1 = KEY_MOUSE1+1;
|
||||
else if (evt.which <= MOUSEBUTTONS)
|
||||
event.data1 = KEY_MOUSE1 + evt.which - SDL_BUTTON_LEFT;
|
||||
if (event.data1) D_PostEvent(&event);
|
||||
}
|
||||
}
|
||||
|
||||
void I_GetEvent(void)
|
||||
{
|
||||
SDL_Event evt;
|
||||
|
||||
if (!graphics_started)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
while (SDL_PollEvent(&evt))
|
||||
{
|
||||
if (evt.type == SDL_WINDOWEVENT)
|
||||
|
@ -775,6 +829,11 @@ void I_GetEvent(void)
|
|||
Impl_HandleMouseMotionEvent(evt.motion);
|
||||
}
|
||||
|
||||
if (evt.type == SDL_MOUSEBUTTONUP || evt.type == SDL_MOUSEBUTTONDOWN)
|
||||
{
|
||||
Impl_HandleMouseButtonEvent(evt.button, evt.type);
|
||||
}
|
||||
|
||||
if (evt.type == SDL_QUIT)
|
||||
{
|
||||
I_Quit();
|
||||
|
@ -997,8 +1056,6 @@ void I_GetEvent(void)
|
|||
|
||||
void I_StartupMouse(void)
|
||||
{
|
||||
SDL2STUB();
|
||||
#if 0
|
||||
static SDL_bool firsttimeonmouse = SDL_TRUE;
|
||||
|
||||
if (disable_mouse)
|
||||
|
@ -1012,7 +1069,6 @@ void I_StartupMouse(void)
|
|||
return;
|
||||
else
|
||||
SDLdoUngrabMouse();
|
||||
#endif
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -1113,28 +1169,21 @@ void I_FinishUpdate(void)
|
|||
|
||||
if (render_soft == rendermode && screens[0])
|
||||
{
|
||||
SDL_Rect *dstrect = NULL;
|
||||
SDL_Rect rect = {0, 0, 0, 0};
|
||||
SDL_Rect rect;
|
||||
SDL_PixelFormat *vidformat = vidSurface->format;
|
||||
int lockedsf = 0, blited = 0;
|
||||
|
||||
rect.w = (Sint16)vid.width;
|
||||
rect.h = (Sint16)vid.height;
|
||||
rect.x = 0;
|
||||
rect.y = 0;
|
||||
rect.w = vid.width;
|
||||
rect.h = vid.height;
|
||||
|
||||
if (vidSurface->h > vid.height)
|
||||
rect.y = (Sint16)((vidSurface->h-vid.height)/2);
|
||||
|
||||
dstrect = ▭
|
||||
|
||||
|
||||
if (!bufSurface && !vid.direct) //Double-Check
|
||||
if (!bufSurface) //Double-Check
|
||||
{
|
||||
if (vid.bpp == 1) bufSurface = SDL_CreateRGBSurfaceFrom(screens[0],vid.width,vid.height,8,
|
||||
(int)vid.rowbytes,0x00000000,0x00000000,0x00000000,0x00000000); // 256 mode
|
||||
else if (vid.bpp == 2) bufSurface = SDL_CreateRGBSurfaceFrom(screens[0],vid.width,vid.height,15,
|
||||
(int)vid.rowbytes,0x00007C00,0x000003E0,0x0000001F,0x00000000); // 555 mode
|
||||
if (bufSurface) SDL_SetPaletteColors(bufSurface->format->palette, localPalette, 0, 256);
|
||||
else I_OutputMsg("No system memory for SDL buffer surface\n");
|
||||
Impl_VideoSetupSDLBuffer();
|
||||
}
|
||||
#if 0
|
||||
if (SDLmatchVideoformat() && !vid.direct)//Alam: DOS Way
|
||||
|
@ -1163,7 +1212,7 @@ void I_FinishUpdate(void)
|
|||
#endif
|
||||
if (bufSurface) //Alam: New Way to send video data
|
||||
{
|
||||
blited = SDL_BlitSurface(bufSurface,NULL,vidSurface,dstrect);
|
||||
blited = SDL_BlitSurface(bufSurface, NULL, vidSurface, &rect);
|
||||
SDL_UpdateTexture(texture, NULL, vidSurface->pixels, realwidth * 4);
|
||||
}
|
||||
#if 0
|
||||
|
@ -1300,7 +1349,8 @@ void I_SetPalette(RGBA_t *palette)
|
|||
localPalette[i].g = palette[i].s.green;
|
||||
localPalette[i].b = palette[i].s.blue;
|
||||
}
|
||||
if (vidSurface) SDL_SetPaletteColors(vidSurface->format->palette, localPalette, 0, 256);
|
||||
//if (vidSurface) SDL_SetPaletteColors(vidSurface->format->palette, localPalette, 0, 256);
|
||||
// Fury -- SDL2 vidSurface is a 32-bit surface buffer copied to the texture. It's not palletized, like bufSurface.
|
||||
if (bufSurface) SDL_SetPaletteColors(bufSurface->format->palette, localPalette, 0, 256);
|
||||
}
|
||||
|
||||
|
@ -1315,6 +1365,7 @@ INT32 VID_NumModes(void)
|
|||
|
||||
const char *VID_GetModeName(INT32 modeNum)
|
||||
{
|
||||
#if 0
|
||||
if (USE_FULLSCREEN && numVidModes != -1) // fullscreen modes
|
||||
{
|
||||
modeNum += firstEntry;
|
||||
|
@ -1327,18 +1378,29 @@ const char *VID_GetModeName(INT32 modeNum)
|
|||
}
|
||||
else // windowed modes
|
||||
{
|
||||
#endif
|
||||
if (modeNum > MAXWINMODES)
|
||||
return NULL;
|
||||
|
||||
sprintf(&vidModeName[modeNum][0], "%dx%d",
|
||||
windowedModes[modeNum][0],
|
||||
windowedModes[modeNum][1]);
|
||||
}
|
||||
//}
|
||||
return &vidModeName[modeNum][0];
|
||||
}
|
||||
|
||||
INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MAXWINMODES; i++)
|
||||
{
|
||||
if (windowedModes[i][0] == w && windowedModes[i][1] == h)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
#if 0
|
||||
INT32 matchMode = -1, i;
|
||||
if (USE_FULLSCREEN && numVidModes != -1)
|
||||
{
|
||||
|
@ -1398,10 +1460,13 @@ INT32 VID_GetModeForSize(INT32 w, INT32 h)
|
|||
}
|
||||
}
|
||||
return matchMode;
|
||||
#endif
|
||||
}
|
||||
|
||||
void VID_PrepareModeList(void)
|
||||
{
|
||||
// Under SDL2, we just use the windowed modes list, and scale in windowed fullscreen.
|
||||
#if 0
|
||||
INT32 i;
|
||||
|
||||
firstEntry = 0;
|
||||
|
@ -1421,6 +1486,7 @@ void VID_PrepareModeList(void)
|
|||
}
|
||||
}
|
||||
allow_fullscreen = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void SDLESSet(void)
|
||||
|
@ -1459,8 +1525,27 @@ static void* SDLGetDirect(void)
|
|||
|
||||
INT32 VID_SetMode(INT32 modeNum)
|
||||
{
|
||||
SDL2STUB();
|
||||
SDLSetMode(320, 200, 16, 0);
|
||||
SDLdoUngrabMouse();
|
||||
|
||||
vid.width = windowedModes[modeNum][0];
|
||||
vid.height = windowedModes[modeNum][1];
|
||||
vid.bpp = 1;
|
||||
|
||||
vid.modenum = modeNum; //VID_GetModeForSize(vidSurface->w,vidSurface->h);
|
||||
|
||||
SDLSetMode(windowedModes[modeNum][0], windowedModes[modeNum][1], 16, 0);
|
||||
|
||||
if (render_soft == rendermode)
|
||||
{
|
||||
if (bufSurface)
|
||||
{
|
||||
SDL_FreeSurface(bufSurface);
|
||||
bufSurface = NULL;
|
||||
}
|
||||
|
||||
Impl_VideoSetupBuffer();
|
||||
}
|
||||
|
||||
return SDL_TRUE;
|
||||
#if 0
|
||||
SDLdoUngrabMouse();
|
||||
|
@ -1600,6 +1685,53 @@ static void Impl_SetWindowIcon()
|
|||
SDL_SetWindowIcon(window, icoSurface);
|
||||
}
|
||||
|
||||
static void Impl_VideoSetupSDLBuffer()
|
||||
{
|
||||
if (bufSurface != NULL)
|
||||
{
|
||||
SDL_FreeSurface(bufSurface);
|
||||
bufSurface = NULL;
|
||||
}
|
||||
// Set up the SDL palletized buffer (copied to vidbuffer before being rendered to texture)
|
||||
if (vid.bpp == 1)
|
||||
{
|
||||
bufSurface = SDL_CreateRGBSurfaceFrom(screens[0],vid.width,vid.height,8,
|
||||
(int)vid.rowbytes,0x00000000,0x00000000,0x00000000,0x00000000); // 256 mode
|
||||
}
|
||||
else if (vid.bpp == 2) // Fury -- don't think this is used at all anymore
|
||||
{
|
||||
bufSurface = SDL_CreateRGBSurfaceFrom(screens[0],vid.width,vid.height,15,
|
||||
(int)vid.rowbytes,0x00007C00,0x000003E0,0x0000001F,0x00000000); // 555 mode
|
||||
}
|
||||
if (bufSurface)
|
||||
{
|
||||
SDL_SetPaletteColors(bufSurface->format->palette, localPalette, 0, 256);
|
||||
}
|
||||
else
|
||||
{
|
||||
I_Error("%s", M_GetText("No system memory for SDL buffer surface\n"));
|
||||
}
|
||||
}
|
||||
|
||||
static void Impl_VideoSetupBuffer()
|
||||
{
|
||||
// Set up game's software render buffer
|
||||
if (rendermode == render_soft)
|
||||
{
|
||||
vid.rowbytes = vid.width * vid.bpp;
|
||||
vid.direct = NULL;
|
||||
vid.buffer = malloc(vid.rowbytes*vid.height*NUMSCREENS);
|
||||
if (vid.buffer)
|
||||
{
|
||||
memset(vid.buffer,0x00,vid.rowbytes*vid.height*NUMSCREENS);
|
||||
}
|
||||
else
|
||||
{
|
||||
I_Error("%s", M_GetText("Not enough memory for video buffer\n"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void I_StartupGraphics(void)
|
||||
{
|
||||
static char SDLNOMOUSE[] = "SDL_NOMOUSE=1";
|
||||
|
@ -1738,6 +1870,8 @@ void I_StartupGraphics(void)
|
|||
#endif
|
||||
if (render_soft == rendermode)
|
||||
{
|
||||
VID_SetMode(VID_GetModeForSize(BASEVIDWIDTH, BASEVIDHEIGHT));
|
||||
#if 0
|
||||
vid.width = BASEVIDWIDTH;
|
||||
vid.height = BASEVIDHEIGHT;
|
||||
SDLSetMode(vid.width, vid.height, BitsPerPixel, surfaceFlagsW);
|
||||
|
@ -1748,11 +1882,8 @@ void I_StartupGraphics(void)
|
|||
graphics_started = true;
|
||||
return;
|
||||
}
|
||||
vid.rowbytes = vid.width * vid.bpp;
|
||||
vid.direct = SDLGetDirect();
|
||||
vid.buffer = malloc(vid.rowbytes*vid.height*NUMSCREENS);
|
||||
if (vid.buffer) memset(vid.buffer,0x00,vid.rowbytes*vid.height*NUMSCREENS);
|
||||
else CONS_Printf("%s", M_GetText("Not enough memory for video buffer\n"));
|
||||
Impl_VideoSetupBuffer();
|
||||
#endif
|
||||
}
|
||||
if (M_CheckParm("-nomousegrab"))
|
||||
mousegrabok = SDL_FALSE;
|
||||
|
|
Loading…
Reference in a new issue