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); }