jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=d0d9dbfdbad7f7c31518b38242188ec007cb3756

commit d0d9dbfdbad7f7c31518b38242188ec007cb3756
Author: Jean-Philippe Andre <[email protected]>
Date:   Fri Jun 13 15:22:26 2014 +0900

    Evas: Add encoding parameter to the savers
    
    ecore_evas_convert: Add -e/--encoding option
    
    This uses directly the encoding parameter.
    For now, used only by the TGV saver, but there is no other way
    to specify between ETC1 and ETC2. And we don't have a mixed ETC1+2
    mode (yet).
    
    @feature
---
 src/bin/ecore_evas/ecore_evas_convert.c            | 17 ++++++---
 src/lib/evas/canvas/evas_object_image.c            |  5 ++-
 src/lib/evas/common/evas_image.h                   |  2 +-
 src/lib/evas/common/evas_image_save.c              |  6 ++-
 src/lib/evas/include/evas_private.h                |  2 +-
 .../evas/engines/gl_common/evas_gl_context.c       |  2 +-
 src/modules/evas/savers/eet/evas_image_save_eet.c  |  5 ++-
 .../evas/savers/jpeg/evas_image_save_jpeg.c        |  5 ++-
 src/modules/evas/savers/png/evas_image_save_png.c  |  5 ++-
 src/modules/evas/savers/tgv/evas_image_save_tgv.c  | 43 +++++++++++++++-------
 .../evas/savers/tiff/evas_image_save_tiff.c        |  5 ++-
 .../evas/savers/webp/evas_image_save_webp.c        |  5 ++-
 12 files changed, 68 insertions(+), 34 deletions(-)

diff --git a/src/bin/ecore_evas/ecore_evas_convert.c 
b/src/bin/ecore_evas/ecore_evas_convert.c
index 8ba05fa..8cf613e 100644
--- a/src/bin/ecore_evas/ecore_evas_convert.c
+++ b/src/bin/ecore_evas/ecore_evas_convert.c
@@ -27,6 +27,7 @@ const Ecore_Getopt optdesc = {
   {
     ECORE_GETOPT_STORE_INT('q', "quality", "define encoding quality in 
percent."),
     ECORE_GETOPT_STORE_TRUE('c', "compress", "define if data should be 
compressed."),
+    ECORE_GETOPT_STORE_STR('e', "encoding", "define the codec (for TGV files: 
etc1, etc2)"),
     ECORE_GETOPT_LICENSE('L', "license"),
     ECORE_GETOPT_COPYRIGHT('C', "copyright"),
     ECORE_GETOPT_VERSION('V', "version"),
@@ -38,19 +39,21 @@ const Ecore_Getopt optdesc = {
 int
 main(int argc, char *argv[])
 {
-   char flags[128];
    Ecore_Evas *ee;
    Evas *e;
    Evas_Object *im;
    int arg_index;
    int quality = -1;
    int r = -1;
+   char *encoding = NULL;
    Eina_Bool compress = 1;
    Eina_Bool quit_option = EINA_FALSE;
+   Eina_Strbuf *flags = NULL;
 
    Ecore_Getopt_Value values[] = {
      ECORE_GETOPT_VALUE_INT(quality),
      ECORE_GETOPT_VALUE_BOOL(compress),
+     ECORE_GETOPT_VALUE_STR(encoding),
      ECORE_GETOPT_VALUE_BOOL(quit_option),
      ECORE_GETOPT_VALUE_BOOL(quit_option),
      ECORE_GETOPT_VALUE_BOOL(quit_option),
@@ -86,10 +89,12 @@ main(int argc, char *argv[])
         goto end;
      }
 
+   flags = eina_strbuf_new();
+   eina_strbuf_append_printf(flags, "compress=%d", compress);
    if (quality >= 0)
-     snprintf(flags, sizeof (flags), "compress=%i quality=%i", compress, 
quality);
-   else
-     snprintf(flags, sizeof (flags), "compress=%i", compress);
+     eina_strbuf_append_printf(flags, " quality=%d", quality);
+   if (encoding)
+     eina_strbuf_append_printf(flags, " encoding=%s", encoding);
 
    im = evas_object_image_add(e);
    evas_object_image_file_set(im, argv[arg_index], NULL);
@@ -102,7 +107,8 @@ main(int argc, char *argv[])
         goto end;
      }
 
-   if (!evas_object_image_save(im, argv[arg_index + 1], NULL, flags))
+   if (!evas_object_image_save(im, argv[arg_index + 1], NULL,
+                               eina_strbuf_string_get(flags)))
      {
         EINA_LOG_ERR("Could not convert file to '%s'.", argv[arg_index + 1]);
         goto end;
@@ -111,6 +117,7 @@ main(int argc, char *argv[])
    r = 0;
 
  end:
+   if (flags) eina_strbuf_free(flags);
    ecore_evas_shutdown();
    ecore_shutdown();
 
diff --git a/src/lib/evas/canvas/evas_object_image.c 
b/src/lib/evas/canvas/evas_object_image.c
index 3dc74f0..28f7a76 100644
--- a/src/lib/evas/canvas/evas_object_image.c
+++ b/src/lib/evas/canvas/evas_object_image.c
@@ -1512,6 +1512,7 @@ _evas_image_save(Eo *eo_obj, Evas_Image_Data *o, const 
char *file, const char *k
 {
    DATA32 *data = NULL;
    int quality = 80, compress = 9, ok = 0;
+   char *encoding = NULL;
    RGBA_Image *im;
    if (!o->engine_data) return 0;
    Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, 
EVAS_OBJECT_CLASS);
@@ -1530,6 +1531,7 @@ _evas_image_save(Eo *eo_obj, Evas_Image_Data *o, const 
char *file, const char *k
              if (pp) *pp = 0;
              sscanf(p, "quality=%i", &quality);
              sscanf(p, "compress=%i", &compress);
+             sscanf(p, "encoding=%ms", &encoding);
              if (pp) p = pp + 1;
              else break;
           }
@@ -1550,7 +1552,8 @@ _evas_image_save(Eo *eo_obj, Evas_Image_Data *o, const 
char *file, const char *k
                                                                    
EVAS_COLORSPACE_ARGB8888);
         if (im->image.data)
           {
-             ok = evas_common_save_image_to_file(im, file, key, quality, 
compress);
+             ok = evas_common_save_image_to_file(im, file, key, quality, 
compress, encoding);
+             free(encoding);
 
              if (o->cur->cspace != EVAS_COLORSPACE_ARGB8888)
                free(im->image.data);
diff --git a/src/lib/evas/common/evas_image.h b/src/lib/evas/common/evas_image.h
index 3ea2f22..3eecfee 100644
--- a/src/lib/evas/common/evas_image.h
+++ b/src/lib/evas/common/evas_image.h
@@ -34,7 +34,7 @@ EAPI void              
evas_common_image_alpha_line_buffer_free    (RGBA_Image *
 
 EAPI RGBA_Image       *evas_common_load_image_from_file            (const char 
*file, const char *key, Evas_Image_Load_Opts *lo, int *error);
 EAPI RGBA_Image       *evas_common_load_image_from_mmap            (Eina_File 
*f, const char *key, Evas_Image_Load_Opts *lo, int *error);
-EAPI int               evas_common_save_image_to_file              (RGBA_Image 
*im, const char *file, const char *key, int quality, int compress);
+EAPI int               evas_common_save_image_to_file              (RGBA_Image 
*im, const char *file, const char *key, int quality, int compress, const char 
*encoding);
 
 EAPI void evas_common_rgba_image_scalecache_init(Image_Entry *ie);
 EAPI void evas_common_rgba_image_scalecache_shutdown(Image_Entry *ie);
diff --git a/src/lib/evas/common/evas_image_save.c 
b/src/lib/evas/common/evas_image_save.c
index 0d1cdc5..faf1e6e 100644
--- a/src/lib/evas/common/evas_image_save.c
+++ b/src/lib/evas/common/evas_image_save.c
@@ -9,7 +9,8 @@
 
 
 int
-evas_common_save_image_to_file(RGBA_Image *im, const char *file, const char 
*key, int quality, int compress)
+evas_common_save_image_to_file(RGBA_Image *im, const char *file, const char 
*key,
+                               int quality, int compress, const char *encoding)
 {
    Evas_Image_Save_Func *evas_image_save_func = NULL;
    char *p;
@@ -45,7 +46,8 @@ evas_common_save_image_to_file(RGBA_Image *im, const char 
*file, const char *key
             if (evas_module_load(em))
               {
                  evas_image_save_func = em->functions;
-                 return evas_image_save_func->image_save(im, file, key, 
quality, compress);
+                  return evas_image_save_func->image_save(im, file, key, 
quality,
+                                                          compress, encoding);
               }
          }
      }
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index 0ef8f08..6cdce71 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1205,7 +1205,7 @@ struct _Evas_Func
 
 struct _Evas_Image_Save_Func
 {
-  int (*image_save) (RGBA_Image *im, const char *file, const char *key, int 
quality, int compress);
+  int (*image_save) (RGBA_Image *im, const char *file, const char *key, int 
quality, int compress, const char *encoding);
 };
 
 #ifdef __cplusplus
diff --git a/src/modules/evas/engines/gl_common/evas_gl_context.c 
b/src/modules/evas/engines/gl_common/evas_gl_context.c
index 268d4b0..62b833d 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_context.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_context.c
@@ -3346,7 +3346,7 @@ evas_gl_common_buffer_dump(Evas_Engine_GL_Context *gc, 
const char* dname, const
         im->image.data = data2;
         if (im->image.data)
           {
-             ok = evas_common_save_image_to_file(im, fname, NULL, 0, 0);
+             ok = evas_common_save_image_to_file(im, fname, NULL, 0, 0, NULL);
 
              if (!ok) ERR("Error Saving file.");
           }
diff --git a/src/modules/evas/savers/eet/evas_image_save_eet.c 
b/src/modules/evas/savers/eet/evas_image_save_eet.c
index 64e903b..d3c4eba 100644
--- a/src/modules/evas/savers/eet/evas_image_save_eet.c
+++ b/src/modules/evas/savers/eet/evas_image_save_eet.c
@@ -7,7 +7,7 @@
 #include "evas_common_private.h"
 #include "evas_private.h"
 
-static int evas_image_save_file_eet(RGBA_Image *im, const char *file, const 
char *key, int quality, int compress);
+static int evas_image_save_file_eet(RGBA_Image *im, const char *file, const 
char *key, int quality, int compress, const char *encoding);
 
 static Evas_Image_Save_Func evas_image_save_eet_func =
 {
@@ -15,7 +15,8 @@ static Evas_Image_Save_Func evas_image_save_eet_func =
 };
 
 static int
-evas_image_save_file_eet(RGBA_Image *im, const char *file, const char *key, 
int quality, int compress)
+evas_image_save_file_eet(RGBA_Image *im, const char *file, const char *key,
+                         int quality, int compress, const char *encoding 
EINA_UNUSED)
 {
    Eet_File            *ef;
    int alpha = 0, lossy = 0, ok = 0;
diff --git a/src/modules/evas/savers/jpeg/evas_image_save_jpeg.c 
b/src/modules/evas/savers/jpeg/evas_image_save_jpeg.c
index b0cf5f8..3ef082e 100644
--- a/src/modules/evas/savers/jpeg/evas_image_save_jpeg.c
+++ b/src/modules/evas/savers/jpeg/evas_image_save_jpeg.c
@@ -5,7 +5,7 @@
 #include <jpeglib.h>
 #include <setjmp.h>
 
-static int evas_image_save_file_jpeg(RGBA_Image *im, const char *file, const 
char *key, int quality, int compress);
+static int evas_image_save_file_jpeg(RGBA_Image *im, const char *file, const 
char *key, int quality, int compress, const char *encoding);
 
 static Evas_Image_Save_Func evas_image_save_jpeg_func =
 {
@@ -121,7 +121,8 @@ save_image_jpeg(RGBA_Image *im, const char *file, int 
quality)
    return 1;
 }
 
-static int evas_image_save_file_jpeg(RGBA_Image *im, const char *file, const 
char *key EINA_UNUSED, int quality, int compress EINA_UNUSED)
+static int evas_image_save_file_jpeg(RGBA_Image *im, const char *file, const 
char *key EINA_UNUSED,
+                                     int quality, int compress EINA_UNUSED, 
const char *encoding EINA_UNUSED)
 {
    return save_image_jpeg(im, file, quality);
 }
diff --git a/src/modules/evas/savers/png/evas_image_save_png.c 
b/src/modules/evas/savers/png/evas_image_save_png.c
index cc31441..f1819d9 100644
--- a/src/modules/evas/savers/png/evas_image_save_png.c
+++ b/src/modules/evas/savers/png/evas_image_save_png.c
@@ -21,7 +21,7 @@
 #include "evas_common_private.h"
 #include "evas_private.h"
 
-static int evas_image_save_file_png(RGBA_Image *im, const char *file, const 
char *key, int quality, int compress);
+static int evas_image_save_file_png(RGBA_Image *im, const char *file, const 
char *key, int quality, int compress, const char *encoding);
 
 static Evas_Image_Save_Func evas_image_save_png_func =
 {
@@ -156,7 +156,8 @@ save_image_png(RGBA_Image *im, const char *file, int 
do_compress, int interlace)
 }
 
 static int 
-evas_image_save_file_png(RGBA_Image *im, const char *file, const char *key 
EINA_UNUSED, int quality EINA_UNUSED, int do_compress)
+evas_image_save_file_png(RGBA_Image *im, const char *file, const char *key 
EINA_UNUSED,
+                         int quality EINA_UNUSED, int do_compress, const char 
*encoding EINA_UNUSED)
 {
    return save_image_png(im, file, do_compress, 0);
 }
diff --git a/src/modules/evas/savers/tgv/evas_image_save_tgv.c 
b/src/modules/evas/savers/tgv/evas_image_save_tgv.c
index f85b32f..2c1d031 100644
--- a/src/modules/evas/savers/tgv/evas_image_save_tgv.c
+++ b/src/modules/evas/savers/tgv/evas_image_save_tgv.c
@@ -150,7 +150,7 @@ on_error:
 static int
 evas_image_save_file_tgv(RGBA_Image *im,
                          const char *file, const char *key EINA_UNUSED,
-                         int quality, int compress)
+                         int quality, int compress, const char *encoding)
 {
    rg_etc1_pack_params param;
    FILE *f;
@@ -170,11 +170,6 @@ evas_image_save_file_tgv(RGBA_Image *im,
    clock_gettime(CLOCK_MONOTONIC, &ts1);
 #endif
 
-   /* FIXME: How to tell the encoder to encode as ETC1 or ETC2?
-    * The save API is weak. For now, assume ETC2 iif there's alpha.
-    * As long as we don't have a full ETC2 encoder, this is fine.
-    */
-
    if (!im || !im->image.data || !file)
      return 0;
 
@@ -186,6 +181,8 @@ evas_image_save_file_tgv(RGBA_Image *im,
       case EVAS_COLORSPACE_ETC1:
       case EVAS_COLORSPACE_RGB8_ETC2:
       case EVAS_COLORSPACE_RGBA8_ETC2_EAC:
+        if (encoding)
+          WRN("Ignoring 'encoding' argument the data is already ETC1/2");
         return _save_direct_tgv(im, file, compress);
       default:
         return 0;
@@ -214,18 +211,38 @@ evas_image_save_file_tgv(RGBA_Image *im,
    header[4] = (block_height << 4) | block_width;
 
    // header[5]: 0 for ETC1, 1 for RGB8_ETC2, 2 for RGBA8_ETC2_EAC
-   if (alpha)
-     {
-        cspace = EVAS_COLORSPACE_RGBA8_ETC2_EAC;
-        etc_block_size = 16;
-        header[5] = 2;
-     }
-   else
+   if (!encoding) encoding = "etc2";
+   if (!strcasecmp(encoding, "etc1"))
      {
+        if (alpha)
+          {
+             ERR("ETC1 does not support alpha encoding. Abort.");
+             return 0;
+          }
         cspace = EVAS_COLORSPACE_ETC1;
         etc_block_size = 8;
         header[5] = 0;
      }
+   else if (!strcasecmp(encoding, "etc2"))
+     {
+        if (!alpha)
+          {
+             cspace = EVAS_COLORSPACE_RGB8_ETC2;
+             etc_block_size = 8;
+             header[5] = 1;
+          }
+        else
+          {
+             cspace = EVAS_COLORSPACE_RGBA8_ETC2_EAC;
+             etc_block_size = 16;
+             header[5] = 2;
+          }
+     }
+   else
+     {
+        ERR("Unknown encoding '%.8s' selected. Abort.", encoding);
+        return 0;
+     }
 
    // header[6]: 0 for raw, 1, for LZ4 compressed
    header[6] = compress;
diff --git a/src/modules/evas/savers/tiff/evas_image_save_tiff.c 
b/src/modules/evas/savers/tiff/evas_image_save_tiff.c
index 84c73bb..c6dbda8 100644
--- a/src/modules/evas/savers/tiff/evas_image_save_tiff.c
+++ b/src/modules/evas/savers/tiff/evas_image_save_tiff.c
@@ -3,7 +3,7 @@
 
 #include <tiffio.h>
 
-static int evas_image_save_file_tiff(RGBA_Image *im, const char *file, const 
char *key, int quality, int compress);
+static int evas_image_save_file_tiff(RGBA_Image *im, const char *file, const 
char *key, int quality, int compress, const char *encoding);
 
 static Evas_Image_Save_Func evas_image_save_tiff_func =
 {
@@ -102,7 +102,8 @@ save_image_tiff(RGBA_Image *im, const char *file, int 
compress EINA_UNUSED, int
    return 1;
 }
 
-static int evas_image_save_file_tiff(RGBA_Image *im, const char *file, const 
char *key EINA_UNUSED, int quality EINA_UNUSED, int compress)
+static int evas_image_save_file_tiff(RGBA_Image *im, const char *file, const 
char *key EINA_UNUSED,
+                                     int quality EINA_UNUSED, int compress, 
const char *encoding EINA_UNUSED)
 {
    return save_image_tiff(im, file, compress, 0);
 }
diff --git a/src/modules/evas/savers/webp/evas_image_save_webp.c 
b/src/modules/evas/savers/webp/evas_image_save_webp.c
index 2c27b36..0941c7b 100644
--- a/src/modules/evas/savers/webp/evas_image_save_webp.c
+++ b/src/modules/evas/savers/webp/evas_image_save_webp.c
@@ -8,7 +8,7 @@
 #include "evas_common_private.h"
 #include "evas_private.h"
 
-static int evas_image_save_file_webp(RGBA_Image *im, const char *file, const 
char *key, int quality, int compress);
+static int evas_image_save_file_webp(RGBA_Image *im, const char *file, const 
char *key, int quality, int compress, const char *encoding);
 
 static Evas_Image_Save_Func evas_image_save_webp_func =
 {
@@ -72,7 +72,8 @@ save_image_webp(RGBA_Image *im, const char *file, int quality)
        return result;
 }
 
-static int evas_image_save_file_webp(RGBA_Image *im, const char *file, const 
char *key EINA_UNUSED, int quality, int compress EINA_UNUSED)
+static int evas_image_save_file_webp(RGBA_Image *im, const char *file, const 
char *key EINA_UNUSED,
+                                     int quality, int compress EINA_UNUSED, 
const char *encoding EINA_UNUSED)
 {
        return save_image_webp(im, file, quality);
 }

-- 


Reply via email to