mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-14 12:04:29 +00:00
loader/svg: ++optimization
flush out the used internal memory immediately.
This commit is contained in:
parent
5d32cf1e3b
commit
f399491557
2 changed files with 37 additions and 31 deletions
|
@ -3460,8 +3460,29 @@ static bool _svgLoaderParserForValidCheck(void* data, SimpleXMLType type, const
|
|||
}
|
||||
|
||||
|
||||
void SvgLoader::clear()
|
||||
void SvgLoader::clear(bool all)
|
||||
{
|
||||
//flush out the intermediate data
|
||||
free(loaderData.svgParse);
|
||||
loaderData.svgParse = nullptr;
|
||||
|
||||
for (auto gradient = loaderData.gradients.data; gradient < loaderData.gradients.end(); ++gradient) {
|
||||
(*gradient)->clear();
|
||||
free(*gradient);
|
||||
}
|
||||
loaderData.gradients.reset();
|
||||
|
||||
_freeNode(loaderData.doc);
|
||||
loaderData.doc = nullptr;
|
||||
loaderData.stack.reset();
|
||||
|
||||
if (!all) return;
|
||||
|
||||
for (auto p = loaderData.images.data; p < loaderData.images.end(); ++p) {
|
||||
free(*p);
|
||||
}
|
||||
loaderData.images.reset();
|
||||
|
||||
if (copy) free((char*)content);
|
||||
size = 0;
|
||||
content = nullptr;
|
||||
|
@ -3513,6 +3534,20 @@ void SvgLoader::run(unsigned tid)
|
|||
if (defs) _updateGradient(&loaderData, loaderData.doc, &defs->node.defs.gradients);
|
||||
}
|
||||
root = svgSceneBuild(loaderData, {vx, vy, vw, vh}, w, h, align, meetOrSlice, svgPath, viewFlag);
|
||||
|
||||
//In case no viewbox and width/height data is provided the completion of loading
|
||||
//has to be forced, in order to establish this data based on the whole picture.
|
||||
if (!(viewFlag & SvgViewFlag::Viewbox)) {
|
||||
//Override viewbox & size again after svg loading.
|
||||
vx = loaderData.doc->node.doc.vx;
|
||||
vy = loaderData.doc->node.doc.vy;
|
||||
vw = loaderData.doc->node.doc.vw;
|
||||
vh = loaderData.doc->node.doc.vh;
|
||||
w = loaderData.doc->node.doc.w;
|
||||
h = loaderData.doc->node.doc.h;
|
||||
}
|
||||
|
||||
clear(false);
|
||||
}
|
||||
|
||||
|
||||
|
@ -3582,14 +3617,6 @@ bool SvgLoader::header()
|
|||
}
|
||||
|
||||
run(0);
|
||||
|
||||
//Override viewbox & size again after svg loading.
|
||||
vx = loaderData.doc->node.doc.vx;
|
||||
vy = loaderData.doc->node.doc.vy;
|
||||
vw = loaderData.doc->node.doc.vw;
|
||||
vh = loaderData.doc->node.doc.vh;
|
||||
w = loaderData.doc->node.doc.w;
|
||||
h = loaderData.doc->node.doc.h;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -3669,27 +3696,6 @@ bool SvgLoader::close()
|
|||
{
|
||||
this->done();
|
||||
|
||||
if (loaderData.svgParse) {
|
||||
free(loaderData.svgParse);
|
||||
loaderData.svgParse = nullptr;
|
||||
}
|
||||
auto gradients = loaderData.gradients.data;
|
||||
for (size_t i = 0; i < loaderData.gradients.count; ++i) {
|
||||
(*gradients)->clear();
|
||||
free(*gradients);
|
||||
++gradients;
|
||||
}
|
||||
loaderData.gradients.reset();
|
||||
|
||||
_freeNode(loaderData.doc);
|
||||
loaderData.doc = nullptr;
|
||||
loaderData.stack.reset();
|
||||
|
||||
for (auto p = loaderData.images.data; p < loaderData.images.end(); ++p) {
|
||||
free(*p);
|
||||
}
|
||||
loaderData.images.reset();
|
||||
|
||||
clear();
|
||||
|
||||
return true;
|
||||
|
|
|
@ -61,7 +61,7 @@ private:
|
|||
float vh = 0;
|
||||
|
||||
bool header();
|
||||
void clear();
|
||||
void clear(bool all = true);
|
||||
void run(unsigned tid) override;
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue