evas vg: Add FIXME and fix strbuf use
authorJean-Philippe Andre <jp.andre@samsung.com>
Fri, 27 Oct 2017 05:31:37 +0000 (14:31 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Fri, 27 Oct 2017 05:58:38 +0000 (14:58 +0900)
This is the result of a really quick review of the new VG code. Most of
it was moved around, but this merge includes the following:
 - Move logic from edje to evas
 - Create static lib for common VG handling
 - Add file_set() API
 - Add a basic VG cache in evas side
 - Add savers modules, implement loaders and savers.

src/bin/edje/edje_cc_out.c
src/lib/edje/edje_calc.c
src/lib/evas/canvas/efl_canvas_vg.c
src/lib/evas/canvas/efl_canvas_vg.eo
src/lib/evas/vg/evas_vg_cache.c

index 7803f78..da36943 100644 (file)
@@ -1267,7 +1267,7 @@ data_write_vectors(Eet_File *ef, int *vector_num)
    char *s;
    Eina_File *f = NULL;
    Edje_Vector_Directory_Entry *vector;
-   char buf[100];
+   Eina_Strbuf *buf;
    Eina_Bool found = EINA_FALSE;
    Ecore_Evas *ee;
    Evas *evas;
@@ -1281,7 +1281,7 @@ data_write_vectors(Eet_File *ef, int *vector_num)
      error_and_abort(ef, "Cannot create buffer engine canvas for image load.");
    evas = ecore_evas_get(ee);
    vg = evas_object_vg_add(evas);
-
+   buf = eina_strbuf_new();
    for (i = 0; i < edje_file->image_dir->vectors_count; i++)
      {
         if (!beta)
@@ -1290,18 +1290,18 @@ data_write_vectors(Eet_File *ef, int *vector_num)
         vector = &edje_file->image_dir->vectors[i];
         EINA_LIST_FOREACH(img_dirs, ll, s)
           {
-             sprintf(buf, "%s/%s", s, vector->entry);
-
-             f = eina_file_open(buf, EINA_FALSE);
+             eina_strbuf_reset(buf);
+             eina_strbuf_append_printf(buf, "%s" EINA_PATH_SEP_S "%s", s, vector->entry);
+             f = eina_file_open(eina_strbuf_string_get(buf), EINA_FALSE);
              if (!f) continue;
              eina_file_close(f);
 
-             if (!efl_file_set(vg, buf, NULL))
+             if (!efl_file_set(vg, eina_strbuf_string_get(buf), NULL))
                error_and_abort(ef, "Failed to parse svg : %s", vector->entry);
 
-             sprintf(buf, "edje/vectors/%i", vector->id);
-
-             if(!efl_file_save(vg, eet_file_get(ef), buf, NULL))
+             eina_strbuf_reset(buf);
+             eina_strbuf_append_printf(buf, "edje/vectors/%i", vector->id);
+             if (!efl_file_save(vg, eet_file_get(ef), eina_strbuf_string_get(buf), NULL))
                error_and_abort(ef, "Failed to write data in Eet for svg :%s", vector->entry);
 
              *vector_num += 1;
@@ -1312,6 +1312,7 @@ data_write_vectors(Eet_File *ef, int *vector_num)
           error_and_abort(ef, "Unable to find the svg :%s", vector->entry);
         found = EINA_FALSE;
      }
+   eina_strbuf_free(buf);
 }
 
 static void
index 0a9efdc..d752e23 100644 (file)
@@ -3696,13 +3696,13 @@ _edje_svg_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3 EINA_U
 {
    int new_svg = -1; //invalid svg
    int w, h;
-   char src_key[20], dest_key[20];
+   char src_key[32], dest_key[32];
    Efl_VG *src_root, *dest_root, *root;
 
    evas_object_geometry_get(ep->object, NULL, NULL, &w, &h);
    if( (w == 0) || (h == 0)) return;
 
-   sprintf(src_key, "edje/vectors/%i", chosen_desc->vg.id);
+   snprintf(src_key, sizeof(src_key), "edje/vectors/%i", chosen_desc->vg.id);
 
    if (ep->param2)
      {
@@ -3719,22 +3719,27 @@ _edje_svg_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3 EINA_U
      }
    else
      {
-        sprintf(dest_key, "edje/vectors/%i", new_svg);
+        snprintf(dest_key, sizeof(dest_key), "edje/vectors/%i", new_svg);
 
         efl_file_set(ep->object, ed->file->path, src_key);
         src_root = efl_canvas_vg_root_node_get(ep->object);
+        efl_ref(src_root);
 
         efl_file_set(ep->object, ed->file->path, dest_key);
         dest_root = efl_canvas_vg_root_node_get(ep->object);
+        efl_ref(dest_root);
 
+        // FIXME: root = dup(), root.interpolate(dest).
         root = evas_vg_container_add(NULL);
         evas_vg_node_dup(root, src_root);
 
         if (!evas_vg_node_interpolate(root, src_root, dest_root, pos))
           {
-             ERR(" Can't interpolate check the svg file \n");
+             ERR("Can't interpolate check the svg file");
           }
         efl_canvas_vg_root_node_set(ep->object, root);
+        efl_unref(src_root);
+        efl_unref(dest_root);
      }
 }
 
index 15d0eb2..a869308 100644 (file)
@@ -244,22 +244,18 @@ _efl_canvas_vg_viewbox_align_get(Eo *obj EINA_UNUSED, Efl_Canvas_Vg_Data *pd, do
 EOLIAN static Eina_Bool
 _efl_canvas_vg_efl_file_file_set(Eo *obj, Efl_Canvas_Vg_Data *pd, const char *file, const char *key)
 {
+   Evas_Cache_Vg_Entry *old_entry;
    int w, h;
-   Evas_Cache_Vg_Entry *entry;
 
    if (!file) return EINA_FALSE;
 
+   old_entry = pd->vg_entry;
    evas_object_geometry_get(obj, NULL, NULL, &w, &h);
-   entry = evas_cache_vg_entry_find(file, key, w, h);
-   if (entry != pd->vg_entry)
-     {
-        if (pd->vg_entry)
-          {
-             evas_cache_vg_entry_del(pd->vg_entry);
-          }
-        pd->vg_entry = entry;
-     }
-   evas_object_change(obj, efl_data_scope_get(obj, EFL_CANVAS_OBJECT_CLASS));
+   pd->vg_entry = evas_cache_vg_entry_find(file, key, w, h);
+   if (pd->vg_entry != old_entry)
+     evas_object_change(obj, efl_data_scope_get(obj, EFL_CANVAS_OBJECT_CLASS));
+   evas_cache_vg_entry_del(old_entry);
+
    return EINA_TRUE;
 }
 
@@ -276,7 +272,7 @@ _efl_canvas_vg_efl_file_file_get(Eo *obj EINA_UNUSED, Efl_Canvas_Vg_Data *pd, co
 EOLIAN static Eina_Bool
 _efl_canvas_vg_efl_file_save(const Eo *obj, Efl_Canvas_Vg_Data *pd, const char *file, const char *key, const char *flags)
 {
-   Vg_File_Data tmp;
+   Vg_File_Data tmp = {};
    Vg_File_Data *info = &tmp;
 
    if (pd->vg_entry && pd->vg_entry->file)
@@ -291,8 +287,7 @@ _efl_canvas_vg_efl_file_save(const Eo *obj, Efl_Canvas_Vg_Data *pd, const char *
         info->root = pd->root;
         info->preserve_aspect = EINA_FALSE;
      }
-   evas_vg_save_to_file(info, file, key, flags);
-   return EINA_TRUE;
+   return evas_vg_save_to_file(info, file, key, flags);
 }
 
 static void
@@ -431,7 +426,6 @@ _efl_canvas_vg_render(Evas_Object *eo_obj EINA_UNUSED,
      {
         root = vd->root;
      }
-   //obj->layer->evas->engine.func->ector_begin(output, context,
    obj->layer->evas->engine.func->ector_begin(engine, context,
                                               ector, surface,
                                               vd->engine_data,
index c9fee6d..398dd6c 100644 (file)
@@ -73,6 +73,7 @@ class Efl.Canvas.Vg (Efl.Canvas.Object, Efl.File)
       Efl.Object.constructor;
       Efl.Object.finalize;
       Efl.Object.destructor;
+      // FIXME: Implement mmap only (also fix cache keys)
       Efl.File.file { get; set; }
       Efl.File.save;
    }
index dae36cc..aa32a6f 100644 (file)
@@ -324,5 +324,6 @@ evas_cache_vg_entry_del(Evas_Cache_Vg_Entry *svg_entry)
    if (!svg_entry) return;
 
    svg_entry->ref--;
+   // FIXME implement delete logic (LRU)
 }