From 3997aedcd506745231aa85524c501ca5c5798dd0 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 8 Jul 2021 19:25:50 +0900 Subject: [PATCH] svg_loader: optimize memory usage. -- unnecessary memory fragmentation. --- src/loaders/svg/tvgSvgLoader.cpp | 28 +++++++++----------------- src/loaders/svg/tvgSvgLoaderCommon.h | 4 ++-- src/loaders/svg/tvgSvgSceneBuilder.cpp | 4 ++-- 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index 6bff1d42..c6c7cc81 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -1578,12 +1578,10 @@ static SvgNode* _findNodeById(SvgNode *node, string* id) return result; } -static void _cloneGradStops(Array* dst, const Array* src) +static void _cloneGradStops(Array& dst, const Array& src) { - for (uint32_t i = 0; i < src->count; ++i) { - auto stop = static_cast(malloc(sizeof(Fill::ColorStop))); - *stop = *src->data[i]; - dst->push(stop); + for (uint32_t i = 0; i < src.count; ++i) { + dst.push(src.data[i]); } } @@ -1616,7 +1614,7 @@ static SvgStyleGradient* _cloneGradient(SvgStyleGradient* from) memcpy(grad->radial, from->radial, sizeof(SvgRadialGradient)); } - _cloneGradStops(&grad->stops, &from->stops); + _cloneGradStops(grad->stops, from->stops); return grad; error_grad_alloc: //LOG: allocation failed. out of memory @@ -2000,7 +1998,7 @@ static SvgStyleGradient* _createRadialGradient(SvgLoaderData* loader, const char static bool _attrParseStopsStyle(void* data, const char* key, const char* value) { SvgLoaderData* loader = (SvgLoaderData*)data; - auto stop = loader->svgParse->gradStop; + auto stop = &loader->svgParse->gradStop; if (!strcmp(key, "stop-opacity")) { stop->a = _toOpacity(value); @@ -2019,7 +2017,7 @@ static bool _attrParseStopsStyle(void* data, const char* key, const char* value) static bool _attrParseStops(void* data, const char* key, const char* value) { SvgLoaderData* loader = (SvgLoaderData*)data; - auto stop = loader->svgParse->gradStop; + auto stop = &loader->svgParse->gradStop; if (!strcmp(key, "offset")) { stop->offset = _toOffset(value); @@ -2313,13 +2311,10 @@ static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content, #endif return; } - auto stop = static_cast(calloc(1, sizeof(Fill::ColorStop))); - if (!stop) return; - loader->svgParse->gradStop = stop; /* default value for opacity */ - stop->a = 255; + loader->svgParse->gradStop = {0.0f, 0, 0, 0, 255}; simpleXmlParseAttributes(attrs, attrsLength, _attrParseStops, loader); - loader->latestGradient->stops.push(stop); + loader->latestGradient->stops.push(loader->svgParse->gradStop); } #ifdef THORVG_LOG_ENABLED else { @@ -2487,7 +2482,7 @@ static SvgStyleGradient* _gradientDup(Array* gradients, const for (uint32_t i = 0; i < gradients->count; ++i) { if (!((*gradList)->id->compare(*result->ref))) { if (result->stops.count == 0) { - _cloneGradStops(&result->stops, &(*gradList)->stops); + _cloneGradStops(result->stops, (*gradList)->stops); } //TODO: Properly inherit other property break; @@ -2540,11 +2535,6 @@ static void _freeGradientStyle(SvgStyleGradient* grad) free(grad->radial); free(grad->linear); if (grad->transform) free(grad->transform); - - for (uint32_t i = 0; i < grad->stops.count; ++i) { - auto colorStop = grad->stops.data[i]; - free(colorStop); - } grad->stops.reset(); free(grad); } diff --git a/src/loaders/svg/tvgSvgLoaderCommon.h b/src/loaders/svg/tvgSvgLoaderCommon.h index b9f02b80..efba6751 100644 --- a/src/loaders/svg/tvgSvgLoaderCommon.h +++ b/src/loaders/svg/tvgSvgLoaderCommon.h @@ -254,7 +254,7 @@ struct SvgStyleGradient SvgRadialGradient* radial; SvgLinearGradient* linear; Matrix* transform; - Array stops; + Array stops; bool userSpace; bool usePercentage; }; @@ -319,7 +319,7 @@ struct SvgParser { SvgNode* node; SvgStyleGradient* styleGrad; - Fill::ColorStop* gradStop; + Fill::ColorStop gradStop; SvgStopStyleFlags flags; struct { diff --git a/src/loaders/svg/tvgSvgSceneBuilder.cpp b/src/loaders/svg/tvgSvgSceneBuilder.cpp index 31f47c4e..711e473e 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -73,7 +73,7 @@ static unique_ptr _applyLinearGradientProperty(SvgStyleGradient* if (!stops) return fillGrad; auto prevOffset = 0.0f; for (uint32_t i = 0; i < g->stops.count; ++i) { - auto colorStop = g->stops.data[i]; + auto colorStop = &g->stops.data[i]; //Use premultiplied color stops[i].r = colorStop->r; stops[i].g = colorStop->g; @@ -139,7 +139,7 @@ static unique_ptr _applyRadialGradientProperty(SvgStyleGradient* if (!stops) return fillGrad; auto prevOffset = 0.0f; for (uint32_t i = 0; i < g->stops.count; ++i) { - auto colorStop = g->stops.data[i]; + auto colorStop = &g->stops.data[i]; //Use premultiplied color stops[i].r = colorStop->r; stops[i].g = colorStop->g;