Added comprehensive video modes iteration

Added letterboxing status for fullscreen modes
Brought back vid_listmodes console command
This commit is contained in:
alexey.lysiuk 2014-12-28 12:48:08 +02:00
parent b66c712446
commit 40d4dc502e

View file

@ -1337,7 +1337,7 @@ public:
virtual DFrameBuffer* CreateFrameBuffer(int width, int height, bool fs, DFrameBuffer* old); virtual DFrameBuffer* CreateFrameBuffer(int width, int height, bool fs, DFrameBuffer* old);
virtual void StartModeIterator(int bits, bool fs); virtual void StartModeIterator(int bits, bool fullscreen);
virtual bool NextMode(int* width, int* height, bool* letterbox); virtual bool NextMode(int* width, int* height, bool* letterbox);
static bool IsFullscreen(); static bool IsFullscreen();
@ -1346,7 +1346,14 @@ public:
static void SetWindowVisible(bool visible); static void SetWindowVisible(bool visible);
private: private:
size_t m_modeIterator; struct ModeIterator
{
size_t index;
int bits;
bool fullscreen;
};
ModeIterator m_modeIterator;
CocoaWindow* m_window; CocoaWindow* m_window;
@ -1536,14 +1543,14 @@ CocoaWindow* CreateCocoaWindow(const NSUInteger styleMask)
CocoaVideo::CocoaVideo(const int multisample) CocoaVideo::CocoaVideo(const int multisample)
: m_modeIterator(0) : m_window(CreateCocoaWindow(STYLE_MASK_WINDOWED))
, m_window(CreateCocoaWindow(STYLE_MASK_WINDOWED))
//, m_multisample(0)
, m_width(-1) , m_width(-1)
, m_height(-1) , m_height(-1)
, m_fullscreen(false) , m_fullscreen(false)
, m_hiDPI(false) , m_hiDPI(false)
{ {
memset(&m_modeIterator, 0, sizeof m_modeIterator);
// Set attributes for OpenGL context // Set attributes for OpenGL context
NSOpenGLPixelFormatAttribute attributes[16]; NSOpenGLPixelFormatAttribute attributes[16];
@ -1585,26 +1592,43 @@ CocoaVideo::~CocoaVideo()
[m_window release]; [m_window release];
} }
void CocoaVideo::StartModeIterator(int bits, bool fs) void CocoaVideo::StartModeIterator(const int bits, const bool fullscreen)
{ {
ZD_UNUSED(bits); m_modeIterator.index = 0;
ZD_UNUSED(fs); m_modeIterator.bits = bits;
m_modeIterator.fullscreen = fullscreen;
m_modeIterator = 0;
} }
bool CocoaVideo::NextMode(int* width, int* height, bool* letterbox) bool CocoaVideo::NextMode(int* const width, int* const height, bool* const letterbox)
{ {
assert(NULL != width); assert(NULL != width);
assert(NULL != height); assert(NULL != height);
ZD_UNUSED(letterbox);
if (m_modeIterator < sizeof(VideoModes) / sizeof(VideoModes[0])) const int bits = m_modeIterator.bits;
if (8 != bits && 16 != bits && 24 != bits && 32 != bits)
{ {
*width = VideoModes[m_modeIterator].width; return false;
*height = VideoModes[m_modeIterator].height; }
size_t& index = m_modeIterator.index;
if (index < sizeof(VideoModes) / sizeof(VideoModes[0]))
{
*width = VideoModes[index].width;
*height = VideoModes[index].height;
if (m_modeIterator.fullscreen && NULL != letterbox)
{
const NSSize screenSize = [[m_window screen] frame].size;
const float screenRatio = screenSize.width / screenSize.height;
const float modeRatio = float(*width) / *height;
*letterbox = fabs(screenRatio - modeRatio) > 0.001f;
}
++index;
++m_modeIterator;
return true; return true;
} }
@ -2258,6 +2282,32 @@ CUSTOM_CVAR(Bool, vid_hidpi, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
} }
} }
CCMD(vid_listmodes)
{
if (Video == NULL)
{
return;
}
static const char* const ratios[5] = { "", " - 16:9", " - 16:10", " - 17:10", " - 5:4" };
int width, height;
bool letterbox;
Video->StartModeIterator(32, screen->IsFullscreen());
while (Video->NextMode(&width, &height, &letterbox))
{
const bool current = width == DisplayWidth && height == DisplayHeight;
const int ratio = CheckRatio(width, height);
Printf(current ? PRINT_BOLD : PRINT_HIGH, "%s%4d x%5d x%3d%s%s\n",
current || !(ratio & 3) ? "" : TEXTCOLOR_GOLD,
width, height, 32, ratios[ratio],
current || !letterbox ? "" : TEXTCOLOR_BROWN " LB");
}
}
CCMD(vid_currentmode) CCMD(vid_currentmode)
{ {
Printf("%dx%dx%d\n", DisplayWidth, DisplayHeight, DisplayBits); Printf("%dx%dx%d\n", DisplayWidth, DisplayHeight, DisplayBits);