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
This commit is contained in:
Jean-Philippe Andre 2014-06-13 15:22:26 +09:00
parent c79a8b43b6
commit d0d9dbfdba
12 changed files with 68 additions and 34 deletions

View File

@ -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();

View File

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

View File

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

View File

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

View File

@ -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

View File

@ -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.");
}

View File

@ -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;

View File

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

View File

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

View File

@ -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;

View File

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

View File

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