summaryrefslogtreecommitdiffstats
path: root/thirdparty/thorvg/src/renderer/tvgSaver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/thorvg/src/renderer/tvgSaver.cpp')
-rw-r--r--thirdparty/thorvg/src/renderer/tvgSaver.cpp48
1 files changed, 47 insertions, 1 deletions
diff --git a/thirdparty/thorvg/src/renderer/tvgSaver.cpp b/thirdparty/thorvg/src/renderer/tvgSaver.cpp
index 3b4dfddcc2..038d1ad097 100644
--- a/thirdparty/thorvg/src/renderer/tvgSaver.cpp
+++ b/thirdparty/thorvg/src/renderer/tvgSaver.cpp
@@ -26,6 +26,9 @@
#ifdef THORVG_TVG_SAVER_SUPPORT
#include "tvgTvgSaver.h"
#endif
+#ifdef THORVG_GIF_SAVER_SUPPORT
+ #include "tvgGifSaver.h"
+#endif
/************************************************************************/
/* Internal Class Implementation */
@@ -50,6 +53,12 @@ static SaveModule* _find(FileType type)
#endif
break;
}
+ case FileType::Gif: {
+#ifdef THORVG_GIF_SAVER_SUPPORT
+ return new GifSaver;
+#endif
+ break;
+ }
default: {
break;
}
@@ -62,12 +71,16 @@ static SaveModule* _find(FileType type)
format = "TVG";
break;
}
+ case FileType::Gif: {
+ format = "GIF";
+ break;
+ }
default: {
format = "???";
break;
}
}
- TVGLOG("SAVER", "%s format is not supported", format);
+ TVGLOG("RENDERER", "%s format is not supported", format);
#endif
return nullptr;
}
@@ -78,6 +91,8 @@ static SaveModule* _find(const string& path)
auto ext = path.substr(path.find_last_of(".") + 1);
if (!ext.compare("tvg")) {
return _find(FileType::Tvg);
+ } else if (!ext.compare("gif")) {
+ return _find(FileType::Gif);
}
return nullptr;
}
@@ -124,6 +139,37 @@ Result Saver::save(std::unique_ptr<Paint> paint, const string& path, bool compre
}
+Result Saver::save(std::unique_ptr<Animation> animation, const string& path, uint32_t quality, uint32_t fps) noexcept
+{
+ auto a = animation.release();
+ if (!a) return Result::MemoryCorruption;
+
+ if (mathZero(a->totalFrame())) {
+ delete(a);
+ return Result::InsufficientCondition;
+ }
+
+ //Already on saving an other resource.
+ if (pImpl->saveModule) {
+ delete(a);
+ return Result::InsufficientCondition;
+ }
+
+ if (auto saveModule = _find(path)) {
+ if (saveModule->save(a, path, quality, fps)) {
+ pImpl->saveModule = saveModule;
+ return Result::Success;
+ } else {
+ delete(a);
+ delete(saveModule);
+ return Result::Unknown;
+ }
+ }
+ delete(a);
+ return Result::NonSupport;
+}
+
+
Result Saver::sync() noexcept
{
if (!pImpl->saveModule) return Result::InsufficientCondition;