summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2013-09-24 18:09:38 +0900
committerCedric Bail <cedric.bail@free.fr>2013-10-17 20:48:26 +0900
commit1a0c0df64e3ccaea4180cdaeae5b97ff5a09a2e2 (patch)
tree69631a861e1f87b5b44316818ae613c2e979ac67
parent206e87f242277bcf8a156d59ac05963f49830c4c (diff)
downloadefl-1a0c0df64e3ccaea4180cdaeae5b97ff5a09a2e2.tar.gz
evas/cserve2: Scale images in cserve2 when scalecache is used
So, we're back using cserve2 for scaling. This is not optimal but makes a hell of a lot more sense for the moment. (since cserve2 manages the SHM segments) Also, fix partial scaling (region-based) for border support.
-rw-r--r--src/bin/evas/evas_cserve2.h2
-rw-r--r--src/bin/evas/evas_cserve2_cache.c29
-rw-r--r--src/bin/evas/evas_cserve2_scale.c6
-rw-r--r--src/lib/evas/cache2/evas_cache2.c15
-rw-r--r--src/lib/evas/canvas/evas_object_image.c3
-rw-r--r--src/lib/evas/common/evas_image_scalecache.c11
-rw-r--r--src/modules/evas/engines/software_generic/evas_engine.c6
7 files changed, 46 insertions, 26 deletions
diff --git a/src/bin/evas/evas_cserve2.h b/src/bin/evas/evas_cserve2.h
index b1b6d6882e..2a3a40eb67 100644
--- a/src/bin/evas/evas_cserve2.h
+++ b/src/bin/evas/evas_cserve2.h
@@ -320,7 +320,7 @@ void cserve2_cache_client_del(Client *client);
int cserve2_cache_file_open(Client *client, unsigned int client_file_id, const char *path, const char *key, unsigned int rid, Evas_Image_Load_Opts *lo);
void cserve2_cache_file_close(Client *client, unsigned int client_file_id);
int cserve2_cache_image_entry_create(Client *client, int rid, unsigned int client_file_id, unsigned int image_id, Evas_Image_Load_Opts *opts);
-void cserve2_rgba_image_scale_do(void *src_data, void *dst_data, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int alpha, int smooth);
+void cserve2_rgba_image_scale_do(void *src_data, int src_full_w, int src_full_h, void *dst_data, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int alpha, int smooth);
void cserve2_cache_image_load(Client *client, unsigned int client_image_id, unsigned int rid);
void cserve2_cache_image_preload(Client *client, unsigned int client_image_id, unsigned int rid);
void cserve2_cache_image_unload(Client *client, unsigned int client_image_id);
diff --git a/src/bin/evas/evas_cserve2_cache.c b/src/bin/evas/evas_cserve2_cache.c
index be54b77f9f..743751b7fb 100644
--- a/src/bin/evas/evas_cserve2_cache.c
+++ b/src/bin/evas/evas_cserve2_cache.c
@@ -805,7 +805,9 @@ _scaling_do(Shm_Handle *scale_shm, Image_Data *idata, Image_Entry *original)
char *scale_map, *orig_map;
void *src_data, *dst_data;
File_Data *fd;
+ Image_Data *orig_idata;
+#warning FIXME Remove this call, add alpha flag to Image_Data
fd = _file_data_find(idata->file_id);
if (!fd)
{
@@ -814,6 +816,13 @@ _scaling_do(Shm_Handle *scale_shm, Image_Data *idata, Image_Entry *original)
return -1;
}
+ orig_idata = _image_data_find(original->base.id);
+ if (!orig_idata)
+ {
+ ERR("Could not find image %u", original->base.id);
+ return -1;
+ }
+
scale_map = cserve2_shm_map(scale_shm);
if (scale_map == MAP_FAILED)
{
@@ -833,14 +842,16 @@ _scaling_do(Shm_Handle *scale_shm, Image_Data *idata, Image_Entry *original)
src_data = orig_map + cserve2_shm_map_offset_get(original->shm);
dst_data = scale_map + cserve2_shm_map_offset_get(scale_shm);
- DBG("Scaling image ([%d,%d:%dx%d] --> [%d,%d:%dx%d])",
+ DBG("Scaling image ([%dx%d]:[%d,%d:%dx%d] --> [%d,%d:%dx%d])",
+ orig_idata->w, orig_idata->h,
idata->opts.scale_load.src_x, idata->opts.scale_load.src_y,
idata->opts.scale_load.src_w, idata->opts.scale_load.src_h,
0, 0,
idata->opts.scale_load.dst_w, idata->opts.scale_load.dst_h);
cserve2_rgba_image_scale_do(
- src_data, dst_data,
+ src_data, orig_idata->w, orig_idata->h,
+ dst_data,
idata->opts.scale_load.src_x, idata->opts.scale_load.src_y,
idata->opts.scale_load.src_w, idata->opts.scale_load.src_h,
0, 0,
@@ -875,6 +886,9 @@ _scaling_prepare_and_do(Image_Entry *ientry, Image_Data *idata)
cserve2_shared_string_del(idata->shm_id);
ientry->shm = scale_shm;
idata->shm_id = 0;
+ idata->unscaled = EINA_FALSE;
+ idata->w = idata->opts.scale_load.dst_w;
+ idata->h = idata->opts.scale_load.dst_h;
return 0;
}
@@ -895,14 +909,10 @@ _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;
- /*
- TEST: Sending FULL-SIZE image instead of scaled image to client!
-
if (_scaling_needed(idata, resp))
{
DBG("About to scale image %u", idata->id);
@@ -914,7 +924,6 @@ _load_request_response(Image_Entry *ientry,
}
else
DBG("No scaling needed for image %u", idata->id);
- */
return _image_loaded_msg_create(ientry, idata, size);
}
@@ -2790,7 +2799,7 @@ do_scaling:
CSERVE2_REQ_IMAGE_LOAD,
0, NULL, 0, &_load_funcs, orig_entry);
}
- if (orig_entry->base.request || !orig_entry->shm)
+ if (orig_entry->base.request || !orig_entry->shm || !orig_data->valid)
return -1; // Not loaded yet
if (ientry->shm)
@@ -2881,15 +2890,11 @@ cserve2_cache_image_entry_create(Client *client, int rid,
fentry = _file_entry_find(ref->entry->id);
fentry->images = eina_list_append(fentry->images, ientry);
- /*
- TEST: Sending FULL-SIZE image instead of scaled image to client!
-
if (opts && opts->scale_load.dst_w && opts->scale_load.dst_h)
{
if (!_cserve2_cache_fast_scaling_check(client, ientry))
return 0;
}
- */
ASENTRY(ientry)->request = cserve2_request_add(
CSERVE2_REQ_IMAGE_SPEC_LOAD,
diff --git a/src/bin/evas/evas_cserve2_scale.c b/src/bin/evas/evas_cserve2_scale.c
index 9324432f13..dd909db235 100644
--- a/src/bin/evas/evas_cserve2_scale.c
+++ b/src/bin/evas/evas_cserve2_scale.c
@@ -32,7 +32,8 @@ _cserve2_rgba_image_set(RGBA_Image *im, void *data, int w, int h, int alpha)
}
void
-cserve2_rgba_image_scale_do(void *src_data, void *dst_data,
+cserve2_rgba_image_scale_do(void *src_data, int src_full_w, int src_full_h,
+ void *dst_data,
int src_x, int src_y, int src_w, int src_h,
int dst_x, int dst_y, int dst_w, int dst_h,
int alpha, int smooth)
@@ -40,8 +41,7 @@ cserve2_rgba_image_scale_do(void *src_data, void *dst_data,
RGBA_Image src, dst;
RGBA_Draw_Context ct;
- _cserve2_rgba_image_set(&src, src_data, src_w, src_h, alpha);
-
+ _cserve2_rgba_image_set(&src, src_data, src_full_w, src_full_h, alpha);
_cserve2_rgba_image_set(&dst, dst_data, dst_w, dst_h, alpha);
dst.flags = RGBA_IMAGE_NOTHING;
diff --git a/src/lib/evas/cache2/evas_cache2.c b/src/lib/evas/cache2/evas_cache2.c
index 9495cca584..6098374abb 100644
--- a/src/lib/evas/cache2/evas_cache2.c
+++ b/src/lib/evas/cache2/evas_cache2.c
@@ -919,12 +919,12 @@ evas_cache2_image_scale_load(Image_Entry *im,
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;
- }
+ //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;
@@ -958,6 +958,9 @@ evas_cache2_image_scale_load(Image_Entry *im,
evas_cache2_image_load_data(ret);
ret->references++;
+ ret->w = dst_w;
+ ret->h = dst_h;
+
return ret;
parent_out:
diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c
index 2f002fa491..8033063e0e 100644
--- a/src/lib/evas/canvas/evas_object_image.c
+++ b/src/lib/evas/canvas/evas_object_image.c
@@ -3987,7 +3987,8 @@ evas_object_image_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, v
(o->cur->border.b == 0) &&
(o->cur->border.fill != 0))
{
-#ifdef EVAS_CSERVE2
+#if 0
+//#ifdef EVAS_CSERVE2
if (evas_cserve2_use_get())
{
Image_Entry *ie;
diff --git a/src/lib/evas/common/evas_image_scalecache.c b/src/lib/evas/common/evas_image_scalecache.c
index fc907614c8..cbc33d3fc2 100644
--- a/src/lib/evas/common/evas_image_scalecache.c
+++ b/src/lib/evas/common/evas_image_scalecache.c
@@ -759,6 +759,17 @@ evas_common_rgba_image_scalecache_do_cbs(Image_Entry *ie, RGBA_Image *dst,
}
}
}
+
+ if (sci->populate_me && (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
+ && evas_cserve2_use_get() && evas_cache2_image_cached(&im->cache_entry))
+ {
+ sci->im = (RGBA_Image *) evas_cache2_image_scale_load
+ (&im->cache_entry, src_region_x, src_region_y,
+ src_region_w, src_region_h, dst_region_w, dst_region_h, smooth);
+ if (sci->im != im)
+ sci->populate_me = 0;
+ }
+
if (sci->populate_me)
{
// INF("##! populate!");
diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c
index 816a8853a4..5e03976b77 100644
--- a/src/modules/evas/engines/software_generic/evas_engine.c
+++ b/src/modules/evas/engines/software_generic/evas_engine.c
@@ -1356,7 +1356,7 @@ eng_image_draw(void *data EINA_UNUSED, void *context, void *surface, void *image
image_loaded:
#endif
-#ifdef EVAS_CSERVE2
+#if 0 //def EVAS_CSERVE2
if (evas_cserve2_use_get())
{
if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
@@ -1374,7 +1374,7 @@ image_loaded:
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,
@@ -1385,7 +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