From 12d7ca351d920839d2c7bd371657958cbfe3a276 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 1336f244..3f189668 100644 --- a/src/common/tvgStr.cpp +++ b/src/common/tvgStr.cpp @@ -229,6 +229,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 9e5f9ba9..56fdf86f 100644 --- a/src/common/tvgStr.h +++ b/src/common/tvgStr.h @@ -31,6 +31,7 @@ namespace tvg float strToFloat(const char *nPtr, char **endPtr); //convert to float int str2int(const char* str, size_t n); //convert to integer 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 cccd056a..492cebe3 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); }