Browse Source

Platform: window icon management in Glfw and Sdl2Application.

pull/397/head
Vladimír Vondruš 7 years ago
parent
commit
090c6bb4a7
  1. 3
      doc/changelog.dox
  2. 5
      package/ci/appveyor-desktop-vulkan.bat
  3. 7
      package/ci/travis-desktop-vulkan.sh
  4. 62
      src/Magnum/Platform/GlfwApplication.cpp
  5. 18
      src/Magnum/Platform/GlfwApplication.h
  6. 28
      src/Magnum/Platform/Sdl2Application.cpp
  7. 21
      src/Magnum/Platform/Sdl2Application.h
  8. 15
      src/Magnum/Platform/Test/CMakeLists.txt
  9. 37
      src/Magnum/Platform/Test/GlfwApplicationTest.cpp
  10. 39
      src/Magnum/Platform/Test/Sdl2ApplicationTest.cpp
  11. BIN
      src/Magnum/Platform/Test/icon-16.tga
  12. BIN
      src/Magnum/Platform/Test/icon-32.tga
  13. BIN
      src/Magnum/Platform/Test/icon-64.tga
  14. 12
      src/Magnum/Platform/Test/resources.conf

3
doc/changelog.dox

@ -54,6 +54,9 @@ See also:
@ref Platform::GlfwApplication::setCursor() and @ref Platform::GlfwApplication::setCursor() and
@ref Platform::EmscriptenApplication::setCursor() (see @ref Platform::EmscriptenApplication::setCursor() (see
[mosra/magnum#383](https://github.com/mosra/magnum/pull/383)) [mosra/magnum#383](https://github.com/mosra/magnum/pull/383))
- Window icon management using @ref Platform::Sdl2Application::setWindowIcon()
and @ref Platform::GlfwApplication::setWindowIcon() (see
[mosra/magnum#393](https://github.com/mosra/magnum/issues/393))
- Added @ref Platform::GlfwApplication::warpCursor() to match the equivalent - Added @ref Platform::GlfwApplication::warpCursor() to match the equivalent
API in @ref Platform::Sdl2Application (see API in @ref Platform::Sdl2Application (see
[mosra/magnum#383](https://github.com/mosra/magnum/pull/383)) [mosra/magnum#383](https://github.com/mosra/magnum/pull/383))

5
package/ci/appveyor-desktop-vulkan.bat

@ -21,7 +21,8 @@ cl.exe /c package/ci/libvulkan.cpp || exit /b
lib.exe /OUT:%APPVEYOR_BUILD_FOLDER%/deps/lib/libvulkan.lib libvulkan.obj || exit /b lib.exe /OUT:%APPVEYOR_BUILD_FOLDER%/deps/lib/libvulkan.lib libvulkan.obj || exit /b
rem Enabling only stuff that's directly affected by Vulkan (which means also rem Enabling only stuff that's directly affected by Vulkan (which means also
rem parts of Platform), disabling everything else. rem parts of Platform, which need Trade for icon import in tests), disabling
rem everything else.
mkdir build && cd build || exit /b mkdir build && cd build || exit /b
cmake .. ^ cmake .. ^
-DCMAKE_BUILD_TYPE=Debug ^ -DCMAKE_BUILD_TYPE=Debug ^
@ -37,7 +38,7 @@ cmake .. ^
-DWITH_SHADERS=OFF ^ -DWITH_SHADERS=OFF ^
-DWITH_TEXT=OFF ^ -DWITH_TEXT=OFF ^
-DWITH_TEXTURETOOLS=OFF ^ -DWITH_TEXTURETOOLS=OFF ^
-DWITH_TRADE=OFF ^ -DWITH_TRADE=ON ^
-DWITH_VK=ON ^ -DWITH_VK=ON ^
-DWITH_ANYAUDIOIMPORTER=OFF ^ -DWITH_ANYAUDIOIMPORTER=OFF ^
-DWITH_ANYIMAGECONVERTER=OFF ^ -DWITH_ANYIMAGECONVERTER=OFF ^

7
package/ci/travis-desktop-vulkan.sh

@ -12,7 +12,7 @@ cmake .. \
-DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_BUILD_TYPE=Debug \
-DBUILD_DEPRECATED=$BUILD_DEPRECATED \ -DBUILD_DEPRECATED=$BUILD_DEPRECATED \
-DWITH_INTERCONNECT=OFF \ -DWITH_INTERCONNECT=OFF \
-DWITH_PLUGINMANAGER=OFF \ -DWITH_PLUGINMANAGER=ON \
-G Ninja -G Ninja
ninja install ninja install
cd ../.. cd ../..
@ -22,7 +22,8 @@ cd ../..
g++ package/ci/libvulkan.cpp -std=c++11 -shared -o $HOME/libvulkan.so g++ package/ci/libvulkan.cpp -std=c++11 -shared -o $HOME/libvulkan.so
# Enabling only stuff that's directly affected by Vulkan (which means also # Enabling only stuff that's directly affected by Vulkan (which means also
# parts of Platform), disabling everything else. # parts of Platform, which need Trade for icon import in tests), disabling
# everything else.
mkdir build && cd build mkdir build && cd build
# Not using CXXFLAGS in order to avoid affecting dependencies # Not using CXXFLAGS in order to avoid affecting dependencies
cmake .. \ cmake .. \
@ -39,7 +40,7 @@ cmake .. \
-DWITH_SHADERS=OFF \ -DWITH_SHADERS=OFF \
-DWITH_TEXT=OFF \ -DWITH_TEXT=OFF \
-DWITH_TEXTURETOOLS=OFF \ -DWITH_TEXTURETOOLS=OFF \
-DWITH_TRADE=OFF \ -DWITH_TRADE=ON \
-DWITH_VK=ON \ -DWITH_VK=ON \
-DWITH_AL_INFO=OFF \ -DWITH_AL_INFO=OFF \
-DWITH_GL_INFO=OFF \ -DWITH_GL_INFO=OFF \

62
src/Magnum/Platform/GlfwApplication.cpp

@ -28,10 +28,14 @@
#include <cstring> #include <cstring>
#include <tuple> #include <tuple>
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/StridedArrayView.h>
#include <Corrade/Utility/Arguments.h> #include <Corrade/Utility/Arguments.h>
#include <Corrade/Utility/String.h> #include <Corrade/Utility/String.h>
#include <Corrade/Utility/Unicode.h> #include <Corrade/Utility/Unicode.h>
#include "Magnum/ImageView.h"
#include "Magnum/PixelFormat.h"
#include "Magnum/Math/ConfigurationValue.h" #include "Magnum/Math/ConfigurationValue.h"
#include "Magnum/Platform/ScreenedApplication.hpp" #include "Magnum/Platform/ScreenedApplication.hpp"
#include "Magnum/Platform/Implementation/DpiScaling.h" #include "Magnum/Platform/Implementation/DpiScaling.h"
@ -230,6 +234,64 @@ void GlfwApplication::setWindowTitle(const std::string& title) {
glfwSetWindowTitle(_window, title.data()); glfwSetWindowTitle(_window, title.data());
} }
#if GLFW_VERSION_MAJOR*100 + GLFW_VERSION_MINOR >= 302
void GlfwApplication::setWindowIcon(const ImageView2D& image) {
setWindowIcon({image});
}
namespace {
template<class T> inline void packPixels(const Containers::StridedArrayView2D<const T>& in, const Containers::StridedArrayView2D<Color4ub>& out) {
for(std::size_t row = 0; row != in.size()[0]; ++row)
for(std::size_t col = 0; col != in.size()[1]; ++col)
out[row][col] = in[row][col];
}
}
void GlfwApplication::setWindowIcon(std::initializer_list<ImageView2D> images) {
/* Calculate the total size needed to allocate first so we don't allocate
a ton of tiny arrays */
std::size_t size = 0;
for(const ImageView2D& image: images)
size += sizeof(GLFWimage) + 4*image.size().product();
Containers::Array<char> data{size};
/* Pack array of GLFWimages and pixel data together into the memory
allocated above */
std::size_t offset = images.size()*sizeof(GLFWimage);
Containers::ArrayView<GLFWimage> glfwImages = Containers::arrayCast<GLFWimage>(data.prefix(offset));
std::size_t i = 0;
for(const ImageView2D& image: images) {
/* Copy and tightly pack pixels. GLFW doesn't allow arbitrary formats
or strides (for subimages and/or Y flip), so we have to copy */
Containers::ArrayView<char> target = data.slice(offset, offset + 4*image.size().product());
auto out = Containers::StridedArrayView2D<Color4ub>{
Containers::arrayCast<Color4ub>(target),
{std::size_t(image.size().y()),
std::size_t(image.size().x())}}.flipped<0>();
/** @todo handle sRGB differently? */
if(image.format() == PixelFormat::RGB8Snorm ||
image.format() == PixelFormat::RGB8Unorm)
packPixels(image.pixels<Color3ub>(), out);
else if(image.format() == PixelFormat::RGBA8Snorm ||
image.format() == PixelFormat::RGBA8Unorm)
packPixels(image.pixels<Color4ub>(), out);
else CORRADE_ASSERT(false, "Platform::GlfwApplication::setWindowIcon(): unexpected format" << image.format(), );
/* Specify the image metadata */
glfwImages[i].width = image.size().x();
glfwImages[i].height = image.size().y();
glfwImages[i].pixels = reinterpret_cast<unsigned char*>(target.data());
++i;
offset += target.size();
}
glfwSetWindowIcon(_window, glfwImages.size(), glfwImages);
}
#endif
bool GlfwApplication::tryCreate(const Configuration& configuration) { bool GlfwApplication::tryCreate(const Configuration& configuration) {
#ifdef MAGNUM_TARGET_GL #ifdef MAGNUM_TARGET_GL
#ifdef GLFW_NO_API #ifdef GLFW_NO_API

18
src/Magnum/Platform/GlfwApplication.h

@ -427,6 +427,24 @@ class GlfwApplication {
*/ */
void setWindowTitle(const std::string& title); void setWindowTitle(const std::string& title);
#if GLFW_VERSION_MAJOR*100 + GLFW_VERSION_MINOR >= 302 || defined(DOXYGEN_GENERATING_OUTPUT)
/**
* @brief Set window icon
*
* The @p images are expected to be with origin at bottom left (which
* is the default for imported images) and in one of
* @ref PixelFormat::RGB8Unorm, @ref PixelFormat::RGB8Srgb,
* @ref PixelFormat::RGBA8Unorm or @ref PixelFormat::RGBA8Srgb formats.
* If you have just one image, you can use
* @ref setWindowIcon(const ImageView2D&) instead.
* @note Available since GLFW 3.2. The function has no effect on macOS
* / Wayland, see @m_class{m-doc-external} [glfwSetWindowIcon()](https://www.glfw.org/docs/latest/group__window.html#gadd7ccd39fe7a7d1f0904666ae5932dc5)
* for more information.
*/
void setWindowIcon(std::initializer_list<ImageView2D> images);
void setWindowIcon(const ImageView2D& image); /**< @overload */
#endif
/** /**
* @brief Swap buffers * @brief Swap buffers
* *

28
src/Magnum/Platform/Sdl2Application.cpp

@ -35,6 +35,8 @@
#endif #endif
#include <Corrade/Utility/Arguments.h> #include <Corrade/Utility/Arguments.h>
#include "Magnum/ImageView.h"
#include "Magnum/PixelFormat.h"
#include "Magnum/Math/ConfigurationValue.h" #include "Magnum/Math/ConfigurationValue.h"
#include "Magnum/Math/Range.h" #include "Magnum/Math/Range.h"
#include "Magnum/Platform/ScreenedApplication.hpp" #include "Magnum/Platform/ScreenedApplication.hpp"
@ -275,6 +277,32 @@ void Sdl2Application::setWindowTitle(const std::string& title) {
#endif #endif
} }
#if !defined(CORRADE_TARGET_EMSCRIPTEN) && SDL_MAJOR_VERSION*1000 + SDL_MINOR_VERSION*100 + SDL_PATCHLEVEL >= 2005
void Sdl2Application::setWindowIcon(const ImageView2D& image) {
Uint32 format; /** @todo handle sRGB differently? */
switch(image.format()) {
case PixelFormat::RGB8Srgb:
case PixelFormat::RGB8Unorm:
format = SDL_PIXELFORMAT_RGB24;
break;
case PixelFormat::RGBA8Srgb:
case PixelFormat::RGBA8Unorm:
format = SDL_PIXELFORMAT_RGBA32;
break;
default:
CORRADE_ASSERT(false, "Platform::Sdl2Application::setWindowIcon(): unexpected format" << image.format(), );
}
/* Images are loaded with origin at bottom left, flip it to top left.
Fortunately SDL accepts negative stride, so we don't need to do an
expensive flip ourselves. */
Containers::StridedArrayView3D<const char> pixels = image.pixels().flipped<0>();
SDL_Surface* icon = SDL_CreateRGBSurfaceWithFormatFrom(const_cast<void*>(pixels.data()) , image.size().x(), image.size().y(), 32, pixels.stride()[0], format);
SDL_SetWindowIcon(_window, icon);
SDL_FreeSurface(icon);
}
#endif
bool Sdl2Application::tryCreate(const Configuration& configuration) { bool Sdl2Application::tryCreate(const Configuration& configuration) {
#ifdef MAGNUM_TARGET_GL #ifdef MAGNUM_TARGET_GL
if(!(configuration.windowFlags() & Configuration::WindowFlag::Contextless)) if(!(configuration.windowFlags() & Configuration::WindowFlag::Contextless))

21
src/Magnum/Platform/Sdl2Application.h

@ -702,6 +702,27 @@ class Sdl2Application {
*/ */
void setWindowTitle(const std::string& title); void setWindowTitle(const std::string& title);
#if !defined(CORRADE_TARGET_EMSCRIPTEN) && (SDL_MAJOR_VERSION*1000 + SDL_MINOR_VERSION*100 + SDL_PATCHLEVEL >= 2005 || defined(DOXYGEN_GENERATING_OUTPUT))
/**
* @brief Set window icon
*
* The @p image is expected to be with origin at bottom left (which is
* the default for imported images) and in one of
* @ref PixelFormat::RGB8Unorm, @ref PixelFormat::RGB8Srgb,
* @ref PixelFormat::RGBA8Unorm or @ref PixelFormat::RGBA8Srgb formats.
* Unlike @ref GlfwApplication::setWindowIcon(), SDL doesn't provide a
* way to supply multiple images in different sizes.
* @note Available since SDL 2.0.5. Not available on
* @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten", use
* @cb{.html} <link rel="icon"> @ce in your HTML markup instead.
* Although it's not documented in SDL itself, the function might
* have no effect on macOS / Wayland, similarly to how
* @ref GlfwApplication::setWindowIcon() behaves on those
* platforms.
*/
void setWindowIcon(const ImageView2D& image);
#endif
#if defined(CORRADE_TARGET_EMSCRIPTEN) || defined(DOXYGEN_GENERATING_OUTPUT) #if defined(CORRADE_TARGET_EMSCRIPTEN) || defined(DOXYGEN_GENERATING_OUTPUT)
/** /**
* @brief Set container CSS class * @brief Set container CSS class

15
src/Magnum/Platform/Test/CMakeLists.txt

@ -25,6 +25,11 @@
find_package(Corrade REQUIRED Main) find_package(Corrade REQUIRED Main)
# Icons for SDL/GLFW
if(NOT CORRADE_TARGET_EMSCRIPTEN AND (WITH_SDL2APPLICATION OR WITH_GLFWAPPLICATION))
corrade_add_resource(Platform_RESOURCES resources.conf)
endif()
if(WITH_ANDROIDAPPLICATION) if(WITH_ANDROIDAPPLICATION)
add_library(PlatformAndroidApplicationTest SHARED AndroidApplicationTest.cpp) add_library(PlatformAndroidApplicationTest SHARED AndroidApplicationTest.cpp)
target_link_libraries(PlatformAndroidApplicationTest PRIVATE MagnumAndroidApplication) target_link_libraries(PlatformAndroidApplicationTest PRIVATE MagnumAndroidApplication)
@ -52,6 +57,11 @@ if(WITH_GLFWAPPLICATION)
add_executable(PlatformGlfwApplicationTest WIN32 GlfwApplicationTest.cpp) add_executable(PlatformGlfwApplicationTest WIN32 GlfwApplicationTest.cpp)
# HiDPi.manifest not needed, as GLFW sets that on its own # HiDPi.manifest not needed, as GLFW sets that on its own
target_link_libraries(PlatformGlfwApplicationTest PRIVATE MagnumGlfwApplication Corrade::Main) target_link_libraries(PlatformGlfwApplicationTest PRIVATE MagnumGlfwApplication Corrade::Main)
# Window icon loading
if(NOT CORRADE_TARGET_EMSCRIPTEN)
target_sources(PlatformGlfwApplicationTest PRIVATE ${Platform_RESOURCES})
target_link_libraries(PlatformGlfwApplicationTest PRIVATE MagnumTrade)
endif()
set_target_properties(PlatformGlfwApplicationTest PROPERTIES FOLDER "Magnum/Platform/Test") set_target_properties(PlatformGlfwApplicationTest PROPERTIES FOLDER "Magnum/Platform/Test")
endif() endif()
@ -71,6 +81,11 @@ if(WITH_SDL2APPLICATION)
endif() endif()
endif() endif()
target_link_libraries(PlatformSdl2ApplicationTest PRIVATE MagnumSdl2Application Corrade::Main) target_link_libraries(PlatformSdl2ApplicationTest PRIVATE MagnumSdl2Application Corrade::Main)
# Window icon loading
if(NOT CORRADE_TARGET_EMSCRIPTEN)
target_sources(PlatformSdl2ApplicationTest PRIVATE ${Platform_RESOURCES})
target_link_libraries(PlatformSdl2ApplicationTest PRIVATE MagnumTrade)
endif()
set_target_properties(PlatformSdl2ApplicationTest PROPERTIES FOLDER "Magnum/Platform/Test") set_target_properties(PlatformSdl2ApplicationTest PROPERTIES FOLDER "Magnum/Platform/Test")
if(CORRADE_TARGET_EMSCRIPTEN) if(CORRADE_TARGET_EMSCRIPTEN)
add_custom_command(TARGET PlatformSdl2ApplicationTest POST_BUILD add_custom_command(TARGET PlatformSdl2ApplicationTest POST_BUILD

37
src/Magnum/Platform/Test/GlfwApplicationTest.cpp

@ -23,20 +23,20 @@
DEALINGS IN THE SOFTWARE. DEALINGS IN THE SOFTWARE.
*/ */
#include <Corrade/Containers/Optional.h>
#include <Corrade/PluginManager/Manager.h>
#include <Corrade/Utility/DebugStl.h> #include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/Resource.h>
#include "Magnum/ImageView.h"
#include "Magnum/Platform/GlfwApplication.h" #include "Magnum/Platform/GlfwApplication.h"
#include "Magnum/Trade/AbstractImporter.h"
#include "Magnum/Trade/ImageData.h"
namespace Magnum { namespace Platform { namespace Test { namespace { namespace Magnum { namespace Platform { namespace Test { namespace {
struct GlfwApplicationTest: Platform::Application { struct GlfwApplicationTest: Platform::Application {
explicit GlfwApplicationTest(const Arguments& arguments): Platform::Application{arguments, Configuration{}.setWindowFlags(Configuration::WindowFlag::Resizable)} { explicit GlfwApplicationTest(const Arguments& arguments);
Debug{} << "window size" << windowSize()
#ifdef MAGNUM_TARGET_GL
<< framebufferSize()
#endif
<< dpiScaling();
}
/* For testing HiDPI resize events */ /* For testing HiDPI resize events */
void viewportEvent(ViewportEvent& event) override { void viewportEvent(ViewportEvent& event) override {
@ -93,6 +93,29 @@ struct GlfwApplicationTest: Platform::Application {
void drawEvent() override {} void drawEvent() override {}
}; };
GlfwApplicationTest::GlfwApplicationTest(const Arguments& arguments): Platform::Application{arguments, Configuration{}.setWindowFlags(Configuration::WindowFlag::Resizable)} {
/* For testing resize events */
Debug{} << "window size" << windowSize()
#ifdef MAGNUM_TARGET_GL
<< framebufferSize()
#endif
<< dpiScaling();
#if GLFW_VERSION_MAJOR*100 + GLFW_VERSION_MINOR >= 302
Utility::Resource rs{"icons"};
PluginManager::Manager<Trade::AbstractImporter> manager;
Containers::Pointer<Trade::AbstractImporter> importer;
Containers::Optional<Trade::ImageData2D> image16, image32, image64;
if((importer = manager.loadAndInstantiate("AnyImageImporter")) &&
importer->openData(rs.getRaw("icon-16.tga")) && (image16 = importer->image2D(0)) &&
importer->openData(rs.getRaw("icon-32.tga")) && (image32 = importer->image2D(0)) &&
importer->openData(rs.getRaw("icon-64.tga")) && (image64 = importer->image2D(0))) setWindowIcon({*image16, *image32, *image64});
else Warning{} << "Can't load the plugin / images, not setting window icon";
#else
Debug{} << "GLFW too old, can't set window icon";
#endif
}
}}}} }}}}
MAGNUM_APPLICATION_MAIN(Magnum::Platform::Test::GlfwApplicationTest) MAGNUM_APPLICATION_MAIN(Magnum::Platform::Test::GlfwApplicationTest)

39
src/Magnum/Platform/Test/Sdl2ApplicationTest.cpp

@ -23,23 +23,22 @@
DEALINGS IN THE SOFTWARE. DEALINGS IN THE SOFTWARE.
*/ */
#include <Corrade/Containers/Optional.h>
#include <Corrade/PluginManager/Manager.h>
#include <Corrade/Utility/DebugStl.h> #include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/Resource.h>
#include "Magnum/ImageView.h"
#include "Magnum/Platform/Sdl2Application.h" #include "Magnum/Platform/Sdl2Application.h"
#include "Magnum/Trade/AbstractImporter.h"
#include "Magnum/Trade/ImageData.h"
#include <SDL_events.h> #include <SDL_events.h>
namespace Magnum { namespace Platform { namespace Test { namespace { namespace Magnum { namespace Platform { namespace Test { namespace {
struct Sdl2ApplicationTest: Platform::Application { struct Sdl2ApplicationTest: Platform::Application {
/* For testing resize events */ explicit Sdl2ApplicationTest(const Arguments& arguments);
explicit Sdl2ApplicationTest(const Arguments& arguments): Platform::Application{arguments, Configuration{}.setWindowFlags(Configuration::WindowFlag::Resizable)} {
Debug{} << "window size" << windowSize()
#ifdef MAGNUM_TARGET_GL
<< framebufferSize()
#endif
<< dpiScaling();
}
void exitEvent(ExitEvent& event) override { void exitEvent(ExitEvent& event) override {
Debug{} << "application exiting"; Debug{} << "application exiting";
@ -129,6 +128,30 @@ struct Sdl2ApplicationTest: Platform::Application {
#endif #endif
}; };
Sdl2ApplicationTest::Sdl2ApplicationTest(const Arguments& arguments): Platform::Application{arguments, Configuration{}.setWindowFlags(Configuration::WindowFlag::Resizable)} {
/* For testing resize events */
Debug{} << "window size" << windowSize()
#ifdef MAGNUM_TARGET_GL
<< framebufferSize()
#endif
<< dpiScaling();
#ifndef CORRADE_TARGET_EMSCRIPTEN
#if SDL_MAJOR_VERSION*1000 + SDL_MINOR_VERSION*100 + SDL_PATCHLEVEL >= 2005
Utility::Resource rs{"icons"};
PluginManager::Manager<Trade::AbstractImporter> manager;
Containers::Pointer<Trade::AbstractImporter> importer;
Containers::Optional<Trade::ImageData2D> image;
if((importer = manager.loadAndInstantiate("AnyImageImporter")) &&
importer->openData(rs.getRaw("icon-64.tga")) &&
(image = importer->image2D(0))) setWindowIcon(*image);
else Warning{} << "Can't load the plugin / file, not setting window icon";
#else
Debug{} << "SDL too old, can't set window icon";
#endif
#endif
}
}}}} }}}}
MAGNUM_APPLICATION_MAIN(Magnum::Platform::Test::Sdl2ApplicationTest) MAGNUM_APPLICATION_MAIN(Magnum::Platform::Test::Sdl2ApplicationTest)

BIN
src/Magnum/Platform/Test/icon-16.tga

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
src/Magnum/Platform/Test/icon-32.tga

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
src/Magnum/Platform/Test/icon-64.tga

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

12
src/Magnum/Platform/Test/resources.conf

@ -0,0 +1,12 @@
group=icons
# Files generated from favicon.svg in magnum-website/artwork
[file]
filename=icon-16.tga
[file]
filename=icon-32.tga
[file]
filename=icon-64.tga
Loading…
Cancel
Save