From d0d9dbfdbad7f7c31518b38242188ec007cb3756 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Fri, 13 Jun 2014 15:22:26 +0900 Subject: [PATCH] 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 +- .../evas/savers/eet/evas_image_save_eet.c | 5 ++- .../evas/savers/jpeg/evas_image_save_jpeg.c | 5 ++- .../evas/savers/png/evas_image_save_png.c | 5 ++- .../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 8ba05fac2f..8cf613e211 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 3dc74f0401..28f7a76cfb 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 3ea2f22a49..3eecfeee8a 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 0d1cdc5166..faf1e6e102 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 0ef8f081e0..6cdce715ad 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 268d4b095d..62b833df59 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 64e903b510..d3c4eba155 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 b0cf5f8a11..3ef082e6dc 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 #include -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 cc3144128d..f1819d9100 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 f85b32f7fe..2c1d031314 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 84c73bb640..c6dbda8ebe 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 -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 2c27b3602c..0941c7b4bc 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); }