mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-30 07:41:22 +00:00
Added comprehensive video modes iteration
Added letterboxing status for fullscreen modes Brought back vid_listmodes console command
This commit is contained in:
parent
b66c712446
commit
40d4dc502e
1 changed files with 66 additions and 16 deletions
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue