1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

Merge pull request #621 from sztupy/android_fix_sdl_letterboxing

Fix SDL letterboxing on Android builds
This commit is contained in:
Alexander Shishkin
2020-01-08 10:17:03 +03:00
committed by GitHub
2 changed files with 36 additions and 0 deletions

View File

@@ -1056,6 +1056,39 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIn
#ifdef VCMI_ANDROID #ifdef VCMI_ANDROID
mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex),SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), 0, 0, SDL_WINDOW_FULLSCREEN); mainWindow = SDL_CreateWindow(NAME.c_str(), SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex),SDL_WINDOWPOS_UNDEFINED_DISPLAY(displayIndex), 0, 0, SDL_WINDOW_FULLSCREEN);
// SDL on Android doesn't do proper letterboxing, and will show an annoying flickering in the blank space in case you're not using the full screen estate
// That's why we need to make sure our width and height we'll use below have the same aspect ratio as the screen itself to ensure we fill the full screen estate
SDL_Rect screenRect;
if(SDL_GetDisplayBounds(0, &screenRect) == 0)
{
int screenWidth, screenHeight;
double aspect;
screenWidth = screenRect.w;
screenHeight = screenRect.h;
aspect = (double)screenWidth / (double)screenHeight;
logGlobal->info("Screen size and aspect ration: %dx%d (%lf)", screenWidth, screenHeight, aspect);
if((double)w / aspect > (double)h)
{
h = (int)round((double)w / aspect);
}
else
{
w = (int)round((double)h * aspect);
}
logGlobal->info("Changing logical screen size to %dx%d", w, h);
}
else
{
logGlobal->error("Can't fix aspect ratio for screen");
}
#else #else
if(fullscreen) if(fullscreen)

View File

@@ -162,6 +162,9 @@ std::shared_ptr<IShowActivatable> CGuiHandler::topInt()
void CGuiHandler::totalRedraw() void CGuiHandler::totalRedraw()
{ {
#ifdef VCMI_ANDROID
SDL_FillRect(screen2, NULL, SDL_MapRGB(screen2->format, 0, 0, 0));
#endif
for(auto & elem : objsToBlit) for(auto & elem : objsToBlit)
elem->showAll(screen2); elem->showAll(screen2);
blitAt(screen2,0,0,screen); blitAt(screen2,0,0,screen);