Explorar o código

Letter box for frameless window mode.

bkaradzic %!s(int64=13) %!d(string=hai) anos
pai
achega
5383961058
Modificáronse 3 ficheiros con 77 adicións e 12 borrados
  1. 76 10
      src/bgfx_p.h
  2. 1 0
      src/renderer_d3d9.cpp
  3. 0 2
      src/renderer_gl.cpp

+ 76 - 10
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;
 			}
 

+ 1 - 0
src/renderer_d3d9.cpp

@@ -1206,6 +1206,7 @@ namespace bgfx
 
 						width >>= 1;
 						height >>= 1;
+						depth >>= 1;
 					}
 				}
 			}

+ 0 - 2
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_
 			}
 		}