From 700a44c623f9ff663d7b6488dbe831fe672ca7be Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 30 Apr 2020 19:11:04 +0900 Subject: [PATCH] common shape: added path commands interfaces for user convenient. +lineTo() +moveTo() +cubicTo() +close() These interfaces might not perfect optmizied, but you can build path commands easier than manual data set. Change-Id: Icb934ca256d3107ca0c938d28015d767fb93355e --- .gitignore | 1 + inc/tizenvg.h | 5 +++ src/lib/sw_engine/tvgSwRle.cpp | 2 +- src/lib/tvgShapeNode.cpp | 45 +++++++++++++++++++++ src/lib/tvgShapePath.h | 9 +---- test/makefile | 1 + test/testPath2.cpp | 89 ++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 144 insertions(+), 8 deletions(-) create mode 100644 test/testPath2.cpp diff --git a/.gitignore b/.gitignore index ddc6523..8e92d13 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ testMultiShapes testMergeShapes testBoundary testPath +testPath2 diff --git a/inc/tizenvg.h b/inc/tizenvg.h index 89db3f5..83e5f1d 100644 --- a/inc/tizenvg.h +++ b/inc/tizenvg.h @@ -119,6 +119,11 @@ public: int update(RenderMethod* engine) noexcept override; int clear() noexcept; + int moveTo(float x, float y) noexcept; + int lineTo(float x, float y) noexcept; + int cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) noexcept; + int close() noexcept; + int appendRect(float x, float y, float w, float h, float cornerRadius) noexcept; int appendCircle(float cx, float cy, float radiusW, float radiusH) noexcept; int appendPath(const PathCommand* cmds, size_t cmdCnt, const Point* pts, size_t ptsCnt) noexcept; diff --git a/src/lib/sw_engine/tvgSwRle.cpp b/src/lib/sw_engine/tvgSwRle.cpp index 02870c3..5166de8 100644 --- a/src/lib/sw_engine/tvgSwRle.cpp +++ b/src/lib/sw_engine/tvgSwRle.cpp @@ -637,7 +637,7 @@ static bool _decomposeOutline(RleWorker& rw) } } - //Close the contour with a line segment? + //FIXME: Close the contour with a line segment? //_lineTo(rw, UPSCALE(outline->pts[first])); close: first = last + 1; diff --git a/src/lib/tvgShapeNode.cpp b/src/lib/tvgShapeNode.cpp index 12ce6de..b8397df 100644 --- a/src/lib/tvgShapeNode.cpp +++ b/src/lib/tvgShapeNode.cpp @@ -144,12 +144,57 @@ int ShapeNode::appendPath(const PathCommand *cmds, size_t cmdCnt, const Point* p auto impl = pImpl.get(); assert(impl); + impl->path->grow(cmdCnt, ptsCnt); impl->path->append(cmds, cmdCnt, pts, ptsCnt); return 0; } +int ShapeNode::moveTo(float x, float y) noexcept +{ + auto impl = pImpl.get(); + assert(impl); + + impl->path->moveTo(x, y); + + return 0; +} + + +int ShapeNode::lineTo(float x, float y) noexcept +{ + auto impl = pImpl.get(); + assert(impl); + + impl->path->lineTo(x, y); + + return 0; +} + + +int ShapeNode::cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) noexcept +{ + auto impl = pImpl.get(); + assert(impl); + + impl->path->cubicTo(cx1, cy1, cx2, cy2, x, y); + + return 0; +} + + +int ShapeNode::close() noexcept +{ + auto impl = pImpl.get(); + assert(impl); + + impl->path->close(); + + return 0; +} + + int ShapeNode::appendCircle(float cx, float cy, float radiusW, float radiusH) noexcept { auto impl = pImpl.get(); diff --git a/src/lib/tvgShapePath.h b/src/lib/tvgShapePath.h index f4fee18..2849099 100644 --- a/src/lib/tvgShapePath.h +++ b/src/lib/tvgShapePath.h @@ -56,12 +56,6 @@ struct ShapePath assert(pts); } - void reserve(size_t cmdCnt, size_t ptsCnt) - { - reserveCmd(cmdCnt); - reservePts(ptsCnt); - } - void grow(size_t cmdCnt, size_t ptsCnt) { reserveCmd(this->cmdCnt + cmdCnt); @@ -76,7 +70,6 @@ struct ShapePath void append(const PathCommand* cmds, size_t cmdCnt, const Point* pts, size_t ptsCnt) { - grow(cmdCnt, ptsCnt); memcpy(this->cmds + this->cmdCnt, cmds, sizeof(PathCommand) * cmdCnt); memcpy(this->pts + this->ptsCnt, pts, sizeof(Point) * ptsCnt); this->cmdCnt += cmdCnt; @@ -114,6 +107,8 @@ struct ShapePath void close() { + if (cmdCnt > 0 && cmds[cmdCnt - 1] == PathCommand::Close) return; + if (cmdCnt + 1 > reservedCmdCnt) reserveCmd((cmdCnt + 1) * 2); cmds[cmdCnt++] = PathCommand::Close; } diff --git a/test/makefile b/test/makefile index e213907..1471ecd 100644 --- a/test/makefile +++ b/test/makefile @@ -4,3 +4,4 @@ all: gcc -o testMergeShapes testMergeShapes.cpp -g -lstdc++ `pkg-config --cflags --libs elementary tizenvg` gcc -o testBoundary testBoundary.cpp -g -lstdc++ `pkg-config --cflags --libs elementary tizenvg` gcc -o testPath testPath.cpp -g -lstdc++ `pkg-config --cflags --libs elementary tizenvg` + gcc -o testPath2 testPath2.cpp -g -lstdc++ `pkg-config --cflags --libs elementary tizenvg` diff --git a/test/testPath2.cpp b/test/testPath2.cpp new file mode 100644 index 0000000..3c6738a --- /dev/null +++ b/test/testPath2.cpp @@ -0,0 +1,89 @@ +#include +#include + +using namespace std; + +#define WIDTH 800 +#define HEIGHT 800 + +static uint32_t buffer[WIDTH * HEIGHT]; + +void tvgtest() +{ + //Initialize TizenVG Engine + tvg::Engine::init(); + + //Create a Canvas + auto canvas = tvg::SwCanvas::gen(buffer, WIDTH, HEIGHT); + + //Star + auto shape1 = tvg::ShapeNode::gen(); + + //Appends Paths + shape1->moveTo(199, 34); + shape1->lineTo(253, 143); + shape1->lineTo(374, 160); + shape1->lineTo(287, 244); + shape1->lineTo(307, 365); + shape1->lineTo(199, 309); + shape1->lineTo(97, 365); + shape1->lineTo(112, 245); + shape1->lineTo(26, 161); + shape1->lineTo(146, 143); + shape1->close(); + shape1->fill(0, 0, 255, 255); + canvas->push(move(shape1)); + + //Circle + auto shape2 = tvg::ShapeNode::gen(); + + auto cx = 550.0f; + auto cy = 550.0f; + auto radius = 125.0f; + auto halfRadius = radius * 0.552284f; + + //Append Paths + shape2->moveTo(cx, cy - radius); + shape2->cubicTo(cx + halfRadius, cy - radius, cx + radius, cy - halfRadius, cx + radius, cy); + shape2->cubicTo(cx + radius, cy + halfRadius, cx + halfRadius, cy + radius, cx, cy+ radius); + shape2->cubicTo(cx - halfRadius, cy + radius, cx - radius, cy + halfRadius, cx - radius, cy); + shape2->cubicTo(cx - radius, cy - halfRadius, cx - halfRadius, cy - radius, cx, cy - radius); + shape2->fill(255, 0, 0, 255); + canvas->push(move(shape2)); + + canvas->draw(); + canvas->sync(); + + //Terminate TizenVG Engine + tvg::Engine::term(); +} + +void +win_del(void *data, Evas_Object *o, void *ev) +{ + elm_exit(); +} + +int main(int argc, char **argv) +{ + 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_run(); + elm_shutdown(); +} -- 2.7.4