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()
|
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_
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Add table
Reference in a new issue