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 de9ad83295..16be20ec16 100644 --- a/legacy/evas/src/lib/engines/common/evas_image_load.c +++ b/legacy/evas/src/lib/engines/common/evas_image_load.c @@ -1097,7 +1097,10 @@ evas_common_load_image_from_file(const char *file, const char *key) } im->timestamp = mod_time; if (file) - im->info.file = strdup(file); + { + im->info.file = strdup(file); + im->info.real_file = evas_file_path_resolve(file); + } if (key) im->info.key = strdup(key); evas_common_image_ref(im); diff --git a/legacy/evas/src/lib/engines/common/evas_image_main.c b/legacy/evas/src/lib/engines/common/evas_image_main.c index 20595cf9c9..ad4f1279dd 100644 --- a/legacy/evas/src/lib/engines/common/evas_image_main.c +++ b/legacy/evas/src/lib/engines/common/evas_image_main.c @@ -138,6 +138,7 @@ evas_common_image_free(RGBA_Image *im) } if (im->mipmaps.levels) free(im->mipmaps.levels); if (im->info.file) free(im->info.file); + if (im->info.real_file) free(im->info.real_file); if (im->info.key) free(im->info.key); if (im->info.comment) free(im->info.comment); free(im); @@ -244,7 +245,8 @@ evas_common_image_store(RGBA_Image *im) if (im->flags & RGBA_IMAGE_INDEXED) return; if ((!im->info.file) && (!im->info.key)) return; l1 = 0; - if (im->info.file) l1 = strlen(im->info.file); + if (im->info.real_file) l1 = strlen(im->info.real_file); + else if (im->info.file) l1 = strlen(im->info.file); l2 = 0; if (im->info.key) l2 = strlen(im->info.key); snprintf(buf, sizeof(buf), "%llx", im->timestamp); @@ -252,7 +254,8 @@ evas_common_image_store(RGBA_Image *im) key = malloc(l1 + 3 + l2 + 3 + l3 +1); if (!key) return; key[0] = 0; - if (im->info.file) strcpy(key, im->info.file); + if (im->info.real_file) strcpy(key, im->info.real_file); + else if (im->info.file) strcpy(key, im->info.file); strcat(key, "/:/"); if (im->info.key) strcat(key, im->info.key); strcat(key, "/:/"); @@ -272,7 +275,8 @@ evas_common_image_unstore(RGBA_Image *im) if (!(im->flags & RGBA_IMAGE_INDEXED)) return; if ((!im->info.file) && (!im->info.key)) return; l1 = 0; - if (im->info.file) l1 = strlen(im->info.file); + if (im->info.real_file) l1 = strlen(im->info.real_file); + else if (im->info.file) l1 = strlen(im->info.file); l2 = 0; if (im->info.key) l2 = strlen(im->info.key); snprintf(buf, sizeof(buf), "%llx", im->timestamp); @@ -280,7 +284,8 @@ evas_common_image_unstore(RGBA_Image *im) key = malloc(l1 + 3 + l2 + 3 + l3 +1); if (!key) return; key[0] = 0; - if (im->info.file) strcpy(key, im->info.file); + if (im->info.real_file) strcpy(key, im->info.real_file); + else if (im->info.file) strcpy(key, im->info.file); strcat(key, "/:/"); if (im->info.key) strcat(key, im->info.key); strcat(key, "/:/"); @@ -294,6 +299,7 @@ evas_common_image_unstore(RGBA_Image *im) RGBA_Image * evas_common_image_find(const char *filename, const char *key, DATA64 timestamp) { + char *real_filename; Evas_Object_List *l; RGBA_Image *im; char *str; @@ -301,8 +307,10 @@ evas_common_image_find(const char *filename, const char *key, DATA64 timestamp) char buf[256]; if ((!filename) && (!key)) return NULL; + real_filename = evas_file_path_resolve(filename); l1 = 0; - if (filename) l1 = strlen(filename); + if (real_filename) l1 = strlen(real_filename); + else if (filename) l1 = strlen(filename); l2 = 0; if (key) l2 = strlen(key); sprintf(buf, "%llx", timestamp); @@ -325,11 +333,20 @@ evas_common_image_find(const char *filename, const char *key, DATA64 timestamp) im = (RGBA_Image *)l; ok = 0; - if ((filename) && (im->info.file) && - (!strcmp(filename, im->info.file))) - ok++; - if ((!filename) && (!im->info.file)) - ok++; + if (real_filename) + { + if ((im->info.real_file) && + (!strcmp(real_filename, im->info.real_file))) + ok++; + } + else + { + if ((filename) && (im->info.file) && + (!strcmp(filename, im->info.file))) + ok++; + if ((!filename) && (!im->info.file)) + ok++; + } if ((key) && (im->info.key) && (!strcmp(key, im->info.key))) ok++; @@ -350,6 +367,7 @@ evas_common_image_ram_usage(RGBA_Image *im) ram += sizeof(struct _RGBA_Image); if (im->info.file) ram += strlen(im->info.file); + if (im->info.real_file) ram += strlen(im->info.real_file); if (im->info.key) ram += strlen(im->info.key); if (im->info.comment) ram += strlen(im->info.comment); if ((im->image) && (im->image->data) && (!im->image->no_free)) diff --git a/legacy/evas/src/lib/file/evas_path.c b/legacy/evas/src/lib/file/evas_path.c index a39261487b..ec5f3b196d 100644 --- a/legacy/evas/src/lib/file/evas_path.c +++ b/legacy/evas/src/lib/file/evas_path.c @@ -8,9 +8,12 @@ #ifndef _WIN32_WCE +#include +#include +#include +#include #include #include -#include /* get the casefold feature! */ #define _GNU_SOURCE #include @@ -120,6 +123,15 @@ evas_file_modified_time(const char *file) return 0; } +char * +evas_file_path_resolve(const char *file) +{ + char buf[PATH_MAX], *buf2; + + if (!realpath(file, buf)) return NULL; + buf2 = strdup(buf); + return buf2; +} #else @@ -327,7 +339,6 @@ evas_file_path_list(char *path, char *match, int match_case) return files; } - DATA64 evas_file_modified_time(const char *file) { @@ -353,4 +364,10 @@ evas_file_modified_time(const char *file) return modtime.QuadPart; } + +char * +evas_file_path_resolve(const char *file) +{ + return strdup(file); +} #endif diff --git a/legacy/evas/src/lib/include/evas_common.h b/legacy/evas/src/lib/include/evas_common.h index 958b9f3420..d9d9c11886 100644 --- a/legacy/evas/src/lib/include/evas_common.h +++ b/legacy/evas/src/lib/include/evas_common.h @@ -265,6 +265,7 @@ struct _RGBA_Image { int format; char *file; + char *real_file; char *key; char *comment; } info; diff --git a/legacy/evas/src/lib/include/evas_private.h b/legacy/evas/src/lib/include/evas_private.h index 946a95d2a0..91e912edc4 100644 --- a/legacy/evas/src/lib/include/evas_private.h +++ b/legacy/evas/src/lib/include/evas_private.h @@ -521,6 +521,7 @@ int evas_file_path_is_file(char *path); int evas_file_path_is_dir(char *path); Evas_List *evas_file_path_list(char *path, char *match, int match_case); DATA64 evas_file_modified_time(const char *file); +char *evas_file_path_resolve(const char *file); int evas_mem_free(int mem_required); int evas_mem_degrade(int mem_required); void evas_debug_error(void);