From 1b3661a0b0bceb790f6352a9c89d0f9d081ade16 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Sat, 2 May 2020 18:06:06 +0900 Subject: [PATCH] common shape: renamed the method clear() to reset() Also, added one more showcase how to update only necessary properties of a shape while retaining other properties... Change-Id: If165bc7f8147cad0437e3ca2f7c007614c256248 --- .gitignore | 1 + inc/tizenvg.h | 2 +- src/lib/tvgShapeNode.cpp | 4 +- src/lib/tvgShapePath.h | 2 +- test/makefile | 1 + test/testDirectUpdate.cpp | 98 ++++++++++++++++++++++++++++++++++++++++ test/testUpdate.cpp | 112 +++++++++++++++++++++++----------------------- 7 files changed, 160 insertions(+), 60 deletions(-) create mode 100644 test/testDirectUpdate.cpp diff --git a/.gitignore b/.gitignore index 06f9099..a5643f4 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ testPath testPathCopy testBlending testUpdate +testDirectUpdate diff --git a/inc/tizenvg.h b/inc/tizenvg.h index 8708695..4a947da 100644 --- a/inc/tizenvg.h +++ b/inc/tizenvg.h @@ -117,7 +117,7 @@ public: ~ShapeNode(); int update(RenderMethod* engine) noexcept override; - int clear() noexcept; + int reset() noexcept; int moveTo(float x, float y) noexcept; int lineTo(float x, float y) noexcept; diff --git a/src/lib/tvgShapeNode.cpp b/src/lib/tvgShapeNode.cpp index b8397df..0a87211 100644 --- a/src/lib/tvgShapeNode.cpp +++ b/src/lib/tvgShapeNode.cpp @@ -103,12 +103,12 @@ int ShapeNode::update(RenderMethod* engine) noexcept } -int ShapeNode::clear() noexcept +int ShapeNode::reset() noexcept { auto impl = pImpl.get(); assert(impl); - impl->path->clear(); + impl->path->reset(); return 0; } diff --git a/src/lib/tvgShapePath.h b/src/lib/tvgShapePath.h index 2849099..6b016f1 100644 --- a/src/lib/tvgShapePath.h +++ b/src/lib/tvgShapePath.h @@ -62,7 +62,7 @@ struct ShapePath reservePts(this->ptsCnt + ptsCnt); } - void clear() + void reset() { cmdCnt = 0; ptsCnt = 0; diff --git a/test/makefile b/test/makefile index e12fb31..23fd51a 100644 --- a/test/makefile +++ b/test/makefile @@ -7,3 +7,4 @@ all: gcc -o testPathCopy testPathCopy.cpp -g -lstdc++ `pkg-config --cflags --libs elementary tizenvg` gcc -o testBlending testBlending.cpp -g -lstdc++ `pkg-config --cflags --libs elementary tizenvg` gcc -o testUpdate testUpdate.cpp -g -lstdc++ `pkg-config --cflags --libs elementary tizenvg` + gcc -o testDirectUpdate testDirectUpdate.cpp -g -lstdc++ `pkg-config --cflags --libs elementary tizenvg` diff --git a/test/testDirectUpdate.cpp b/test/testDirectUpdate.cpp new file mode 100644 index 0000000..ac6bdc3 --- /dev/null +++ b/test/testDirectUpdate.cpp @@ -0,0 +1,98 @@ +#include +#include + +using namespace std; + +#define WIDTH 800 +#define HEIGHT 800 + +static uint32_t buffer[WIDTH * HEIGHT]; +unique_ptr canvas = nullptr; +tvg::ShapeNode* pShape = nullptr; + +void tvgtest() +{ + //Create a Canvas + canvas = tvg::SwCanvas::gen(); + canvas->target(buffer, WIDTH, WIDTH, HEIGHT); + + //Shape + auto shape = tvg::ShapeNode::gen(); + + /* Acquire shape pointer to access it again. + instead, you should consider not to interrupt this pointer life-cycle. */ + pShape = shape.get(); + + shape->appendRect(-100, -100, 200, 200, 0); + shape->fill(127, 255, 255, 255); + canvas->push(move(shape)); + + //Draw first frame + canvas->draw(); + canvas->sync(); +} + +void transit_cb(Elm_Transit_Effect *effect, Elm_Transit* transit, double progress) +{ + /* Update shape directly. + You can update only necessary properties of this shape, + while retaining other properties. */ + + pShape->reset(); //reset path + + pShape->appendRect(-100 + (800 * progress), -100 + (800 * progress), 200, 200, (100 * progress)); + + //Update shape for drawing (this may work asynchronously) + pShape->update(canvas->engine()); + + //Draw Next frames + canvas->draw(); + canvas->sync(); + + //Update Efl Canvas + Eo* img = (Eo*) effect; + evas_object_image_data_update_add(img, 0, 0, WIDTH, HEIGHT); +} + +void +win_del(void *data, Evas_Object *o, void *ev) +{ + elm_exit(); +} + +int main(int argc, char **argv) +{ + //Initialize TizenVG Engine + tvg::Engine::init(); + + tvgtest(); + + //Show the result using EFL... + elm_init(argc, argv); + + Eo* win = elm_win_util_standard_add(NULL, "TizenVG Test"); + evas_object_smart_callback_add(win, "delete,request", win_del, 0); + + Eo* img = evas_object_image_filled_add(evas_object_evas_get(win)); + evas_object_image_size_set(img, WIDTH, HEIGHT); + evas_object_image_data_set(img, buffer); + evas_object_size_hint_weight_set(img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(img); + + elm_win_resize_object_add(win, img); + evas_object_geometry_set(win, 0, 0, WIDTH, HEIGHT); + evas_object_show(win); + + Elm_Transit *transit = elm_transit_add(); + elm_transit_effect_add(transit, transit_cb, img, nullptr); + elm_transit_duration_set(transit, 2); + elm_transit_repeat_times_set(transit, -1); + elm_transit_auto_reverse_set(transit, EINA_TRUE); + elm_transit_go(transit); + + elm_run(); + elm_shutdown(); + + //Terminate TizenVG Engine + tvg::Engine::term(); +} diff --git a/test/testUpdate.cpp b/test/testUpdate.cpp index c4250fb..97e81ec 100644 --- a/test/testUpdate.cpp +++ b/test/testUpdate.cpp @@ -11,80 +11,80 @@ unique_ptr canvas = nullptr; void tvgtest() { - //Create a Canvas - canvas = tvg::SwCanvas::gen(); - canvas->target(buffer, WIDTH, WIDTH, HEIGHT); - - //Shape - auto shape = tvg::ShapeNode::gen(); - shape->appendRect(-100, -100, 200, 200, 0); - shape->fill(255, 255, 255, 255); - canvas->push(move(shape)); - - //Draw first frame - canvas->draw(); - canvas->sync(); + //Create a Canvas + canvas = tvg::SwCanvas::gen(); + canvas->target(buffer, WIDTH, WIDTH, HEIGHT); + + //Shape + auto shape = tvg::ShapeNode::gen(); + shape->appendRect(-100, -100, 200, 200, 0); + shape->fill(255, 255, 255, 255); + canvas->push(move(shape)); + + //Draw first frame + canvas->draw(); + canvas->sync(); } void transit_cb(Elm_Transit_Effect *effect, Elm_Transit* transit, double progress) { - //Explicitly clear all retained paint nodes. - canvas->clear(); - - //Shape - auto shape = tvg::ShapeNode::gen(); - shape->appendRect(-100 + (800 * progress), -100 + (800 * progress), 200, 200, (100 * progress)); - shape->fill(rand()%255, rand()%255, rand()%255, 255); - canvas->push(move(shape)); - - //Draw Next frames - canvas->draw(); - canvas->sync(); - - //Update Efl Canvas - Eo* img = (Eo*) effect; - evas_object_image_data_update_add(img, 0, 0, WIDTH, HEIGHT); + //Explicitly clear all retained paint nodes. + canvas->clear(); + + //Shape + auto shape = tvg::ShapeNode::gen(); + shape->appendRect(-100 + (800 * progress), -100 + (800 * progress), 200, 200, (100 * progress)); + shape->fill(rand()%255, rand()%255, rand()%255, 255); + canvas->push(move(shape)); + + //Draw Next frames + canvas->draw(); + canvas->sync(); + + //Update Efl Canvas + Eo* img = (Eo*) effect; + evas_object_image_data_update_add(img, 0, 0, WIDTH, HEIGHT); } void win_del(void *data, Evas_Object *o, void *ev) { - elm_exit(); + elm_exit(); } int main(int argc, char **argv) { - //Initialize TizenVG Engine - tvg::Engine::init(); + //Initialize TizenVG Engine + tvg::Engine::init(); - tvgtest(); + tvgtest(); - //Show the result using EFL... - elm_init(argc, argv); + //Show the result using EFL... + elm_init(argc, argv); - Eo* win = elm_win_util_standard_add(NULL, "TizenVG Test"); - evas_object_smart_callback_add(win, "delete,request", win_del, 0); + Eo* win = elm_win_util_standard_add(NULL, "TizenVG Test"); + evas_object_smart_callback_add(win, "delete,request", win_del, 0); - Eo* img = evas_object_image_filled_add(evas_object_evas_get(win)); - evas_object_image_size_set(img, WIDTH, HEIGHT); - evas_object_image_data_set(img, buffer); - evas_object_size_hint_weight_set(img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(img); + Eo* img = evas_object_image_filled_add(evas_object_evas_get(win)); + evas_object_image_size_set(img, WIDTH, HEIGHT); + evas_object_image_data_set(img, buffer); + evas_object_size_hint_weight_set(img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(img); - elm_win_resize_object_add(win, img); - evas_object_geometry_set(win, 0, 0, WIDTH, HEIGHT); - evas_object_show(win); + elm_win_resize_object_add(win, img); + evas_object_geometry_set(win, 0, 0, WIDTH, HEIGHT); + evas_object_show(win); - Elm_Transit *transit = elm_transit_add(); - elm_transit_effect_add(transit, transit_cb, img, nullptr); - elm_transit_duration_set(transit, 2); - elm_transit_repeat_times_set(transit, -1); - elm_transit_auto_reverse_set(transit, EINA_TRUE); - elm_transit_go(transit); + Elm_Transit *transit = elm_transit_add(); + elm_transit_effect_add(transit, transit_cb, img, nullptr); + elm_transit_duration_set(transit, 2); + elm_transit_repeat_times_set(transit, -1); + elm_transit_auto_reverse_set(transit, EINA_TRUE); + elm_transit_go(transit); - elm_run(); - elm_shutdown(); + elm_run(); + elm_shutdown(); - //Terminate TizenVG Engine - tvg::Engine::term(); -} \ No newline at end of file + //Terminate TizenVG Engine + tvg::Engine::term(); +} -- 2.7.4