Add more UWP support (nw)

This commit is contained in:
Miodrag Milanovic 2016-11-09 15:44:44 +01:00
parent f9f30e95ef
commit cddd8bbe7a
6 changed files with 54 additions and 12 deletions

View File

@ -233,8 +233,12 @@ if (STANDALONE~=true) then
links {
ext_lib("lua"),
"lualibs",
}
if (_OPTIONS["osd"] ~= "uwp") then
links {
"linenoise-ng",
}
end
end
links {
ext_lib("zlib"),

View File

@ -13,10 +13,10 @@
#if (USE_OPENGL)
#include "render/drawogl.h"
#endif
#ifdef OSD_WINDOWS
#if defined(OSD_WINDOWS)
#include "render/drawgdi.h"
#include "render/drawd3d.h"
#else
#elif defined(OSD_SDL)
#include "render/draw13.h"
#include "render/drawsdl.h"
#endif
@ -30,7 +30,7 @@ std::unique_ptr<osd_renderer> osd_renderer::make_for_type(int mode, std::shared_
{
switch(mode)
{
#ifdef OSD_WINDOWS
#if defined(OSD_WINDOWS) || defined(OSD_UWP)
case VIDEO_MODE_NONE:
return std::make_unique<renderer_none>(window);
#endif
@ -40,12 +40,12 @@ std::unique_ptr<osd_renderer> osd_renderer::make_for_type(int mode, std::shared_
case VIDEO_MODE_OPENGL:
return std::make_unique<renderer_ogl>(window);
#endif
#ifdef OSD_WINDOWS
#if defined(OSD_WINDOWS)
case VIDEO_MODE_GDI:
return std::make_unique<renderer_gdi>(window);
case VIDEO_MODE_D3D:
return std::make_unique<renderer_d3d9>(window);
#else
#elif defined(OSD_SDL)
case VIDEO_MODE_SDL2ACCEL:
return std::make_unique<renderer_sdl2>(window, extra_flags);
case VIDEO_MODE_SOFT:

View File

@ -21,13 +21,15 @@
#include <windowsx.h>
#include <mmsystem.h>
#endif
#undef min
#undef max
#ifdef OSD_SDL
// forward declaration
struct SDL_Window;
#elif defined(OSD_UWP)
#include <Agile.h>
#endif
#undef min
#undef max
//============================================================
// TYPE DEFINITIONS
@ -71,7 +73,7 @@ class osd_window : public std::enable_shared_from_this<osd_window>
public:
osd_window(const osd_window_config &config)
:
#ifndef OSD_SDL
#ifdef OSD_WINDOW
m_dc(nullptr), m_resize_state(0),
#endif
m_primlist(nullptr),
@ -136,14 +138,16 @@ public:
virtual void update() = 0;
virtual void destroy() = 0;
#ifndef OSD_SDL
#ifdef OSD_WINDOWS
virtual bool win_has_menu() = 0;
HDC m_dc; // only used by GDI renderer!
int m_resize_state;
#elif OSD_UWP
virtual bool win_has_menu() = 0;
Platform::Agile<Windows::UI::Core::CoreWindow^> m_window;
#endif
render_primitive_list *m_primlist;
osd_window_config m_win_config;
int m_index;

View File

@ -5,7 +5,7 @@
// drawbgfx.cpp - BGFX renderer
//
//============================================================
#if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS)
#if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS) || defined(OSD_UWP)
// standard windows headers
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
@ -133,7 +133,7 @@ inline void winSetHwnd(::HWND _window)
pd.backBufferDS = NULL;
bgfx::setPlatformData(pd);
}
#else
#elif defined(OSD_SDL)
static void* sdlNativeWindowHandle(SDL_Window* _window)
{
SDL_SysWMinfo wmi;
@ -186,6 +186,22 @@ inline bool sdlSetWindow(SDL_Window* _window)
return true;
}
#elif defined(OSD_UWP)
inline void winrtSetWindow(::IUnknown* _window)
{
bgfx::PlatformData pd;
pd.ndt = NULL;
pd.nwh = _window;
pd.context = NULL;
pd.backBuffer = NULL;
pd.backBufferDS = NULL;
bgfx::setPlatformData(pd);
}
IInspectable* AsInspectable(Platform::Object^ o)
{
return reinterpret_cast<IInspectable*>(o);
}
#endif
int renderer_bgfx::create()
@ -211,6 +227,8 @@ int renderer_bgfx::create()
}
#ifdef OSD_WINDOWS
winSetHwnd(win->platform_window<HWND>());
#elif defined(OSD_UWP)
winrtSetWindow(AsInspectable(win->m_window.Get()));
#else
sdlSetWindow(win->platform_window<SDL_Window*>());
#endif
@ -260,6 +278,8 @@ int renderer_bgfx::create()
{
#ifdef OSD_WINDOWS
m_framebuffer = m_targets->create_backbuffer(win->platform_window<HWND>(), m_width[win->m_index], m_height[win->m_index]);
#elif defined(OSD_UWP)
m_framebuffer = m_targets->create_backbuffer(&win->m_window, m_width[win->m_index], m_height[win->m_index]);
#else
m_framebuffer = m_targets->create_backbuffer(sdlNativeWindowHandle(win->platform_window<SDL_Window*>()), m_width[win->m_index], m_height[win->m_index]);
#endif
@ -899,6 +919,8 @@ bool renderer_bgfx::update_dimensions()
delete m_framebuffer;
#ifdef OSD_WINDOWS
m_framebuffer = m_targets->create_backbuffer(win->platform_window<HWND>(), width, height);
#elif defined(OSD_UWP)
m_framebuffer = m_targets->create_backbuffer(&win->m_window, width, height);
#else
m_framebuffer = m_targets->create_backbuffer(sdlNativeWindowHandle(win->platform_window<SDL_Window*>()), width, height);
#endif

View File

@ -26,7 +26,15 @@ render_primitive_list *renderer_none::get_primitives()
return nullptr;
RECT client;
#if defined(OSD_WINDOWS)
GetClientRect(win->platform_window<HWND>(), &client);
#elif defined(OSD_UWP)
auto bounds = win->m_window->Bounds;
client.left = bounds.Left;
client.right = bounds.Right;
client.top = bounds.Top;
client.bottom = bounds.Bottom;
#endif
win->target()->set_bounds(rect_width(&client), rect_height(&client), win->pixel_aspect());
return &win->target()->get_primitives();
}

View File

@ -107,7 +107,11 @@ void osd_subst_env(std::string &dst, const std::string &src)
TCHAR buffer[MAX_PATH];
osd::text::tstring t_src = osd::text::to_tstring(src);
#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
ExpandEnvironmentStrings(t_src.c_str(), buffer, ARRAY_LENGTH(buffer));
#else
wcsncpy(buffer, t_src.c_str(), ARRAY_LENGTH(buffer));
#endif
osd::text::from_tstring(dst, buffer);
}