Handle window size change (#163)

This commit is contained in:
Alexander Batalov 2022-10-04 13:15:54 +03:00 committed by GitHub
parent 624076ae9b
commit cce1bb223e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 56 additions and 40 deletions

View File

@ -24,6 +24,8 @@
namespace fallout { namespace fallout {
static void idleImpl(); static void idleImpl();
static bool createRenderer(int width, int height);
static void destroyRenderer();
// 0x51E234 // 0x51E234
IdleFunc* _idle_func = NULL; IdleFunc* _idle_func = NULL;
@ -1140,8 +1142,8 @@ void _GNW95_process_message()
windowRefreshAll(&_scr_size); windowRefreshAll(&_scr_size);
break; break;
case SDL_WINDOWEVENT_SIZE_CHANGED: case SDL_WINDOWEVENT_SIZE_CHANGED:
// TODO: Recreate gSdlSurface in case size really changed (i.e. destroyRenderer();
// not alt-tabbing in fullscreen mode). createRenderer(screenGetWidth(), screenGetHeight());
break; break;
case SDL_WINDOWEVENT_FOCUS_GAINED: case SDL_WINDOWEVENT_FOCUS_GAINED:
gProgramIsActive = true; gProgramIsActive = true;
@ -1393,50 +1395,17 @@ int _GNW95_init_window(int width, int height, bool fullscreen)
return -1; return -1;
} }
gSdlRenderer = SDL_CreateRenderer(gSdlWindow, -1, 0); if (!createRenderer(width, height)) {
if (gSdlRenderer == NULL) { destroyRenderer();
goto err;
}
if (SDL_RenderSetLogicalSize(gSdlRenderer, width, height) != 0) { SDL_DestroyWindow(gSdlWindow);
goto err; gSdlWindow = NULL;
}
gSdlTexture = SDL_CreateTexture(gSdlRenderer, SDL_PIXELFORMAT_RGB888, SDL_TEXTUREACCESS_STREAMING, width, height); return -1;
if (gSdlTexture == NULL) {
goto err;
}
Uint32 format;
if (SDL_QueryTexture(gSdlTexture, &format, NULL, NULL, NULL) != 0) {
goto err;
}
gSdlTextureSurface = SDL_CreateRGBSurfaceWithFormat(0, width, height, SDL_BITSPERPIXEL(format), format);
if (gSdlTextureSurface == NULL) {
goto err;
} }
} }
return 0; return 0;
err:
if (gSdlTexture != NULL) {
SDL_DestroyTexture(gSdlTexture);
gSdlTexture = NULL;
}
if (gSdlRenderer != NULL) {
SDL_DestroyRenderer(gSdlRenderer);
gSdlRenderer = NULL;
}
if (gSdlWindow != NULL) {
SDL_DestroyWindow(gSdlWindow);
gSdlWindow = NULL;
}
return -1;
} }
// calculate shift for mask // calculate shift for mask
@ -1822,4 +1791,51 @@ static void idleImpl()
SDL_Delay(125); SDL_Delay(125);
} }
static bool createRenderer(int width, int height)
{
gSdlRenderer = SDL_CreateRenderer(gSdlWindow, -1, 0);
if (gSdlRenderer == NULL) {
return false;
}
if (SDL_RenderSetLogicalSize(gSdlRenderer, width, height) != 0) {
return false;
}
gSdlTexture = SDL_CreateTexture(gSdlRenderer, SDL_PIXELFORMAT_RGB888, SDL_TEXTUREACCESS_STREAMING, width, height);
if (gSdlTexture == NULL) {
return false;
}
Uint32 format;
if (SDL_QueryTexture(gSdlTexture, &format, NULL, NULL, NULL) != 0) {
return false;
}
gSdlTextureSurface = SDL_CreateRGBSurfaceWithFormat(0, width, height, SDL_BITSPERPIXEL(format), format);
if (gSdlTextureSurface == NULL) {
return false;
}
return true;
}
static void destroyRenderer()
{
if (gSdlTextureSurface != NULL) {
SDL_FreeSurface(gSdlTextureSurface);
gSdlTextureSurface = NULL;
}
if (gSdlTexture != NULL) {
SDL_DestroyTexture(gSdlTexture);
gSdlTexture = NULL;
}
if (gSdlRenderer != NULL) {
SDL_DestroyRenderer(gSdlRenderer);
gSdlRenderer = NULL;
}
}
} // namespace fallout } // namespace fallout