From 20fcb5b1c22a5df5966aee30bd5af7f1b517c638 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 7 Feb 2024 17:23:16 +0900 Subject: [PATCH] renderer/loader: enhance picture format compatibility Attempt to load a given file/data using candidate formats when the desired loader fails. This approach will enhance the compatibility with various file formats in unexpected scenarios. Previously, we had removed this feature, but have since recognized its necessity due to the impact on file data in specific corner cases. --- src/renderer/tvgCommon.h | 2 +- src/renderer/tvgLoader.cpp | 75 ++++++++++++++++++++++---------------- 2 files changed, 45 insertions(+), 32 deletions(-) diff --git a/src/renderer/tvgCommon.h b/src/renderer/tvgCommon.h index deb419bc..d080ea19 100644 --- a/src/renderer/tvgCommon.h +++ b/src/renderer/tvgCommon.h @@ -63,7 +63,7 @@ using namespace tvg; #define TVG_CLASS_ID_RADIAL 5 #define TVG_CLASS_ID_TEXT 6 -enum class FileType { Tvg = 0, Svg, Ttf, Lottie, Raw, Png, Jpg, Webp, Gif, Unknown }; +enum class FileType { Png = 0, Jpg, Webp, Tvg, Svg, Lottie, Ttf, Raw, Gif, Unknown }; using Size = Point; diff --git a/src/renderer/tvgLoader.cpp b/src/renderer/tvgLoader.cpp index e2ee0e1e..99fb2987 100644 --- a/src/renderer/tvgLoader.cpp +++ b/src/renderer/tvgLoader.cpp @@ -73,6 +73,24 @@ static Inlist _activeLoaders; static LoadModule* _find(FileType type) { switch(type) { + case FileType::Png: { +#ifdef THORVG_PNG_LOADER_SUPPORT + return new PngLoader; +#endif + break; + } + case FileType::Jpg: { +#ifdef THORVG_JPG_LOADER_SUPPORT + return new JpgLoader; +#endif + break; + } + case FileType::Webp: { +#ifdef THORVG_WEBP_LOADER_SUPPORT + return new WebpLoader; +#endif + break; + } case FileType::Tvg: { #ifdef THORVG_TVG_LOADER_SUPPORT return new TvgLoader; @@ -101,24 +119,6 @@ static LoadModule* _find(FileType type) return new RawLoader; break; } - case FileType::Png: { -#ifdef THORVG_PNG_LOADER_SUPPORT - return new PngLoader; -#endif - break; - } - case FileType::Jpg: { -#ifdef THORVG_JPG_LOADER_SUPPORT - return new JpgLoader; -#endif - break; - } - case FileType::Webp: { -#ifdef THORVG_WEBP_LOADER_SUPPORT - return new WebpLoader; -#endif - break; - } default: { break; } @@ -305,8 +305,22 @@ LoadModule* LoaderMgr::loader(const string& path, bool* invalid) return loader; } delete(loader); - *invalid = true; } + //Unkown MimeType. Try with the candidates in the order + for (int i = 0; i < static_cast(FileType::Raw); i++) { + if (auto loader = _find(static_cast(i))) { + if (loader->open(path)) { + loader->hashpath = strdup(path.c_str()); + { + ScopedLock lock(key); + _activeLoaders.back(loader); + } + return loader; + } + delete(loader); + } + } + *invalid = true; return nullptr; } @@ -349,21 +363,20 @@ LoadModule* LoaderMgr::loader(const char* data, uint32_t size, const string& mim delete(loader); } } + } //Unkown MimeType. Try with the candidates in the order - } else { - for (int i = 0; i < static_cast(FileType::Unknown); i++) { - auto loader = _find(static_cast(i)); - if (loader) { - if (loader->open(data, size, rpath, copy)) { - loader->hashkey = HASH_KEY(data, size); - { - ScopedLock lock(key); - _activeLoaders.back(loader); - } - return loader; + for (int i = 0; i < static_cast(FileType::Raw); i++) { + auto loader = _find(static_cast(i)); + if (loader) { + if (loader->open(data, size, rpath, copy)) { + loader->hashkey = HASH_KEY(data, size); + { + ScopedLock lock(key); + _activeLoaders.back(loader); } - delete(loader); + return loader; } + delete(loader); } } return nullptr;