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_