diff --git a/CMakeLists.txt b/CMakeLists.txt index f7466cfa2..1e3d6673b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ include(CMakeDependentOption) # Plugins to build option(WITH_ASSIMPIMPORTER "Build AssimpImporter plugin" OFF) +option(WITH_BASISIMAGECONVERTER "Build BasisImageConverter plugin" OFF) option(WITH_BASISIMPORTER "Build BasisImporter plugin" OFF) option(WITH_DDSIMPORTER "Build DdsImporter plugin" OFF) option(WITH_DEVILIMAGEIMPORTER "Build DevIlImageImporter plugin" OFF) diff --git a/doc/building-plugins.dox b/doc/building-plugins.dox index f51600f2d..83f8763d5 100644 --- a/doc/building-plugins.dox +++ b/doc/building-plugins.dox @@ -303,6 +303,9 @@ By default no plugins are built and you need to select them manually: - `WITH_ASSIMPIMPORTER` --- Build the @ref Trade::AssimpImporter "AssimpImporter" plugin. Depends on [Assimp](http://assimp.org/). +- `WITH_BASISIMAGECONVERTER` --- Build the + @ref Trade::BasisImageConverter "BasisImageConverter" plugin. Depends on + [Basis Universal](https://github.com/binomialLLC/basis_universal). - `WITH_BASISIMPORTER` --- Build the @ref Trade::BasisImporter "BasisImporter" plugin. Depends on [Basis Universal](https://github.com/binomialLLC/basis_universal) --- if you are on Vcpkg, it will "just work", otherwise you need to diff --git a/doc/changelog-plugins.dox b/doc/changelog-plugins.dox index 10cb99716..5c79f1cf7 100644 --- a/doc/changelog-plugins.dox +++ b/doc/changelog-plugins.dox @@ -39,6 +39,8 @@ namespace Magnum { - New @ref Trade::BasisImporter "BasisImporter" plugin for importing Basis files (see [mosra/magnum-plugins#62](https://github.com/mosra/magnum-plugins/pull/62)); support for Basis-encoded textures in @ref Trade::TinyGltfImporter "TinyGltfImporter" +- New @ref Trade::BasisImageConverter "BasisImageConverter" plugin for writing + Basis files (see [mosra/magnum-plugins#65](https://github.com/mosra/magnum-plugins/pull/65)) @subsection changelog-plugins-latest-changes Changes and improvements diff --git a/doc/cmake-plugins.dox b/doc/cmake-plugins.dox index 6be3192fd..237d1f92c 100644 --- a/doc/cmake-plugins.dox +++ b/doc/cmake-plugins.dox @@ -72,6 +72,7 @@ This command tries to find Magnum plugins and then defines: This command will not try to find any actual plugin. The plugins are: - `AssimpImporter` --- @ref Trade::AssimpImporter "AssimpImporter" plugin +- `BasisImageConverter` --- @ref Trade::BasisImageConverter "BasisImageConverter" plugin - `BasisImporter` --- @ref Trade::BasisImporter "BasisImporter" plugin - `DdsImporter` --- @ref Trade::DdsImporter "DdsImporter" plugin - `DevIlImageImporter` --- @ref Trade::DevIlImageImporter "DevIlImageImporter" diff --git a/doc/credits.dox b/doc/credits.dox index edc8eb306..bdca87469 100644 --- a/doc/credits.dox +++ b/doc/credits.dox @@ -47,6 +47,7 @@ namespace Magnum { fixes for @ref Trade::AssimpImporter "AssimpImporter" workarounds and bugs - **Jonathan Hale** ([\@Squareys](https://github.com/Squareys)) --- @ref Trade::AssimpImporter "AssimpImporter", + @ref Trade::BasisImageConverter "BasisImageConverter", @ref Trade::BasisImporter "BasisImporter", @ref Trade::DdsImporter "DdsImporter" and @ref Audio::StbVorbisImporter "StbVorbisAudioImporter" plugins, diff --git a/doc/namespaces.dox b/doc/namespaces.dox index 32e875375..8cf5d4f37 100644 --- a/doc/namespaces.dox +++ b/doc/namespaces.dox @@ -29,6 +29,9 @@ /** @dir MagnumPlugins/AssimpImporter * @brief Plugin @ref Magnum::Trade::AssimpImporter */ +/** @dir MagnumPlugins/BasisImageConverter + * @brief Plugin @ref Magnum::Trade::BasisImageConverter + */ /** @dir MagnumPlugins/BasisImporter * @brief Plugin @ref Magnum::Trade::BasisImporter */ diff --git a/modules/FindMagnumPlugins.cmake b/modules/FindMagnumPlugins.cmake index 6f674bc91..1cd74024d 100644 --- a/modules/FindMagnumPlugins.cmake +++ b/modules/FindMagnumPlugins.cmake @@ -13,6 +13,7 @@ # This command will not try to find any actual plugin. The plugins are: # # AssimpImporter - Assimp importer +# BasisImageConverter - Basis image converter # BasisImporter - Basis importer # DdsImporter - DDS importer # DevIlImageImporter - Image importer using DevIL @@ -123,7 +124,7 @@ mark_as_advanced(MAGNUMPLUGINS_INCLUDE_DIR) # components from other repositories) set(_MAGNUMPLUGINS_LIBRARY_COMPONENT_LIST OpenDdl) set(_MAGNUMPLUGINS_PLUGIN_COMPONENT_LIST - AssimpImporter BasisImporter DdsImporter DevIlImageImporter + AssimpImporter BasisImageConverter BasisImporter DdsImporter DevIlImageImporter DrFlacAudioImporter DrMp3AudioImporter DrWavAudioImporter Faad2AudioImporter FreeTypeFont HarfBuzzFont JpegImageConverter JpegImporter MiniExrImageConverter OpenGexImporter PngImageConverter PngImporter @@ -273,6 +274,12 @@ foreach(_component ${MagnumPlugins_FIND_COMPONENTS}) set_property(TARGET MagnumPlugins::${_component} APPEND PROPERTY INTERFACE_LINK_LIBRARIES Assimp::Assimp) + # BasisImageConverter plugin dependencies + if(_component STREQUAL BasisImageConverter) + find_package(BasisUniversal COMPONENTS Encoder) + set_property(TARGET MagnumPlugins::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES BasisUniversal::Encoder) + # BasisImporter has only compiled-in dependencies, except in case of # vcpkg, then we need to link to a library. Use a similar logic as in # FindBasisUniversal, so in case an user wants to disable this, they diff --git a/package/archlinux/PKGBUILD b/package/archlinux/PKGBUILD index ff68992c5..ee002c067 100644 --- a/package/archlinux/PKGBUILD +++ b/package/archlinux/PKGBUILD @@ -24,6 +24,7 @@ build() { -DBUILD_TESTS=ON \ -DBUILD_GL_TESTS=ON \ -DWITH_ASSIMPIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=ON \ -DWITH_BASISIMPORTER=ON \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=ON \ diff --git a/package/archlinux/PKGBUILD-android-arm64 b/package/archlinux/PKGBUILD-android-arm64 index 255e44866..d3e729052 100644 --- a/package/archlinux/PKGBUILD-android-arm64 +++ b/package/archlinux/PKGBUILD-android-arm64 @@ -35,6 +35,7 @@ build() { -DMAGNUM_INCLUDE_INSTALL_PREFIX=/opt/android-ndk/sysroot/usr \ -DWITH_ASSIMPIMPORTER=OFF \ -DWITH_BASISIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=ON \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=OFF \ -DWITH_DRFLACAUDIOIMPORTER=OFF \ diff --git a/package/archlinux/PKGBUILD-clang b/package/archlinux/PKGBUILD-clang index 4ea6dd048..45f8cb082 100644 --- a/package/archlinux/PKGBUILD-clang +++ b/package/archlinux/PKGBUILD-clang @@ -37,6 +37,7 @@ build() { -DBUILD_GL_TESTS=ON \ -DWITH_ASSIMPIMPORTER=ON \ -DWITH_BASISIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=ON \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=ON \ -DWITH_DRFLACAUDIOIMPORTER=ON \ diff --git a/package/archlinux/PKGBUILD-clang-addesssanitizer b/package/archlinux/PKGBUILD-clang-addesssanitizer index 208b9a32b..3f831e1da 100644 --- a/package/archlinux/PKGBUILD-clang-addesssanitizer +++ b/package/archlinux/PKGBUILD-clang-addesssanitizer @@ -27,6 +27,7 @@ build() { -DBUILD_GL_TESTS=ON \ -DWITH_ASSIMPIMPORTER=ON \ -DWITH_BASISIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=ON \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=ON \ -DWITH_DRFLACAUDIOIMPORTER=ON \ diff --git a/package/archlinux/PKGBUILD-coverage b/package/archlinux/PKGBUILD-coverage index a98ceb4ca..9d291c509 100644 --- a/package/archlinux/PKGBUILD-coverage +++ b/package/archlinux/PKGBUILD-coverage @@ -30,6 +30,7 @@ build() { -DBUILD_GL_TESTS=ON \ -DWITH_ASSIMPIMPORTER=ON \ -DWITH_BASISIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=ON \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=ON \ -DWITH_DRFLACAUDIOIMPORTER=ON \ diff --git a/package/archlinux/PKGBUILD-emscripten b/package/archlinux/PKGBUILD-emscripten index 64d47e745..29a9475d9 100644 --- a/package/archlinux/PKGBUILD-emscripten +++ b/package/archlinux/PKGBUILD-emscripten @@ -26,6 +26,7 @@ build() { # For Basis disabling everything we don't support in Magnum + BC7 as its # tables are YUUUGE (see the Basis README for details) + # WITH_BASISIMAGECONVERTER is disabled as it requires pthreads. cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/lib/emscripten/system \ @@ -33,6 +34,7 @@ build() { -DBASIS_UNIVERSAL_DIR=/opt/basis-universal \ -DWITH_ASSIMPIMPORTER=OFF \ -DWITH_BASISIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=OFF \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=OFF \ -DWITH_DRFLACAUDIOIMPORTER=ON \ diff --git a/package/archlinux/PKGBUILD-emscripten-wasm b/package/archlinux/PKGBUILD-emscripten-wasm index 076c7dd51..05e09f58b 100644 --- a/package/archlinux/PKGBUILD-emscripten-wasm +++ b/package/archlinux/PKGBUILD-emscripten-wasm @@ -26,12 +26,14 @@ build() { # For Basis disabling everything we don't support in Magnum + BC7 as its # tables are YUUUGE (see the Basis README for details) + # WITH_BASISIMAGECONVERTER is disabled as it requires pthreads. cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/lib/emscripten/system \ -DCMAKE_CXX_FLAGS="-DBASISD_SUPPORT_BC7=0 -DBASISD_SUPPORT_ATC=0 -DBASISD_SUPPORT_FXT1=0 -DBASISD_SUPPORT_PVRTC2=0" \ -DBASIS_UNIVERSAL_DIR=/opt/basis-universal \ -DWITH_BASISIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=OFF \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=OFF \ -DWITH_DRFLACAUDIOIMPORTER=ON \ diff --git a/package/archlinux/PKGBUILD-emscripten-wasm-webgl2 b/package/archlinux/PKGBUILD-emscripten-wasm-webgl2 index b209ea2fc..7dd931796 100644 --- a/package/archlinux/PKGBUILD-emscripten-wasm-webgl2 +++ b/package/archlinux/PKGBUILD-emscripten-wasm-webgl2 @@ -26,12 +26,14 @@ build() { # For Basis disabling everything we don't support in Magnum + BC7 as its # tables are YUUUGE (see the Basis README for details) + # WITH_BASISIMAGECONVERTER is disabled as it requires pthreads. cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/lib/emscripten/system \ -DCMAKE_CXX_FLAGS="-DBASISD_SUPPORT_BC7=0 -DBASISD_SUPPORT_ATC=0 -DBASISD_SUPPORT_FXT1=0 -DBASISD_SUPPORT_PVRTC2=0" \ -DBASIS_UNIVERSAL_DIR=/home/mosra/Code/basis_universal \ -DWITH_BASISIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=OFF \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=OFF \ -DWITH_DRFLACAUDIOIMPORTER=ON \ diff --git a/package/archlinux/PKGBUILD-gcc48 b/package/archlinux/PKGBUILD-gcc48 index a7240c3ac..393109420 100644 --- a/package/archlinux/PKGBUILD-gcc48 +++ b/package/archlinux/PKGBUILD-gcc48 @@ -37,6 +37,7 @@ build() { -DBUILD_GL_TESTS=ON \ -DWITH_ASSIMPIMPORTER=ON \ -DWITH_BASISIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=ON \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=ON \ -DWITH_DRFLACAUDIOIMPORTER=ON \ diff --git a/package/archlinux/PKGBUILD-mingw-w64 b/package/archlinux/PKGBUILD-mingw-w64 index b880a1f10..1f30bbd44 100644 --- a/package/archlinux/PKGBUILD-mingw-w64 +++ b/package/archlinux/PKGBUILD-mingw-w64 @@ -23,6 +23,7 @@ build() { -DBASIS_UNIVERSAL_DIR=/opt/basis-universal \ -DWITH_ASSIMPIMPORTER=ON \ -DWITH_BASISIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=OFF \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=OFF \ -DWITH_DRFLACAUDIOIMPORTER=ON \ @@ -50,12 +51,15 @@ build() { mkdir -p "$_rootdir/build-mingw-w64-64" cd "$_rootdir/build-mingw-w64-64" + # WITH_BASISIMAGECONVERTER is disabled, since Basis Universal currently does not + # support building on MinGW. cmake .. \ -DCMAKE_TOOLCHAIN_FILE=../toolchains/archlinux/basic-mingw-w64-64.cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 \ -DBASIS_UNIVERSAL_DIR=/opt/basis-universal \ -DWITH_ASSIMPIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=OFF \ -DWITH_BASISIMPORTER=ON \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=OFF \ diff --git a/package/archlinux/PKGBUILD-release b/package/archlinux/PKGBUILD-release index 90536daec..23f9efb09 100644 --- a/package/archlinux/PKGBUILD-release +++ b/package/archlinux/PKGBUILD-release @@ -25,6 +25,7 @@ build() { -DBUILD_GL_TESTS=ON \ -DWITH_ASSIMPIMPORTER=ON \ -DWITH_BASISIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=ON \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=ON \ -DWITH_DRFLACAUDIOIMPORTER=ON \ diff --git a/package/archlinux/magnum-plugins-git/PKGBUILD b/package/archlinux/magnum-plugins-git/PKGBUILD index 71407fe35..5b11ca35e 100644 --- a/package/archlinux/magnum-plugins-git/PKGBUILD +++ b/package/archlinux/magnum-plugins-git/PKGBUILD @@ -26,6 +26,7 @@ build() { -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr \ -DWITH_ASSIMPIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=ON \ -DWITH_BASISIMPORTER=OFF \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=ON \ diff --git a/package/archlinux/magnum-plugins/PKGBUILD b/package/archlinux/magnum-plugins/PKGBUILD index 738467491..4208fe400 100644 --- a/package/archlinux/magnum-plugins/PKGBUILD +++ b/package/archlinux/magnum-plugins/PKGBUILD @@ -20,6 +20,7 @@ build() { -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr \ -DWITH_ASSIMPIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=ON \ -DWITH_BASISIMPORTER=OFF \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=ON \ diff --git a/package/ci/appveyor-desktop-mingw.bat b/package/ci/appveyor-desktop-mingw.bat index afae55547..d1dee5b17 100644 --- a/package/ci/appveyor-desktop-mingw.bat +++ b/package/ci/appveyor-desktop-mingw.bat @@ -60,6 +60,8 @@ cd .. && cd .. rem Build. BUILD_GL_TESTS is enabled just to be sure, it should not be needed rem by any plugin. +rem WITH_BASISIMAGECONVERTER is disabled, since Basis Universal currently does not +rem support building on MinGW. mkdir build && cd build || exit /b cmake .. ^ -DCMAKE_CXX_FLAGS="--coverage" ^ @@ -67,6 +69,7 @@ cmake .. ^ -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ -DCMAKE_PREFIX_PATH=%APPVEYOR_BUILD_FOLDER%/openal;%APPVEYOR_BUILD_FOLDER%/devil ^ -DWITH_ASSIMPIMPORTER=OFF ^ + -DWITH_BASISIMAGECONVERTER=OFF ^ -DWITH_BASISIMPORTER=ON -DBASIS_UNIVERSAL_DIR=%APPVEYOR_BUILD_FOLDER%/basis_universal ^ -DWITH_DDSIMPORTER=ON ^ -DWITH_DEVILIMAGEIMPORTER=ON ^ diff --git a/package/ci/appveyor-desktop.bat b/package/ci/appveyor-desktop.bat index 5088c394c..97ccc87ed 100644 --- a/package/ci/appveyor-desktop.bat +++ b/package/ci/appveyor-desktop.bat @@ -69,6 +69,7 @@ cmake .. ^ -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%/deps ^ -DCMAKE_PREFIX_PATH=%APPVEYOR_BUILD_FOLDER%/openal;%APPVEYOR_BUILD_FOLDER%/devil;C:/Tools/vcpkg/installed/x64-windows ^ -DWITH_ASSIMPIMPORTER=OFF ^ + -DWITH_BASISIMAGECONVERTER=ON ^ -DWITH_BASISIMPORTER=ON -DBASIS_UNIVERSAL_DIR=%APPVEYOR_BUILD_FOLDER%/basis_universal ^ -DWITH_DDSIMPORTER=ON ^ -DWITH_DEVILIMAGEIMPORTER=ON ^ diff --git a/package/ci/appveyor-rt.bat b/package/ci/appveyor-rt.bat index 18928fe86..cd11a9cf9 100644 --- a/package/ci/appveyor-rt.bat +++ b/package/ci/appveyor-rt.bat @@ -65,6 +65,7 @@ cmake .. ^ -DCMAKE_SYSTEM_VERSION=10.0 ^ -DCMAKE_PREFIX_PATH=%APPVEYOR_BUILD_FOLDER%/deps ^ -DWITH_ASSIMPIMPORTER=OFF ^ + -DWITH_BASISIMAGECONVERTER=ON ^ -DWITH_BASISIMPORTER=ON -DBASIS_UNIVERSAL_DIR=%APPVEYOR_BUILD_FOLDER%/basis_universal ^ -DWITH_DDSIMPORTER=ON ^ -DWITH_DEVILIMAGEIMPORTER=OFF ^ diff --git a/package/ci/travis-android-arm.sh b/package/ci/travis-android-arm.sh index a9c4ccd1f..36fc75841 100755 --- a/package/ci/travis-android-arm.sh +++ b/package/ci/travis-android-arm.sh @@ -79,6 +79,7 @@ cmake .. \ -DCMAKE_PREFIX_PATH=$HOME/deps \ -DCMAKE_FIND_ROOT_PATH=$HOME/deps \ -DWITH_ASSIMPIMPORTER=OFF \ + -DWITH_BASISIMAGECONVERTER=ON \ -DWITH_BASISIMPORTER=ON -DBASIS_UNIVERSAL_DIR=$HOME/basis_universal \ -DWITH_DDSIMPORTER=ON \ -DWITH_DRFLACAUDIOIMPORTER=OFF \ diff --git a/package/ci/travis-desktop.sh b/package/ci/travis-desktop.sh index 30efad08d..52267aa80 100755 --- a/package/ci/travis-desktop.sh +++ b/package/ci/travis-desktop.sh @@ -47,6 +47,7 @@ cmake .. \ -DCMAKE_INSTALL_RPATH=$HOME/deps/lib \ -DCMAKE_BUILD_TYPE=Debug \ -DWITH_ASSIMPIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=ON \ -DWITH_BASISIMPORTER=ON -DBASIS_UNIVERSAL_DIR=$HOME/basis_universal \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=ON \ diff --git a/package/ci/travis-emscripten.sh b/package/ci/travis-emscripten.sh index 3081b6677..326429559 100755 --- a/package/ci/travis-emscripten.sh +++ b/package/ci/travis-emscripten.sh @@ -74,6 +74,7 @@ cd .. # Crosscompile. BUILD_GL_TESTS is enabled just to be sure, it should not be # needed by any plugin. +# WITH_BASISIMAGECONVERTER is disabled as it requires pthreads. mkdir build-emscripten && cd build-emscripten cmake .. \ -DCORRADE_RC_EXECUTABLE=$HOME/deps-native/bin/corrade-rc \ @@ -85,6 +86,7 @@ cmake .. \ -DCMAKE_INSTALL_PREFIX=$HOME/deps \ -DCMAKE_FIND_ROOT_PATH=$HOME/deps \ -DWITH_ASSIMPIMPORTER=OFF \ + -DWITH_BASISIMAGECONVERTER=OFF \ -DWITH_BASISIMPORTER=ON -DBASIS_UNIVERSAL_DIR=$HOME/basis_universal \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=OFF \ diff --git a/package/ci/travis-ios-simulator.sh b/package/ci/travis-ios-simulator.sh index 896af369f..591267813 100755 --- a/package/ci/travis-ios-simulator.sh +++ b/package/ci/travis-ios-simulator.sh @@ -70,6 +70,7 @@ cmake .. \ -DCORRADE_RC_EXECUTABLE=$HOME/deps-native/bin/corrade-rc \ -DCMAKE_INSTALL_PREFIX=$HOME/deps \ -DWITH_ASSIMPIMPORTER=OFF \ + -DWITH_BASISIMAGECONVERTER=ON \ -DWITH_BASISIMPORTER=ON -DBASIS_UNIVERSAL_DIR=$HOME/basis_universal \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=OFF \ diff --git a/package/debian/rules b/package/debian/rules index a5d297f3c..7583e9855 100755 --- a/package/debian/rules +++ b/package/debian/rules @@ -16,6 +16,7 @@ override_dh_auto_configure: dh_auto_configure -- \ -DCMAKE_BUILD_TYPE=Release \ -DWITH_ASSIMPIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=OFF \ -DWITH_BASISIMPORTER=OFF \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=ON \ diff --git a/package/gentoo/dev-libs/magnum-plugins/magnum-plugins-9999.ebuild b/package/gentoo/dev-libs/magnum-plugins/magnum-plugins-9999.ebuild index d1df9946f..60786ec47 100644 --- a/package/gentoo/dev-libs/magnum-plugins/magnum-plugins-9999.ebuild +++ b/package/gentoo/dev-libs/magnum-plugins/magnum-plugins-9999.ebuild @@ -30,6 +30,7 @@ src_configure() { -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr" -DCMAKE_BUILD_TYPE=Release -DWITH_ASSIMPIMPORTER=ON + -DWITH_BASISIMAGECONVERTER=OFF -DWITH_BASISIMPORTER=OFF -DWITH_DDSIMPORTER=ON -DWITH_DEVILIMAGEIMPORTER=ON diff --git a/package/homebrew/magnum-plugins.rb b/package/homebrew/magnum-plugins.rb index 7a0d756db..371028732 100644 --- a/package/homebrew/magnum-plugins.rb +++ b/package/homebrew/magnum-plugins.rb @@ -19,7 +19,7 @@ class MagnumPlugins < Formula def install system "mkdir build" cd "build" do - system "cmake", "-DCMAKE_BUILD_TYPE=Release", "-DCMAKE_INSTALL_PREFIX=#{prefix}", "-DWITH_ASSIMPIMPORTER=ON", "-DWITH_BASISIMPORTER=OFF", "-DWITH_DDSIMPORTER=ON", "-DWITH_DEVILIMAGEIMPORTER=ON", "-DWITH_DRFLACAUDIOIMPORTER=ON", "-DWITH_DRMP3AUDIOIMPORTER=ON", "-DWITH_DRWAVAUDIOIMPORTER=ON", "-DWITH_FAAD2AUDIOIMPORTER=ON", "-DWITH_FREETYPEFONT=ON", "-DWITH_HARFBUZZFONT=ON", "-DWITH_JPEGIMAGECONVERTER=ON", "-DWITH_JPEGIMPORTER=ON", "-DWITH_MINIEXRIMAGECONVERTER=ON", "-DWITH_OPENGEXIMPORTER=ON", "-DWITH_PNGIMAGECONVERTER=ON", "-DWITH_PNGIMPORTER=ON", "-DWITH_STANFORDIMPORTER=ON", "-DWITH_STBIMAGECONVERTER=ON", "-DWITH_STBIMAGEIMPORTER=ON", "-DWITH_STBTRUETYPEFONT=ON", "-DWITH_STBVORBISAUDIOIMPORTER=ON", "-DWITH_TINYGLTFIMPORTER=ON", ".." + system "cmake", "-DCMAKE_BUILD_TYPE=Release", "-DCMAKE_INSTALL_PREFIX=#{prefix}", "-DWITH_ASSIMPIMPORTER=ON", "-DWITH_BASISIMAGECONVERTER=OFF", "-DWITH_BASISIMPORTER=OFF", "-DWITH_DDSIMPORTER=ON", "-DWITH_DEVILIMAGEIMPORTER=ON", "-DWITH_DRFLACAUDIOIMPORTER=ON", "-DWITH_DRMP3AUDIOIMPORTER=ON", "-DWITH_DRWAVAUDIOIMPORTER=ON", "-DWITH_FAAD2AUDIOIMPORTER=ON", "-DWITH_FREETYPEFONT=ON", "-DWITH_HARFBUZZFONT=ON", "-DWITH_JPEGIMAGECONVERTER=ON", "-DWITH_JPEGIMPORTER=ON", "-DWITH_MINIEXRIMAGECONVERTER=ON", "-DWITH_OPENGEXIMPORTER=ON", "-DWITH_PNGIMAGECONVERTER=ON", "-DWITH_PNGIMPORTER=ON", "-DWITH_STANFORDIMPORTER=ON", "-DWITH_STBIMAGECONVERTER=ON", "-DWITH_STBIMAGEIMPORTER=ON", "-DWITH_STBTRUETYPEFONT=ON", "-DWITH_STBVORBISAUDIOIMPORTER=ON", "-DWITH_TINYGLTFIMPORTER=ON", ".." system "cmake", "--build", "." system "cmake", "--build", ".", "--target", "install" end diff --git a/package/msys/PKGBUILD b/package/msys/PKGBUILD index f3dd7efa3..9a6c231fc 100644 --- a/package/msys/PKGBUILD +++ b/package/msys/PKGBUILD @@ -34,6 +34,7 @@ build() { -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \ -DWITH_ASSIMPIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=OFF \ -DWITH_BASISIMPORTER=OFF \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=ON \ diff --git a/package/msys/magnum-plugins/PKGBUILD b/package/msys/magnum-plugins/PKGBUILD index e0ddbed3d..60e3cfe66 100644 --- a/package/msys/magnum-plugins/PKGBUILD +++ b/package/msys/magnum-plugins/PKGBUILD @@ -42,6 +42,7 @@ build() { -G'Ninja' \ -DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \ -DWITH_ASSIMPIMPORTER=ON \ + -DWITH_BASISIMAGECONVERTER=OFF \ -DWITH_BASISIMPORTER=OFF \ -DWITH_DDSIMPORTER=ON \ -DWITH_DEVILIMAGEIMPORTER=ON \ diff --git a/src/MagnumPlugins/BasisImageConverter/BasisImageConverter.conf b/src/MagnumPlugins/BasisImageConverter/BasisImageConverter.conf new file mode 100644 index 000000000..6efb578a9 --- /dev/null +++ b/src/MagnumPlugins/BasisImageConverter/BasisImageConverter.conf @@ -0,0 +1,45 @@ +# [configuration] +[configuration] +threads=1 + +compression_level=1 + +y_flip=true +debug=false +enable_debug_printf=false +debug_images=false +global_sel_pal=false +no_auto_global_sel_pal=false +# sRGB images should be compressed with perceptual enabled, turn this flag off +# for linear images. +perceptual=true +no_endpoint_rdo=false +no_selector_rdo=false +read_source_images=false +write_output_basis_files=false +compute_stats=false +check_for_alpha=true +force_alpha=false +seperate_rg_to_color_alpha=false +disable_hierarchical_endpoint_codebooks=false + +hybrid_sel_cb_quality_thresh=2.0 + +global_pal_bits=8 +global_mod_bits=8 + +endpoint_rdo_thresh=1.5 +selector_rdo_thresh=1.25 + +mip_gen=false +mip_renormalize=false +mip_wrapping=true +mip_srgb=false +mip_scale=1.0 +mip_smallest_dimension=0 +mip_filter=kaiser + +max_endpoint_clusters=512 +max_selector_clusters=512 +quality_level=-1 +# [configuration] diff --git a/src/MagnumPlugins/BasisImageConverter/BasisImageConverter.cpp b/src/MagnumPlugins/BasisImageConverter/BasisImageConverter.cpp new file mode 100644 index 000000000..62d130853 --- /dev/null +++ b/src/MagnumPlugins/BasisImageConverter/BasisImageConverter.cpp @@ -0,0 +1,263 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 + Vladimír Vondruš + Copyright © 2019 Jonathan Hale + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include "BasisImageConverter.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +namespace Magnum { namespace Trade { + +BasisImageConverter::BasisImageConverter() = default; + +BasisImageConverter::BasisImageConverter(PluginManager::AbstractManager& manager, const std::string& plugin): AbstractImageConverter{manager, plugin} {} + +auto BasisImageConverter::doFeatures() const -> Features { return Feature::ConvertData; } + +Containers::Array BasisImageConverter::doExportToData(const ImageView2D& image) { + /* Check input */ + if(image.format() != PixelFormat::RGB8Unorm + && image.format() != PixelFormat::RGBA8Unorm + && image.format() != PixelFormat::RG8Unorm + && image.format() != PixelFormat::R8Unorm) { + Error() << "Trade::BasisImageConverter::exportToData(): unsupported format" << image.format(); + return {}; + } + + /* Magnum specific configuration */ + UnsignedInt threadCount = configuration().value("threads"); + if(threadCount == 0) { + threadCount = std::thread::hardware_concurrency(); + } + + basisu::basis_compressor_params params; + + const bool multithreading = threadCount > 1; + params.m_multithreading = multithreading; + basisu::job_pool jpool(threadCount); + params.m_pJob_pool = &jpool; + + #define PARAM_CONFIG(name, type) params.m_##name = configuration().value(#name) + PARAM_CONFIG(compression_level, int); + + PARAM_CONFIG(y_flip, bool); + PARAM_CONFIG(debug, bool); + PARAM_CONFIG(debug_images, bool); + PARAM_CONFIG(perceptual, bool); + PARAM_CONFIG(no_endpoint_rdo, bool); + PARAM_CONFIG(no_selector_rdo, bool); + PARAM_CONFIG(read_source_images, bool); + PARAM_CONFIG(write_output_basis_files, bool); + PARAM_CONFIG(compute_stats, bool); + PARAM_CONFIG(check_for_alpha, bool); + PARAM_CONFIG(force_alpha, bool); + PARAM_CONFIG(seperate_rg_to_color_alpha, bool); + PARAM_CONFIG(disable_hierarchical_endpoint_codebooks, bool); + + PARAM_CONFIG(hybrid_sel_cb_quality_thresh, float); + + PARAM_CONFIG(global_pal_bits, int); + PARAM_CONFIG(global_mod_bits, int); + + PARAM_CONFIG(endpoint_rdo_thresh, float); + PARAM_CONFIG(selector_rdo_thresh, float); + + PARAM_CONFIG(mip_gen, bool); + PARAM_CONFIG(mip_renormalize, bool); + PARAM_CONFIG(mip_wrapping, bool); + PARAM_CONFIG(mip_srgb, bool); + PARAM_CONFIG(mip_scale, float); + PARAM_CONFIG(mip_smallest_dimension, int); + PARAM_CONFIG(mip_filter, std::string); + + PARAM_CONFIG(max_endpoint_clusters, int); + PARAM_CONFIG(max_selector_clusters, int); + PARAM_CONFIG(quality_level, int); + #undef PARAM_CONFIG + + basist::etc1_global_selector_codebook sel_codebook(basist::g_global_selector_cb_size, basist::g_global_selector_cb); + params.m_pSel_codebook = &sel_codebook; + + /* Enable verbose debug output in basis to get reasons for failures */ + basisu::enable_debug_printf(configuration().value("enable_debug_printf")); + + if(image.size().x() <= 0 || image.size().y() <= 0) { + Error() << "Trade::BasisImageConverter::exportToData(): source image is empty"; + return {}; + } + + if(!image.data()) { + Error() << "Trade::BasisImageConverter::exportToData(): source image data is nullptr"; + return {}; + } + + /* Copy image data into the basis image. There is no way to construct a + basis image from existing data as it is based on a std::vector */ + params.m_source_images.emplace_back(image.size().x(), image.size().y()); + + /* Get data properties and calculate the initial slice based on subimage + offset */ + const std::pair, Math::Vector2> dataProperties = + image.dataProperties(); + Containers::ArrayView inputData = image.data().suffix( + dataProperties.first.sum()); + + basisu::image& basisImage = params.m_source_images.back(); + + /* Do Y-flip and tight packing of image data */ + const std::size_t rowSize = image.size().x()*image.pixelSize(); + const std::size_t rowStride = dataProperties.second.x(); + const std::size_t packedDataSize = rowSize*image.size().y(); + + /* basis image is always RGBA, fill in alpha if necessary */ + if (image.format() == PixelFormat::RGB8Unorm) { + const std::size_t width = image.size().x(); + const std::size_t height = image.size().y(); + + auto basisView = Containers::arrayCast( + Containers::arrayView(basisImage.get_ptr(), width*height)); + for(Int y = 0; y < height; ++y) { + const auto src = image.pixels()[height - y -1]; + + Color4ub* destPixel = basisView.suffix(y*width).begin(); + for(const Color3ub& pixel: src) { + *(destPixel++) = pixel; + } + } + + } else if(image.format() == PixelFormat::RG8Unorm) { + const std::size_t width = image.size().x(); + const std::size_t height = image.size().y(); + + auto basisView = Containers::arrayCast( + Containers::arrayView(basisImage.get_ptr(), width*height)); + for(Int y = 0; y < height; ++y) { + const auto src = Containers::arrayCast>(inputData + .suffix((height - y - 1)*rowStride).prefix(rowSize)); + + Color4ub* destPixel = basisView.suffix(y*width).begin(); + for(const Math::Vector2 pixel: src) { + destPixel->rgb() = Color3ub{pixel.x()}; + destPixel->a() = pixel.y(); + destPixel++; + } + } + } else if(image.format() == PixelFormat::R8Unorm) { + const std::size_t width = image.size().x(); + const std::size_t height = image.size().y(); + + auto basisView = Containers::arrayCast( + Containers::arrayView(basisImage.get_ptr(), width*height)); + for(Int y = 0; y < height; ++y) { + const auto src = Containers::arrayCast(inputData + .suffix((height - y - 1)*rowStride).prefix(rowSize)); + + Color4ub* destPixel = basisView.suffix(y*width).begin(); + for(const UnsignedByte pixel: src) { + (destPixel++)->rgb() = Color3ub{pixel}; + } + } + } else { + CORRADE_INTERNAL_ASSERT(image.format() == PixelFormat::RGBA8Unorm); + + const std::size_t width = image.size().x(); + const std::size_t height = image.size().y(); + + auto basisView = Containers::arrayCast( + Containers::arrayView(basisImage.get_ptr(), width*height)); + ; + for(Int y = 0; y < height; ++y) { + auto basisRow = basisView.suffix(y*width).begin(); + auto row = image.pixels()[height - y - 1]; + for(int x = 0; x < width; ++x) { + basisRow[x] = row[x]; + } + } + } + + basisu::basis_compressor basis; + basis.init(params); + + basisu::basis_compressor::error_code errorCode = basis.process(); + switch(errorCode) { + case basisu::basis_compressor::error_code::cECSuccess: + break; + case basisu::basis_compressor::error_code::cECFailedReadingSourceImages: + /* Emitted e.g. when source image is 0-size */ + Error{} << "Trade::BasisImageConverter::exportToData(): source image is invalid"; + return {}; + case basisu::basis_compressor::error_code::cECFailedValidating: + /* process() will have printed additional error information to stderr */ + Error{} << "Trade::BasisImageConverter::exportToData(): type constraint validation failed"; + return {}; + case basisu::basis_compressor::error_code::cECFailedFrontEnd: + /* process() will have printed additional error information to stderr */ + Error{} << "Trade::BasisImageConverter::exportToData(): frontend processing failed"; + return {}; + case basisu::basis_compressor::error_code::cECFailedBackend: + Error{} << "Trade::BasisImageConverter::exportToData(): encoding failed"; + return {}; + case basisu::basis_compressor::error_code::cECFailedCreateBasisFile: + /* process() will have printed additional error information to stderr */ + Error{} << "Trade::BasisImageConverter::exportToData(): assembling basis file data or transcoding failed"; + return {}; + + /* LCOV_EXCL_START */ + case basisu::basis_compressor::error_code::cECFailedFontendExtract: + /* This error will actually never be raised from basis_universal code */ + case basisu::basis_compressor::error_code::cECFailedWritingOutput: + /* We do not write any files, just data */ + default: + CORRADE_ASSERT_UNREACHABLE(); + return {}; + /* LCOV_EXCL_STOP */ + } + + const basisu::uint8_vec& out = basis.get_output_basis_file(); + + Containers::Array fileData{Containers::DefaultInit, out.size()}; + std::copy(out.begin(), out.end(), fileData.data()); + + return fileData; +} + +}} + +CORRADE_PLUGIN_REGISTER(BasisImageConverter, Magnum::Trade::BasisImageConverter, + "cz.mosra.magnum.Trade.AbstractImageConverter/0.2.1") diff --git a/src/MagnumPlugins/BasisImageConverter/BasisImageConverter.h b/src/MagnumPlugins/BasisImageConverter/BasisImageConverter.h new file mode 100644 index 000000000..45eabcaf5 --- /dev/null +++ b/src/MagnumPlugins/BasisImageConverter/BasisImageConverter.h @@ -0,0 +1,114 @@ +#ifndef Magnum_Trade_BasisImageConverter_h +#define Magnum_Trade_BasisImageConverter_h +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 + Vladimír Vondruš + Copyright © 2019 Jonathan Hale + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +/** @file + * @brief Class @ref Magnum::Trade::BasisImageConverter + */ + +#include + +#include "MagnumPlugins/BasisImageConverter/configure.h" + +#ifndef DOXYGEN_GENERATING_OUTPUT +#ifndef MAGNUM_BASISIMAGECONVERTER_BUILD_STATIC + #ifdef BasisImageConverter_EXPORTS + #define MAGNUM_BASISIMAGECONVERTER_EXPORT CORRADE_VISIBILITY_EXPORT + #else + #define MAGNUM_BASISIMAGECONVERTER_EXPORT CORRADE_VISIBILITY_IMPORT + #endif +#else + #define MAGNUM_BASISIMAGECONVERTER_EXPORT CORRADE_VISIBILITY_STATIC +#endif +#define MAGNUM_BASISIMAGECONVERTER_LOCAL CORRADE_VISIBILITY_LOCAL +#else +#define MAGNUM_BASISIMAGECONVERTER_EXPORT +#define MAGNUM_BASISIMAGECONVERTER_LOCAL +#endif + +namespace Magnum { namespace Trade { + +/** +@brief BASIS image converter plugin + +Creates [Basis Universal](https://github.com/binomialLLC/basis_universal) +(`*.basis`) files from images with format @ref PixelFormat::R8Unorm, +@ref PixelFormat::RG8Unorm, @ref PixelFormat::RGB8Unorm or +@ref PixelFormat::RGBA8Unorm. + +This plugin depends on the @ref Trade and [Basis Universal](https://github.com/binomialLLC/basis_universal) +and is built if `WITH_BASISIMAGECONVERTER` is enabled when building Magnum +Plugins. To use as a dynamic plugin, you need to load the +@cpp "BasisImageConverter" @ce plugin from `MAGNUM_PLUGINS_IMAGECONVERTER_DIR`. +To use as a static plugin or as a dependency of another plugin with CMake, you +need to request the `BasisImageConverter` component of the `MagnumPlugins` +package and link to the `MagnumPlugins::BasisImageConverter` target. See +@ref building-plugins, @ref cmake-plugins and @ref plugins for more +information. + +@section Trade-BasisImporter-configuration Plugin-specific configuration + +Basis compression can be configured to produce better quality or reduce runtime. +Configuration options expose parameters of the `basisu` tool and match their +naming. The full form of the configuration is shown below: + +@snippet MagnumPlugins/BasisImporter/BasisImporter.conf configuration + +@subsection Trade-BasisImporter-magnum-configuration Magnum-specific configuration + +The following options can be configured in addition to the ones that are +exposed `basisu` parameters. + +- `threads`: configure the number of threads basis should use during compression, `0` + defaults to the value returned by @ref std::thread::hardware_concurrency(). + +- `enable_debug_printf`: enable verbose logging in basis + +@m_class{m-block m-success} + +@thirdparty This plugin makes use of the + [Basis Universal GPU Texture Codec](https://github.com/BinomialLLC/basis_universal) + library, licensed under @m_class{m-label m-info} **Apache-2.0** + ([license text](https://opensource.org/licenses/Apache-2.0), + [choosealicense.com](https://choosealicense.com/licenses/apache-2.0/)). +*/ +class MAGNUM_BASISIMAGECONVERTER_EXPORT BasisImageConverter: public AbstractImageConverter { + public: + /** @brief Default constructor */ + explicit BasisImageConverter(); + + /** @brief Plugin manager constructor */ + explicit BasisImageConverter(PluginManager::AbstractManager& manager, const std::string& plugin); + + private: + MAGNUM_BASISIMAGECONVERTER_LOCAL Features doFeatures() const override; + MAGNUM_BASISIMAGECONVERTER_LOCAL Containers::Array doExportToData(const ImageView2D& image) override; +}; + +}} + +#endif diff --git a/src/MagnumPlugins/BasisImageConverter/CMakeLists.txt b/src/MagnumPlugins/BasisImageConverter/CMakeLists.txt new file mode 100644 index 000000000..5ecd640cb --- /dev/null +++ b/src/MagnumPlugins/BasisImageConverter/CMakeLists.txt @@ -0,0 +1,68 @@ +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 +# Vladimír Vondruš +# Copyright © 2019 Jonathan Hale +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +find_package(Magnum REQUIRED Trade) +find_package(BasisUniversal REQUIRED Encoder) + +if(BUILD_PLUGINS_STATIC) + set(MAGNUM_BASISIMAGECONVERTER_BUILD_STATIC 1) +endif() + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) + +# BasisImageConverter plugin +add_plugin(BasisImageConverter + "${MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_LIBRARY_INSTALL_DIR}" + "${MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_LIBRARY_INSTALL_DIR}" + BasisImageConverter.conf + BasisImageConverter.cpp + BasisImageConverter.h) +if(BUILD_PLUGINS_STATIC AND BUILD_STATIC_PIC) + set_target_properties(BasisImageConverter PROPERTIES POSITION_INDEPENDENT_CODE ON) +endif() +target_include_directories(BasisImageConverter + PUBLIC + ${PROJECT_SOURCE_DIR}/src + ${PROJECT_BINARY_DIR}/src) +target_link_libraries(BasisImageConverter PUBLIC Magnum::Trade BasisUniversal::Encoder + BasisUniversal::Transcoder) + +install(FILES BasisImageConverter.h ${CMAKE_CURRENT_BINARY_DIR}/configure.h + DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/BasisImageConverter) + +# Automatic static plugin import +if(BUILD_PLUGINS_STATIC) + install(FILES importStaticPlugin.cpp DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/BasisImageConverter) + target_sources(BasisImageConverter INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/importStaticPlugin.cpp) +endif() + +if(BUILD_TESTS) + add_subdirectory(Test) +endif() + +# MagnumPlugins BasisImageConverter target alias for superprojects +add_library(MagnumPlugins::BasisImageConverter ALIAS BasisImageConverter) diff --git a/src/MagnumPlugins/BasisImageConverter/Test/BasisImageConverterTest.cpp b/src/MagnumPlugins/BasisImageConverter/Test/BasisImageConverterTest.cpp new file mode 100644 index 000000000..f93dfb973 --- /dev/null +++ b/src/MagnumPlugins/BasisImageConverter/Test/BasisImageConverterTest.cpp @@ -0,0 +1,327 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 + Vladimír Vondruš + Copyright © 2019 Jonathan Hale + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "configure.h" + +namespace Magnum { namespace Trade { namespace Test { namespace { + +struct BasisImageConverterTest: TestSuite::Tester { + explicit BasisImageConverterTest(); + + void wrongFormat(); + void zeroSize(); + void emptyData(); + void processError(); + + void r(); + void rg(); + void rgb(); + void rgba(); + + /* Explicitly forbid system-wide plugin dependencies */ + PluginManager::Manager _converterManager{"nonexistent"}; + + /* Needs to load AnyImageImporter from system-wide location */ + PluginManager::Manager _manager; +}; + +BasisImageConverterTest::BasisImageConverterTest() { + addTests({&BasisImageConverterTest::wrongFormat, + &BasisImageConverterTest::zeroSize, + &BasisImageConverterTest::emptyData, + &BasisImageConverterTest::processError, + + &BasisImageConverterTest::r, + &BasisImageConverterTest::rg, + + &BasisImageConverterTest::rgb, + &BasisImageConverterTest::rgba}); + + /* Pull in the AnyImageImporter dependency for image comparison, load + StbImageImporter from the build tree, if defined. Otherwise it's static + and already loaded. */ + _manager.load("AnyImageImporter"); + #ifdef STBIMAGEIMPORTER_PLUGIN_FILENAME + _manager.setPluginDirectory({}); + CORRADE_INTERNAL_ASSERT(_manager.load(STBIMAGEIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif + /* Load the plugin directly from the build tree. Otherwise it's static and + already loaded. */ + #ifdef BASISIMAGECONVERTER_PLUGIN_FILENAME + CORRADE_INTERNAL_ASSERT(_converterManager.load(BASISIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif + #ifdef BASISIMPORTER_PLUGIN_FILENAME + _manager.setPluginDirectory({}); + CORRADE_INTERNAL_ASSERT(_manager.load(BASISIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif +} + +void BasisImageConverterTest::wrongFormat() { + Containers::Pointer converter = + _converterManager.instantiate("BasisImageConverter"); + ImageView2D image{PixelFormat::RG32F, {}, nullptr}; + + std::ostringstream out; + Error redirectError{&out}; + CORRADE_VERIFY(!converter->exportToData(image)); + CORRADE_COMPARE(out.str(), "Trade::BasisImageConverter::exportToData(): unsupported format PixelFormat::RG32F\n"); +} + +void BasisImageConverterTest::zeroSize() { + Containers::Pointer converter = + _converterManager.instantiate("BasisImageConverter"); + + std::ostringstream out; + Error redirectError{&out}; + CORRADE_VERIFY(!converter->exportToData(ImageView2D{PixelFormat::RGB8Unorm, {}, nullptr})); + CORRADE_COMPARE(out.str(), + "Trade::BasisImageConverter::exportToData(): source image is empty\n"); +} + +void BasisImageConverterTest::emptyData() { + Containers::Pointer converter = + _converterManager.instantiate("BasisImageConverter"); + + std::ostringstream out; + Error redirectError{&out}; + CORRADE_VERIFY(!converter->exportToData(ImageView2D{PixelFormat::RGB8Unorm, {9192, 8192}})); + CORRADE_COMPARE(out.str(), + "Trade::BasisImageConverter::exportToData(): source image data is nullptr\n"); +} + +void BasisImageConverterTest::processError() { + Containers::Pointer converter = + _converterManager.instantiate("BasisImageConverter"); + converter->configuration().setValue("max_endpoint_clusters", + 16128 /* basisu_frontend::cMaxEndpointClusters */ + 1); + + std::ostringstream out; + Error redirectError{&out}; + + const UnsignedInt dataSize = (27+8)*(63+7)*4; + Image2D imageWithSkip{PixelStorage{}.setSkip({8, 7, 0}), + PixelFormat::RGBA8Unorm, {27, 63}, + Containers::Array{Containers::ValueInit, dataSize}}; + + CORRADE_VERIFY(!converter->exportToData(imageWithSkip)); + CORRADE_COMPARE(out.str(), + "Trade::BasisImageConverter::exportToData(): frontend processing failed\n"); +} + +void BasisImageConverterTest::r() { + if(_manager.loadState("PngImporter") == PluginManager::LoadState::NotFound) + CORRADE_SKIP("PngImporter plugin not found, cannot test contents"); + + Containers::Pointer pngImporter = + _manager.instantiate("PngImporter"); + pngImporter->openFile(Utility::Directory::join(BASISIMPORTER_TEST_DIR, "rgb-27x63.png")); + const auto originalImage = pngImporter->image2D(0); + + /* Use the original image and add a skip of {8, 7} to ensure the converter reads the + image data properly. Data size is computed with row alignment to 4 bytes. + During copy, we only use R channel to retrieve a R8 image. */ + const UnsignedInt dataSize = ((27+8) + 1)*(63+7); + Image2D imageWithSkip{PixelStorage{}.setSkip({8, 7, 0}), + PixelFormat::R8Unorm, originalImage->size(), Containers::Array{Containers::ValueInit, dataSize}}; + + auto sourcePixels = Containers::arrayCast(originalImage->pixels()); + auto destPixels = imageWithSkip.pixels(); + for(std::size_t y = 0; y != sourcePixels.size()[0]; ++y) + for(std::size_t x = 0; x != sourcePixels.size()[1]; ++x) + destPixels[y][x] = sourcePixels[y][x]; + + const auto compressedData = _converterManager.instantiate("BasisImageConverter")->exportToData(imageWithSkip); + CORRADE_VERIFY(compressedData); + + if(_manager.loadState("BasisImporter") == PluginManager::LoadState::NotFound) + CORRADE_SKIP("BasisImporter plugin not found, cannot test"); + + Containers::Pointer importer = + _manager.instantiate("BasisImporterRGBA8"); + CORRADE_VERIFY(importer->openData(compressedData)); + Containers::Optional image = importer->image2D(0); + CORRADE_VERIFY(image); + + /* Basis can only load RGBA8 uncompressed data, which corresponds to RRR1 + from our R8 image data. We chose the red channel from the imported image + to compare to our original data */ + CORRADE_COMPARE_WITH( + (Containers::arrayCast<2, UnsignedByte>(image->pixels().prefix({size_t(image->size()[1]), size_t(image->size()[0]), 1}))), + imageWithSkip, + /* There are moderately significant compression artifacts */ + (DebugTools::CompareImage{21.0f, 0.740742f})); +} + + +void BasisImageConverterTest::rg() { + if(_manager.loadState("PngImporter") == PluginManager::LoadState::NotFound) + CORRADE_SKIP("PngImporter plugin not found, cannot test contents"); + + Containers::Pointer pngImporter = + _manager.instantiate("PngImporter"); + pngImporter->openFile(Utility::Directory::join(BASISIMPORTER_TEST_DIR, "rgb-27x63.png")); + const auto originalImage = pngImporter->image2D(0); + + /* Use the original image and add a skip of {8, 7} to ensure the converter reads the + image data properly. Data size is computed with row alignment to 4 bytes. + During copy, we only use R and G channels to retrieve a RG8 image. */ + const UnsignedInt dataSize = ((27+8)*2 + 2)*(63+7); + Image2D imageWithSkip{PixelStorage{}.setSkip({8, 7, 0}), + PixelFormat::RG8Unorm, originalImage->size(), Containers::Array{Containers::ValueInit, dataSize}}; + + auto sourcePixels = originalImage->pixels(); + auto destPixels = imageWithSkip.pixels>(); + for(std::size_t y = 0; y != sourcePixels.size()[0]; ++y) + for(std::size_t x = 0; x != sourcePixels.size()[1]; ++x) + destPixels[y][x] = sourcePixels[y][x].xy(); + + const auto compressedData = _converterManager.instantiate("BasisImageConverter")->exportToData(imageWithSkip); + CORRADE_VERIFY(compressedData); + + if(_manager.loadState("BasisImporter") == PluginManager::LoadState::NotFound) + CORRADE_SKIP("BasisImporter plugin not found, cannot test"); + + Containers::Pointer importer = + _manager.instantiate("BasisImporterRGBA8"); + CORRADE_VERIFY(importer->openData(compressedData)); + Containers::Optional image = importer->image2D(0); + CORRADE_VERIFY(image); + + /* Basis can only load RGBA8 uncompressed data, which corresponds to RRRG + from our RG8 image data. We chose the B and A channels from the imported + image to compare to our original data */ + CORRADE_COMPARE_WITH( + (Containers::arrayCast<2, Math::Vector2>(image->pixels().suffix({0, 0, 2}))), + imageWithSkip, + /* There are moderately significant compression artifacts */ + (DebugTools::CompareImage{21.0f, 0.800423f})); +} + +void BasisImageConverterTest::rgb() { + if(_manager.loadState("PngImporter") == PluginManager::LoadState::NotFound) + CORRADE_SKIP("PngImporter plugin not found, cannot test contents"); + + Containers::Pointer pngImporter = + _manager.instantiate("PngImporter"); + pngImporter->openFile(Utility::Directory::join(BASISIMPORTER_TEST_DIR, "rgb-27x63.png")); + const auto originalImage = pngImporter->image2D(0); + + /* Use the original image and add a skip of {8, 7} to ensure the converter reads the + image data properly. Data size is computed with row alignment to 4 bytes. */ + const UnsignedInt dataSize = ((27+8)*3 + 3)*(63+7); + Image2D imageWithSkip{PixelStorage{}.setSkip({8, 7, 0}), + PixelFormat::RGB8Unorm, originalImage->size(), + Containers::Array{Containers::ValueInit, dataSize}}; + + auto sourcePixels = originalImage->pixels(); + auto destPixels = imageWithSkip.pixels(); + for(std::size_t y = 0; y != sourcePixels.size()[0]; ++y) + for(std::size_t x = 0; x != sourcePixels.size()[1]; ++x) + destPixels[y][x] = sourcePixels[y][x]; + + const auto compressedData = _converterManager.instantiate("BasisImageConverter")->exportToData(imageWithSkip); + CORRADE_VERIFY(compressedData); + + if(_manager.loadState("BasisImporter") == PluginManager::LoadState::NotFound) + CORRADE_SKIP("BasisImporter plugin not found, cannot test"); + + Containers::Pointer importer = + _manager.instantiate("BasisImporterRGBA8"); + CORRADE_VERIFY(importer->openData(compressedData)); + Containers::Optional image = importer->image2D(0); + CORRADE_VERIFY(image); + + CORRADE_COMPARE_WITH(Containers::arrayCast(image->pixels()), + Utility::Directory::join(BASISIMPORTER_TEST_DIR, "rgb-27x63.png"), + /* There are moderately significant compression artifacts */ + (DebugTools::CompareImageToFile{_manager, 81.0f, 9.46542f})); +} + + +void BasisImageConverterTest::rgba() { + if(_manager.loadState("PngImporter") == PluginManager::LoadState::NotFound) + CORRADE_SKIP("PngImporter plugin not found, cannot test contents"); + + Containers::Pointer pngImporter = + _manager.instantiate("PngImporter"); + pngImporter->openFile(Utility::Directory::join(BASISIMPORTER_TEST_DIR, "rgba-27x63.png")); + const auto originalImage = pngImporter->image2D(0); + + /* Use the original image and add a skip of {8, 7} to ensure the converter reads the + image data properly. */ + const UnsignedInt dataSize = (27+8)*(63+7)*4; + Image2D imageWithSkip{PixelStorage{}.setSkip({8, 7, 0}), + PixelFormat::RGBA8Unorm, originalImage->size(), + Containers::Array{Containers::ValueInit, dataSize}}; + + auto sourcePixels = originalImage->pixels(); + auto destPixels = imageWithSkip.pixels(); + for(std::size_t y = 0; y != sourcePixels.size()[0]; ++y) + for(std::size_t x = 0; x != sourcePixels.size()[1]; ++x) + destPixels[y][x] = sourcePixels[y][x]; + + const auto data = _converterManager.instantiate("BasisImageConverter")->exportToData(imageWithSkip); + CORRADE_VERIFY(data); + + if(_manager.loadState("BasisImporter") == PluginManager::LoadState::NotFound) + CORRADE_SKIP("BasisImporter plugin not found, cannot test"); + + Containers::Pointer importer = + _manager.instantiate("BasisImporterRGBA8"); + CORRADE_VERIFY(importer->openData(data)); + Containers::Optional image = importer->image2D(0); + CORRADE_VERIFY(image); + + /* Basis can only load RGBA8 uncompressed data, which corresponds to RGB1 + from our RGB8 image data. */ + CORRADE_COMPARE_WITH(image->pixels(), + Utility::Directory::join(BASISIMPORTER_TEST_DIR, "rgba-27x63.png"), + /* There are moderately significant compression artifacts */ + (DebugTools::CompareImageToFile{_manager, 85.25f, 9.84613f})); +} + +}}}} + +CORRADE_TEST_MAIN(Magnum::Trade::Test::BasisImageConverterTest) diff --git a/src/MagnumPlugins/BasisImageConverter/Test/CMakeLists.txt b/src/MagnumPlugins/BasisImageConverter/Test/CMakeLists.txt new file mode 100644 index 000000000..343798ba0 --- /dev/null +++ b/src/MagnumPlugins/BasisImageConverter/Test/CMakeLists.txt @@ -0,0 +1,84 @@ +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 +# Vladimír Vondruš +# Copyright © 2019 Jonathan Hale +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +find_package(Magnum REQUIRED DebugTools) + +# Not required +find_package(Magnum COMPONENTS AnyImageImporter) + +if(WITH_BASISIMPORTER) + if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) + set(BASISIMPORTER_TEST_DIR ".") + else() + set(BASISIMPORTER_TEST_DIR ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/BasisImporter/Test) + endif() +endif() + +# CMake before 3.8 has broken $ expressions for iOS (see +# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade +# doesn't support dynamic plugins on iOS, this sorta works around that. Should +# be revisited when updating Travis to newer Xcode (current has CMake 3.6). +if(NOT BUILD_PLUGINS_STATIC) + set(BASISIMAGECONVERTER_PLUGIN_FILENAME $) + if(WITH_BASISIMPORTER) + set(BASISIMPORTER_PLUGIN_FILENAME $) + endif() + if(WITH_STBIMAGEIMPORTER) + set(STBIMAGEIMPORTER_PLUGIN_FILENAME $) + endif() + + # First replace ${} variables, then $<> generator expressions + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) + file(GENERATE OUTPUT $/configure.h + INPUT ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) +else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +endif() + +corrade_add_test(BasisImageConverterTest BasisImageConverterTest.cpp + LIBRARIES Magnum::Trade + FILES + ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/BasisImporter/Test/rgb-27x63.png + ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/BasisImporter/Test/rgba-27x63.png) +if(NOT BUILD_PLUGINS_STATIC) + target_include_directories(BasisImageConverterTest PRIVATE $) + target_link_libraries(BasisImageConverterTest PRIVATE Magnum::DebugTools BasisUniversal::Encoder) +else() + target_include_directories(BasisImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(BasisImageConverterTest PRIVATE BasisImageConverter Magnum::DebugTools BasisUniversal::Encoder) + if(Magnum_AnyImageImporter_FOUND) + target_link_libraries(BasisImageConverterTest PRIVATE Magnum::AnyImageImporter) + endif() + if(WITH_BASISIMPORTER) + target_link_libraries(BasisImageConverterTest PRIVATE BasisImporter) + endif() + if(WITH_STBIMAGEIMPORTER) + target_link_libraries(BasisImageConverterTest PRIVATE StbImageImporter) + endif() +endif() +set_target_properties(BasisImageConverterTest PROPERTIES FOLDER "MagnumPlugins/BasisImageConverter/Test") diff --git a/src/MagnumPlugins/BasisImageConverter/Test/configure.h.cmake b/src/MagnumPlugins/BasisImageConverter/Test/configure.h.cmake new file mode 100644 index 000000000..1fbcc1570 --- /dev/null +++ b/src/MagnumPlugins/BasisImageConverter/Test/configure.h.cmake @@ -0,0 +1,30 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 + Vladimír Vondruš + Copyright © 2019 Jonathan Hale + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#cmakedefine BASISIMAGECONVERTER_PLUGIN_FILENAME "${BASISIMAGECONVERTER_PLUGIN_FILENAME}" +#cmakedefine BASISIMPORTER_PLUGIN_FILENAME "${BASISIMPORTER_PLUGIN_FILENAME}" +#cmakedefine STBIMAGEIMPORTER_PLUGIN_FILENAME "${STBIMAGEIMPORTER_PLUGIN_FILENAME}" +#cmakedefine BASISIMPORTER_TEST_DIR "${BASISIMPORTER_TEST_DIR}" diff --git a/src/MagnumPlugins/BasisImageConverter/configure.h.cmake b/src/MagnumPlugins/BasisImageConverter/configure.h.cmake new file mode 100644 index 000000000..6f2db111d --- /dev/null +++ b/src/MagnumPlugins/BasisImageConverter/configure.h.cmake @@ -0,0 +1,27 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 + Vladimír Vondruš + Copyright © 2019 Jonathan Hale + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#cmakedefine MAGNUM_BASISIMAGECONVERTER_BUILD_STATIC diff --git a/src/MagnumPlugins/BasisImageConverter/importStaticPlugin.cpp b/src/MagnumPlugins/BasisImageConverter/importStaticPlugin.cpp new file mode 100644 index 000000000..fae6ee0de --- /dev/null +++ b/src/MagnumPlugins/BasisImageConverter/importStaticPlugin.cpp @@ -0,0 +1,36 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 + Vladimír Vondruš + Copyright © 2019 Jonathan Hale + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include "MagnumPlugins/BasisImageConverter/configure.h" + +#ifdef MAGNUM_BASISIMAGECONVERTER_BUILD_STATIC +#include + +static int magnumBasisImageConverterStaticImporter() { + CORRADE_PLUGIN_IMPORT(BasisImageConverter) + return 1; +} CORRADE_AUTOMATIC_INITIALIZER(magnumBasisImageConverterStaticImporter) +#endif diff --git a/src/MagnumPlugins/CMakeLists.txt b/src/MagnumPlugins/CMakeLists.txt index c201ace42..ff6bdf878 100644 --- a/src/MagnumPlugins/CMakeLists.txt +++ b/src/MagnumPlugins/CMakeLists.txt @@ -38,6 +38,10 @@ if(WITH_ASSIMPIMPORTER) add_subdirectory(AssimpImporter) endif() +if(WITH_BASISIMAGECONVERTER) + add_subdirectory(BasisImageConverter) +endif() + if(WITH_BASISIMPORTER) add_subdirectory(BasisImporter) endif()