Handle window size change (#163)
This commit is contained in:
parent
624076ae9b
commit
cce1bb223e
96
src/core.cc
96
src/core.cc
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue