diff --git a/src/examples/testDuplicate.cpp b/src/examples/testDuplicate.cpp index b963abf3..86fea2c0 100644 --- a/src/examples/testDuplicate.cpp +++ b/src/examples/testDuplicate.cpp @@ -77,7 +77,19 @@ void tvgDrawCmds(tvg::Canvas* canvas) canvas->push(move(scene2)); } + //Duplicate Picture + { + auto picture1 = tvg::Picture::gen(); + picture1->load(EXAMPLE_DIR"/tiger.svg"); + picture1->translate(370, 370); + picture1->scale(0.25); + auto picture2 = unique_ptr(static_cast(picture1->duplicate())); + picture2->translate(550, 550); + + canvas->push(move(picture1)); + canvas->push(move(picture2)); + } } diff --git a/src/lib/tvgPaint.h b/src/lib/tvgPaint.h index d47ba285..071a45fa 100644 --- a/src/lib/tvgPaint.h +++ b/src/lib/tvgPaint.h @@ -153,7 +153,7 @@ namespace tvg auto ret = smethod->duplicate(); //duplicate Transform - if (rTransform) { + if (ret && rTransform) { ret->pImpl->rTransform = new RenderTransform(); if (ret->pImpl->rTransform) { *ret->pImpl->rTransform = *rTransform; diff --git a/src/lib/tvgPictureImpl.h b/src/lib/tvgPictureImpl.h index b4c5ed58..9b742aab 100644 --- a/src/lib/tvgPictureImpl.h +++ b/src/lib/tvgPictureImpl.h @@ -43,16 +43,22 @@ struct Picture::Impl return true; } - bool update(RenderMethod &renderer, const RenderTransform* transform, RenderUpdateFlag flag) + void reload() { - if (loader) { + if (loader && !paint) { auto scene = loader->data(); if (scene) { - this->paint = scene.release(); - if (!this->paint) return false; + paint = scene.release(); + if (!paint) return; loader->close(); } } + } + + + bool update(RenderMethod &renderer, const RenderTransform* transform, RenderUpdateFlag flag) + { + reload(); if (!paint) return false; @@ -107,8 +113,15 @@ struct Picture::Impl Paint* duplicate() { - //TODO: - return nullptr; + reload(); + + if (!paint) return nullptr; + auto ret = Picture::gen(); + if (!ret) return nullptr; + auto dup = ret.get()->pImpl; + dup->paint = paint->duplicate(); + + return ret.release(); } };