loader/svg: ++optimization

flush out the used internal memory immediately.
This commit is contained in:
Hermet Park 2023-08-21 12:32:46 +09:00 committed by Hermet Park
parent 5d32cf1e3b
commit f399491557
2 changed files with 37 additions and 31 deletions

View file

@ -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;

View file

@ -61,7 +61,7 @@ private:
float vh = 0;
bool header();
void clear();
void clear(bool all = true);
void run(unsigned tid) override;
};