diff --git a/src/examples/images/image-embeded.svg b/src/examples/images/image-embeded.svg index 8f0712a1..3104bec9 100644 --- a/src/examples/images/image-embeded.svg +++ b/src/examples/images/image-embeded.svg @@ -7,6 +7,6 @@ - - - \ No newline at end of file + + + diff --git a/src/examples/images/logo.png b/src/examples/images/logo.png new file mode 100644 index 00000000..b08abf8b Binary files /dev/null and b/src/examples/images/logo.png differ diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index 88b24968..c1b3b337 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -2788,7 +2788,7 @@ void SvgLoader::run(unsigned tid) if (loaderData.cloneNodes.count > 0) _clonePostponedNodes(&loaderData.cloneNodes); } - root = svgSceneBuild(loaderData.doc, vx, vy, vw, vh, w, h, preserveAspect); + root = svgSceneBuild(loaderData.doc, vx, vy, vw, vh, w, h, preserveAspect, svgPath); } @@ -2857,6 +2857,7 @@ bool SvgLoader::open(const string& path) if (!f.is_open()) return false; + svgPath = path; getline(f, filePath, '\0'); f.close(); diff --git a/src/loaders/svg/tvgSvgLoader.h b/src/loaders/svg/tvgSvgLoader.h index 01e90d4d..468f0580 100644 --- a/src/loaders/svg/tvgSvgLoader.h +++ b/src/loaders/svg/tvgSvgLoader.h @@ -29,6 +29,7 @@ class SvgLoader : public LoadModule, public Task { public: string filePath; + string svgPath = ""; const char* content = nullptr; uint32_t size = 0; diff --git a/src/loaders/svg/tvgSvgSceneBuilder.cpp b/src/loaders/svg/tvgSvgSceneBuilder.cpp index 0026af40..fe7a2db5 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -469,7 +469,7 @@ static bool _isValidImageMimeTypeAndEncoding(const char** href, const char** mim } -static unique_ptr _imageBuildHelper(SvgNode* node, float vx, float vy, float vw, float vh) +static unique_ptr _imageBuildHelper(SvgNode* node, float vx, float vy, float vw, float vh, const string& svgPath) { if (!node->node.image.href) return nullptr; auto picture = Picture::gen(); @@ -496,7 +496,12 @@ static unique_ptr _imageBuildHelper(SvgNode* node, float vx, float vy, TVGLOG("SVG", "Embedded svg file is disabled."); return nullptr; } - if (picture->load(href) != Result::Success) return nullptr; + string imagePath = href; + if (strncmp(href, "/", 1)) { + auto last = svgPath.find_last_of("/"); + imagePath = svgPath.substr(0, (last == string::npos ? 0 : last + 1 )) + imagePath; + } + if (picture->load(imagePath) != Result::Success) return nullptr; } float w, h; @@ -512,7 +517,7 @@ static unique_ptr _imageBuildHelper(SvgNode* node, float vx, float vy, } -static unique_ptr _sceneBuildHelper(const SvgNode* node, float vx, float vy, float vw, float vh) +static unique_ptr _sceneBuildHelper(const SvgNode* node, float vx, float vy, float vw, float vh, const string& svgPath) { if (_isGroupType(node->type)) { auto scene = Scene::gen(); @@ -522,9 +527,9 @@ static unique_ptr _sceneBuildHelper(const SvgNode* node, float vx, float auto child = node->child.data; for (uint32_t i = 0; i < node->child.count; ++i, ++child) { if (_isGroupType((*child)->type)) { - scene->push(_sceneBuildHelper(*child, vx, vy, vw, vh)); + scene->push(_sceneBuildHelper(*child, vx, vy, vw, vh, svgPath)); } else if ((*child)->type == SvgNodeType::Image) { - auto image = _imageBuildHelper(*child, vx, vy, vw, vh); + auto image = _imageBuildHelper(*child, vx, vy, vw, vh, svgPath); if (image) scene->push(move(image)); } else { auto shape = _shapeBuildHelper(*child, vx, vy, vw, vh); @@ -544,11 +549,11 @@ static unique_ptr _sceneBuildHelper(const SvgNode* node, float vx, float /* External Class Implementation */ /************************************************************************/ -unique_ptr svgSceneBuild(SvgNode* node, float vx, float vy, float vw, float vh, float w, float h, bool preserveAspect) +unique_ptr svgSceneBuild(SvgNode* node, float vx, float vy, float vw, float vh, float w, float h, bool preserveAspect, const string& svgPath) { if (!node || (node->type != SvgNodeType::Doc)) return nullptr; - auto docNode = _sceneBuildHelper(node, vx, vy, vw, vh); + auto docNode = _sceneBuildHelper(node, vx, vy, vw, vh, svgPath); if (fabsf(w - vw) > FLT_EPSILON || fabsf(h - vh) > FLT_EPSILON) { auto sx = w / vw; diff --git a/src/loaders/svg/tvgSvgSceneBuilder.h b/src/loaders/svg/tvgSvgSceneBuilder.h index a09e3403..4232aca6 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.h +++ b/src/loaders/svg/tvgSvgSceneBuilder.h @@ -25,6 +25,6 @@ #include "tvgCommon.h" -unique_ptr svgSceneBuild(SvgNode* node, float vx, float vy, float vw, float vh, float w, float h, bool preserveAspect); +unique_ptr svgSceneBuild(SvgNode* node, float vx, float vy, float vw, float vh, float w, float h, bool preserveAspect, const string& svgPath); #endif //_TVG_SVG_SCENE_BUILDER_H_