evas/canvas/vg: Added thorvg initialization. 14/241114/4
authorMichal Szczecinski <m.szczecinsk@partner.samsung.com>
Fri, 7 Aug 2020 07:04:42 +0000 (09:04 +0200)
committerHermet Park <chuneon.park@samsung.com>
Tue, 8 Sep 2020 07:49:44 +0000 (07:49 +0000)
Added thorvg initialization in evas_vg_cache. To don't break current
code, added separated functions to render object when thorvg lib is
used.

Change-Id: I2ea361fab9758a170f971dc7a731eded9d45b0e6

src/lib/evas/canvas/evas_vg_private.h
src/lib/evas/vg/evas_vg_cache.c

index b237b6f..8cf0938 100644 (file)
@@ -1,8 +1,13 @@
 #ifndef EVAS_VG_PRIVATE_H_
 # define EVAS_VG_PRIVATE_H_
 
+//TODO: Parametrize this include
 #include <Ector.h>
 
+#ifdef HAVE_THORVG
+#include <thorvg_capi.h>
+#endif
+
 typedef struct _Efl_Canvas_Vg_Node_Data             Efl_Canvas_Vg_Node_Data;
 typedef struct _Efl_Canvas_Vg_Container_Data        Efl_Canvas_Vg_Container_Data;
 typedef struct _Efl_Canvas_Vg_Gradient_Data         Efl_Canvas_Vg_Gradient_Data;
@@ -55,6 +60,11 @@ struct _Efl_Canvas_Vg_Object_Data
    void                      *ckeys[2];  //cache keys for first, last frames if animation
 
    Eina_Bool                  changed : 1;
+
+#ifdef HAVE_THORVG
+   Tvg_Canvas *tvg_canvas;
+   uint32_t   *tvg_buffer;
+#endif
 };
 
 struct _Efl_Canvas_Vg_Node_Data
@@ -71,6 +81,13 @@ struct _Efl_Canvas_Vg_Node_Data
          Efl_Canvas_Vg_Node_Data *nd,
          void *engine, void *output, void *contenxt, Ector_Surface *surface,
          Eina_Matrix3 *ptransform, int opacity, Ector_Buffer *comp, Efl_Gfx_Vg_Composite_Method comp_method, void *data);
+
+#ifdef HAVE_THORVG
+   void (*render_pre_tvg)(Evas_Object_Protected_Data *vg_pd, Efl_VG *node, Efl_Canvas_Vg_Node_Data *nd, void *canvas);
+   void (*render_tvg)(Evas_Object_Protected_Data *vg_pd, Efl_VG *node, Efl_Canvas_Vg_Node_Data *nd, void *canvas);
+   void (*set_color)(Efl_Canvas_Vg_Node_Data *nd, int r, int g, int b, int a);
+#endif
+
    void *data;
 
    double x, y;
@@ -176,6 +193,10 @@ _evas_vg_render_pre(Evas_Object_Protected_Data *vg_pd, Efl_VG *child,
    if (nd) nd->render_pre(vg_pd, child, nd,
                           engine, output, context, surface,
                           transform, opacity, comp, comp_method, nd->data);
+#ifdef HAVE_THORVG
+   //TODO: This function probably is not called when HAVE_THORVG is defined
+   if (nd && nd->render_pre_tvg) nd->render_pre_tvg(vg_pd, child, nd, NULL);
+#endif
    return nd;
 }
 
index d9cefb8..e8610ae 100644 (file)
@@ -271,6 +271,10 @@ evas_cache_vg_init(void)
         return;
      }
 
+#ifdef HAVE_THORVG
+   tvg_engine_init(TVG_ENGINE_SW, eina_cpu_count());
+#endif
+
    vg_cache->vfd_hash = eina_hash_string_superfast_new(_evas_cache_vg_data_free_cb);
    vg_cache->vg_entry_hash = eina_hash_string_superfast_new(_evas_cache_vg_entry_free_cb);
    vg_cache->ref++;
@@ -315,6 +319,11 @@ evas_cache_vg_shutdown(void)
 {
    if (!vg_cache) return;
    vg_cache->ref--;
+
+#ifdef HAVE_THORVG
+   tvg_engine_term(TVG_ENGINE_SW | TVG_ENGINE_GL);
+#endif
+
    if (vg_cache->ref > 0) return;
 
    char *key;