diff options
author | Jean-Philippe Andre <jp.andre@samsung.com> | 2013-09-24 18:09:38 +0900 |
---|---|---|
committer | Cedric Bail <cedric.bail@free.fr> | 2013-10-17 20:48:26 +0900 |
commit | 1a0c0df64e3ccaea4180cdaeae5b97ff5a09a2e2 (patch) | |
tree | 69631a861e1f87b5b44316818ae613c2e979ac67 | |
parent | 206e87f242277bcf8a156d59ac05963f49830c4c (diff) | |
download | efl-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.h | 2 | ||||
-rw-r--r-- | src/bin/evas/evas_cserve2_cache.c | 29 | ||||
-rw-r--r-- | src/bin/evas/evas_cserve2_scale.c | 6 | ||||
-rw-r--r-- | src/lib/evas/cache2/evas_cache2.c | 15 | ||||
-rw-r--r-- | src/lib/evas/canvas/evas_object_image.c | 3 | ||||
-rw-r--r-- | src/lib/evas/common/evas_image_scalecache.c | 11 | ||||
-rw-r--r-- | src/modules/evas/engines/software_generic/evas_engine.c | 6 |
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 |