evas vector: Added shape path getter for thorvg. 77/246977/2
authorMichal Szczecinski <m.szczecinsk@partner.samsung.com>
Wed, 4 Nov 2020 16:52:15 +0000 (17:52 +0100)
committerHermet Park <chuneon.park@samsung.com>
Mon, 9 Nov 2020 08:21:21 +0000 (08:21 +0000)
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

index 68d17e0..d27a1ad 100644 (file)
@@ -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