From 538396105840c3b36316a4a1859c5cc126a1d830 Mon Sep 17 00:00:00 2001 From: bkaradzic Date: Mon, 11 Jun 2012 19:42:27 -0700 Subject: [PATCH] Letter box for frameless window mode. --- src/bgfx_p.h | 86 ++++++++++++++++++++++++++++++++++++++----- src/renderer_d3d9.cpp | 1 + src/renderer_gl.cpp | 2 - 3 files changed, 77 insertions(+), 12 deletions(-) diff --git a/src/bgfx_p.h b/src/bgfx_p.h index d222e8a2..28dec651 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -2382,6 +2382,17 @@ namespace bgfx HINSTANCE instance = (HINSTANCE)GetModuleHandle(NULL); WNDCLASSEX wnd; + memset(&wnd, 0, sizeof(wnd) ); + wnd.cbSize = sizeof(wnd); + wnd.lpfnWndProc = DefWindowProc; + wnd.hInstance = instance; + wnd.hIcon = LoadIcon(instance, IDI_APPLICATION); + wnd.hCursor = LoadCursor(instance, IDC_ARROW); + wnd.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + wnd.lpszClassName = "bgfx_letterbox"; + wnd.hIconSm = LoadIcon(instance, IDI_APPLICATION); + RegisterClassExA(&wnd); + memset(&wnd, 0, sizeof(wnd) ); wnd.cbSize = sizeof(wnd); wnd.style = CS_HREDRAW | CS_VREDRAW; @@ -2390,9 +2401,22 @@ namespace bgfx wnd.hIcon = LoadIcon(instance, IDI_APPLICATION); wnd.hCursor = LoadCursor(instance, IDC_ARROW); wnd.lpszClassName = "bgfx"; - wnd.hIconSm = LoadIcon(instance, IDI_APPLICATION); + wnd.hIconSm = LoadIcon(instance, IDI_APPLICATION); RegisterClassExA(&wnd); + HWND hwnd = CreateWindowA("bgfx_letterbox" + , "BGFX" + , WS_POPUP|WS_SYSMENU + , -32000 + , -32000 + , 0 + , 0 + , NULL + , NULL + , instance + , 0 + ); + g_bgfxHwnd = CreateWindowA("bgfx" , "BGFX" , WS_OVERLAPPEDWINDOW|WS_VISIBLE @@ -2400,9 +2424,9 @@ namespace bgfx , 0 , BGFX_DEFAULT_WIDTH , BGFX_DEFAULT_HEIGHT - , 0 - , 0 - , 0 + , hwnd + , NULL + , instance , 0 ); @@ -2486,6 +2510,8 @@ namespace bgfx void adjust(uint32_t _width, uint32_t _height, bool _windowFrame) { + m_aspectRatio = float(_width)/float(_height); + ShowWindow(g_bgfxHwnd, SW_SHOWNORMAL); RECT rect; RECT newrect = {0, 0, (LONG)_width, (LONG)_height}; @@ -2528,19 +2554,59 @@ namespace bgfx rect.top = 0; } + int32_t left = rect.left; + int32_t top = rect.top; + int32_t width = (newrect.right-newrect.left); + int32_t height = (newrect.bottom-newrect.top); + + if (!_windowFrame) + { + float aspectRatio = 1.0f/m_aspectRatio; + width = bx::uint32_max(BGFX_DEFAULT_WIDTH/4, width); + height = uint32_t(float(width)*aspectRatio); + + left = newrect.left+(newrect.right-newrect.left-width)/2; + top = newrect.top+(newrect.bottom-newrect.top-height)/2; + } + + HWND parent = GetWindow(g_bgfxHwnd, GW_OWNER); + if (NULL != parent) + { + if (_windowFrame) + { + SetWindowPos(parent + , HWND_TOP + , -32000 + , -32000 + , 0 + , 0 + , SWP_SHOWWINDOW + ); + } + else + { + SetWindowPos(parent + , HWND_TOP + , newrect.left + , newrect.top + , newrect.right-newrect.left + , newrect.bottom-newrect.top + , SWP_SHOWWINDOW + ); + } + } + SetWindowPos(g_bgfxHwnd , HWND_TOP - , rect.left - , rect.top - , (newrect.right-newrect.left) - , (newrect.bottom-newrect.top) + , left + , top + , width + , height , SWP_SHOWWINDOW ); ShowWindow(g_bgfxHwnd, SW_RESTORE); - m_aspectRatio = float(_width)/float(_height); - m_frame = _windowFrame; } diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index 5319f608..827cefd1 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -1206,6 +1206,7 @@ namespace bgfx width >>= 1; height >>= 1; + depth >>= 1; } } } diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 6f259582..a9a30122 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -73,9 +73,7 @@ namespace bgfx m_textVideoMem.clear(); m_resolution = _resolution; -#if BX_PLATFORM_NACL || BX_PLATFORM_LINUX setRenderContextSize(_resolution.m_width, _resolution.m_height); -#endif // BX_PLATFORM_ } }