mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-14 12:04:29 +00:00
SvgLoader: Async conversion of svg data
Change-Id: I58025e646b531a0451be096ef1891377e655a3fc
This commit is contained in:
parent
02a0e98596
commit
d5e78eac71
2 changed files with 39 additions and 28 deletions
|
@ -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};
|
||||
auto asyncTask = [](SvgLoader *loader) {
|
||||
|
||||
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);
|
||||
|
||||
if (loader->loaderData.doc) {
|
||||
SvgNode *defs;
|
||||
_updateStyle(loaderData.doc, nullptr);
|
||||
defs = loaderData.doc->node.doc.defs;
|
||||
if (defs) _updateGradient(loaderData.doc, defs->node.defs.gradients);
|
||||
_updateStyle(loader->loaderData.doc, nullptr);
|
||||
defs = loader->loaderData.doc->node.doc.defs;
|
||||
if (defs) _updateGradient(loader->loaderData.doc, defs->node.defs.gradients);
|
||||
else {
|
||||
if (!loaderData.gradients.empty()) {
|
||||
if (!loader->loaderData.gradients.empty()) {
|
||||
vector<SvgStyleGradient*> gradientList;
|
||||
std::copy(loaderData.gradients.begin(), loaderData.gradients.end(), gradientList.begin());
|
||||
_updateGradient(loaderData.doc, 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_
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Reference in a new issue