From ca234026fbe1c64efc4ef13a249be005d50c65de Mon Sep 17 00:00:00 2001 From: Nerixyz Date: Wed, 30 Oct 2024 19:58:10 +0100 Subject: [PATCH] feat: check if webp is supported --- src/CMakeLists.txt | 2 + src/RunGui.cpp | 3 ++ src/util/SanityCheckImages.cpp | 69 ++++++++++++++++++++++++++++++++++ src/util/SanityCheckImages.hpp | 8 ++++ 4 files changed, 82 insertions(+) create mode 100644 src/util/SanityCheckImages.cpp create mode 100644 src/util/SanityCheckImages.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a5ab2de4ef5..8b2697b0bad 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -537,6 +537,8 @@ set(SOURCE_FILES util/RenameThread.hpp util/SampleData.cpp util/SampleData.hpp + util/SanityCheckImages.cpp + util/SanityCheckImages.hpp util/SharedPtrElementLess.hpp util/SignalListener.hpp util/StreamLink.cpp diff --git a/src/RunGui.cpp b/src/RunGui.cpp index ff77d6c470c..766cbb53284 100644 --- a/src/RunGui.cpp +++ b/src/RunGui.cpp @@ -11,6 +11,7 @@ #include "singletons/Settings.hpp" #include "singletons/Updates.hpp" #include "util/CombinePath.hpp" +#include "util/SanityCheckImages.hpp" #include "widgets/dialogs/LastRunCrashDialog.hpp" #include @@ -241,6 +242,8 @@ void runGui(QApplication &a, const Paths &paths, Settings &settings, } #endif + sanityCheckImages(); + updates.deleteOldFiles(); // Clear the cache 1 minute after start. diff --git a/src/util/SanityCheckImages.cpp b/src/util/SanityCheckImages.cpp new file mode 100644 index 00000000000..bdeb22afa4e --- /dev/null +++ b/src/util/SanityCheckImages.cpp @@ -0,0 +1,69 @@ +#include "util/SanityCheckImages.hpp" + +#include "common/Literals.hpp" + +#include +#include +#include +#include +#include + +namespace { + +using namespace chatterino::literals; + +// lossy image from https://developers.google.com/speed/webp/faq#in_your_own_javascript +const QByteArray WEBP_IMAGE = + "RIFF\x22\0\0\0WEBPVP8\x20\x16\0\0\0\x30\x01\0\x9d\x01\x2a\x01\0\x01\0\x0e\xc0\xfe\x25\xa4\0\x03p\0\0\0\0"_ba; + +} // namespace + +namespace chatterino { + +void sanityCheckImages() +{ + QStringList messages; + QMimeDatabase mimeDb; + + auto mime = mimeDb.mimeTypeForData(WEBP_IMAGE); + if (!mime.inherits("image/webp")) + { + messages.emplace_back(u"Failed to determine MIME type for WEBP image - " + u"detected MIME type: \"" % + mime.name() % '"'); + } + + QBuffer buffer; + buffer.setData(WEBP_IMAGE); + QImageReader reader(&buffer); + + if (reader.canRead()) + { + if (reader.imageCount() != 1) + { + messages.emplace_back(u"Minimal WEBP image doesn't have one (1) " + u"expected image - got: " % + QString::number(reader.imageCount()) % + u" - error: " % reader.errorString()); + } + reader.read(); + } + else + { + messages.emplace_back( + u"Minimal WEBP image can't be read - QImageReader::canRead " + u"returned false - error: \"" % + reader.errorString() % '"'); + } + + if (!messages.empty()) + { + QMessageBox::warning( + nullptr, u"Chatterino - Sanity Check"_s, + u"Your Chatterino instance is not able to load WEBP files.\nMake " + u"sure you have qtimageformats installed.\n\n" % + messages.join(u"\n\n")); + } +} + +} // namespace chatterino diff --git a/src/util/SanityCheckImages.hpp b/src/util/SanityCheckImages.hpp new file mode 100644 index 00000000000..a7753d4bd4b --- /dev/null +++ b/src/util/SanityCheckImages.hpp @@ -0,0 +1,8 @@ +#pragma once + +namespace chatterino { + +/// Checks if WEBPs can be loaded +void sanityCheckImages(); + +} // namespace chatterino