SvgLoader: Async conversion of svg data 46/237946/3
authorJunsuChoi <jsuya.choi@samsung.com>
Tue, 7 Jul 2020 01:15:05 +0000 (10:15 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Tue, 7 Jul 2020 04:43:00 +0000 (13:43 +0900)
Change-Id: I58025e646b531a0451be096ef1891377e655a3fc

src/loaders/svg_loader/tvgSvgLoader.cpp
src/loaders/svg_loader/tvgSvgLoader.h

index 99bb689..81991a0 100644 (file)
@@ -2227,13 +2227,22 @@ static void _freeSvgNode(SvgNode* node)
 /************************************************************************/
 
 
-SvgLoader::SvgLoader()
+SvgLoader::SvgLoader() :
+    loaderData {vector<SvgNode*>(),
+                nullptr,
+                nullptr,
+                vector<SvgStyleGradient*>(),
+                nullptr,
+                nullptr,
+                0,
+                false}
 {
 }
 
 
 SvgLoader::~SvgLoader()
 {
+    if (rootProgress.valid()) root = rootProgress.get();
 }
 
 
@@ -2261,52 +2270,53 @@ bool SvgLoader::read()
 {
     if (content.empty()) return false;
 
-    loaderData = {vector<SvgNode*>(),
-        nullptr,
-        nullptr,
-        vector<SvgStyleGradient*>(),
-        nullptr,
-        nullptr,
-        0,
-        false};
-
-    loaderData.svgParse = (SvgParser*)malloc(sizeof(SvgParser));
-
-    bool res = simpleXmlParse(content.c_str(), content.size(), true, _svgLoaderParser, &loaderData);
-
-    if (loaderData.doc) {
-        SvgNode *defs;
-        _updateStyle(loaderData.doc, nullptr);
-        defs = loaderData.doc->node.doc.defs;
-        if (defs) _updateGradient(loaderData.doc, defs->node.defs.gradients);
-        else {
-            if (!loaderData.gradients.empty()) {
-                vector<SvgStyleGradient*> gradientList;
-                std::copy(loaderData.gradients.begin(), loaderData.gradients.end(), gradientList.begin());
-                _updateGradient(loaderData.doc, gradientList);
-                gradientList.clear();
+    auto asyncTask = [](SvgLoader *loader) {
+
+        loader->loaderData.svgParse = (SvgParser*)malloc(sizeof(SvgParser));
+
+        bool res = simpleXmlParse(loader->content.c_str(), loader->content.size(), true, _svgLoaderParser, &(loader->loaderData));
+
+        if (!res) return unique_ptr<Scene>(nullptr);
+
+        if (loader->loaderData.doc) {
+            SvgNode *defs;
+            _updateStyle(loader->loaderData.doc, nullptr);
+            defs = loader->loaderData.doc->node.doc.defs;
+            if (defs) _updateGradient(loader->loaderData.doc, defs->node.defs.gradients);
+            else {
+                if (!loader->loaderData.gradients.empty()) {
+                    vector<SvgStyleGradient*> gradientList;
+                    std::copy(loader->loaderData.gradients.begin(), loader->loaderData.gradients.end(), gradientList.begin());
+                    _updateGradient(loader->loaderData.doc, gradientList);
+                    gradientList.clear();
+                }
             }
         }
-    }
+        return loader->builder.build(loader->loaderData.doc);
+    };
 
-    root = builder.build(loaderData.doc);
+    rootProgress = async(launch::async, asyncTask, this);
 
-    if (!res) return false;
     return true;
 }
 
 
 bool SvgLoader::close()
 {
+    if (rootProgress.valid()) root = rootProgress.get();
+
     if (loaderData.svgParse) free(loaderData.svgParse);
     _freeSvgNode(loaderData.doc);
-    return false;
+    return true;
 }
 
 
 unique_ptr<Scene> SvgLoader::data()
 {
-    return move(root);
+    if (rootProgress.valid()) root = rootProgress.get();
+
+    if (root) return move(root);
+    else return unique_ptr<Scene>(nullptr);
 }
 
 #endif //_TVG_SVG_LOADER_CPP_
index eba74c3..9a02a86 100644 (file)
@@ -19,7 +19,7 @@
 
 #include "tvgSvgLoaderCommon.h"
 #include "tvgSvgSceneBuilder.h"
-
+#include <future>
 
 class SvgLoader : public Loader
 {
@@ -27,6 +27,7 @@ private:
     string content;
     SvgLoaderData loaderData;
     SvgSceneBuilder builder;
+    future<unique_ptr<Scene>> rootProgress;
     unique_ptr<Scene> root;
 
 public: