mirror of https://github.com/OpenMW/openmw.git
Merge branch 'rework_resolutions' into 'master'
Rework resolution selection Closes #7709 See merge request OpenMW/openmw!3622macos_ci_fix
commit
d230c89a56
@ -0,0 +1,82 @@
|
||||
#include "display.hpp"
|
||||
|
||||
#include <numeric>
|
||||
#include <string>
|
||||
|
||||
#include <components/misc/strings/format.hpp>
|
||||
|
||||
namespace Misc
|
||||
{
|
||||
std::string getResolutionText(int x, int y, const std::string& format)
|
||||
{
|
||||
int gcd = std::gcd(x, y);
|
||||
if (gcd == 0)
|
||||
return std::string();
|
||||
|
||||
int xaspect = x / gcd;
|
||||
int yaspect = y / gcd;
|
||||
|
||||
// It is unclear how to handle 90-degree screen rotation properly.
|
||||
// So far only swap aspects, apply custom formatting logic and then swap back.
|
||||
// As result, 1920 x 1200 is displayed as "1200 x 1920 (10:16)"
|
||||
bool flipped = false;
|
||||
if (yaspect > xaspect)
|
||||
{
|
||||
flipped = true;
|
||||
std::swap(xaspect, yaspect);
|
||||
}
|
||||
|
||||
// 683:384 (used in 1366 x 768) is usually referred as 16:9
|
||||
if (xaspect == 683 && yaspect == 384)
|
||||
{
|
||||
xaspect = 16;
|
||||
yaspect = 9;
|
||||
}
|
||||
// 85:48 (used in 1360 x 768) is usually referred as 16:9
|
||||
else if (xaspect == 85 && yaspect == 48)
|
||||
{
|
||||
xaspect = 16;
|
||||
yaspect = 9;
|
||||
}
|
||||
// 49:36 (used in 1176 x 864) is usually referred as 4:3
|
||||
else if (xaspect == 49 && yaspect == 36)
|
||||
{
|
||||
xaspect = 4;
|
||||
yaspect = 3;
|
||||
}
|
||||
// 39:29 (used in 624 x 484) is usually referred as 4:3
|
||||
else if (xaspect == 39 && yaspect == 29)
|
||||
{
|
||||
xaspect = 4;
|
||||
yaspect = 3;
|
||||
}
|
||||
// 8:5 (used in 1440 x 900) is usually referred as 16:10
|
||||
else if (xaspect == 8 && yaspect == 5)
|
||||
{
|
||||
xaspect = 16;
|
||||
yaspect = 10;
|
||||
}
|
||||
// 5:3 (used in 1280 x 768) is usually referred as 15:9
|
||||
else if (xaspect == 5 && yaspect == 3)
|
||||
{
|
||||
xaspect = 15;
|
||||
yaspect = 9;
|
||||
}
|
||||
else
|
||||
{
|
||||
// everything between 21:9 and 22:9
|
||||
// is usually referred as 21:9
|
||||
float ratio = static_cast<float>(xaspect) / yaspect;
|
||||
if (ratio >= 21 / 9.f && ratio < 22 / 9.f)
|
||||
{
|
||||
xaspect = 21;
|
||||
yaspect = 9;
|
||||
}
|
||||
}
|
||||
|
||||
if (flipped)
|
||||
std::swap(xaspect, yaspect);
|
||||
|
||||
return Misc::StringUtils::format(format, x, y, xaspect, yaspect);
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
#ifndef OPENMW_COMPONENTS_MISC_DISPLAY_H
|
||||
#define OPENMW_COMPONENTS_MISC_DISPLAY_H
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace Misc
|
||||
{
|
||||
std::string getResolutionText(int x, int y, const std::string& format);
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue