mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-09-28 16:15:55 +08:00
WinRT: added Win10/UWP (Universal Windows Platform) support
"UWP" appears to be Microsoft's new name for WinRT/Windows-Store APIs. This set of changes updates SDL's WinRT backends to support the Win10 flavor of WinRT. It has been tested on Win10 on a desktop. In theory, it should also support Win10 on other devices (phone, Xbox One, etc.), however further patches may be necessary. This adds: - a set of MSVC 2015 project files, for use in creating UWP apps - modifications to various pieces of SDL, in order to compile via MSVC 2015 + the Win10 API set - enables SDL_Window resizing and programmatic-fullscreen toggling, when using the WinRT backend - WinRT README updates
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+23
-35
@@ -10,6 +10,7 @@ primarily, via a Microsoft-run online store (of the same name).
|
||||
|
||||
Some of the operating systems that include WinRT, are:
|
||||
|
||||
* Windows 10, via its Universal Windows Platform (UWP) APIs
|
||||
* Windows 8.x
|
||||
* Windows RT 8.x (aka. Windows 8.x for ARM processors)
|
||||
* Windows Phone 8.x
|
||||
@@ -18,12 +19,12 @@ Some of the operating systems that include WinRT, are:
|
||||
Requirements
|
||||
------------
|
||||
|
||||
* Microsoft Visual C++ (aka Visual Studio), either 2013 or 2012 versions
|
||||
* Microsoft Visual C++ (aka Visual Studio), either 2015, 2013, or 2012
|
||||
- Free, "Community" or "Express" editions may be used, so long as they
|
||||
include support for either "Windows Store" or "Windows Phone" apps.
|
||||
"Express" versions marked as supporting "Windows Desktop" development
|
||||
typically do not include support for creating WinRT apps, to note.
|
||||
(The "Community" edition of Visual C++ 2013 does, however, support both
|
||||
(The "Community" editions of Visual C++ do, however, support both
|
||||
desktop/Win32 and WinRT development).
|
||||
- Visual C++ 2012 can only build apps that target versions 8.0 of Windows,
|
||||
or Windows Phone. 8.0-targetted apps will run on devices running 8.1
|
||||
@@ -50,25 +51,21 @@ Status
|
||||
Here is a rough list of what works, and what doens't:
|
||||
|
||||
* What works:
|
||||
* compilation via Visual C++ 2012 and 2013
|
||||
* compilation via Visual C++ 2012 through 2015
|
||||
* compile-time platform detection for SDL programs. The C/C++ #define,
|
||||
`__WINRT__`, will be set to 1 (by SDL) when compiling for WinRT.
|
||||
* GPU-accelerated 2D rendering, via SDL_Renderer.
|
||||
* OpenGL ES 2, via the ANGLE library (included separately from SDL)
|
||||
* software rendering, via either SDL_Surface (optionally in conjunction with
|
||||
SDL_GetWindowSurface() and SDL_UpdateWindowSurface()) or via the
|
||||
SDL_Renderer APIs
|
||||
* threads. Significant chunks of Win32's threading APIs are not available in
|
||||
WinRT. A new, SDL threading backend was built using C++11's threading APIs
|
||||
(std::thread, std::mutex, std::condition_variable, etc.), which C or C++
|
||||
programs alike can access via SDL's threading APIs. Support for thread
|
||||
priorities is not, however, currently available, due to restrictions in
|
||||
WinRT's own API set.
|
||||
* threads
|
||||
* timers (via SDL_GetTicks(), SDL_AddTimer(), SDL_GetPerformanceCounter(),
|
||||
SDL_GetPerformanceFrequency(), etc.)
|
||||
* file I/O via SDL_RWops
|
||||
* mouse input (unsupported on Windows Phone)
|
||||
* audio, via a modified version of SDL's XAudio2 backend
|
||||
* .DLL file loading. Libraries must be packaged inside applications. Loading
|
||||
* .DLL file loading. Libraries *MUST* be packaged inside applications. Loading
|
||||
anything outside of the app is not supported.
|
||||
* system path retrieval via SDL's filesystem APIs
|
||||
* game controllers. Support is provided via the SDL_Joystick and
|
||||
@@ -76,10 +73,7 @@ Here is a rough list of what works, and what doens't:
|
||||
* multi-touch input
|
||||
* app events. SDL_APP_WILLENTER* and SDL_APP_DIDENTER* events get sent out as
|
||||
appropriate.
|
||||
* window events. SDL_WINDOWEVENT_MINIMIZED and SDL_WINDOWEVENT_RESTORED are
|
||||
sent out on app suspend and resume, respectively. SDL_WINDOWEVENT_SHOWN and
|
||||
SDL_WINDOWEVENT_HIDDEN are also sent, but not necessarily on app suspend or
|
||||
resume, as WinRT treats these two concepts differently..
|
||||
* window events
|
||||
* using Direct3D 11.x APIs outside of SDL. Non-XAML / Direct3D-only apps can
|
||||
choose to render content directly via Direct3D, using SDL to manage the
|
||||
internal WinRT window, as well as input and audio. (Use
|
||||
@@ -89,24 +83,13 @@ Here is a rough list of what works, and what doens't:
|
||||
* What partially works:
|
||||
* keyboard input. Most of WinRT's documented virtual keys are supported, as
|
||||
well as many keys with documented hardware scancodes.
|
||||
* OpenGL. Experimental support for OpenGL ES 2 is available via the ANGLE
|
||||
project, using either:
|
||||
* MS Open Technologies' "ms-master" repository, at https://github.com/MSOpenTech/angle
|
||||
(for use with Windows 8.1+ or Windows Phone 8.1+)
|
||||
* MS Open Technologies' "angle-win8.0" repository, at https://github.com/MSOpenTech/angle-win8.0
|
||||
(for Windows 8.0 only!)
|
||||
* Google's main ANGLE repository, at https://chromium.googlesource.com/angle/angle
|
||||
* SDLmain. WinRT uses a different signature for each app's main() function.
|
||||
SDL-based apps that use this port must compile in SDL_winrt_main_NonXAML.cpp
|
||||
(in `SDL\src\main\winrt\`) directly in order for their C-style main()
|
||||
functions to be called.
|
||||
* XAML interoperability. This feature is currently experimental (there are
|
||||
**many** known bugs in this, at present!), preliminary, and only for
|
||||
Windows 8.x/RT at the moment. Windows Phone + XAML support is still
|
||||
pending.
|
||||
|
||||
* What doesn't work:
|
||||
* compilation with anything other than Visual C++ 2012 or 2013
|
||||
* compilation with anything other than Visual C++
|
||||
* programmatically-created custom cursors. These don't appear to be supported
|
||||
by WinRT. Different OS-provided cursors can, however, be created via
|
||||
SDL_CreateSystemCursor() (unsupported on Windows Phone)
|
||||
@@ -236,10 +219,10 @@ To set this up for SDL/WinRT, you'll need to run through the following steps:
|
||||
4. find SDL/WinRT's Visual C++ project file and open it. Different project
|
||||
files exist for different WinRT platforms. All of them are in SDL's
|
||||
source distribution, in the following directories:
|
||||
* `VisualC-WinRT/WinPhone80_VS2012/` - for Windows Phone 8.0 apps
|
||||
* `VisualC-WinRT/UWP_VS2015/` - for Windows 10 / UWP apps
|
||||
* `VisualC-WinRT/WinPhone81_VS2013/` - for Windows Phone 8.1 apps
|
||||
* `VisualC-WinRT/WinRT80_VS2012/` - for Windows 8.0 apps
|
||||
* `VisualC-WinRT/WinRT81_VS2013/` - for Windows 8.1 apps
|
||||
* `VisualC-WinRT/WinRT80_VS2012/` - for Windows 8.0 apps
|
||||
* `VisualC-WinRT/WinRT81_VS2013/` - for Windows 8.1 apps
|
||||
5. once the project has been added, right-click on your app's project and
|
||||
select, "References..."
|
||||
6. click on the button titled, "Add New Reference..."
|
||||
@@ -400,11 +383,11 @@ A list of unsupported C APIs can be found at
|
||||
<http://msdn.microsoft.com/en-us/library/windows/apps/jj606124.aspx>
|
||||
|
||||
General information on using the C runtime in WinRT can be found at
|
||||
<http://msdn.microsoft.com/en-us/LIBRARY/hh972425(v=vs.110).aspx>
|
||||
<https://msdn.microsoft.com/en-us/library/hh972425.aspx>
|
||||
|
||||
A list of supported Win32 APIs for Windows 8/RT apps can be found at
|
||||
A list of supported Win32 APIs for WinRT apps can be found at
|
||||
<http://msdn.microsoft.com/en-us/library/windows/apps/br205757.aspx>. To note,
|
||||
the list of supported Win32 APIs for Windows Phone 8 development is different.
|
||||
the list of supported Win32 APIs for Windows Phone 8.0 is different.
|
||||
That list can be found at
|
||||
<http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj662956(v=vs.105).aspx>
|
||||
|
||||
@@ -422,7 +405,12 @@ Simulator. Once you do that, any time you build and run the app, the app will
|
||||
launch in window, rather than full-screen.
|
||||
|
||||
|
||||
#### 7.A. Running apps on ARM-based devices ####
|
||||
#### 7.A. Running apps on older, ARM-based, "Windows RT" devices ####
|
||||
|
||||
**These instructions do not include Windows Phone, despite Windows Phone
|
||||
typically running on ARM processors.** They are specifically for devices
|
||||
that use the "Windows RT" operating system, which was a modified version of
|
||||
Windows 8.x that ran primarily on ARM-based tablet computers.
|
||||
|
||||
To build and run the app on ARM-based, "Windows RT" devices, you'll need to:
|
||||
|
||||
@@ -433,9 +421,9 @@ To build and run the app on ARM-based, "Windows RT" devices, you'll need to:
|
||||
Windows RT device (on the network).
|
||||
|
||||
Microsoft's Remote Debugger can be found at
|
||||
<http://msdn.microsoft.com/en-us/library/vstudio/bt727f1t.aspx>. Please note
|
||||
<https://msdn.microsoft.com/en-us/library/hh441469.aspx>. Please note
|
||||
that separate versions of this debugger exist for different versions of Visual
|
||||
C++, one for debugging with MSVC 2012, another for debugging with MSVC 2013.
|
||||
C++, one each for MSVC 2015, 2013, and 2012.
|
||||
|
||||
To setup Visual C++ to launch your app on an ARM device:
|
||||
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
#ifndef NTDDI_WINBLUE
|
||||
#define NTDDI_WINBLUE 0x06030000
|
||||
#endif
|
||||
#ifndef NTDDI_WIN10
|
||||
#define NTDDI_WIN10 0x0A000000
|
||||
#endif
|
||||
|
||||
/* This is a set of defines to configure the SDL features */
|
||||
|
||||
|
||||
@@ -58,8 +58,13 @@
|
||||
/* The configure script already did any necessary checking */
|
||||
# define SDL_XAUDIO2_HAS_SDK 1
|
||||
#elif defined(__WINRT__)
|
||||
/* WinRT always has access to the XAudio 2 SDK */
|
||||
/* WinRT always has access to the XAudio 2 SDK (albeit with a header file
|
||||
that doesn't compile as C code).
|
||||
*/
|
||||
# define SDL_XAUDIO2_HAS_SDK
|
||||
#include "SDL_xaudio2.h" /* ... compiles as C code, in contrast to XAudio2 headers
|
||||
in the Windows SDK, v.10.0.10240.0 (Win 10's initial SDK)
|
||||
*/
|
||||
#else
|
||||
/* XAudio2 exists as of the March 2008 DirectX SDK
|
||||
The XAudio2 implementation available in the Windows 8 SDK targets Windows 8 and newer.
|
||||
@@ -88,17 +93,10 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* The XAudio header file, when #include'd on WinRT, will only compile in C++
|
||||
files, but not C. A few preprocessor-based hacks are defined below in order
|
||||
to get xaudio2.h to compile in the C/non-C++ file, SDL_xaudio2.c.
|
||||
*/
|
||||
#ifdef __WINRT__
|
||||
#define uuid(x)
|
||||
#define DX_BUILD
|
||||
#endif
|
||||
|
||||
#if !defined(_SDL_XAUDIO2_H)
|
||||
#define INITGUID 1
|
||||
#include <xaudio2.h>
|
||||
#endif
|
||||
|
||||
/* Hidden "this" pointer for the audio functions */
|
||||
#define _THIS SDL_AudioDevice *this
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -381,7 +381,7 @@ void SDL_WinRTApp::SetWindow(CoreWindow^ window)
|
||||
// TODO, WinRT: see if an app's default orientation can be found out via WinRT API(s), then set the initial value of SDL_HINT_ORIENTATIONS accordingly.
|
||||
SDL_AddHintCallback(SDL_HINT_ORIENTATIONS, WINRT_SetDisplayOrientationsPreference, NULL);
|
||||
|
||||
#if WINAPI_FAMILY == WINAPI_FAMILY_APP // for Windows 8/8.1/RT apps... (and not Phone apps)
|
||||
#if (WINAPI_FAMILY == WINAPI_FAMILY_APP) && (NTDDI_VERSION < NTDDI_WIN10) // for Windows 8/8.1/RT apps... (and not Phone apps)
|
||||
// Make sure we know when a user has opened the app's settings pane.
|
||||
// This is needed in order to display a privacy policy, which needs
|
||||
// to be done for network-enabled apps, as per Windows Store requirements.
|
||||
@@ -474,7 +474,7 @@ void SDL_WinRTApp::Uninitialize()
|
||||
{
|
||||
}
|
||||
|
||||
#if WINAPI_FAMILY == WINAPI_FAMILY_APP
|
||||
#if (WINAPI_FAMILY == WINAPI_FAMILY_APP) && (NTDDI_VERSION < NTDDI_WIN10)
|
||||
void SDL_WinRTApp::OnSettingsPaneCommandsRequested(
|
||||
Windows::UI::ApplicationSettings::SettingsPane ^p,
|
||||
Windows::UI::ApplicationSettings::SettingsPaneCommandsRequestedEventArgs ^args)
|
||||
@@ -516,7 +516,7 @@ void SDL_WinRTApp::OnSettingsPaneCommandsRequested(
|
||||
args->Request->ApplicationCommands->Append(cmd);
|
||||
}
|
||||
}
|
||||
#endif // if WINAPI_FAMILY == WINAPI_FAMILY_APP
|
||||
#endif // if (WINAPI_FAMILY == WINAPI_FAMILY_APP) && (NTDDI_VERSION < NTDDI_WIN10)
|
||||
|
||||
void SDL_WinRTApp::OnWindowSizeChanged(CoreWindow^ sender, WindowSizeChangedEventArgs^ args)
|
||||
{
|
||||
|
||||
@@ -43,11 +43,11 @@ protected:
|
||||
|
||||
// Event Handlers.
|
||||
|
||||
#if WINAPI_FAMILY == WINAPI_FAMILY_APP // for Windows 8/8.1/RT apps... (and not Phone apps)
|
||||
#if (WINAPI_FAMILY == WINAPI_FAMILY_APP) && (NTDDI_VERSION < NTDDI_WIN10) // for Windows 8/8.1/RT apps... (and not Phone apps)
|
||||
void OnSettingsPaneCommandsRequested(
|
||||
Windows::UI::ApplicationSettings::SettingsPane ^p,
|
||||
Windows::UI::ApplicationSettings::SettingsPaneCommandsRequestedEventArgs ^args);
|
||||
#endif // if WINAPI_FAMILY == WINAPI_FAMILY_APP
|
||||
#endif // if (WINAPI_FAMILY == WINAPI_FAMILY_APP) && (NTDDI_VERSION < NTDDI_WIN10)
|
||||
|
||||
#if NTDDI_VERSION > NTDDI_WIN8
|
||||
void OnOrientationChanged(Windows::Graphics::Display::DisplayInformation^ sender, Platform::Object^ args);
|
||||
|
||||
@@ -2367,7 +2367,7 @@ D3D11_UpdateVertexBuffer(SDL_Renderer *renderer,
|
||||
} else {
|
||||
SAFE_RELEASE(rendererData->vertexBuffer);
|
||||
|
||||
vertexBufferDesc.ByteWidth = dataSizeInBytes;
|
||||
vertexBufferDesc.ByteWidth = (UINT) dataSizeInBytes;
|
||||
vertexBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
|
||||
vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
|
||||
vertexBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||
|
||||
@@ -1168,7 +1168,7 @@ SDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool fullscreen)
|
||||
window->last_fullscreen_flags = window->flags;
|
||||
return 0;
|
||||
}
|
||||
#elif __WINRT__
|
||||
#elif __WINRT__ && (NTDDI_VERSION < NTDDI_WIN10)
|
||||
/* HACK: WinRT 8.x apps can't choose whether or not they are fullscreen
|
||||
or not. The user can choose this, via OS-provided UI, but this can't
|
||||
be set programmatically.
|
||||
@@ -1405,7 +1405,7 @@ SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if __WINRT__
|
||||
#if __WINRT__ && (NTDDI_VERSION < NTDDI_WIN10)
|
||||
/* HACK: WinRT 8.x apps can't choose whether or not they are fullscreen
|
||||
or not. The user can choose this, via OS-provided UI, but this can't
|
||||
be set programmatically.
|
||||
|
||||
@@ -76,6 +76,8 @@ static void WINRT_VideoQuit(_THIS);
|
||||
|
||||
/* Window functions */
|
||||
static int WINRT_CreateWindow(_THIS, SDL_Window * window);
|
||||
static void WINRT_SetWindowSize(_THIS, SDL_Window * window);
|
||||
static void WINRT_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
|
||||
static void WINRT_DestroyWindow(_THIS, SDL_Window * window);
|
||||
static SDL_bool WINRT_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info);
|
||||
|
||||
@@ -134,6 +136,8 @@ WINRT_CreateDevice(int devindex)
|
||||
device->VideoInit = WINRT_VideoInit;
|
||||
device->VideoQuit = WINRT_VideoQuit;
|
||||
device->CreateWindow = WINRT_CreateWindow;
|
||||
device->SetWindowSize = WINRT_SetWindowSize;
|
||||
device->SetWindowFullscreen = WINRT_SetWindowFullscreen;
|
||||
device->DestroyWindow = WINRT_DestroyWindow;
|
||||
device->SetDisplayMode = WINRT_SetDisplayMode;
|
||||
device->PumpEvents = WINRT_PumpEvents;
|
||||
@@ -478,6 +482,9 @@ WINRT_CreateWindow(_THIS, SDL_Window * window)
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Make note of the requested window flags, before they start getting changed. */
|
||||
const Uint32 requestedFlags = window->flags;
|
||||
|
||||
#if SDL_VIDEO_OPENGL_EGL
|
||||
/* Setup the EGL surface, but only if OpenGL ES 2 was requested. */
|
||||
if (!(window->flags & SDL_WINDOW_OPENGL)) {
|
||||
@@ -548,15 +555,35 @@ WINRT_CreateWindow(_THIS, SDL_Window * window)
|
||||
SDL_SetMouseFocus(NULL); // TODO: detect this
|
||||
SDL_SetKeyboardFocus(NULL); // TODO: detect this
|
||||
} else {
|
||||
/* WinRT apps seem to live in an environment where the OS controls the
|
||||
/* WinRT 8.x apps seem to live in an environment where the OS controls the
|
||||
app's window size, with some apps being fullscreen, depending on
|
||||
user choice of various things. For now, just adapt the SDL_Window to
|
||||
whatever Windows set-up as the native-window's geometry.
|
||||
*/
|
||||
window->x = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Left);
|
||||
window->y = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Top);
|
||||
#if NTDDI_VERSION < NTDDI_WIN10
|
||||
/* On WinRT 8.x / pre-Win10, just use the size we were given. */
|
||||
window->w = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Width);
|
||||
window->h = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Height);
|
||||
#else
|
||||
/* On Windows 10, we occasionally get control over window size. For windowed
|
||||
mode apps, try this.
|
||||
*/
|
||||
bool didSetSize = false;
|
||||
if (!(requestedFlags & SDL_WINDOW_FULLSCREEN)) {
|
||||
const Windows::Foundation::Size size(WINRT_PHYSICAL_PIXELS_TO_DIPS(window->w),
|
||||
WINRT_PHYSICAL_PIXELS_TO_DIPS(window->h));
|
||||
didSetSize = data->appView->TryResizeView(size);
|
||||
}
|
||||
if (!didSetSize) {
|
||||
/* We either weren't able to set the window size, or a request for
|
||||
fullscreen was made. Get window-size info from the OS.
|
||||
*/
|
||||
window->w = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Width);
|
||||
window->h = WINRT_DIPS_TO_PHYSICAL_PIXELS(data->coreWindow->Bounds.Height);
|
||||
}
|
||||
#endif
|
||||
|
||||
WINRT_UpdateWindowFlags(
|
||||
window,
|
||||
@@ -584,6 +611,35 @@ WINRT_CreateWindow(_THIS, SDL_Window * window)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
WINRT_SetWindowSize(_THIS, SDL_Window * window)
|
||||
{
|
||||
#if NTDDI_VERSION >= NTDDI_WIN10
|
||||
SDL_WindowData * data = (SDL_WindowData *)window->driverdata;
|
||||
const Windows::Foundation::Size size(WINRT_PHYSICAL_PIXELS_TO_DIPS(window->w),
|
||||
WINRT_PHYSICAL_PIXELS_TO_DIPS(window->h));
|
||||
data->appView->TryResizeView(size); // TODO, WinRT: return failure (to caller?) from TryResizeView()
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
WINRT_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen)
|
||||
{
|
||||
#if NTDDI_VERSION >= NTDDI_WIN10
|
||||
SDL_WindowData * data = (SDL_WindowData *)window->driverdata;
|
||||
if (fullscreen) {
|
||||
if (!data->appView->IsFullScreenMode) {
|
||||
data->appView->TryEnterFullScreenMode(); // TODO, WinRT: return failure (to caller?) from TryEnterFullScreenMode()
|
||||
}
|
||||
} else {
|
||||
if (data->appView->IsFullScreenMode) {
|
||||
data->appView->ExitFullScreenMode();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WINRT_DestroyWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
|
||||
@@ -75,9 +75,9 @@ extern "C" Uint32 WINRT_DetectWindowFlags(SDL_Window * window); /* detects flag
|
||||
#define WINRT_DISPLAY_PROPERTY(NAME) (Windows::Graphics::Display::DisplayProperties::NAME)
|
||||
#endif
|
||||
|
||||
/* Converts DIPS to physical pixels */
|
||||
#define WINRT_DIPS_TO_PHYSICAL_PIXELS(DIPS) ((int)(0.5f + (((float)(DIPS) * (float)WINRT_DISPLAY_PROPERTY(LogicalDpi)) / 96.f)))
|
||||
|
||||
/* Converts DIPS to/from physical pixels */
|
||||
#define WINRT_DIPS_TO_PHYSICAL_PIXELS(DIPS) ((int)(0.5f + (((float)(DIPS) * (float)WINRT_DISPLAY_PROPERTY(LogicalDpi)) / 96.f)))
|
||||
#define WINRT_PHYSICAL_PIXELS_TO_DIPS(PHYSPIX) (((float)(PHYSPIX) * 96.f)/WINRT_DISPLAY_PROPERTY(LogicalDpi))
|
||||
|
||||
/* Internal window data */
|
||||
struct SDL_WindowData
|
||||
|
||||
Reference in New Issue
Block a user