From 9b4874dc7b73fe047bcee5e85348bc0737e02365 Mon Sep 17 00:00:00 2001 From: Michal Szczecinski Date: Wed, 4 Nov 2020 17:52:15 +0100 Subject: [PATCH] evas vector: Added shape path getter for thorvg. This commit adds implementation of evas_vg_shape_path_get() api for thorvg shapes. It is needed to render edje vector parts. Change-Id: I2a14238e9f7c051f62e9b3e592c2e9396550f3ba --- src/lib/evas/canvas/efl_canvas_vg_shape.c | 56 ++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/lib/evas/canvas/efl_canvas_vg_shape.c b/src/lib/evas/canvas/efl_canvas_vg_shape.c index 68d17e0..d27a1ad 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_shape.c +++ b/src/lib/evas/canvas/efl_canvas_vg_shape.c @@ -100,6 +100,19 @@ _get_shape_data(Evas_Vg_Shape *obj) return nd->data; } +static Evas_Vg_Path_Command +_get_evas_command(Tvg_Path_Command cmd) +{ + switch(cmd) + { + case TVG_PATH_COMMAND_MOVE_TO: return EVAS_VG_PATH_COMMAND_MOVE_TO; + case TVG_PATH_COMMAND_LINE_TO: return EVAS_VG_PATH_COMMAND_LINE_TO; + case TVG_PATH_COMMAND_CUBIC_TO: return EVAS_VG_PATH_COMMAND_CUBIC_TO; + case TVG_PATH_COMMAND_CLOSE: return EVAS_VG_PATH_COMMAND_CLOSE; + default: return EVAS_VG_PATH_COMMAND_END; + } +} + static void _assign_current_point(Efl_Canvas_Vg_Shape_Data *sd, void *cmd EINA_UNUSED, double x, double y) { @@ -1029,8 +1042,49 @@ evas_vg_shape_path_set(Evas_Vg_Shape *obj, const Evas_Vg_Path_Command *op, const EAPI void evas_vg_shape_path_get(Evas_Vg_Shape *obj, const Evas_Vg_Path_Command **op, const double **points) { - //TODO: implement + if (!op || !points) return; +#ifdef HAVE_THORVG + Tvg_Paint *shape = NULL; + + const Tvg_Path_Command *tvg_cmds = NULL; + uint32_t cmds_len = 0; + + const Tvg_Point *tvg_pts = NULL; + uint32_t pts_len = 0; + + unsigned int i = 0, j = 0; + + Evas_Vg_Path_Command *evas_cmds = NULL; + double *evas_pts = NULL; + + shape = _get_tvg_shape(obj); + + tvg_shape_get_path_commands(shape, &tvg_cmds, &cmds_len); + tvg_shape_get_path_coords(shape, &tvg_pts, &pts_len); + + evas_cmds = (Evas_Vg_Path_Command*)malloc(sizeof(Evas_Vg_Path_Command) * (cmds_len + 1)); + + for (i = 0; i < cmds_len; ++i) + { + evas_cmds[i] = _get_evas_command(tvg_cmds[i]); + } + + evas_cmds[cmds_len] = EVAS_VG_PATH_COMMAND_END; + *op = evas_cmds; + + evas_pts = (double*)malloc(sizeof(double) * pts_len * 2); + i = 0; + + for (i = 0; i < pts_len; ++i) + { + evas_pts[j] = tvg_pts[i].x; + evas_pts[j+1] = tvg_pts[i].y; + j += 2; + } + *points = evas_pts; +#else efl_gfx_path_get(obj, (const Efl_Gfx_Path_Command **)op, points); +#endif } EAPI void -- 2.7.4