From c37e4056acc61001dfab8dc074b04cfca915d01c Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Wed, 4 Sep 2024 19:15:07 +0200 Subject: [PATCH] svg_loader: append text to the SvgTextNode Text can be added in parts due to the presence of the tag. This requires that each subsequent piece of text is appended rather than overwriting the previous one. --- src/common/tvgStr.cpp | 8 ++++++++ src/common/tvgStr.h | 1 + src/loaders/svg/tvgSvgLoader.cpp | 4 ++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/common/tvgStr.cpp b/src/common/tvgStr.cpp index eb436f5b..1ebdd41c 100644 --- a/src/common/tvgStr.cpp +++ b/src/common/tvgStr.cpp @@ -219,6 +219,14 @@ char* strDuplicate(const char *str, size_t n) return (char *) memcpy(ret, str, n); } +char* strAppend(char* lhs, const char* rhs, size_t n) +{ + if (!rhs) return lhs; + if (!lhs) return strDuplicate(rhs, n); + lhs = (char*)realloc(lhs, strlen(lhs) + n + 1); + return strncat(lhs, rhs, n); +} + char* strDirname(const char* path) { const char *ptr = strrchr(path, '/'); diff --git a/src/common/tvgStr.h b/src/common/tvgStr.h index 272ff4ac..6b16b4c7 100644 --- a/src/common/tvgStr.h +++ b/src/common/tvgStr.h @@ -30,6 +30,7 @@ namespace tvg float strToFloat(const char *nPtr, char **endPtr); //convert to float char* strDuplicate(const char *str, size_t n); //copy the string +char* strAppend(char* lhs, const char* rhs, size_t n); //append the rhs to the lhs char* strDirname(const char* path); //return the full directory name } diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index 66d6b7ff..93457bc3 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -2183,6 +2183,7 @@ static SvgNode* _createTextNode(SvgLoaderData* loader, SvgNode* parent, const ch //TODO: support the def font and size as used in a system? loader->svgParse->node->node.text.fontSize = 10.0f; loader->svgParse->node->node.text.fontFamily = nullptr; + loader->svgParse->node->node.text.text = nullptr; func(buf, bufLength, _attrParseTextNode, loader); @@ -3400,8 +3401,7 @@ static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content, static void _svgLoaderParserText(SvgLoaderData* loader, const char* content, unsigned int length) { auto text = &loader->svgParse->node->node.text; - if (text->text) free(text->text); - text->text = strDuplicate(content, length); + text->text = strAppend(text->text, content, length); }