svg_loader: refactoring code.

merge loader class with task to simplfy code.
This commit is contained in:
Hermet Park 2020-09-05 19:49:05 +09:00 committed by JunsuChoi
parent 241c25d722
commit 3e63263646
2 changed files with 27 additions and 37 deletions

View file

@ -2323,30 +2323,13 @@ static bool _svgLoaderParserForValidCheck(void* data, SimpleXMLType type, const
} }
void SvgTask::run()
{
if (!simpleXmlParse(loader->content, loader->size, true, _svgLoaderParser, &(loader->loaderData))) return;
if (loader->loaderData.doc) {
_updateStyle(loader->loaderData.doc, nullptr);
auto defs = loader->loaderData.doc->node.doc.defs;
if (defs) _updateGradient(loader->loaderData.doc, &defs->node.defs.gradients);
else {
if (loader->loaderData.gradients.cnt > 0) {
_updateGradient(loader->loaderData.doc, &loader->loaderData.gradients);
}
}
}
loader->root = loader->builder.build(loader->loaderData.doc);
};
/************************************************************************/ /************************************************************************/
/* External Class Implementation */ /* External Class Implementation */
/************************************************************************/ /************************************************************************/
SvgLoader::SvgLoader() : task(new SvgTask) SvgLoader::SvgLoader()
{ {
task->loader = this;
} }
@ -2356,6 +2339,24 @@ SvgLoader::~SvgLoader()
} }
void SvgLoader::run()
{
if (!simpleXmlParse(content, size, true, _svgLoaderParser, &(loaderData))) return;
if (loaderData.doc) {
_updateStyle(loaderData.doc, nullptr);
auto defs = loaderData.doc->node.doc.defs;
if (defs) _updateGradient(loaderData.doc, &defs->node.defs.gradients);
else {
if (loaderData.gradients.cnt > 0) {
_updateGradient(loaderData.doc, &loaderData.gradients);
}
}
}
root = builder.build(loaderData.doc);
};
bool SvgLoader::header() bool SvgLoader::header()
{ {
//For valid check, only <svg> tag is parsed first. //For valid check, only <svg> tag is parsed first.
@ -2417,7 +2418,7 @@ bool SvgLoader::read()
{ {
if (!content || size == 0) return false; if (!content || size == 0) return false;
TaskScheduler::request(task); TaskScheduler::request(this);
return true; return true;
} }
@ -2425,11 +2426,8 @@ bool SvgLoader::read()
bool SvgLoader::close() bool SvgLoader::close()
{ {
if (task) { this->get();
task->get();
delete(task);
task = nullptr;
}
if (loaderData.svgParse) { if (loaderData.svgParse) {
free(loaderData.svgParse); free(loaderData.svgParse);
loaderData.svgParse = nullptr; loaderData.svgParse = nullptr;
@ -2451,7 +2449,7 @@ bool SvgLoader::close()
unique_ptr<Scene> SvgLoader::data() unique_ptr<Scene> SvgLoader::data()
{ {
if (task) task->get(); this->get();
if (root) return move(root); if (root) return move(root);
else return nullptr; else return nullptr;
} }

View file

@ -25,16 +25,7 @@
#include "tvgSvgLoaderCommon.h" #include "tvgSvgLoaderCommon.h"
#include "tvgSvgSceneBuilder.h" #include "tvgSvgSceneBuilder.h"
class SvgLoader; class SvgLoader : public Loader, public Task
struct SvgTask : Task
{
SvgLoader* loader = nullptr;
void run() override;
};
class SvgLoader : public Loader
{ {
public: public:
string filePath; string filePath;
@ -44,7 +35,6 @@ public:
SvgLoaderData loaderData; SvgLoaderData loaderData;
SvgSceneBuilder builder; SvgSceneBuilder builder;
unique_ptr<Scene> root; unique_ptr<Scene> root;
SvgTask* task = nullptr;
SvgLoader(); SvgLoader();
~SvgLoader(); ~SvgLoader();
@ -54,6 +44,8 @@ public:
bool header(); bool header();
bool read() override; bool read() override;
bool close() override; bool close() override;
void run() override;
unique_ptr<Scene> data() override; unique_ptr<Scene> data() override;
}; };