From 4d6dee91e4c2347b4f9e97df29e3585a2a5634b3 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 29 Jun 2020 14:59:01 +0900 Subject: [PATCH] test shape: unify sw/gl test code. default is sw engine, please run sample app with "gl" argument $./testShape gl Change-Id: Iff7da624ff17827df957919341737b9f129f502e --- .gitignore | 1 - test/makefile | 1 - test/testGlShape.cpp | 107 -------------------------------------- test/testShape.cpp | 120 +++++++++++++++++++++++++++++++++++-------- 4 files changed, 99 insertions(+), 130 deletions(-) delete mode 100644 test/testGlShape.cpp diff --git a/.gitignore b/.gitignore index f6c52c51..9a645208 100644 --- a/.gitignore +++ b/.gitignore @@ -19,5 +19,4 @@ testLinearGradient testRadialGradient testGradientTransform testSvg -testGlShape testAsync diff --git a/test/makefile b/test/makefile index 33eb7d98..6455a0a2 100644 --- a/test/makefile +++ b/test/makefile @@ -17,5 +17,4 @@ all: gcc -o testRadialGradient testRadialGradient.cpp -g -lstdc++ `pkg-config --cflags --libs elementary thorvg` gcc -o testGradientTransform testGradientTransform.cpp -g -lstdc++ `pkg-config --cflags --libs elementary thorvg` gcc -o testSvg testSvg.cpp -g -lstdc++ `pkg-config --cflags --libs elementary thorvg` - gcc -o testGlShape testGlShape.cpp -g -lstdc++ `pkg-config --cflags --libs elementary thorvg` gcc -o testAsync testAsync.cpp -g -lstdc++ `pkg-config --cflags --libs elementary thorvg` diff --git a/test/testGlShape.cpp b/test/testGlShape.cpp deleted file mode 100644 index c488091c..00000000 --- a/test/testGlShape.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include -#include - -using namespace std; - -#define WIDTH 800 -#define HEIGHT 800 -#define BPP 4 -static Evas_GL_API *glapi; -static unique_ptr canvas; - -void tvgtest() -{ - //Create a Canvas - canvas = tvg::GlCanvas::gen(); - canvas->target(nullptr, WIDTH * BPP, WIDTH, HEIGHT); - - //Prepare a Shape (Rectangle + Rectangle + Circle + Circle) - auto shape1 = tvg::Shape::gen(); - shape1->appendRect(0, 0, 200, 200, 0); //x, y, w, h, cornerRadius - shape1->appendRect(100, 100, 300, 300, 100); //x, y, w, h, cornerRadius - shape1->appendCircle(400, 400, 100, 100); //cx, cy, radiusW, radiusH - shape1->appendCircle(400, 500, 170, 100); //cx, cy, radiusW, radiusH - shape1->fill(255, 255, 0, 255); //r, g, b, a - shape1->stroke(255, 0, 0, 255); //r, g, b, a - shape1->stroke(10.0f); - - /* Push the shape into the Canvas drawing list - When this shape is into the canvas list, the shape could update & prepare - internal data asynchronously for coming rendering. - Canvas keeps this shape node unless user call canvas->clear() */ - canvas->push(move(shape1)); -} - -void init_gl(Evas_Object *obj) -{ - //Initialize ThorVG Engine - tvg::Initializer::init(tvg::CanvasEngine::Gl); - - tvgtest(); -} - -void del_gl(Evas_Object *obj) -{ - //Terminate ThorVG Engine - tvg::Initializer::term(tvg::CanvasEngine::Gl); -} - -void draw_gl(Evas_Object *obj) -{ - Evas_GL_API *gl = elm_glview_gl_api_get(obj); - int w, h; - elm_glview_size_get(obj, &w, &h); - gl->glViewport(0, 0, w, h); - gl->glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - gl->glClear(GL_COLOR_BUFFER_BIT); - gl->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - gl->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE); - gl->glEnable(GL_BLEND); - - canvas->draw(); - canvas->sync(); -} - -void win_del(void *data, Evas_Object *o, void *ev) -{ - elm_exit(); -} - -int main(int argc, char **argv) -{ - //Show the result using EFL... - elm_init(argc, argv); - - elm_config_accel_preference_set("gl"); - - Eo* win = elm_win_util_standard_add(nullptr, "ThorVG Test"); - evas_object_smart_callback_add(win, "delete,request", win_del, 0); - - //Create a new glview object - Eo* gl = elm_glview_add(win); - glapi = elm_glview_gl_api_get(gl); - evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - - elm_glview_mode_set(gl, ELM_GLVIEW_ALPHA); - elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); - elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND); - - evas_object_resize(gl, WIDTH, HEIGHT); - - //Initialize callback function gets registered here - elm_glview_init_func_set(gl, init_gl); - //Delete callback function gets registered here - elm_glview_del_func_set(gl, del_gl); - elm_glview_render_func_set(gl, draw_gl); - - evas_object_show(gl); - - evas_object_geometry_set(win, 0, 0, WIDTH, HEIGHT); - evas_object_show(win); - - elm_run(); - elm_shutdown(); - - return 0; -} diff --git a/test/testShape.cpp b/test/testShape.cpp index a79c770c..e32142fb 100644 --- a/test/testShape.cpp +++ b/test/testShape.cpp @@ -6,17 +6,8 @@ using namespace std; #define WIDTH 800 #define HEIGHT 800 -static uint32_t buffer[WIDTH * HEIGHT]; - -void tvgtest() +unique_ptr tvgDrawCmds() { - //Initialize ThorVG Engine - tvg::Initializer::init(tvg::CanvasEngine::Sw); - - //Create a Canvas - auto canvas = tvg::SwCanvas::gen(); - canvas->target(buffer, WIDTH, WIDTH, HEIGHT); - //Prepare a Shape (Rectangle + Rectangle + Circle + Circle) auto shape1 = tvg::Shape::gen(); shape1->appendRect(0, 0, 200, 200, 0); //x, y, w, h, cornerRadius @@ -25,12 +16,27 @@ void tvgtest() shape1->appendCircle(400, 500, 170, 100); //cx, cy, radiusW, radiusH shape1->fill(255, 255, 0, 255); //r, g, b, a + return move(shape1); +} + +/************************************************************************/ +/* Sw Engine Test Code */ +/************************************************************************/ + +void tvgSwTest(uint32_t* buffer) +{ + //Initialize ThorVG Engine + tvg::Initializer::init(tvg::CanvasEngine::Sw); + + //Create a Canvas + auto canvas = tvg::SwCanvas::gen(); + canvas->target(buffer, WIDTH, WIDTH, HEIGHT); + /* Push the shape into the Canvas drawing list When this shape is into the canvas list, the shape could update & prepare internal data asynchronously for coming rendering. Canvas keeps this shape node unless user call canvas->clear() */ - canvas->push(move(shape1)); - + canvas->push(tvgDrawCmds()); canvas->draw(); canvas->sync(); @@ -38,29 +44,101 @@ void tvgtest() tvg::Initializer::term(tvg::CanvasEngine::Sw); } +/************************************************************************/ +/* GL Engine Test Code */ +/************************************************************************/ + +static unique_ptr canvas; + +void initGLview(Evas_Object *obj) +{ + static constexpr auto BPP = 4; + + //Initialize ThorVG Engine + tvg::Initializer::init(tvg::CanvasEngine::Gl); + + //Create a Canvas + canvas = tvg::GlCanvas::gen(); + canvas->target(nullptr, WIDTH * BPP, WIDTH, HEIGHT); + + /* Push the shape into the Canvas drawing list + When this shape is into the canvas list, the shape could update & prepare + internal data asynchronously for coming rendering. + Canvas keeps this shape node unless user call canvas->clear() */ + canvas->push(tvgDrawCmds()); +} + +void delGLview(Evas_Object *obj) +{ + //Terminate ThorVG Engine + tvg::Initializer::term(tvg::CanvasEngine::Gl); +} + +void drawGLview(Evas_Object *obj) +{ + auto gl = elm_glview_gl_api_get(obj); + int w, h; + elm_glview_size_get(obj, &w, &h); + gl->glViewport(0, 0, w, h); + gl->glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + gl->glClear(GL_COLOR_BUFFER_BIT); + gl->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + gl->glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE); + gl->glEnable(GL_BLEND); + + canvas->draw(); + canvas->sync(); +} + +/************************************************************************/ +/* Common Infrastructure Code */ +/************************************************************************/ + void win_del(void *data, Evas_Object *o, void *ev) { elm_exit(); } - int main(int argc, char **argv) { - tvgtest(); + bool swEngine = true; + + if (argc > 1) { + if (!strcmp(argv[1], "gl")) swEngine = false; + } + + elm_init(argc, argv); //Show the result using EFL... - elm_init(argc, argv); + elm_config_accel_preference_set("gl"); Eo* win = elm_win_util_standard_add(NULL, "ThorVG 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* viewer; - elm_win_resize_object_add(win, img); + if (swEngine) { + static uint32_t buffer[WIDTH * HEIGHT]; + viewer = evas_object_image_filled_add(evas_object_evas_get(win)); + evas_object_image_size_set(viewer, WIDTH, HEIGHT); + evas_object_image_data_set(viewer, buffer); + evas_object_size_hint_weight_set(viewer, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(viewer); + tvgSwTest(buffer); + //GlEngine + } else { + viewer = elm_glview_add(win); + evas_object_size_hint_weight_set(viewer, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_glview_mode_set(viewer, ELM_GLVIEW_ALPHA); + elm_glview_resize_policy_set(viewer, ELM_GLVIEW_RESIZE_POLICY_RECREATE); + elm_glview_render_policy_set(viewer, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND); + elm_glview_init_func_set(viewer, initGLview); + elm_glview_del_func_set(viewer, delGLview); + elm_glview_render_func_set(viewer, drawGLview); + evas_object_show(viewer); + } + + elm_win_resize_object_add(win, viewer); evas_object_geometry_set(win, 0, 0, WIDTH, HEIGHT); evas_object_show(win);