evas_vg refactoring: thorvg svg loader: edje 49/261149/5 accepted/tizen/unified/20210910.004743 submit/tizen/20210909.071105
authorMichal Maciola <m.maciola@samsung.com>
Mon, 12 Jul 2021 10:39:38 +0000 (12:39 +0200)
committerHermet Park <chuneon.park@samsung.com>
Wed, 8 Sep 2021 08:04:27 +0000 (08:04 +0000)
This patch changes evas svg loader to using thorvg svg loader.
The patch extands .svg only; .svgz and .svg.gz will be loaded using old loader.
For edje_cc support (edj/edc files), svg file content is written into edj.

Patch is divided into two parts- edje & evas. This is edje part.

Change-Id: I716fa0a8b2e5bc23d2b262bb4b134a7972a545ce

src/bin/edje/edje_cc_handlers.c
src/bin/edje/edje_cc_out.c
src/lib/edje/edje_calc.c
src/lib/edje/edje_private.h

index d99a9a3..6b6c3cd 100644 (file)
@@ -2352,10 +2352,14 @@ st_images_vector(void)
      {
         vector->type = EDJE_VECTOR_FILE_TYPE_LOTTIE;
      }
-   else
+   else if ((entry_len > 4) && !strncmp(vector->entry + entry_len - 4, ".svg", 4))
      {
         vector->type = EDJE_VECTOR_FILE_TYPE_SVG;
      }
+   else
+     {
+        vector->type = EDJE_VECTOR_FILE_TYPE_SVGZ;
+     }
 }
 
 /** @edcsubsection{toplevel_images_set,
index 319da7f..43d8dc9 100644 (file)
@@ -1453,6 +1453,28 @@ data_write_vectors(Eet_File *ef, int *vector_num)
                   found = EINA_TRUE;
                   break;
                }
+             else if (vector->type == EDJE_VECTOR_FILE_TYPE_SVG)
+               {
+                  char *svg_data = NULL;
+                  int svg_data_len = 0;
+
+                  f = eina_file_open(eina_strbuf_string_get(buf), EINA_FALSE);
+                  if (!f) continue;
+
+                  svg_data_len = (int) eina_file_size_get(f);
+                  svg_data = eina_file_map_all(f, EINA_FILE_POPULATE);
+
+                  eina_strbuf_reset(buf);
+                  eina_strbuf_append_printf(buf, "edje/vectors/%i", vector->id);
+                  eet_write(ef, eina_strbuf_string_get(buf), svg_data, svg_data_len, EET_COMPRESSION_NONE);
+
+                  eina_file_map_free(f, svg_data);
+                  eina_file_close(f);
+
+                  *vector_num += 1;
+                  found = EINA_TRUE;
+                  break;
+               }
              else
                {
                   f = eina_file_open(eina_strbuf_string_get(buf), EINA_FALSE);
index 4f5d01e..851f5f4 100644 (file)
@@ -3344,6 +3344,29 @@ _edje_vector_load_lottie(Edje *ed, Edje_Real_Part *ep, const char *key)
 #endif
 
 static void
+_edje_vector_load_svg(Edje *ed, Edje_Real_Part *ep, const char *key)
+{
+   Edje_Part_Description_Vector *desc = (Edje_Part_Description_Vector *)ep->chosen_description;
+   Eina_File *file;
+   char *svg_data;
+   int svg_data_len = 0;
+
+   if (ep->typedata.vector->current_id != desc->vg.id)
+     {
+        svg_data = (char *)eet_read(ed->file->ef, key, &svg_data_len);
+        if (svg_data)
+          {
+             svg_data[svg_data_len] = '\0';
+             file = eina_file_virtualize(NULL, svg_data, svg_data_len + 1, EINA_FALSE);
+             if (efl_file_loaded_get(ep->object)) efl_file_unload(ep->object);
+             efl_file_simple_mmap_load(ep->object, file, NULL);
+
+             ep->typedata.vector->current_id = desc->vg.id;
+          }
+     }
+}
+
+static void
 _edje_vector_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3 EINA_UNUSED, Edje_Part_Description_Vector *chosen_desc, FLOAT_T pos)
 {
    int new_id = -1; //invalid svg
@@ -3351,7 +3374,7 @@ _edje_vector_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3 EIN
    char src_key[32], dest_key[32];
    Efl_VG *src_root, *dest_root, *root;
    Edje_Vector_File_Type type = chosen_desc->vg.type;
-   Edje_Vector_File_Type new_type = EDJE_VECTOR_FILE_TYPE_SVG;
+   Edje_Vector_File_Type new_type = EDJE_VECTOR_FILE_TYPE_SVGZ;
 
    evas_object_geometry_get(ep->object, NULL, NULL, &w, &h);
    if( (w == 0) || (h == 0)) return;
@@ -3367,6 +3390,11 @@ _edje_vector_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3 EIN
 #endif
         return;
      }
+   else if (type == EDJE_VECTOR_FILE_TYPE_SVG)
+     {
+        _edje_vector_load_svg(ed, ep, src_key);
+        return;
+     }
 
    if (ep->param2)
      {
@@ -3382,14 +3410,14 @@ _edje_vector_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3 EIN
           }
      }
 
-   if ((new_id < 0) || (new_type == EDJE_VECTOR_FILE_TYPE_LOTTIE))
+   if ((new_id < 0) || (new_type == EDJE_VECTOR_FILE_TYPE_LOTTIE) || (new_type == EDJE_VECTOR_FILE_TYPE_SVG))
      {
 #ifndef BUILD_VG_LOADER_JSON
         if (new_type == EDJE_VECTOR_FILE_TYPE_LOTTIE)
           ERR("Evas Vg Lottie (Lottie) Loader is not supported, Only Static Vector Image(SVG) is available!");
         else
 #endif
-          efl_file_simple_load(ep->object, ed->file->path, src_key);
+        efl_file_simple_load(ep->object, ed->file->path, src_key);
      }
    else
      {
index b0d6c3f..fa4dc7c 100644 (file)
@@ -676,8 +676,9 @@ struct _Edje_Image_Directory
 
 typedef enum _Edje_Vector_File_Type
 {
-   EDJE_VECTOR_FILE_TYPE_SVG = 0,
-   EDJE_VECTOR_FILE_TYPE_LOTTIE
+   EDJE_VECTOR_FILE_TYPE_SVGZ = 0,
+   EDJE_VECTOR_FILE_TYPE_LOTTIE,
+   EDJE_VECTOR_FILE_TYPE_SVG
 } Edje_Vector_File_Type;
 
 struct _Edje_Vector_Directory_Entry