summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2013-09-24 15:13:27 +0900
committerCedric Bail <cedric.bail@free.fr>2013-10-17 20:48:26 +0900
commit206e87f242277bcf8a156d59ac05963f49830c4c (patch)
tree03512ed7e58e57a38cf9116a12869b6cce2c460f
parent3cdc236918cfb359bfb9fa76fa7cf6bc3612356c (diff)
downloadefl-206e87f242277bcf8a156d59ac05963f49830c4c.tar.gz
evas/cserve2: Use scalecache with cserve2
Let's reuse the logic from scalecache and call cserve2 functions when the scalecache should be used. So, now, cserve2 server will not scale any image... This is too computationally intensive for the server's main thread.
-rw-r--r--src/bin/evas/evas_cserve2_cache.c3
-rw-r--r--src/lib/evas/cache2/evas_cache2.c31
-rw-r--r--src/lib/evas/cserve2/evas_cs2.h4
-rw-r--r--src/lib/evas/cserve2/evas_cs2_client.c20
-rw-r--r--src/modules/evas/engines/software_generic/evas_engine.c11
5 files changed, 62 insertions, 7 deletions
diff --git a/src/bin/evas/evas_cserve2_cache.c b/src/bin/evas/evas_cserve2_cache.c
index 779d11e2f4..be54b77f9f 100644
--- a/src/bin/evas/evas_cserve2_cache.c
+++ b/src/bin/evas/evas_cserve2_cache.c
@@ -506,6 +506,7 @@ _image_loaded_msg_create(Image_Entry *ientry, Image_Data *idata, int *size)
msg->shm.mmap_size = cserve2_shm_map_size_get(ientry->shm);
msg->shm.image_size = cserve2_shm_size_get(ientry->shm);
msg->alpha_sparse = idata->alpha_sparse;
+ msg->unscaled = idata->unscaled;
msg->image.w = idata->w;
msg->image.h = idata->h;
@@ -894,6 +895,8 @@ _load_request_response(Image_Entry *ientry,
if (!idata->doload)
DBG("Entry %d loaded by speculative preload.", idata->id);
+#warning Forcing unscaled mode for now
+ idata->unscaled = EINA_TRUE;
idata->w = resp->w;
idata->h = resp->h;
diff --git a/src/lib/evas/cache2/evas_cache2.c b/src/lib/evas/cache2/evas_cache2.c
index d799dc719e..9495cca584 100644
--- a/src/lib/evas/cache2/evas_cache2.c
+++ b/src/lib/evas/cache2/evas_cache2.c
@@ -799,7 +799,28 @@ evas_cache2_image_open_wait(Image_Entry *im)
}
static Image_Entry *
-_scaled_image_find(Image_Entry *im, int src_x, int src_y, int src_w, int src_h, int dst_w, int dst_h, int smooth)
+_non_scaled_image_find(Image_Entry *im)
+{
+ size_t pathlen, keylen, size;
+ char *hkey;
+ Evas_Image_Load_Opts lo;
+
+ pathlen = strlen(im->file);
+ keylen = im->key ? strlen(im->key) : 6;
+ size = pathlen + keylen + HKEY_LOAD_OPTS_STR_LEN;
+ hkey = alloca(sizeof(char) * size);
+
+ lo = im->load_opts;
+ memset(&lo.scale_load, 0, sizeof(lo.scale_load));
+
+ evas_cache2_image_cache_key_create(hkey, im->file, pathlen,
+ im->key, keylen, &lo);
+ return eina_hash_find(im->cache2->activ, hkey);
+}
+
+static Image_Entry *
+_scaled_image_find(Image_Entry *im, int src_x, int src_y, int src_w,
+ int src_h, int dst_w, int dst_h, int smooth)
{
size_t pathlen, keylen, size;
char *hkey;
@@ -897,6 +918,14 @@ evas_cache2_image_scale_load(Image_Entry *im,
dst_w, dst_h, smooth);
if (ret) return ret;
+ // Find whether non scaled image is in cache
+ ret = _non_scaled_image_find(im);
+ if (ret)
+ {
+ DBG("Non scaled version of this image in cache. Scaling on-the-fly.");
+ return ret;
+ }
+
pathlen = strlen(im->file);
keylen = im->key ? strlen(im->key) : 6;
size = pathlen + keylen + HKEY_LOAD_OPTS_STR_LEN;
diff --git a/src/lib/evas/cserve2/evas_cs2.h b/src/lib/evas/cserve2/evas_cs2.h
index e556f18624..93bde6228f 100644
--- a/src/lib/evas/cserve2/evas_cs2.h
+++ b/src/lib/evas/cserve2/evas_cs2.h
@@ -91,9 +91,10 @@ struct _Msg_Loaded {
int image_size;
} shm;
struct {
- int w, h; // Real dimensions of this image. May differ from Msg_Opened::image::{w,h} after scaling.
+ unsigned int w, h; // Real dimensions of this image. May differ from Msg_Opened::image::{w,h} after scaling.
} image;
Eina_Bool alpha_sparse : 1;
+ Eina_Bool unscaled : 1;
};
struct _Msg_Preload {
@@ -362,6 +363,7 @@ struct _Image_Data {
Eina_Bool unused : 1;
Eina_Bool doload : 1;
Eina_Bool valid : 1;
+ Eina_Bool unscaled : 1;
};
#define FONT_DATA_ARRAY_TAG ('F' | 'O' << 8 | 'N' << 16 | 'T' << 24)
diff --git a/src/lib/evas/cserve2/evas_cs2_client.c b/src/lib/evas/cserve2/evas_cs2_client.c
index a1861f2a1e..060f759429 100644
--- a/src/lib/evas/cserve2/evas_cs2_client.c
+++ b/src/lib/evas/cserve2/evas_cs2_client.c
@@ -530,6 +530,7 @@ _loaded_handle(Image_Entry *ie, const Msg_Loaded *msg, int size)
Data_Entry *dentry = ie->data2;
RGBA_Image *im = (RGBA_Image *)ie;
const char *shmpath;
+ Eina_Bool scale_request;
shmpath = ((const char *)msg) + sizeof(*msg);
if ((size < (int) sizeof(*msg) + 1)
@@ -540,13 +541,16 @@ _loaded_handle(Image_Entry *ie, const Msg_Loaded *msg, int size)
}
// FIXME: Client-side scaling!
- if (msg->image.w && msg->image.h)
+ // FIXME: Is this valid? Can we change ie's w,h here?
+ scale_request = !_memory_zero_cmp(&ie->load_opts.scale_load,
+ sizeof(ie->load_opts.scale_load));
+ if (scale_request && msg->unscaled)
{
- WRN("Forcing image %p size to %dx%d", ie, msg->image.w, msg->image.h);
+ WRN("Got unscaled image %dx%d after requesting %dx%d",
+ msg->image.w, msg->image.h, ie->w, ie->h);
ie->w = msg->image.w;
ie->h = msg->image.h;
}
- else WRN("keeping original image %p size %dx%d", ie, ie->w, ie->h);
// dentry->shm.path = strdup(shmpath);
dentry->shm.mmap_offset = msg->shm.mmap_offset;
@@ -1099,8 +1103,14 @@ evas_cserve2_image_load_data_wait(Image_Entry *ie)
im->image.no_free = 1;
// FIXME: Is this valid? Can we change ie's w,h here?
- ie->w = idata->w;
- ie->h = idata->h;
+ if (idata->w && idata->h
+ && (idata->w != ie->w || idata->h != ie->h))
+ {
+ WRN("Forcing image %p size to %dx%d (was %dx%d)",
+ ie, idata->w, idata->h, ie->w, ie->h);
+ ie->w = idata->w;
+ ie->h = idata->h;
+ }
ie->load_rid = 0;
return CSERVE2_NONE;
diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c
index 9937f5c9d1..816a8853a4 100644
--- a/src/modules/evas/engines/software_generic/evas_engine.c
+++ b/src/modules/evas/engines/software_generic/evas_engine.c
@@ -1365,6 +1365,16 @@ image_loaded:
if (!im->cache_entry.flags.loaded) return EINA_FALSE;
evas_common_image_colorspace_normalize(im);
+ evas_common_rgba_image_scalecache_prepare
+ (&im->cache_entry, surface, context, smooth,
+ src_x, src_y, src_w, src_h,
+ dst_x, dst_y, dst_w, dst_h);
+ evas_common_rgba_image_scalecache_do
+ (&im->cache_entry, surface, context, smooth,
+ src_x, src_y, src_w, src_h,
+ dst_x, dst_y, dst_w, dst_h);
+
+ /*
if (smooth)
evas_common_scale_rgba_in_to_out_clip_smooth
(im, surface, context,
@@ -1375,6 +1385,7 @@ image_loaded:
(im, surface, context,
src_x, src_y, src_w, src_h,
dst_x, dst_y, dst_w, dst_h);
+ */
}
else
#endif