import eina_types;
+
+struct Efl.File_Save_Info
+{
+ [[Info used to determine various attributes when saving a file.]]
+ quality: uint; [[The quality level (0-100) to save the file with; commonly used when saving image files.]]
+ compression: uint; [[The compression level (0-100) to save the file with.]]
+ encoding: string; [[The encoding to use when saving the file.]]
+}
+
interface @beta Efl.File_Save {
[[Efl file saving interface]]
methods {
obligatory).]]
@in key: string; [[The image key in the file (if an Eet one), or $null,
otherwise.]]
- @in flags: string; [[String containing the flags to be used ($null for
- none).]]
+ @in info: const(ptr(Efl.File_Save_Info)); [[The flags to be used ($null for defaults).]]
}
return: bool; [[$true on success, $false otherwise]]
}
}
EOLIAN static Eina_Bool
-_efl_canvas_vg_object_efl_file_save_save(const Eo *obj, Efl_Canvas_Vg_Object_Data *pd, const char *file, const char *key, const char *flags)
+_efl_canvas_vg_object_efl_file_save_save(const Eo *obj, Efl_Canvas_Vg_Object_Data *pd, const char *file, const char *key, const Efl_File_Save_Info *info)
{
if (pd->vg_entry)
- return evas_cache_vg_entry_file_save(pd->vg_entry, file, key, flags);
+ return evas_cache_vg_entry_file_save(pd->vg_entry, file, key, info);
Evas_Coord w, h;
evas_object_geometry_get(obj, NULL, NULL, &w, &h);
- return evas_cache_vg_file_save(pd->root, w, h, file, key, flags);
+ return evas_cache_vg_file_save(pd->root, w, h, file, key, info);
}
static void
_evas_canvas3d_mesh_efl_file_save_save(const Eo *obj, Evas_Canvas3D_Mesh_Data *pd,
const char *file,
const char *key EINA_UNUSED,
- const char *flags EINA_UNUSED)
+ const Efl_File_Save_Info *info EINA_UNUSED)
{
if ((file == NULL) || (obj == NULL) || (pd == NULL)) return EINA_FALSE;
EAPI Eina_Bool
evas_object_image_save(const Evas_Object *obj, const char *file, const char *key, const char *flags)
{
+ char *encoding = NULL;
+ Efl_File_Save_Info info;
+ Eina_Error ret;
+
EVAS_IMAGE_API(obj, EINA_FALSE);
- return efl_file_save(obj, file, key, flags);
+
+ if (flags)
+ {
+ char *p, *pp;
+ char *tflags;
+ int quality = 80, compress = 9;
+
+ tflags = alloca(strlen(flags) + 1);
+ strcpy(tflags, flags);
+ p = tflags;
+ while (p)
+ {
+ pp = strchr(p, ' ');
+ if (pp) *pp = 0;
+ sscanf(p, "quality=%4i", &quality);
+ sscanf(p, "compress=%4i", &compress);
+ sscanf(p, "encoding=%ms", &encoding);
+ if (pp) p = pp + 1;
+ else break;
+ }
+ info.quality = quality;
+ info.compression = compress;
+ info.encoding = encoding;
+
+ }
+ ret = efl_file_save(obj, file, key, flags ? &info : NULL);
+ free(encoding);
+ return ret;
}
EAPI Eina_Bool
}
EOLIAN static Eina_Bool
-_efl_canvas_image_internal_efl_file_save_save(const Eo *eo_obj, Evas_Image_Data *o, const char *file, const char *key, const char *flags)
+_efl_canvas_image_internal_efl_file_save_save(const Eo *eo_obj, Evas_Image_Data *o, const char *file, const char *key, const Efl_File_Save_Info *info)
{
int quality = 80, compress = 9, ok = 0;
- char *encoding = NULL;
+ const char *encoding = NULL;
Image_Entry *ie;
Evas_Colorspace cspace = EVAS_COLORSPACE_ARGB8888;
Evas_Colorspace want_cspace = EVAS_COLORSPACE_ARGB8888;
cspace = ENFN->image_file_colorspace_get(ENC, pixels);
want_cspace = cspace;
-
- if (flags)
+ if (info)
{
- const char *ext;
- char *p, *pp;
- char *tflags;
-
- tflags = alloca(strlen(flags) + 1);
- strcpy(tflags, flags);
- p = tflags;
- while (p)
- {
- pp = strchr(p, ' ');
- if (pp) *pp = 0;
- sscanf(p, "quality=%4i", &quality);
- sscanf(p, "compress=%4i", &compress);
- sscanf(p, "encoding=%ms", &encoding);
- if (pp) p = pp + 1;
- else break;
- }
+ encoding = info->encoding;
+ quality = info->quality;
+ compress = info->compression;
+ }
- if (encoding)
+ if (encoding)
+ {
+ const char *ext = strrchr(file, '.');
+ if (ext && !strcasecmp(ext, ".tgv"))
{
- ext = strrchr(file, '.');
- if (ext && !strcasecmp(ext, ".tgv"))
+ if (!strcmp(encoding, "auto"))
+ want_cspace = cspace;
+ else if (!strcmp(encoding, "etc1"))
+ want_cspace = EVAS_COLORSPACE_ETC1;
+ else if (!strcmp(encoding, "etc2"))
{
- if (!strcmp(encoding, "auto"))
- want_cspace = cspace;
- else if (!strcmp(encoding, "etc1"))
- want_cspace = EVAS_COLORSPACE_ETC1;
- else if (!strcmp(encoding, "etc2"))
- {
- if (!ENFN->image_alpha_get(ENC, pixels))
- want_cspace = EVAS_COLORSPACE_RGB8_ETC2;
- else
- want_cspace = EVAS_COLORSPACE_RGBA8_ETC2_EAC;
- }
- else if (!strcmp(encoding, "etc1+alpha"))
- want_cspace = EVAS_COLORSPACE_ETC1_ALPHA;
+ if (!ENFN->image_alpha_get(ENC, pixels))
+ want_cspace = EVAS_COLORSPACE_RGB8_ETC2;
+ else
+ want_cspace = EVAS_COLORSPACE_RGBA8_ETC2_EAC;
}
+ else if (!strcmp(encoding, "etc1+alpha"))
+ want_cspace = EVAS_COLORSPACE_ETC1_ALPHA;
}
}
if (unmap_it)
ENFN->image_data_unmap(ENC, pixels, &slice);
- free(encoding);
if (!ok) ERR("Image save failed.");
return ok;
no_pixels:
- free(encoding);
ERR("Could not get image pixels for saving.");
return EINA_FALSE;
}
Efl_VG* evas_cache_vg_tree_get(Vg_Cache_Entry *vg_entry, unsigned int frame_num);
void evas_cache_vg_entry_del(Vg_Cache_Entry *vg_entry);
Vg_File_Data * evas_cache_vg_file_open(const Eina_File *file, const char *key, Eina_Bool mmap);
-Eina_Bool evas_cache_vg_file_save(Efl_VG *root, int w, int h, const char *file, const char *key, const char *flags);
-Eina_Bool evas_cache_vg_entry_file_save(Vg_Cache_Entry *vg_entry, const char *file, const char *key, const char *flags);
+Eina_Bool evas_cache_vg_file_save(Efl_VG *root, int w, int h, const char *file, const char *key, const Efl_File_Save_Info *info);
+Eina_Bool evas_cache_vg_entry_file_save(Vg_Cache_Entry *vg_entry, const char *file, const char *key, const Efl_File_Save_Info *info);
double evas_cache_vg_anim_duration_get(const Vg_Cache_Entry *vg_entry);
unsigned int evas_cache_vg_anim_frame_count_get(const Vg_Cache_Entry *vg_entry);
Eina_Size2D evas_cache_vg_entry_default_size_get(const Vg_Cache_Entry *vg_entry);
}
static Eina_Bool
-_vg_file_save(Vg_File_Data *vfd, const char *file, const char *key, const char *flags)
+_vg_file_save(Vg_File_Data *vfd, const char *file, const char *key, const Efl_File_Save_Info *info)
{
Evas_Module *em;
Evas_Vg_Save_Func *saver;
if (!file) return EINA_FALSE;
- if (flags)
- {
- char *p, *pp;
- char *tflags;
-
- int len = strlen(flags) + 1;
- tflags = alloca(len);
- strncpy(tflags, flags, len);
- p = tflags;
- while (p)
- {
- pp = strchr(p, ' ');
- if (pp) *pp = 0;
- sscanf(p, "compress=%i", &compress);
- if (pp) p = pp + 1;
- else break;
- }
- }
+ if (info) compress = info->compression;
em = _find_saver_module(file);
if (em)
}
Eina_Bool
-evas_cache_vg_entry_file_save(Vg_Cache_Entry *vg_entry, const char *file, const char *key,
- const char *flags)
+evas_cache_vg_entry_file_save(Vg_Cache_Entry *vg_entry, const char *file, const char *key, const Efl_File_Save_Info *info)
{
Vg_File_Data *vfd =
evas_cache_vg_file_open(vg_entry->file, vg_entry->key, EINA_FALSE);
if (!vfd) return EINA_FALSE;
- return _vg_file_save(vfd, file, key, flags);
+ return _vg_file_save(vfd, file, key, info);
}
Eina_Bool
-evas_cache_vg_file_save(Efl_VG *root, int w, int h, const char *file, const char *key,
- const char *flags)
+evas_cache_vg_file_save(Efl_VG *root, int w, int h, const char *file, const char *key, const Efl_File_Save_Info *info)
{
Vg_File_Data vfd = {};
vfd.root = root;
vfd.preserve_aspect = EINA_FALSE;
- return _vg_file_save(&vfd, file, key, flags);
+ return _vg_file_save(&vfd, file, key, info);
}