jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=d76e869a5908a56c04bb8ad9927ef45b1cf70faa

commit d76e869a5908a56c04bb8ad9927ef45b1cf70faa
Author: Jean-Philippe Andre <[email protected]>
Date:   Mon Sep 2 18:53:18 2013 +0900

    evas/cserve2: Fallback to normal cache for mmap
    
    cserve2 can't handle virtual files (mmap-only), by design.
    Proper support can be added later on, but for now we might want
    to just fallback to the normal cache functions.
    
    Fixes photocam test
---
 src/lib/evas/cache2/evas_cache2.c                       |  7 +++++++
 src/lib/evas/cache2/evas_cache2.h                       |  1 +
 src/lib/evas/canvas/evas_render.c                       |  2 +-
 src/modules/evas/engines/software_generic/evas_engine.c | 14 +++++++-------
 4 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/src/lib/evas/cache2/evas_cache2.c 
b/src/lib/evas/cache2/evas_cache2.c
index 1a033b5..4b51b32 100644
--- a/src/lib/evas/cache2/evas_cache2.c
+++ b/src/lib/evas/cache2/evas_cache2.c
@@ -549,6 +549,13 @@ evas_cache2_shutdown(Evas_Cache2 *cache)
    free(cache);
 }
 
+EAPI Eina_Bool
+evas_cache2_image_cached(Image_Entry *ie)
+{
+   if (!ie) return EINA_FALSE;
+   return (ie->cache2 != NULL);
+}
+
 EAPI void
 evas_cache2_image_cache_key_create(char *hkey, const char *path, size_t 
pathlen,
                                    const char *key, size_t keylen,
diff --git a/src/lib/evas/cache2/evas_cache2.h 
b/src/lib/evas/cache2/evas_cache2.h
index 6f8e588..7cd9c79 100644
--- a/src/lib/evas/cache2/evas_cache2.h
+++ b/src/lib/evas/cache2/evas_cache2.h
@@ -76,6 +76,7 @@ EAPI Image_Entry * evas_cache2_image_size_set(Image_Entry 
*im, unsigned int w, u
 EAPI Image_Entry * evas_cache2_image_dirty(Image_Entry *im, unsigned int x, 
unsigned int y, unsigned int w, unsigned int h);
 EAPI Image_Entry * evas_cache2_image_empty(Evas_Cache2 *cache);
 EAPI void evas_cache2_image_surface_alloc(Image_Entry *ie, int w, int h);
+EAPI Eina_Bool evas_cache2_image_cached(Image_Entry *ie);
 
 EAPI int evas_cache2_flush(Evas_Cache2 *cache);
 EAPI void evas_cache2_limit_set(Evas_Cache2 *cache, int limit);
diff --git a/src/lib/evas/canvas/evas_render.c 
b/src/lib/evas/canvas/evas_render.c
index b08e006..2ceca4d 100644
--- a/src/lib/evas/canvas/evas_render.c
+++ b/src/lib/evas/canvas/evas_render.c
@@ -1571,7 +1571,7 @@ static Eina_Bool
 _drop_image_cache_ref(const void *container EINA_UNUSED, void *data, void 
*fdata EINA_UNUSED)
 {
 #ifdef EVAS_CSERVE2
-   if (evas_cserve2_use_get())
+   if (evas_cserve2_use_get() && evas_cache2_image_cached(data))
      evas_cache2_image_close((Image_Entry *)data);
    else
 #endif
diff --git a/src/modules/evas/engines/software_generic/evas_engine.c 
b/src/modules/evas/engines/software_generic/evas_engine.c
index 5163a56..8b34414 100644
--- a/src/modules/evas/engines/software_generic/evas_engine.c
+++ b/src/modules/evas/engines/software_generic/evas_engine.c
@@ -962,7 +962,7 @@ eng_image_mmap(void *data EINA_UNUSED, Eina_File *f, const 
char *key, int *error
    *error = EVAS_LOAD_ERROR_NONE;
 #ifdef EVAS_CSERVE2
    // FIXME: Need to pass fd to make that useful, so just get the filename for 
now.
-   if (evas_cserve2_use_get())
+   if (evas_cserve2_use_get() && !eina_file_virtual(f))
      {
         Image_Entry *ie;
         ie = evas_cache2_image_open(evas_common_image_cache2_get(),
@@ -1006,7 +1006,7 @@ static void
 eng_image_free(void *data EINA_UNUSED, void *image)
 {
 #ifdef EVAS_CSERVE2
-   if (evas_cserve2_use_get())
+   if (evas_cserve2_use_get() && evas_cache2_image_cached(image))
      {
         evas_cache2_image_close(image);
         return;
@@ -1031,7 +1031,7 @@ eng_image_size_set(void *data EINA_UNUSED, void *image, 
int w, int h)
    Image_Entry *im = image;
    if (!im) return NULL;
 #ifdef EVAS_CSERVE2
-   if (evas_cserve2_use_get())
+   if (evas_cserve2_use_get() && evas_cache2_image_cached(im))
      return evas_cache2_image_size_set(im, w, h);
 #endif
    return evas_cache_image_size_set(im, w, h);
@@ -1043,7 +1043,7 @@ eng_image_dirty_region(void *data EINA_UNUSED, void 
*image, int x, int y, int w,
    Image_Entry *im = image;
    if (!im) return NULL;
 #ifdef EVAS_CSERVE2
-   if (evas_cserve2_use_get())
+   if (evas_cserve2_use_get() && evas_cache2_image_cached(im))
      return evas_cache2_image_dirty(im, x, y, w, h);
 #endif
    return evas_cache_image_dirty(im, x, y, w, h);
@@ -1063,7 +1063,7 @@ eng_image_data_get(void *data EINA_UNUSED, void *image, 
int to_write, DATA32 **i
    im = image;
 
 #ifdef EVAS_CSERVE2
-   if (evas_cserve2_use_get())
+   if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->cache_entry))
      {
         error = evas_cache2_image_load_data(&im->cache_entry);
         if (err) *err = error;
@@ -1157,7 +1157,7 @@ eng_image_data_preload_request(void *data EINA_UNUSED, 
void *image, const Eo *ta
    if (!im) return;
 
 #ifdef EVAS_CSERVE2
-   if (evas_cserve2_use_get())
+   if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->cache_entry))
      {
         evas_cache2_image_preload_data(&im->cache_entry, target);
         return;
@@ -1171,7 +1171,7 @@ eng_image_data_preload_cancel(void *data EINA_UNUSED, 
void *image, const Eo *tar
 {
    RGBA_Image *im = image;
 #ifdef EVAS_CSERVE2
-   if (evas_cserve2_use_get())
+   if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->cache_entry))
      return;
 #endif
 

-- 


Reply via email to