/* This file is part of Magnum. Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Vladimír Vondruš 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. */ namespace Magnum { /** @page file-formats File format support @brief Support tables for widely used image, scene, audio and font formats @tableofcontents @m_footernavigation The @ref Audio::AnyImporter "AnyAudioImporter", @relativeref{Trade,AnyImageImporter}, @relativeref{Trade,AnySceneImporter}, @relativeref{Trade,AnyImageConverter}, @relativeref{Trade,AnySceneConverter} and @ref ShaderTools::AnyConverter "AnyShaderConverter" plugins @ref plugins-aliases "described on the previous page" can be used for generic handling of any of the formats they recognize and they'll proxy the operation to a concrete plugin implementation. To support diverse use cases, there's commonly more than one alternative implementation for given format. The following tables list the most widely used formats with corresponding plugin implementations and known caveats for each. When one format is supported by more than one plugin, you can use @relativeref{Corrade,PluginManager::AbstractManager::setPreferredPlugins()} to prioritize a particular plugin implementation. See the @ref file-formats-legend section at the bottom of the page for a detailed explanation of the color-coded columns. @section file-formats-image-importers Image importers Together with @ref file-formats-scene-importers "scene importers" derived from @ref Trade::AbstractImporter. @m_class{m-row m-container-inflate} @parblock @m_class{m-fullwidth m-flat}
Format Generic plugin alias Plugin name Caveats Dependencies License
ASTC (`*.astc`) `AstcImporter` @relativeref{Trade,AstcImporter} @ref Trade-AstcImporter-behavior "none" @m_span{m-text m-dim} none @m_endspan
Basis Universal (`*.basis`) `BasisImporter` @ref Trade::BasisImporter "BasisImporter" @ref Trade-BasisImporter-behavior "none" bundleable, tiny Apache-2.0
BMP
(`*.bmp`)
`BmpImporter` @ref Trade::StbImageImporter "StbImageImporter" @ref Trade-StbImageImporter-behavior "some" bundled public domain
@ref Trade::DevIlImageImporter "DevIlImageImporter" @ref Trade-DevIlImageImporter-behavior "unknown" external LGPLv2.1
DirectDraw Surface
(`*.dds`)
`DdsImporter` @ref Trade::DdsImporter "DdsImporter" @ref Trade-DdsImporter-behavior "none" @m_span{m-text m-dim} none @m_endspan
@ref Trade::DevIlImageImporter "DevIlImageImporter" @ref Trade-DevIlImageImporter-behavior-dds "severe" external LGPLv2.1
OpenEXR (`*.exr`) `OpenExrImporter` @ref Trade::OpenExrImporter "OpenExrImporter" @ref Trade-OpenExrImporter-behavior "some" bundleable BSD 3-clause
@ref Trade::DevIlImageImporter "DevIlImageImporter" @ref Trade-DevIlImageImporter-behavior-exr "severe" external LGPLv2.1
GIF
(`*.gif`)
`GifImporter` @ref Trade::StbImageImporter "StbImageImporter" @ref Trade-StbImageImporter-behavior "some" bundled public domain
@ref Trade::DevIlImageImporter "DevIlImageImporter" @ref Trade-DevIlImageImporter-behavior-animated-gifs "severe" external LGPLv2.1
Radiance HDR
(`*.hdr`)
`HdrImporter` @ref Trade::StbImageImporter "StbImageImporter" @ref Trade-StbImageImporter-behavior "some" bundled public domain
@ref Trade::DevIlImageImporter "DevIlImageImporter" @ref Trade-DevIlImageImporter-behavior "none" external LGPLv2.1
ICO
(`*.ico`, `*.cur`)
`IcoImporter` @ref Trade::IcoImporter "IcoImporter" @ref Trade-IcoImporter-behavior "some" @m_span{m-text m-dim} none @m_endspan
@ref Trade::DevIlImageImporter "DevIlImageImporter" @ref Trade-DevIlImageImporter-behavior-ico "severe" external LGPLv2.1
JPEG
(`*.jpg`, `*.jpe`, `*.jpeg`)
`JpegImporter` @ref Trade::JpegImporter "JpegImporter" @m_span{m-text m-dim} none @m_endspan external, tiny Libjpeg
@ref Trade::StbImageImporter "StbImageImporter" @ref Trade-StbImageImporter-behavior "some" bundled public domain
@ref Trade::DevIlImageImporter "DevIlImageImporter" @ref Trade-DevIlImageImporter-behavior "none" external LGPLv2.1
KTX2 (`*.ktx2`) `KtxImporter` @ref Trade::KtxImporter "KtxImporter" @ref Trade-KtxImporter-behavior "some" @m_span{m-text m-dim} none @m_endspan
PNG
(`*.png`)
`PngImporter` @ref Trade::PngImporter "PngImporter" @ref Trade-PngImporter-behavior "minor" external, tiny libPNG
@relativeref{Trade,SpngImporter} @ref Trade-SpngImporter-behavior "some" external, tiny BSD 2-clause
@ref Trade::StbImageImporter "StbImageImporter" @ref Trade-StbImageImporter-behavior "some" bundled public domain
@ref Trade::DevIlImageImporter "DevIlImageImporter" @ref Trade-DevIlImageImporter-behavior-cgbi "some" external LGPLv2.1
PSD
(`*.psd`)
`PsdImporter` @ref Trade::StbImageImporter "StbImageImporter" @ref Trade-StbImageImporter-behavior "severe" bundled public domain
@ref Trade::DevIlImageImporter "DevIlImageImporter" @ref Trade-DevIlImageImporter-behavior-psd "severe" external LGPLv2.1
SVG
(`*.svg`, `*.svgz`)
`SvgImporter` @relativeref{Trade,LunaSvgImporter} @ref Trade-LunaSvgImporter-behavior "severe" external, tiny MIT
@relativeref{Trade,PlutoSvgImporter} @ref Trade-PlutoSvgImporter-behavior "severe" external, tiny MIT
@relativeref{Trade,ResvgImporter} @ref Trade-ResvgImporter-behavior "severe" external Apache-2.0/MIT
Truevision TGA
(`*.tga`, `*.vda`, `*.icb`, `*.vst`)
`TgaImporter` @ref Trade::TgaImporter "TgaImporter" @ref Trade-TgaImporter-behavior "minor" @m_span{m-text m-dim} none @m_endspan
@ref Trade::StbImageImporter "StbImageImporter" @ref Trade-StbImageImporter-behavior "some" bundled public domain
@ref Trade::DevIlImageImporter "DevIlImageImporter" @ref Trade-DevIlImageImporter-behavior "unknown" external LGPLv2.1
WebP (`*.webp`) `WebPImporter` @relativeref{Trade,WebPImporter} @ref Trade-WebPImporter-behavior "minor" external BSD 3-clause
@endparblock In addition to the above, @ref Trade::DevIlImageImporter "DevIlImageImporter" and @ref Trade::StbImageImporter "StbImageImporter" support many more formats. @section file-formats-image-converters Image converters Derived from @ref Trade::AbstractImageConverter. @m_class{m-row m-container-inflate} @parblock @m_class{m-fullwidth m-flat}
Format Generic plugin alias Plugin name Caveats Dependencies License
Basis Universal (`*.basis`) `BasisImageConverter` @ref Trade::BasisImageConverter "BasisImageConverter" @ref Trade-BasisImageConverter-behavior "some" bundleable Apache-2.0
Windows Bitmap (`*.bmp`) `BmpImageConverter` @ref Trade::StbImageConverter "StbImageConverter" @ref Trade-StbImageConverter-behavior "some" bundled public domain
OpenEXR (`*.exr`) `OpenExrImageConverter` @ref Trade::OpenExrImageConverter "OpenExrImageConverter" @ref Trade-OpenExrImageConverter-behavior "some" bundleable BSD 3-clause
@ref Trade::MiniExrImageConverter "MiniExrImageConverter" @ref Trade-MiniExrImageConverter-behavior "severe" bundled public domain
Radiance HDR (`*.hdr`) `HdrImageConverter` @ref Trade::StbImageConverter "StbImageConverter" @ref Trade-StbImageConverter-behavior "some" bundled public domain
JPEG
(`*.jpg`, `*.jpe`, `*.jpeg`)
`JpegImageConverter` @ref Trade::JpegImageConverter "JpegImageConverter" @ref Trade-JpegImageConverter-behavior "minor" external, tiny Libjpeg
@ref Trade::StbImageConverter "StbImageConverter" @ref Trade-StbImageConverter-behavior "some" bundled public domain
KTX2 (`*.ktx2`) `KtxImageConverter` @ref Trade::KtxImageConverter "KtxImageConverter" @ref Trade-KtxImageConverter-behavior "some" @m_span{m-text m-dim} none @m_endspan
PNG
(`*.png`)
`PngImageConverter` @ref Trade::PngImageConverter "PngImageConverter" @ref Trade-PngImageConverter-behavior "none" external, tiny libPNG
@ref Trade::StbImageConverter "StbImageConverter" @ref Trade-StbImageConverter-behavior "some" bundled public domain
Truevision TGA
(`*.tga`, `*.vda`, `*.icb`, `*.vst`)
`TgaImageConverter` @ref Trade::TgaImageConverter "TgaImageConverter" @ref Trade-TgaImageConverter-behavior "none" @m_span{m-text m-dim} none @m_endspan
@ref Trade::StbImageConverter "StbImageConverter" @ref Trade-StbImageConverter-behavior "some" bundled public domain
WebP (`*.webp`) `WebPImageConverter` @relativeref{Trade,WebPImageConverter} @ref Trade-WebPImageConverter-behavior "none" external BSD 3-clause
@endparblock @section file-formats-scene-importers Scene importers Together with @ref file-formats-image-importers "image importers" derived from @ref Trade::AbstractImporter. @m_class{m-row m-container-inflate} @parblock @m_class{m-fullwidth m-flat}
Format Generic plugin alias Plugin name Caveats Dependencies License
COLLADA (`*.dae`) `ColladaImporter` @ref Trade::AssimpImporter "AssimpImporter" @ref Trade-AssimpImporter-behavior "severe" bundleable BSD 3-clause
Autodesk FBX (`*.fbx`) `FbxImporter` @relativeref{Trade,UfbxImporter} @ref Trade-UfbxImporter-behavior "minor" bundled public domain
@ref Trade::AssimpImporter "AssimpImporter" @ref Trade-AssimpImporter-behavior "unknown" bundleable BSD 3-clause
OBJ
(`*.obj`)
`ObjImporter` @ref Trade::ObjImporter "ObjImporter" @ref Trade-ObjImporter-behavior "severe" @m_span{m-text m-dim} none @m_endspan
@relativeref{Trade,UfbxImporter} @ref Trade-UfbxImporter-behavior "unknown" bundled public domain
@ref Trade::AssimpImporter "AssimpImporter" @ref Trade-AssimpImporter-behavior "some" bundleable BSD 3-clause
Open Game Engine Exchange
(`*.ogex`)
`OpenGexImporter` @ref Trade::OpenGexImporter "OpenGexImporter" @ref Trade-OpenGexImporter-behavior "some" @m_span{m-text m-dim} none @m_endspan
@ref Trade::AssimpImporter "AssimpImporter" @ref Trade-AssimpImporter-behavior "unknown" bundleable BSD 3-clause
glTF
(`*.gltf`, `*.glb`)
`GltfImporter` @relativeref{Trade,GltfImporter} @ref Trade-GltfImporter-behavior "minor" @m_span{m-text m-dim} none @m_endspan
@ref Trade::TinyGltfImporter "TinyGltfImporter" @m_class{m-label m-danger} **deprecated** @ref Trade-TinyGltfImporter-behavior "some" bundled MIT
@ref Trade::AssimpImporter "AssimpImporter" @ref Trade-AssimpImporter-behavior "severe" bundleable BSD 3-clause
Stanford PLY
(`*.ply`)
`StanfordImporter` @ref Trade::StanfordImporter "StanfordImporter" @ref Trade-StanfordImporter-behavior "minor" @m_span{m-text m-dim} none @m_endspan
@ref Trade::AssimpImporter "AssimpImporter" @ref Trade-AssimpImporter-behavior "severe" bundleable BSD 3-clause
STL
(`*.stl`)
`StlImporter` @ref Trade::StlImporter "StlImporter" @ref Trade-StlImporter-behavior "minor" @m_span{m-text m-dim} none @m_endspan
@ref Trade::AssimpImporter "AssimpImporter" @ref Trade-AssimpImporter-behavior "unknown" bundleable BSD 3-clause
@endparblock In addition to the above, @ref Trade::AssimpImporter "AssimpImporter" supports many more formats. @section file-formats-scene-converters Scene converters Derived from @ref Trade::AbstractSceneConverter. @m_class{m-row m-container-inflate} @parblock @m_class{m-fullwidth m-flat}
Format Generic plugin alias Plugin name Caveats Dependencies License
Stanford PLY (`*.ply`) `StanfordSceneConverter` @ref Trade::StanfordSceneConverter "StanfordSceneConverter" @ref Trade-StanfordSceneConverter-behavior "minor" @m_span{m-text m-dim} none @m_endspan
glTF (`*.gltf`, `*.glb`) `GltfSceneConverter` @relativeref{Trade,GltfSceneConverter} @ref Trade-GltfSceneConverter-behavior "some" @m_span{m-text m-dim} none @m_endspan
@endparblock @section file-formats-audio-importers Audio importers To be written. @section file-formats-fonts Fonts @m_class{m-row m-container-inflate} @parblock @m_class{m-fullwidth m-flat}
Format Generic plugin alias Plugin name Caveats Dependencies License
OpenType (`*.otf`) `OpenTypeFont` @relativeref{Text,FreeTypeFont} @ref Text-FreeTypeFont-behavior "some" external FreeType
@relativeref{Text,HarfBuzzFont} @ref Text-HarfBuzzFont-behavior "none" external MIT
@relativeref{Text,StbTrueTypeFont} @ref Text-StbTrueTypeFont-behavior "some" bundled public domain
TrueType (`*.ttf`) `TrueTypeFont` @relativeref{Text,FreeTypeFont} @ref Text-FreeTypeFont-behavior "minor" external FreeType
@relativeref{Text,HarfBuzzFont} @ref Text-HarfBuzzFont-behavior "none" external MIT
@relativeref{Text,StbTrueTypeFont} @ref Text-StbTrueTypeFont-behavior "some" bundled public domain
@endparblock In addition to the above, @ref Text::FreeTypeFont "FreeTypeFont" supports many more formats. @section file-formats-font-converters Font converters To be written. @section file-formats-shaders Shader validators, preprocessors, optimizers and linkers Together with @ref file-formats-shader-converters "shader converters" derived from @ref ShaderTools::AbstractConverter. @m_class{m-row m-container-inflate} @parblock @m_class{m-fullwidth m-flat}
Format Generic plugin alias Plugin name Caveats Dependencies License
GLSL `GlslShaderConverter` @ref ShaderTools::GlslangConverter "GlslangShaderConverter" @ref ShaderTools-GlslangConverter-validation "none" bundleable Many
SPIR-V `SpirvShaderConverter` @ref ShaderTools::SpirvToolsConverter "SpirvToolsShaderConverter" @ref ShaderTools-SpirvToolsConverter-validation "none" bundleable Apache-2.0
SPIR-V assembly `SpirvAssemblyShaderConverter` @ref ShaderTools::SpirvToolsConverter "SpirvToolsShaderConverter" @ref ShaderTools-SpirvToolsConverter-validation "none" bundleable Apache-2.0
@endparblock @section file-formats-shader-converters Shader converters Together with @ref file-formats-shaders "shader validators, preprocessors, optimizers and linkers" derived from @ref ShaderTools::AbstractConverter. @m_class{m-row m-container-inflate} @parblock @m_class{m-fullwidth m-flat}
Format Generic plugin alias Plugin name Caveats Dependencies License
GLSL → SPIR-V `GlslToSpirvShaderConverter` @ref ShaderTools::GlslangConverter "GlslangShaderConverter" @ref ShaderTools-GlslangConverter-conversion "none" bundleable Many
SPIR-V → SPIR-V assembly `SpirvToSpirvAssemblyShaderConverter` @ref ShaderTools::SpirvToolsConverter "SpirvToolsShaderConverter" @ref ShaderTools-SpirvToolsConverter-conversion "none" bundleable Apache-2.0
SPIR-V assembly → SPIR-V `SpirvAssemblyToSpirvShaderConverter` @ref ShaderTools::SpirvToolsConverter "SpirvToolsShaderConverter" @ref ShaderTools-SpirvToolsConverter-conversion "none" bundleable Apache-2.0
@endparblock @section file-formats-legend Legend The *Caveats* column lists known issues and limitations of each plugin, and is color-coded for easier understanding. Note the caveats might get updated over time as features get implemented, bugs fixed or new issues discovered. - @m_class{m-label m-default} **none** means there are no known issues or limitations. - @m_class{m-label m-success} **minor** means the known issues only affect rare corner cases and shouldn't be a problem in practice. - @m_class{m-label m-warning} **some** means it has limitations affecting certain use cases. You're encouraged to check the documentation to be sure these don't affect you. - @m_class{m-label m-danger} **severe** means it has known bugs and limitations and isn't guaranteed to be usable for generic file import. It might work for your concrete use case, but you're encouraged to pick an alternative, if possible. - @m_class{m-label m-dim} **unknown** means there were no documented issues for given file format and there isn't enough practical experience to say how well it works. The *Dependencies* column shows what kind of dependencies the plugin relies on, highlighting potential portability issues: - @m_class{m-label m-default} **none** means it's dependency-free, with all its internals following Magnum standards of high test coverage, stability, portability and documentation. - @m_class{m-label m-primary} **bundled** means the dependency is usually a single-file 3rd party library that's bundled in the repo, and thus with no extra work needed to get it running. It's also tested on all platforms as Magnum itself, which should mean no portability issues either. - @m_class{m-label m-success} **bundleable, tiny** means the dependency is external to the repository, but it's relatively small and thus has no considerable impact on build times or deployment size. It can be either found externally or embedded as a CMake subproject, which may simplify the building procedure. While no guarantees on its portability are given, small libraries are generally rather portable. - @m_class{m-label m-warning} **bundleable** means the dependency is external to the repository and has a significant size that may have impact on build times and deployment size. However it's still possible to embed it as a CMake subproject, which *could* simplify the building a bit. - @m_class{m-label m-warning} **external, tiny** means the dependency is external to the repository, it's relatively small but cannot be (or isn't tested to be) embedded as a CMake subproject, which makes it slightly harder to get running. - @m_class{m-label m-danger} **external** means the dependency is external to the repository, has a significant size that may have impact on deployment size, and cannot be (or isn't tested to be) embedded as a CMake subproject. No guarantees on portability whatsoever. The *License* column shows the license of the plugin dependency, if there's any. Like with all other @ref credits-third-party "3rd party components", each plugin has a color-coded block showing the license, linking to its text and mentioning requirements coming from the license: - @m_class{m-label m-primary} **light blue** marks public domain dependencies, which don't require anything from you in order to use them and put no restrictions on use - @m_class{m-label m-success} **green** marks licenses that make the dependency safe to use in a commercial setting without having to release your source code, usually requiring you to give attribution. - @m_class{m-label m-warning} **yellow** marks licenses that require you to either dynamically link to the software to be able to use it in a commercial setting or release your source code as well. Such plugins are safe to use in internal development tools and asset pipelines, but you might want to consider alternatives before bundling them in a deployed commercial product. In some cases there is an alternative commercial licensing option without this requirement. - @m_class{m-label m-danger} **red** label marks licenses that unconditionally require you to publish your software together with its source code. Such plugins are only safe to use in internal development tools and asset pipelines, consider alternatives for use in a deployed commercial product. In some cases there is an alternative commercial licensing option without this requirement. */ }