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 2011-05-29 Vincent Torri
* Fix compilation when --disable-async-preload is passed to configure. * 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); 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 * @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); 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 EAPI void
evas_pointer_output_xy_get(const Evas *e, int *x, int *y) 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); 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 */ #endif /* _EVAS_IMAGE_H */

View File

@ -8,61 +8,65 @@
struct ext_loader_s struct ext_loader_s
{ {
unsigned int length;
const char *extension; const char *extension;
const char *loader; const char *loader;
}; };
#define MATCHING(Ext, Module) \
{ sizeof (Ext), Ext, Module }
static const struct ext_loader_s loaders[] = static const struct ext_loader_s loaders[] =
{ /* map extensions to loaders to use for good first-guess tries */ { /* map extensions to loaders to use for good first-guess tries */
{ ".png", "png" }, MATCHING(".png", "png"),
{ ".jpg", "jpeg" }, MATCHING(".jpg", "jpeg"),
{ ".jpeg", "jpeg" }, MATCHING(".jpeg", "jpeg"),
{ ".jfif", "jpeg" }, MATCHING(".jfif", "jpeg"),
{ ".eet", "eet" }, MATCHING(".eet", "eet"),
{ ".edj", "eet" }, MATCHING(".edj", "eet"),
{ ".eap", "eet" }, MATCHING(".eap", "eet"),
{ ".edb", "edb" }, MATCHING(".edb", "edb"),
{ ".xpm", "xpm" }, MATCHING(".xpm", "xpm"),
{ ".tiff", "tiff" }, MATCHING(".tiff", "tiff"),
{ ".tif", "tiff" }, MATCHING(".tif", "tiff"),
{ ".svg", "svg" }, MATCHING(".svg", "svg"),
{ ".svgz", "svg" }, MATCHING(".svgz", "svg"),
{ ".svg.gz", "svg" }, MATCHING(".svg.gz", "svg"),
{ ".gif", "gif" }, MATCHING(".gif", "gif"),
{ ".pbm", "pmaps" }, MATCHING(".pbm", "pmaps"),
{ ".pgm", "pmaps" }, MATCHING(".pgm", "pmaps"),
{ ".ppm", "pmaps" }, MATCHING(".ppm", "pmaps"),
{ ".pnm", "pmaps" }, MATCHING(".pnm", "pmaps"),
{ ".bmp", "bmp" }, MATCHING(".bmp", "bmp"),
{ ".tga", "tga" }, MATCHING(".tga", "tga"),
{ ".wbmp", "wbmp" }, MATCHING(".wbmp", "wbmp"),
{ ".ico", "ico" }, MATCHING(".ico", "ico"),
{ ".cur", "ico" }, MATCHING(".cur", "ico"),
{ ".psd", "psd" }, MATCHING(".psd", "psd"),
{ ".pdf", "generic" }, MATCHING(".pdf", "generic"),
{ ".ps", "generic" }, MATCHING(".ps", "generic"),
{ ".xcf", "generic" }, MATCHING(".xcf", "generic"),
{ ".xcf.gz", "generic" }, MATCHING(".xcf.gz", "generic"),
{ ".arw", "generic" }, MATCHING(".arw", "generic"),
{ ".cr2", "generic" }, MATCHING(".cr2", "generic"),
{ ".crw", "generic" }, MATCHING(".crw", "generic"),
{ ".dcr", "generic" }, MATCHING(".dcr", "generic"),
{ ".dng", "generic" }, MATCHING(".dng", "generic"),
{ ".k25", "generic" }, MATCHING(".k25", "generic"),
{ ".kdc", "generic" }, MATCHING(".kdc", "generic"),
{ ".erf", "generic" }, MATCHING(".erf", "generic"),
{ ".mrw", "generic" }, MATCHING(".mrw", "generic"),
{ ".nef", "generic" }, MATCHING(".nef", "generic"),
{ ".nrf", "generic" }, MATCHING(".nrf", "generic"),
{ ".nrw", "generic" }, MATCHING(".nrw", "generic"),
{ ".orf", "generic" }, MATCHING(".orf", "generic"),
{ ".raw", "generic" }, MATCHING(".raw", "generic"),
{ ".rw2", "generic" }, MATCHING(".rw2", "generic"),
{ ".pef", "generic" }, MATCHING(".pef", "generic"),
{ ".raf", "generic" }, MATCHING(".raf", "generic"),
{ ".sr2", "generic" }, MATCHING(".sr2", "generic"),
{ ".srf", "generic" }, MATCHING(".srf", "generic"),
{ ".x3f", "generic" } MATCHING(".x3f", "generic")
}; };
static const char *loaders_name[] = 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; 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;
}