diff --git a/doc/changelog.dox b/doc/changelog.dox index be6643a91..91dce63ff 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -503,7 +503,8 @@ See also: when the implementation only neeeds to do a format detection based on file extension - Recognizing BMP and TIFF file header magic in @relativeref{Trade,AnyImageImporter} -- Recognizgin ASTC files and data in @relativeref{Trade,AnyImageImporter} +- Recognizing ASTC and WebP files and data in + @relativeref{Trade,AnyImageImporter} - Recognizing KTX2 files and data in @relativeref{Trade,AnyImageImporter} and @relativeref{Trade,AnyImageConverter} (see also [mosra/magnum#529](https://github.com/mosra/magnum/pull/529)) diff --git a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp index d8cdfcd55..2c555b3d0 100644 --- a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp +++ b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp @@ -129,6 +129,8 @@ void AnyImageImporter::doOpenFile(const Containers::StringView filename) { plugin = "TgaImporter"_s; else if(normalizedExtension == ".vdb"_s) plugin = "OpenVdbImporter"_s; + else if(normalizedExtension == ".webp"_s) + plugin = "WebPImporter"_s; else { Error{} << "Trade::AnyImageImporter::openFile(): cannot determine the format of" << filename; return; @@ -208,6 +210,11 @@ void AnyImageImporter::doOpenData(Containers::Array&& data, DataFlags) { else if(dataString.hasPrefix("II\x2a\x00"_s) || dataString.hasPrefix("MM\x00\x2a"_s)) plugin = "TiffImporter"_s; + /* https://developers.google.com/speed/webp/docs/riff_container#webp_file_header */ + else if(dataString.size() >= 12 && + dataString.slice(0, 4) == "RIFF"_s && + dataString.slice(8, 12) == "WEBP"_s) + plugin = "WebPImporter"_s; /* https://github.com/file/file/blob/d04de269e0b06ccd0a7d1bf4974fed1d75be7d9e/magic/Magdir/images#L18-L22 TGAs are a complete guesswork, so try after everything else fails. */ else if([dataView]() { diff --git a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h index d13fe634b..1878e6eb1 100644 --- a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h +++ b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h @@ -101,6 +101,8 @@ Supported formats: corresponding signature), loaded with @ref TgaImporter or any other plugin that provides it - OpenVDB (`*.vdb`), loaded with any plugin that provides `OpenVdbImporter` +- WebP (`*.webp` or data with corresponding signature), loaded with + @ref WebPImporter or any other plugin that provides it Detecting file type through @ref openData() is supported only for a subset of formats that are marked as such in the list above. diff --git a/src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp b/src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp index cb5409e04..93e8a73e3 100644 --- a/src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp +++ b/src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp @@ -123,7 +123,9 @@ constexpr struct { {"TIFF data", "image.tiff", true, "TiffImporter"}, {"Basis", "rgb.basis", false, "BasisImporter"}, {"Basis data", "rgb.basis", true, "BasisImporter"}, - {"OpenVDB", "volume.vdb", false, "OpenVdbImporter"} + {"OpenVDB", "volume.vdb", false, "OpenVdbImporter"}, + {"WebP", "rgb-lossless.webp", false, "WebPImporter"}, + {"WebP data", "rgb-lossless.webp", true, "WebPImporter"} /* Not testing everything, just the most important ones */ }; @@ -144,7 +146,9 @@ const struct { {"DDS, but no space", "DDS!"_s, "44445321"}, {"TIFF, but too short", "II\x2a"_s, "49492a"}, {"TIFF, but no zero byte", "MM\xff\x2a"_s, "4d4dff2a"}, - {"KTX, but wrong version", "\xabKTX 30\xbb\r\n\x1a\n"_s, "ab4b5458"} + {"KTX, but wrong version", "\xabKTX 30\xbb\r\n\x1a\n"_s, "ab4b5458"}, + {"RIFF (for WebP), but only 4 bytes", "RIFF"_s, "52494646"}, + {"WebP, but only 11 bytes", "RIFF WEB"_s, "52494646"} }; constexpr struct { diff --git a/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt index aebfd7699..9638be446 100644 --- a/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt @@ -77,7 +77,9 @@ corrade_add_test(AnyImageImporterTest AnyImageImporterTest.cpp rgb.hdr rgb.png rgb.tga - rgba_dxt1.dds) + rgba_dxt1.dds + # From WebPImporter test data + rgb-lossless.webp) target_include_directories(AnyImageImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) if(MAGNUM_ANYIMAGEIMPORTER_BUILD_STATIC) target_link_libraries(AnyImageImporterTest PRIVATE AnyImageImporter) diff --git a/src/MagnumPlugins/AnyImageImporter/Test/rgb-lossless.webp b/src/MagnumPlugins/AnyImageImporter/Test/rgb-lossless.webp new file mode 100644 index 000000000..60815956d Binary files /dev/null and b/src/MagnumPlugins/AnyImageImporter/Test/rgb-lossless.webp differ