From d5e78eac71d73b6c73fdd42590feb1542c69d930 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Tue, 7 Jul 2020 10:15:05 +0900 Subject: [PATCH] SvgLoader: Async conversion of svg data Change-Id: I58025e646b531a0451be096ef1891377e655a3fc --- src/loaders/svg_loader/tvgSvgLoader.cpp | 70 +++++++++++++++++++-------------- src/loaders/svg_loader/tvgSvgLoader.h | 3 +- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/loaders/svg_loader/tvgSvgLoader.cpp b/src/loaders/svg_loader/tvgSvgLoader.cpp index 99bb689..81991a0 100644 --- a/src/loaders/svg_loader/tvgSvgLoader.cpp +++ b/src/loaders/svg_loader/tvgSvgLoader.cpp @@ -2227,13 +2227,22 @@ static void _freeSvgNode(SvgNode* node) /************************************************************************/ -SvgLoader::SvgLoader() +SvgLoader::SvgLoader() : + loaderData {vector(), + nullptr, + nullptr, + vector(), + 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(), - nullptr, - nullptr, - vector(), - 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 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(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 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 SvgLoader::data() { - return move(root); + if (rootProgress.valid()) root = rootProgress.get(); + + if (root) return move(root); + else return unique_ptr(nullptr); } #endif //_TVG_SVG_LOADER_CPP_ diff --git a/src/loaders/svg_loader/tvgSvgLoader.h b/src/loaders/svg_loader/tvgSvgLoader.h index eba74c3..9a02a86 100644 --- a/src/loaders/svg_loader/tvgSvgLoader.h +++ b/src/loaders/svg_loader/tvgSvgLoader.h @@ -19,7 +19,7 @@ #include "tvgSvgLoaderCommon.h" #include "tvgSvgSceneBuilder.h" - +#include class SvgLoader : public Loader { @@ -27,6 +27,7 @@ private: string content; SvgLoaderData loaderData; SvgSceneBuilder builder; + future> rootProgress; unique_ptr root; public: -- 2.7.4