diff --git a/CMakeLists.txt b/CMakeLists.txt index 902c77c..0f0d3a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,6 +87,7 @@ set(LIBRARY_SOURCES SDL2pp/AudioLock.cc SDL2pp/AudioSpec.cc SDL2pp/Color.cc + SDL2pp/Display.cc SDL2pp/Exception.cc SDL2pp/Point.cc SDL2pp/RWops.cc @@ -106,6 +107,7 @@ set(LIBRARY_HEADERS SDL2pp/AudioSpec.hh SDL2pp/Color.hh SDL2pp/ContainerRWops.hh + SDL2pp/Display.hh SDL2pp/Exception.hh SDL2pp/Optional.hh SDL2pp/Point.hh diff --git a/SDL2pp/Display.cc b/SDL2pp/Display.cc new file mode 100644 index 0000000..47f64ab --- /dev/null +++ b/SDL2pp/Display.cc @@ -0,0 +1,70 @@ +/* + libSDL2pp - C++11 bindings/wrapper for SDL2 + Copyright (C) 2017 Vraiment + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include + +#include + +#include + +using std::string; + +namespace SDL2pp { +Rect GetDisplayBounds(int displayIndex) { + Rect result; + if (SDL_GetDisplayBounds(displayIndex, &result) < 0) { + throw Exception("SDL_GetDisplayBounds"); + } + + return result; +} + +string GetDisplayName(int displayIndex) { + const char* name = SDL_GetDisplayName(displayIndex); + if (name == nullptr) { + throw Exception("SDL_GetDisplayName"); + } + + return string{name}; +} + +#if SDL_VERSION_ATLEAST(2, 0, 4) +DPI GetDisplayDPI(int displayIndex) { + float diagonal = 0, horizontal = 0, vertical = 0; + if (SDL_GetDisplayDPI(displayIndex, &diagonal, &horizontal, &vertical) < 0) { + throw Exception("SDL_GetDisplayDPI"); + } + + return DPI{diagonal, horizontal, vertical}; +} +#endif + +#if SDL_VERSION_ATLEAST(2, 0, 5) +Rect GetDisplayUsableBounds(int displayIndex) { + Rect result; + if (SDL_GetDisplayUsableBounds(displayIndex, &result) < 0) { + throw Exception("SDL_GetDisplayUsableBounds"); + } + + return result; +} +#endif +} diff --git a/SDL2pp/Display.hh b/SDL2pp/Display.hh new file mode 100644 index 0000000..a09f876 --- /dev/null +++ b/SDL2pp/Display.hh @@ -0,0 +1,149 @@ +/* + libSDL2pp - C++11 bindings/wrapper for SDL2 + Copyright (C) 2017 Vraiment + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL2PP_DISPLAY_HH +#define SDL2PP_DISPLAY_HH + +#include + +#include + +#include +#include + +namespace SDL2pp { + //////////////////////////////////////////////////////////// + /// \brief Gets the area of a given display + /// + /// This function retrieves an rectangle with the area of + /// the given display, with the initial display being located + /// at (0,0). This function does not takes into account space + /// that is not usable, like OS X's menu bar. + /// + /// \ingroup graphics + /// + /// \headerfile SDL2pp/Display.hh + /// + /// \param[in] displayIndex The display to retrieve the area + /// + /// \returns A rectangle with area of the given display + /// + /// \throws SDL2pp::Exception + /// + /// \see https://wiki.libsdl.org/SDL_GetDisplayBounds + /// + //////////////////////////////////////////////////////////// + SDL2PP_EXPORT Rect GetDisplayBounds(int displayIndex); + + //////////////////////////////////////////////////////////// + /// \brief Gets the name of a given display + /// + /// \ingroup graphics + /// + /// \headerfile SDL2pp/Display.hh + /// + /// \param[in] displayIndex The display to retrieve its name + /// + /// \returns A string with the name of the given display + /// + /// \throws SDL2pp::Exception + /// + /// \see https://wiki.libsdl.org/SDL_GetDisplayName + /// + //////////////////////////////////////////////////////////// + SDL2PP_EXPORT std::string GetDisplayName(int displayIndex); + +#if SDL_VERSION_ATLEAST(2, 0, 4) + //////////////////////////////////////////////////////////// + /// \brief Read-only struct to store DPI information of a display + /// + /// \ingroup graphics + /// + /// \headerfile SDL2pp/Display.hh + /// + //////////////////////////////////////////////////////////// + struct SDL2PP_EXPORT DPI { + //////////////////////////////////////////////////////////// + /// \brief The diagonal DPI of the display + /// + //////////////////////////////////////////////////////////// + const float Diagonal; + + //////////////////////////////////////////////////////////// + /// \brief The horizontal DPI of the display + /// + //////////////////////////////////////////////////////////// + const float Horizontal; + + //////////////////////////////////////////////////////////// + /// \brief The vertical DPI of the display + /// + //////////////////////////////////////////////////////////// + const float Vertical; + }; + + //////////////////////////////////////////////////////////// + /// \brief Gets the dots/pixels per inch of a given display + /// + /// \ingroup graphics + /// + /// \headerfile SDL2pp/Display.hh + /// + /// \param[in] displayIndex The display to retrieve the DPI + /// + /// \returns A DPI object with the dpi values for the given display + /// + /// \throws SDL2pp::Exception + /// + /// \see https://wiki.libsdl.org/SDL_GetDisplayDPI + /// + //////////////////////////////////////////////////////////// + SDL2PP_EXPORT DPI GetDisplayDPI(int displayIndex); +#endif + +#if SDL_VERSION_ATLEAST(2, 0, 5) + //////////////////////////////////////////////////////////// + /// \brief Gets the usable desktop area of a given display + /// + /// This function retrieves an rectangle with the usable area + /// of the given display, with the initial display being + /// located at (0,0). This function does takes into account + /// space that is not usable, like OS X's menu bar, removing it + /// and returning the actual usable area. + /// + /// \ingroup graphics + /// + /// \headerfile SDL2pp/Display.hh + /// + /// \param[in] displayIndex The display to retrieve the usable area + /// + /// \returns A rectangle with the usable area of the given display + /// + /// \throws SDL2pp::Exception + /// + /// \see https://wiki.libsdl.org/SDL_GetDisplayUsableBounds + /// + //////////////////////////////////////////////////////////// + SDL2PP_EXPORT Rect GetDisplayUsableBounds(int displayIndex); +#endif +} + +#endif diff --git a/SDL2pp/SDL2pp.hh b/SDL2pp/SDL2pp.hh index 9a7ea16..aa0976c 100644 --- a/SDL2pp/SDL2pp.hh +++ b/SDL2pp/SDL2pp.hh @@ -60,6 +60,7 @@ /// \ingroup graphics /// //////////////////////////////////////////////////////////// +#include #include ////////////////////////////////////////////////////////////