forked from enlightenment/efl
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:
parent
c79a8b43b6
commit
d0d9dbfdba
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.");
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue