SvgLoader: Async conversion of svg data

Change-Id: I58025e646b531a0451be096ef1891377e655a3fc
This commit is contained in:
JunsuChoi 2020-07-07 10:15:05 +09:00
parent 02a0e98596
commit d5e78eac71
2 changed files with 39 additions and 28 deletions

View 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() SvgLoader::~SvgLoader()
{ {
if (rootProgress.valid()) root = rootProgress.get();
} }
@ -2261,52 +2270,53 @@ bool SvgLoader::read()
{ {
if (content.empty()) return false; if (content.empty()) return false;
loaderData = {vector<SvgNode*>(), auto asyncTask = [](SvgLoader *loader) {
nullptr,
nullptr,
vector<SvgStyleGradient*>(),
nullptr,
nullptr,
0,
false};
loaderData.svgParse = (SvgParser*)malloc(sizeof(SvgParser)); loader->loaderData.svgParse = (SvgParser*)malloc(sizeof(SvgParser));
bool res = simpleXmlParse(content.c_str(), content.size(), true, _svgLoaderParser, &loaderData); bool res = simpleXmlParse(loader->content.c_str(), loader->content.size(), true, _svgLoaderParser, &(loader->loaderData));
if (loaderData.doc) { if (!res) return unique_ptr<Scene>(nullptr);
SvgNode *defs;
_updateStyle(loaderData.doc, nullptr); if (loader->loaderData.doc) {
defs = loaderData.doc->node.doc.defs; SvgNode *defs;
if (defs) _updateGradient(loaderData.doc, defs->node.defs.gradients); _updateStyle(loader->loaderData.doc, nullptr);
else { defs = loader->loaderData.doc->node.doc.defs;
if (!loaderData.gradients.empty()) { if (defs) _updateGradient(loader->loaderData.doc, defs->node.defs.gradients);
vector<SvgStyleGradient*> gradientList; else {
std::copy(loaderData.gradients.begin(), loaderData.gradients.end(), gradientList.begin()); if (!loader->loaderData.gradients.empty()) {
_updateGradient(loaderData.doc, gradientList); vector<SvgStyleGradient*> gradientList;
gradientList.clear(); 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; return true;
} }
bool SvgLoader::close() bool SvgLoader::close()
{ {
if (rootProgress.valid()) root = rootProgress.get();
if (loaderData.svgParse) free(loaderData.svgParse); if (loaderData.svgParse) free(loaderData.svgParse);
_freeSvgNode(loaderData.doc); _freeSvgNode(loaderData.doc);
return false; return true;
} }
unique_ptr<Scene> SvgLoader::data() 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_ #endif //_TVG_SVG_LOADER_CPP_

View file

@ -19,7 +19,7 @@
#include "tvgSvgLoaderCommon.h" #include "tvgSvgLoaderCommon.h"
#include "tvgSvgSceneBuilder.h" #include "tvgSvgSceneBuilder.h"
#include <future>
class SvgLoader : public Loader class SvgLoader : public Loader
{ {
@ -27,6 +27,7 @@ private:
string content; string content;
SvgLoaderData loaderData; SvgLoaderData loaderData;
SvgSceneBuilder builder; SvgSceneBuilder builder;
future<unique_ptr<Scene>> rootProgress;
unique_ptr<Scene> root; unique_ptr<Scene> root;
public: public: