diff --git a/legacy/evas/ChangeLog b/legacy/evas/ChangeLog index 77e3ef88fa..efbf832d1f 100644 --- a/legacy/evas/ChangeLog +++ b/legacy/evas/ChangeLog @@ -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. diff --git a/legacy/evas/src/lib/Evas.h b/legacy/evas/src/lib/Evas.h index 7734981de5..e3625ede0f 100644 --- a/legacy/evas/src/lib/Evas.h +++ b/legacy/evas/src/lib/Evas.h @@ -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 * diff --git a/legacy/evas/src/lib/canvas/evas_main.c b/legacy/evas/src/lib/canvas/evas_main.c index 94d9abf7d6..54e0679710 100644 --- a/legacy/evas/src/lib/canvas/evas_main.c +++ b/legacy/evas/src/lib/canvas/evas_main.c @@ -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) { diff --git a/legacy/evas/src/lib/engines/common/evas_image.h b/legacy/evas/src/lib/engines/common/evas_image.h index 618ea5a5f0..6d5c620079 100644 --- a/legacy/evas/src/lib/engines/common/evas_image.h +++ b/legacy/evas/src/lib/engines/common/evas_image.h @@ -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 */ diff --git a/legacy/evas/src/lib/engines/common/evas_image_load.c b/legacy/evas/src/lib/engines/common/evas_image_load.c index c0486b1314..fcbf7fa977 100644 --- a/legacy/evas/src/lib/engines/common/evas_image_load.c +++ b/legacy/evas/src/lib/engines/common/evas_image_load.c @@ -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; +}