diff --git a/src/examples/testDuplicate.cpp b/src/examples/testDuplicate.cpp index ba889e37..b963abf3 100644 --- a/src/examples/testDuplicate.cpp +++ b/src/examples/testDuplicate.cpp @@ -8,52 +8,76 @@ void tvgDrawCmds(tvg::Canvas* canvas) { if (!canvas) return; - //Prepare first shape, which will not be drawn - auto shape1 = tvg::Shape::gen(); - shape1->appendRect(10, 10, 200, 200, 0, 0); - shape1->appendRect(220, 10, 100, 100, 0, 0); + //Duplicate Shapes + { + //Original Shape + auto shape1 = tvg::Shape::gen(); + shape1->appendRect(10, 10, 200, 200, 0, 0); + shape1->appendRect(220, 10, 100, 100, 0, 0); - shape1->stroke(3); - shape1->stroke(0, 255, 0, 255); + shape1->stroke(3); + shape1->stroke(0, 255, 0, 255); - float dashPattern[2] = {4, 4}; - shape1->stroke(dashPattern, 2); - shape1->fill(255, 0, 0, 255); + float dashPattern[2] = {4, 4}; + shape1->stroke(dashPattern, 2); + shape1->fill(255, 0, 0, 255); - //Create second shape and duplicate parameters - auto shape2 = unique_ptr(static_cast(shape1->duplicate())); + //Duplicate Shape, Switch fill method + auto shape2 = unique_ptr(static_cast(shape1->duplicate())); + shape2->translate(0, 220); - //Create third shape, duplicate from first and add some new parameters - auto shape3 = unique_ptr(static_cast(shape1->duplicate())); + auto fill = tvg::LinearGradient::gen(); + fill->linear(10, 10, 440, 200); - //Move shape3 to new postion to don't cover second shape - shape3->translate(0, 220); + tvg::Fill::ColorStop colorStops[2]; + colorStops[0] = {0, 0, 0, 0, 255}; + colorStops[1] = {1, 255, 255, 255, 255}; + fill->colorStops(colorStops, 2); - //Append New paths - shape3->appendRect(340, 10, 100, 100, 0, 0); + shape2->fill(move(fill)); - //Fill shap3 with Linear Gradient - auto fill = tvg::LinearGradient::gen(); - fill->linear(10, 10, 440, 200); + //Duplicate Shape 2 + auto shape3 = unique_ptr(static_cast(shape2->duplicate())); + shape3->translate(0, 440); - //Gradient Color Stops - tvg::Fill::ColorStop colorStops[2]; - colorStops[0] = {0, 0, 0, 0, 255}; - colorStops[1] = {1, 255, 255, 255, 255}; + canvas->push(move(shape1)); + canvas->push(move(shape2)); + canvas->push(move(shape3)); + } - fill->colorStops(colorStops, 2); + //Duplicate Scene + { + //Create a Scene1 + auto scene1 = tvg::Scene::gen(); + scene1->reserve(3); - shape3->fill(move(fill)); + auto shape1 = tvg::Shape::gen(); + shape1->appendRect(0, 0, 400, 400, 50, 50); + shape1->fill(0, 255, 0, 255); + scene1->push(move(shape1)); - //Create fourth shape, duplicate from third and move position - auto shape4 = unique_ptr(static_cast(shape3->duplicate())); + auto shape2 = tvg::Shape::gen(); + shape2->appendCircle(400, 400, 200, 200); + shape2->fill(255, 255, 0, 255); + scene1->push(move(shape2)); + + auto shape3 = tvg::Shape::gen(); + shape3->appendCircle(600, 600, 150, 100); + shape3->fill(0, 255, 255, 255); + scene1->push(move(shape3)); + + scene1->scale(0.25); + scene1->translate(400, 0); + + //Duplicate Scene1 + auto scene2 = unique_ptr(static_cast(scene1->duplicate())); + scene2->translate(600, 200); + + canvas->push(move(scene1)); + canvas->push(move(scene2)); + } - //Move shape3 to new postion to don't cover second shape - shape4->translate(0, 440); - canvas->push(move(shape2)); - canvas->push(move(shape3)); - canvas->push(move(shape4)); } diff --git a/src/lib/tvgPaint.h b/src/lib/tvgPaint.h index 3bdba812..d47ba285 100644 --- a/src/lib/tvgPaint.h +++ b/src/lib/tvgPaint.h @@ -150,7 +150,18 @@ namespace tvg Paint* duplicate() { - return smethod->duplicate(); + auto ret = smethod->duplicate(); + + //duplicate Transform + if (rTransform) { + ret->pImpl->rTransform = new RenderTransform(); + if (ret->pImpl->rTransform) { + *ret->pImpl->rTransform = *rTransform; + ret->pImpl->flag |= RenderUpdateFlag::Transform; + } + } + + return ret; } }; diff --git a/src/lib/tvgSceneImpl.h b/src/lib/tvgSceneImpl.h index d9d60947..8073a707 100644 --- a/src/lib/tvgSceneImpl.h +++ b/src/lib/tvgSceneImpl.h @@ -91,8 +91,17 @@ struct Scene::Impl Paint* duplicate() { - //TODO: - return nullptr; + auto ret = Scene::gen(); + if (!ret) return nullptr; + auto dup = ret.get()->pImpl; + + dup->paints.reserve(paints.size()); + + for (auto paint: paints) { + dup->paints.push_back(paint->duplicate()); + } + + return ret.release(); } };