mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-15 12:34:30 +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);
|
if (copy) free((char*)content);
|
||||||
size = 0;
|
size = 0;
|
||||||
content = nullptr;
|
content = nullptr;
|
||||||
|
@ -3513,6 +3534,20 @@ void SvgLoader::run(unsigned tid)
|
||||||
if (defs) _updateGradient(&loaderData, loaderData.doc, &defs->node.defs.gradients);
|
if (defs) _updateGradient(&loaderData, loaderData.doc, &defs->node.defs.gradients);
|
||||||
}
|
}
|
||||||
root = svgSceneBuild(loaderData, {vx, vy, vw, vh}, w, h, align, meetOrSlice, svgPath, viewFlag);
|
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);
|
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;
|
return true;
|
||||||
|
@ -3669,27 +3696,6 @@ bool SvgLoader::close()
|
||||||
{
|
{
|
||||||
this->done();
|
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();
|
clear();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -61,7 +61,7 @@ private:
|
||||||
float vh = 0;
|
float vh = 0;
|
||||||
|
|
||||||
bool header();
|
bool header();
|
||||||
void clear();
|
void clear(bool all = true);
|
||||||
void run(unsigned tid) override;
|
void run(unsigned tid) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue