efl.file_save: rework save flags
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 27 Feb 2019 18:17:35 +0000 (13:17 -0500)
committerWonki Kim <wonki_.kim@samsung.com>
Fri, 8 Mar 2019 11:49:36 +0000 (20:49 +0900)
Summary:
instead of passing a string which requires reading docs to know which
arbitrary string key=value sets can be passed, use an extensible struct
which contains more easily referenced values

ref T7672

Depends on D8035

Reviewers: segfaultxavi

Reviewed By: segfaultxavi

Subscribers: segfaultxavi, cedric, #reviewers, #committers

Tags: #efl

Maniphest Tasks: T7672

Differential Revision: https://phab.enlightenment.org/D8039

src/lib/efl/interfaces/efl_file_save.eo
src/lib/evas/canvas/efl_canvas_vg_object.c
src/lib/evas/canvas/evas_canvas3d_mesh.c
src/lib/evas/canvas/evas_image_legacy.c
src/lib/evas/canvas/evas_object_image.c
src/lib/evas/canvas/evas_vg_private.h
src/lib/evas/vg/evas_vg_cache.c

index 3cdc234..43c8d4c 100644 (file)
@@ -1,5 +1,14 @@
 import eina_types;
 
+
+struct Efl.File_Save_Info
+{
+   [[Info used to determine various attributes when saving a file.]]
+   quality: uint; [[The quality level (0-100) to save the file with; commonly used when saving image files.]]
+   compression: uint; [[The compression level (0-100) to save the file with.]]
+   encoding: string; [[The encoding to use when saving the file.]]
+}
+
 interface @beta Efl.File_Save {
    [[Efl file saving interface]]
    methods {
@@ -20,8 +29,7 @@ interface @beta Efl.File_Save {
                                               obligatory).]]
             @in key: string; [[The image key in the file (if an Eet one), or $null,
                                      otherwise.]]
-            @in flags: string; [[String containing the flags to be used ($null for
-                                       none).]]
+            @in info: const(ptr(Efl.File_Save_Info)); [[The flags to be used ($null for defaults).]]
          }
          return: bool;  [[$true on success, $false otherwise]]
       }
index e4c9387..17eecf1 100644 (file)
@@ -312,14 +312,14 @@ _efl_canvas_vg_object_efl_file_unload(Eo *eo_obj, Efl_Canvas_Vg_Object_Data *pd)
 }
 
 EOLIAN static Eina_Bool
-_efl_canvas_vg_object_efl_file_save_save(const Eo *obj, Efl_Canvas_Vg_Object_Data *pd, const char *file, const char *key, const char *flags)
+_efl_canvas_vg_object_efl_file_save_save(const Eo *obj, Efl_Canvas_Vg_Object_Data *pd, const char *file, const char *key, const Efl_File_Save_Info *info)
 {
    if (pd->vg_entry)
-     return evas_cache_vg_entry_file_save(pd->vg_entry, file, key, flags);
+     return evas_cache_vg_entry_file_save(pd->vg_entry, file, key, info);
 
    Evas_Coord w, h;
    evas_object_geometry_get(obj, NULL, NULL, &w, &h);
-   return evas_cache_vg_file_save(pd->root, w, h, file, key, flags);
+   return evas_cache_vg_file_save(pd->root, w, h, file, key, info);
 }
 
 static void
index ccac776..bdf50e0 100644 (file)
@@ -887,7 +887,7 @@ EOLIAN static Eina_Bool
 _evas_canvas3d_mesh_efl_file_save_save(const Eo *obj, Evas_Canvas3D_Mesh_Data *pd,
                    const char *file,
                    const char *key EINA_UNUSED,
-                   const char *flags EINA_UNUSED)
+                   const Efl_File_Save_Info *info EINA_UNUSED)
 {
    if ((file == NULL) || (obj == NULL) || (pd == NULL)) return EINA_FALSE;
 
index a7b6e48..d14986b 100755 (executable)
@@ -221,8 +221,39 @@ evas_object_image_mmap_get(const Evas_Object *obj, const Eina_File **f, const ch
 EAPI Eina_Bool
 evas_object_image_save(const Evas_Object *obj, const char *file, const char *key, const char *flags)
 {
+   char *encoding = NULL;
+   Efl_File_Save_Info info;
+   Eina_Error ret;
+
    EVAS_IMAGE_API(obj, EINA_FALSE);
-   return efl_file_save(obj, file, key, flags);
+   
+   if (flags)
+     {
+        char *p, *pp;
+        char *tflags;
+        int quality = 80, compress = 9;
+
+        tflags = alloca(strlen(flags) + 1);
+        strcpy(tflags, flags);
+        p = tflags;
+        while (p)
+          {
+             pp = strchr(p, ' ');
+             if (pp) *pp = 0;
+             sscanf(p, "quality=%4i", &quality);
+             sscanf(p, "compress=%4i", &compress);
+             sscanf(p, "encoding=%ms", &encoding);
+             if (pp) p = pp + 1;
+             else break;
+          }
+        info.quality = quality;
+        info.compression = compress;
+        info.encoding = encoding;
+
+     }
+   ret = efl_file_save(obj, file, key, flags ? &info : NULL);
+   free(encoding);
+   return ret;
 }
 
 EAPI Eina_Bool
index f63b7b0..dd91fb8 100755 (executable)
@@ -874,10 +874,10 @@ _efl_canvas_image_internal_efl_gfx_image_image_load_error_get(const Eo *eo_obj E
 }
 
 EOLIAN static Eina_Bool
-_efl_canvas_image_internal_efl_file_save_save(const Eo *eo_obj, Evas_Image_Data *o, const char *file, const char *key, const char *flags)
+_efl_canvas_image_internal_efl_file_save_save(const Eo *eo_obj, Evas_Image_Data *o, const char *file, const char *key, const Efl_File_Save_Info *info)
 {
    int quality = 80, compress = 9, ok = 0;
-   char *encoding = NULL;
+   const char *encoding = NULL;
    Image_Entry *ie;
    Evas_Colorspace cspace = EVAS_COLORSPACE_ARGB8888;
    Evas_Colorspace want_cspace = EVAS_COLORSPACE_ARGB8888;
@@ -902,46 +902,31 @@ _efl_canvas_image_internal_efl_file_save_save(const Eo *eo_obj, Evas_Image_Data
 
    cspace = ENFN->image_file_colorspace_get(ENC, pixels);
    want_cspace = cspace;
-
-   if (flags)
+   if (info)
      {
-        const char *ext;
-        char *p, *pp;
-        char *tflags;
-
-        tflags = alloca(strlen(flags) + 1);
-        strcpy(tflags, flags);
-        p = tflags;
-        while (p)
-          {
-             pp = strchr(p, ' ');
-             if (pp) *pp = 0;
-             sscanf(p, "quality=%4i", &quality);
-             sscanf(p, "compress=%4i", &compress);
-             sscanf(p, "encoding=%ms", &encoding);
-             if (pp) p = pp + 1;
-             else break;
-          }
+        encoding = info->encoding;
+        quality = info->quality;
+        compress = info->compression;
+     }
 
-        if (encoding)
+   if (encoding)
+     {
+        const char *ext = strrchr(file, '.');
+        if (ext && !strcasecmp(ext, ".tgv"))
           {
-             ext = strrchr(file, '.');
-             if (ext && !strcasecmp(ext, ".tgv"))
+             if (!strcmp(encoding, "auto"))
+               want_cspace = cspace;
+             else if (!strcmp(encoding, "etc1"))
+               want_cspace = EVAS_COLORSPACE_ETC1;
+             else if (!strcmp(encoding, "etc2"))
                {
-                  if (!strcmp(encoding, "auto"))
-                    want_cspace = cspace;
-                  else if (!strcmp(encoding, "etc1"))
-                    want_cspace = EVAS_COLORSPACE_ETC1;
-                  else if (!strcmp(encoding, "etc2"))
-                    {
-                       if (!ENFN->image_alpha_get(ENC, pixels))
-                         want_cspace = EVAS_COLORSPACE_RGB8_ETC2;
-                       else
-                         want_cspace = EVAS_COLORSPACE_RGBA8_ETC2_EAC;
-                    }
-                  else if (!strcmp(encoding, "etc1+alpha"))
-                    want_cspace = EVAS_COLORSPACE_ETC1_ALPHA;
+                  if (!ENFN->image_alpha_get(ENC, pixels))
+                    want_cspace = EVAS_COLORSPACE_RGB8_ETC2;
+                  else
+                    want_cspace = EVAS_COLORSPACE_RGBA8_ETC2_EAC;
                }
+             else if (!strcmp(encoding, "etc1+alpha"))
+               want_cspace = EVAS_COLORSPACE_ETC1_ALPHA;
           }
      }
 
@@ -984,12 +969,10 @@ _efl_canvas_image_internal_efl_file_save_save(const Eo *eo_obj, Evas_Image_Data
    if (unmap_it)
      ENFN->image_data_unmap(ENC, pixels, &slice);
 
-   free(encoding);
    if (!ok) ERR("Image save failed.");
    return ok;
 
 no_pixels:
-   free(encoding);
    ERR("Could not get image pixels for saving.");
    return EINA_FALSE;
 }
index 1d8e48b..4b7b615 100644 (file)
@@ -127,8 +127,8 @@ Vg_Cache_Entry*             evas_cache_vg_entry_create(const Eina_File *file, co
 Efl_VG*                     evas_cache_vg_tree_get(Vg_Cache_Entry *vg_entry, unsigned int frame_num);
 void                        evas_cache_vg_entry_del(Vg_Cache_Entry *vg_entry);
 Vg_File_Data *              evas_cache_vg_file_open(const Eina_File *file, const char *key, Eina_Bool mmap);
-Eina_Bool                   evas_cache_vg_file_save(Efl_VG *root, int w, int h, const char *file, const char *key, const char *flags);
-Eina_Bool                   evas_cache_vg_entry_file_save(Vg_Cache_Entry *vg_entry, const char *file, const char *key, const char *flags);
+Eina_Bool                   evas_cache_vg_file_save(Efl_VG *root, int w, int h, const char *file, const char *key, const Efl_File_Save_Info *info);
+Eina_Bool                   evas_cache_vg_entry_file_save(Vg_Cache_Entry *vg_entry, const char *file, const char *key, const Efl_File_Save_Info *info);
 double                      evas_cache_vg_anim_duration_get(const Vg_Cache_Entry *vg_entry);
 unsigned int                evas_cache_vg_anim_frame_count_get(const Vg_Cache_Entry *vg_entry);
 Eina_Size2D                 evas_cache_vg_entry_default_size_get(const Vg_Cache_Entry *vg_entry);
index c2cfdf3..1925a8f 100644 (file)
@@ -177,7 +177,7 @@ _evas_cache_vg_entry_free_cb(void *data)
 }
 
 static Eina_Bool
-_vg_file_save(Vg_File_Data *vfd, const char *file, const char *key, const char *flags)
+_vg_file_save(Vg_File_Data *vfd, const char *file, const char *key, const Efl_File_Save_Info *info)
 {
    Evas_Module       *em;
    Evas_Vg_Save_Func *saver;
@@ -186,24 +186,7 @@ _vg_file_save(Vg_File_Data *vfd, const char *file, const char *key, const char *
 
    if (!file) return EINA_FALSE;
 
-   if (flags)
-     {
-        char *p, *pp;
-        char *tflags;
-
-        int len = strlen(flags) + 1;
-        tflags = alloca(len);
-        strncpy(tflags, flags, len);
-        p = tflags;
-        while (p)
-          {
-             pp = strchr(p, ' ');
-             if (pp) *pp = 0;
-             sscanf(p, "compress=%i", &compress);
-             if (pp) p = pp + 1;
-             else break;
-          }
-     }
+   if (info) compress = info->compression;
 
    em = _find_saver_module(file);
    if (em)
@@ -496,20 +479,18 @@ evas_cache_vg_entry_default_size_get(const Vg_Cache_Entry *vg_entry)
 }
 
 Eina_Bool
-evas_cache_vg_entry_file_save(Vg_Cache_Entry *vg_entry, const char *file, const char *key,
-                              const char *flags)
+evas_cache_vg_entry_file_save(Vg_Cache_Entry *vg_entry, const char *file, const char *key, const Efl_File_Save_Info *info)
 {
    Vg_File_Data *vfd =
       evas_cache_vg_file_open(vg_entry->file, vg_entry->key, EINA_FALSE);
 
    if (!vfd) return EINA_FALSE;
 
-   return _vg_file_save(vfd, file, key, flags);
+   return _vg_file_save(vfd, file, key, info);
 }
 
 Eina_Bool
-evas_cache_vg_file_save(Efl_VG *root, int w, int h, const char *file, const char *key,
-                        const char *flags)
+evas_cache_vg_file_save(Efl_VG *root, int w, int h, const char *file, const char *key, const Efl_File_Save_Info *info)
 {
    Vg_File_Data vfd = {};
 
@@ -520,5 +501,5 @@ evas_cache_vg_file_save(Efl_VG *root, int w, int h, const char *file, const char
    vfd.root = root;
    vfd.preserve_aspect = EINA_FALSE;
 
-   return _vg_file_save(&vfd, file, key, flags);
+   return _vg_file_save(&vfd, file, key, info);
 }