Browse Source

AnyImageImporter: recognize WebP extension and header magic.

ktx1-detection
Vladimír Vondruš 4 years ago
parent
commit
389ee37843
  1. 3
      doc/changelog.dox
  2. 7
      src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp
  3. 2
      src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h
  4. 8
      src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp
  5. 4
      src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt
  6. BIN
      src/MagnumPlugins/AnyImageImporter/Test/rgb-lossless.webp

3
doc/changelog.dox

@ -503,7 +503,8 @@ See also:
when the implementation only neeeds to do a format detection based on file when the implementation only neeeds to do a format detection based on file
extension extension
- Recognizing BMP and TIFF file header magic in @relativeref{Trade,AnyImageImporter} - 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 - Recognizing KTX2 files and data in @relativeref{Trade,AnyImageImporter} and
@relativeref{Trade,AnyImageConverter} (see also @relativeref{Trade,AnyImageConverter} (see also
[mosra/magnum#529](https://github.com/mosra/magnum/pull/529)) [mosra/magnum#529](https://github.com/mosra/magnum/pull/529))

7
src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp

@ -129,6 +129,8 @@ void AnyImageImporter::doOpenFile(const Containers::StringView filename) {
plugin = "TgaImporter"_s; plugin = "TgaImporter"_s;
else if(normalizedExtension == ".vdb"_s) else if(normalizedExtension == ".vdb"_s)
plugin = "OpenVdbImporter"_s; plugin = "OpenVdbImporter"_s;
else if(normalizedExtension == ".webp"_s)
plugin = "WebPImporter"_s;
else { else {
Error{} << "Trade::AnyImageImporter::openFile(): cannot determine the format of" << filename; Error{} << "Trade::AnyImageImporter::openFile(): cannot determine the format of" << filename;
return; return;
@ -208,6 +210,11 @@ void AnyImageImporter::doOpenData(Containers::Array<char>&& data, DataFlags) {
else if(dataString.hasPrefix("II\x2a\x00"_s) || else if(dataString.hasPrefix("II\x2a\x00"_s) ||
dataString.hasPrefix("MM\x00\x2a"_s)) dataString.hasPrefix("MM\x00\x2a"_s))
plugin = "TiffImporter"_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 /* https://github.com/file/file/blob/d04de269e0b06ccd0a7d1bf4974fed1d75be7d9e/magic/Magdir/images#L18-L22
TGAs are a complete guesswork, so try after everything else fails. */ TGAs are a complete guesswork, so try after everything else fails. */
else if([dataView]() { else if([dataView]() {

2
src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h

@ -101,6 +101,8 @@ Supported formats:
corresponding signature), loaded with @ref TgaImporter or any other plugin corresponding signature), loaded with @ref TgaImporter or any other plugin
that provides it that provides it
- OpenVDB (`*.vdb`), loaded with any plugin that provides `OpenVdbImporter` - 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 Detecting file type through @ref openData() is supported only for a subset of
formats that are marked as such in the list above. formats that are marked as such in the list above.

8
src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp

@ -123,7 +123,9 @@ constexpr struct {
{"TIFF data", "image.tiff", true, "TiffImporter"}, {"TIFF data", "image.tiff", true, "TiffImporter"},
{"Basis", "rgb.basis", false, "BasisImporter"}, {"Basis", "rgb.basis", false, "BasisImporter"},
{"Basis data", "rgb.basis", true, "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 */ /* Not testing everything, just the most important ones */
}; };
@ -144,7 +146,9 @@ const struct {
{"DDS, but no space", "DDS!"_s, "44445321"}, {"DDS, but no space", "DDS!"_s, "44445321"},
{"TIFF, but too short", "II\x2a"_s, "49492a"}, {"TIFF, but too short", "II\x2a"_s, "49492a"},
{"TIFF, but no zero byte", "MM\xff\x2a"_s, "4d4dff2a"}, {"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 { constexpr struct {

4
src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt

@ -77,7 +77,9 @@ corrade_add_test(AnyImageImporterTest AnyImageImporterTest.cpp
rgb.hdr rgb.hdr
rgb.png rgb.png
rgb.tga rgb.tga
rgba_dxt1.dds) rgba_dxt1.dds
# From WebPImporter test data
rgb-lossless.webp)
target_include_directories(AnyImageImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>) target_include_directories(AnyImageImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>)
if(MAGNUM_ANYIMAGEIMPORTER_BUILD_STATIC) if(MAGNUM_ANYIMAGEIMPORTER_BUILD_STATIC)
target_link_libraries(AnyImageImporterTest PRIVATE AnyImageImporter) target_link_libraries(AnyImageImporterTest PRIVATE AnyImageImporter)

BIN
src/MagnumPlugins/AnyImageImporter/Test/rgb-lossless.webp

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 B

Loading…
Cancel
Save