evas: add evas_object_image_extension_can_load_get.

This functions let you check if a file could be opened by
Evas_Object_Image. It is threadsafe, and you should use it
from another thread as often as possible :-)



SVN revision: 59872
This commit is contained in:
Cedric BAIL 2011-06-01 14:32:08 +00:00
parent 1dfe691a36
commit 0e0dca586f
5 changed files with 122 additions and 49 deletions

View File

@ -387,3 +387,9 @@
2011-05-29 Vincent Torri
* Fix compilation when --disable-async-preload is passed to configure.
2011-06-01 Cedric Bail
* Add +evas_object_image_extension_can_load_get and
evas_object_image_extension_can_load_fast_get that check if a file
may be opened by Evas_Object_Image.

View File

@ -5236,6 +5236,28 @@ EAPI Evas_Object *evas_object_image_source_get (Evas_Obj
*/
EAPI Eina_Bool evas_object_image_source_unset (Evas_Object *obj) EINA_ARG_NONNULL(1);
/**
* Check if a file extention may be supported by @ref Evas_Object_Image.
*
* @param file The file to check
* @return EINA_TRUE if we may be able to opeen it, EINA_FALSE if it's unlikely.
*
* If file is a Eina_Stringshare, use directly @ref evas_object_image_extension_can_load_fast_get.
*
* This functions is threadsafe.
*/
EAPI Eina_Bool evas_object_image_extension_can_load_get(const char *file);
/**
* Check if a file extention may be supported by @ref Evas_Object_Image.
*
* @param file The file to check, it should be an Eina_Stringshare.
* @return EINA_TRUE if we may be able to opeen it, EINA_FALSE if it's unlikely.
*
* This functions is threadsafe.
*/
EAPI Eina_Bool evas_object_image_extension_can_load_fast_get(const char *file);
/**
* @defgroup Evas_Object_Text Text Object Functions
*

View File

@ -510,6 +510,25 @@ evas_render_method_list_free(Eina_List *list)
eina_list_free(list);
}
EAPI Eina_Bool
evas_object_image_extension_can_load_get(const char *file)
{
const char *tmp;
Eina_Bool result;
tmp = eina_stringshare_add(file);
result = evas_common_extension_can_load_get(tmp);
eina_stringshare_del(tmp);
return result;
}
EAPI Eina_Bool
evas_object_image_extension_can_load_fast_get(const char *file)
{
return evas_common_extension_can_load_get(file);
}
EAPI void
evas_pointer_output_xy_get(const Evas *e, int *x, int *y)
{

View File

@ -57,4 +57,6 @@ EAPI int evas_common_load_rgba_image_data_from_file (Image_Entry *im);
void _evas_common_rgba_image_post_surface(Image_Entry *ie);
EAPI Eina_Bool evas_common_extension_can_load_get(const char *file);
#endif /* _EVAS_IMAGE_H */

View File

@ -8,61 +8,65 @@
struct ext_loader_s
{
unsigned int length;
const char *extension;
const char *loader;
};
#define MATCHING(Ext, Module) \
{ sizeof (Ext), Ext, Module }
static const struct ext_loader_s loaders[] =
{ /* map extensions to loaders to use for good first-guess tries */
{ ".png", "png" },
{ ".jpg", "jpeg" },
{ ".jpeg", "jpeg" },
{ ".jfif", "jpeg" },
{ ".eet", "eet" },
{ ".edj", "eet" },
{ ".eap", "eet" },
{ ".edb", "edb" },
{ ".xpm", "xpm" },
{ ".tiff", "tiff" },
{ ".tif", "tiff" },
{ ".svg", "svg" },
{ ".svgz", "svg" },
{ ".svg.gz", "svg" },
{ ".gif", "gif" },
{ ".pbm", "pmaps" },
{ ".pgm", "pmaps" },
{ ".ppm", "pmaps" },
{ ".pnm", "pmaps" },
{ ".bmp", "bmp" },
{ ".tga", "tga" },
{ ".wbmp", "wbmp" },
{ ".ico", "ico" },
{ ".cur", "ico" },
{ ".psd", "psd" },
{ ".pdf", "generic" },
{ ".ps", "generic" },
{ ".xcf", "generic" },
{ ".xcf.gz", "generic" },
{ ".arw", "generic" },
{ ".cr2", "generic" },
{ ".crw", "generic" },
{ ".dcr", "generic" },
{ ".dng", "generic" },
{ ".k25", "generic" },
{ ".kdc", "generic" },
{ ".erf", "generic" },
{ ".mrw", "generic" },
{ ".nef", "generic" },
{ ".nrf", "generic" },
{ ".nrw", "generic" },
{ ".orf", "generic" },
{ ".raw", "generic" },
{ ".rw2", "generic" },
{ ".pef", "generic" },
{ ".raf", "generic" },
{ ".sr2", "generic" },
{ ".srf", "generic" },
{ ".x3f", "generic" }
MATCHING(".png", "png"),
MATCHING(".jpg", "jpeg"),
MATCHING(".jpeg", "jpeg"),
MATCHING(".jfif", "jpeg"),
MATCHING(".eet", "eet"),
MATCHING(".edj", "eet"),
MATCHING(".eap", "eet"),
MATCHING(".edb", "edb"),
MATCHING(".xpm", "xpm"),
MATCHING(".tiff", "tiff"),
MATCHING(".tif", "tiff"),
MATCHING(".svg", "svg"),
MATCHING(".svgz", "svg"),
MATCHING(".svg.gz", "svg"),
MATCHING(".gif", "gif"),
MATCHING(".pbm", "pmaps"),
MATCHING(".pgm", "pmaps"),
MATCHING(".ppm", "pmaps"),
MATCHING(".pnm", "pmaps"),
MATCHING(".bmp", "bmp"),
MATCHING(".tga", "tga"),
MATCHING(".wbmp", "wbmp"),
MATCHING(".ico", "ico"),
MATCHING(".cur", "ico"),
MATCHING(".psd", "psd"),
MATCHING(".pdf", "generic"),
MATCHING(".ps", "generic"),
MATCHING(".xcf", "generic"),
MATCHING(".xcf.gz", "generic"),
MATCHING(".arw", "generic"),
MATCHING(".cr2", "generic"),
MATCHING(".crw", "generic"),
MATCHING(".dcr", "generic"),
MATCHING(".dng", "generic"),
MATCHING(".k25", "generic"),
MATCHING(".kdc", "generic"),
MATCHING(".erf", "generic"),
MATCHING(".mrw", "generic"),
MATCHING(".nef", "generic"),
MATCHING(".nrf", "generic"),
MATCHING(".nrw", "generic"),
MATCHING(".orf", "generic"),
MATCHING(".raw", "generic"),
MATCHING(".rw2", "generic"),
MATCHING(".pef", "generic"),
MATCHING(".raf", "generic"),
MATCHING(".sr2", "generic"),
MATCHING(".srf", "generic"),
MATCHING(".x3f", "generic")
};
static const char *loaders_name[] =
@ -292,3 +296,23 @@ evas_common_load_rgba_image_data_from_file(Image_Entry *ie)
return EVAS_LOAD_ERROR_NONE;
}
EAPI Eina_Bool
evas_common_extension_can_load_get(const char *file)
{
unsigned int length;
unsigned int i;
length = eina_stringshare_strlen(file) + 1;
if (length < 5) return EINA_FALSE;
for (i = 0; i < sizeof (loaders) / sizeof (struct ext_loader_s); ++i)
{
if (loaders[i].length > length) continue;
if (!strcasecmp(loaders[i].extension, file + length - loaders[i].length))
return EINA_TRUE;
}
return EINA_FALSE;
}