forked from enlightenment/efl
evas/cserve2: merge SETOPTS into OPEN
When opening an image, OPEN and SETOPTS were always sent consecutively. Merging these two messages may improve the performance a bit (not measured), but also simplify the whole thing. Note: cserve2 debug tools have not been fixed yet.
This commit is contained in:
parent
ca5d174568
commit
46b7baa379
|
@ -79,11 +79,9 @@ typedef enum {
|
|||
} Slave_Command;
|
||||
|
||||
struct _Slave_Msg_Image_Open {
|
||||
Eina_Bool has_opts : 1;
|
||||
Eina_Bool has_loader_data : 1;
|
||||
// Optionally followed by:
|
||||
// Evas_Image_Load_Opts opts;
|
||||
// const char *loader;
|
||||
// const char loader[];
|
||||
};
|
||||
|
||||
struct _Slave_Msg_Image_Opened {
|
||||
|
@ -293,7 +291,7 @@ void cserve2_cache_client_new(Client *client);
|
|||
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);
|
||||
void cserve2_cache_file_close(Client *client, unsigned int client_file_id);
|
||||
int cserve2_cache_image_opts_set(Client *client, Msg_Setopts *msg);
|
||||
int cserve2_cache_image_opts_set(Client *client, int rid, unsigned int 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_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);
|
||||
|
|
|
@ -594,15 +594,15 @@ _img_opts_id_get(Image_Data *im, char *buf, int size)
|
|||
{
|
||||
uintptr_t image_id;
|
||||
|
||||
// FIXME: Add degree here?
|
||||
snprintf(buf, size,
|
||||
"%u:%0.3f:%dx%d:%d:%d,%d+%dx%d:!([%d,%d:%dx%d]-[%dx%d:%d]):%d",
|
||||
"%u:%0.3f:%dx%d:%d:%d,%d+%dx%d:!([%d,%d:%dx%d]-[%dx%d:%d]):%d:%d",
|
||||
im->file_id, im->opts.dpi, im->opts.w, im->opts.h,
|
||||
im->opts.scale_down_by, im->opts.region.x, im->opts.region.y,
|
||||
im->opts.region.w, im->opts.region.h,
|
||||
im->opts.scale_load.src_x, im->opts.scale_load.src_y,
|
||||
im->opts.scale_load.src_w, im->opts.scale_load.src_h,
|
||||
im->opts.scale_load.dst_w, im->opts.scale_load.dst_h, im->opts.scale_load.smooth,
|
||||
im->opts.scale_load.dst_w, im->opts.scale_load.dst_h,
|
||||
im->opts.scale_load.smooth, im->opts.degree,
|
||||
im->opts.orientation);
|
||||
|
||||
image_id = (uintptr_t)eina_hash_find(image_ids, buf);
|
||||
|
@ -1039,23 +1039,25 @@ cserve2_cache_client_del(Client *client)
|
|||
}
|
||||
|
||||
static Image_Data *
|
||||
_image_msg_new(Client *client, Msg_Setopts *msg)
|
||||
_image_msg_new(Client *client, int rid,
|
||||
unsigned int file_id, unsigned int image_id,
|
||||
Evas_Image_Load_Opts *opts)
|
||||
{
|
||||
Reference *ref;
|
||||
Image_Data *im_entry;
|
||||
|
||||
ref = eina_hash_find(client->files.referencing, &msg->file_id);
|
||||
ref = eina_hash_find(client->files.referencing, &file_id);
|
||||
if (!ref)
|
||||
{
|
||||
ERR("Couldn't find file id: %d, for image id: %d",
|
||||
msg->file_id, msg->image_id);
|
||||
cserve2_client_error_send(client, msg->base.rid,
|
||||
file_id, image_id);
|
||||
cserve2_client_error_send(client, rid,
|
||||
CSERVE2_INVALID_CACHE);
|
||||
return NULL;
|
||||
}
|
||||
if (((File_Data *)ref->entry)->invalid)
|
||||
{
|
||||
cserve2_client_error_send(client, msg->base.rid,
|
||||
cserve2_client_error_send(client, rid,
|
||||
CSERVE2_FILE_CHANGED);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1064,24 +1066,27 @@ _image_msg_new(Client *client, Msg_Setopts *msg)
|
|||
im_entry->base.type = CSERVE2_IMAGE_DATA;
|
||||
im_entry->file_id = ref->entry->id;
|
||||
im_entry->file = (File_Data *)ref->entry;
|
||||
im_entry->opts.dpi = msg->opts.dpi;
|
||||
im_entry->opts.w = msg->opts.w;
|
||||
im_entry->opts.h = msg->opts.h;
|
||||
im_entry->opts.scale_down_by = msg->opts.scale_down_by;
|
||||
im_entry->opts.region.x = msg->opts.region.x;
|
||||
im_entry->opts.region.y = msg->opts.region.y;
|
||||
im_entry->opts.region.w = msg->opts.region.w;
|
||||
im_entry->opts.region.h = msg->opts.region.h;
|
||||
im_entry->opts.scale_load.src_x = msg->opts.scale_load.src_x;
|
||||
im_entry->opts.scale_load.src_y = msg->opts.scale_load.src_y;
|
||||
im_entry->opts.scale_load.src_w = msg->opts.scale_load.src_w;
|
||||
im_entry->opts.scale_load.src_h = msg->opts.scale_load.src_h;
|
||||
im_entry->opts.scale_load.dst_w = msg->opts.scale_load.dst_w;
|
||||
im_entry->opts.scale_load.dst_h = msg->opts.scale_load.dst_h;
|
||||
im_entry->opts.scale_load.smooth = msg->opts.scale_load.smooth;
|
||||
im_entry->opts.scale_load.scale_hint = msg->opts.scale_load.scale_hint;
|
||||
im_entry->opts.degree = msg->opts.degree;
|
||||
im_entry->opts.orientation = msg->opts.orientation;
|
||||
if (opts)
|
||||
{
|
||||
im_entry->opts.dpi = opts->dpi;
|
||||
im_entry->opts.w = opts->w;
|
||||
im_entry->opts.h = opts->h;
|
||||
im_entry->opts.scale_down_by = opts->scale_down_by;
|
||||
im_entry->opts.region.x = opts->region.x;
|
||||
im_entry->opts.region.y = opts->region.y;
|
||||
im_entry->opts.region.w = opts->region.w;
|
||||
im_entry->opts.region.h = opts->region.h;
|
||||
im_entry->opts.scale_load.src_x = opts->scale_load.src_x;
|
||||
im_entry->opts.scale_load.src_y = opts->scale_load.src_y;
|
||||
im_entry->opts.scale_load.src_w = opts->scale_load.src_w;
|
||||
im_entry->opts.scale_load.src_h = opts->scale_load.src_h;
|
||||
im_entry->opts.scale_load.dst_w = opts->scale_load.dst_w;
|
||||
im_entry->opts.scale_load.dst_h = opts->scale_load.dst_h;
|
||||
im_entry->opts.scale_load.smooth = opts->scale_load.smooth;
|
||||
im_entry->opts.scale_load.scale_hint = opts->scale_load.scale_hint;
|
||||
im_entry->opts.degree = opts->degree;
|
||||
im_entry->opts.orientation = opts->orientation;
|
||||
}
|
||||
|
||||
return im_entry;
|
||||
}
|
||||
|
@ -2080,7 +2085,9 @@ cserve2_cache_file_close(Client *client, unsigned int client_file_id)
|
|||
}
|
||||
|
||||
int
|
||||
cserve2_cache_image_opts_set(Client *client, Msg_Setopts *msg)
|
||||
cserve2_cache_image_opts_set(Client *client, int rid,
|
||||
unsigned int file_id, unsigned int client_image_id,
|
||||
Evas_Image_Load_Opts *opts)
|
||||
{
|
||||
Image_Data *entry;
|
||||
File_Data *fentry = NULL;
|
||||
|
@ -2088,10 +2095,10 @@ cserve2_cache_image_opts_set(Client *client, Msg_Setopts *msg)
|
|||
unsigned int image_id;
|
||||
char buf[4096];
|
||||
|
||||
oldref = eina_hash_find(client->images.referencing, &msg->image_id);
|
||||
oldref = eina_hash_find(client->images.referencing, &client_image_id);
|
||||
|
||||
// search whether the image is already loaded by another client
|
||||
entry = _image_msg_new(client, msg);
|
||||
entry = _image_msg_new(client, rid, file_id, client_image_id, opts);
|
||||
if (!entry)
|
||||
return -1;
|
||||
image_id = _img_opts_id_get(entry, buf, sizeof(buf));
|
||||
|
@ -2099,14 +2106,13 @@ cserve2_cache_image_opts_set(Client *client, Msg_Setopts *msg)
|
|||
{ // if so, just update the references
|
||||
free(entry);
|
||||
DBG("found image_id %d for client image id %d",
|
||||
image_id, msg->image_id);
|
||||
image_id, client_image_id);
|
||||
entry = eina_hash_find(image_entries, &image_id);
|
||||
if (!entry)
|
||||
{
|
||||
ERR("image id %d is in file_ids hash, but not in entries hash"
|
||||
"with entry id %d.", msg->image_id, image_id);
|
||||
cserve2_client_error_send(client, msg->base.rid,
|
||||
CSERVE2_INVALID_CACHE);
|
||||
"with entry id %d.", client_image_id, image_id);
|
||||
cserve2_client_error_send(client, rid, CSERVE2_INVALID_CACHE);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -2123,12 +2129,12 @@ cserve2_cache_image_opts_set(Client *client, Msg_Setopts *msg)
|
|||
if (oldref && (oldref->entry->id == image_id))
|
||||
return 0;
|
||||
|
||||
ref = _entry_reference_add((Entry *)entry, client, msg->image_id);
|
||||
ref = _entry_reference_add((Entry *)entry, client, client_image_id);
|
||||
|
||||
if (oldref)
|
||||
eina_hash_del_by_key(client->images.referencing, &msg->image_id);
|
||||
eina_hash_del_by_key(client->images.referencing, &client_image_id);
|
||||
|
||||
eina_hash_add(client->images.referencing, &msg->image_id, ref);
|
||||
eina_hash_add(client->images.referencing, &client_image_id, ref);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2140,11 +2146,11 @@ cserve2_cache_image_opts_set(Client *client, Msg_Setopts *msg)
|
|||
entry->base.id = image_id;
|
||||
eina_hash_add(image_entries, &image_id, entry);
|
||||
eina_hash_add(image_ids, buf, (void *)(intptr_t)image_id);
|
||||
ref = _entry_reference_add((Entry *)entry, client, msg->image_id);
|
||||
ref = _entry_reference_add((Entry *)entry, client, client_image_id);
|
||||
|
||||
if (oldref)
|
||||
eina_hash_del_by_key(client->images.referencing, &msg->image_id);
|
||||
eina_hash_add(client->images.referencing, &msg->image_id, ref);
|
||||
eina_hash_del_by_key(client->images.referencing, &client_image_id);
|
||||
eina_hash_add(client->images.referencing, &client_image_id, ref);
|
||||
|
||||
fentry = entry->file;
|
||||
fentry->images = eina_list_append(fentry->images, entry);
|
||||
|
|
|
@ -67,6 +67,8 @@ parse_input_open(int *size)
|
|||
char *buf;
|
||||
int file_id;
|
||||
|
||||
// TODO: Add load opts
|
||||
|
||||
_read_line(line, sizeof(line));
|
||||
path_len = _read_line(path, sizeof(path));
|
||||
key_len = _read_line(key, sizeof(key));
|
||||
|
@ -88,11 +90,9 @@ parse_input_open(int *size)
|
|||
*size = sizeof(msg) + path_len + key_len;
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void *
|
||||
parse_input_setopts(int *size)
|
||||
{
|
||||
#if 0
|
||||
// TODO: Adapt the following code
|
||||
Msg_Setopts *msg;
|
||||
char line[4096];
|
||||
int file_id, image_id;
|
||||
|
@ -183,6 +183,7 @@ parse_input_setopts(int *size)
|
|||
*size = sizeof(*msg);
|
||||
|
||||
return msg;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void *
|
||||
|
@ -282,13 +283,6 @@ parse_answer_opened(const void *buf)
|
|||
msg->image.w, msg->image.h, msg->image.alpha);
|
||||
}
|
||||
|
||||
static void
|
||||
parse_answer_setoptsed(const void *buf)
|
||||
{
|
||||
const Msg_Setoptsed *msg = buf;
|
||||
printf("SETOPTSED rid = %d\n", msg->base.rid);
|
||||
}
|
||||
|
||||
static void
|
||||
parse_answer_loaded(const void *buf)
|
||||
{
|
||||
|
@ -321,9 +315,6 @@ parse_answer(const void *buf)
|
|||
case CSERVE2_OPENED:
|
||||
parse_answer_opened(buf);
|
||||
break;
|
||||
case CSERVE2_SETOPTSED:
|
||||
parse_answer_setoptsed(buf);
|
||||
break;
|
||||
case CSERVE2_LOADED:
|
||||
parse_answer_loaded(buf);
|
||||
break;
|
||||
|
@ -342,8 +333,6 @@ static struct {
|
|||
} _msg_types[] = {
|
||||
{ "OPEN", CSERVE2_OPEN, parse_input_open },
|
||||
{ "OPENED", CSERVE2_OPENED, NULL },
|
||||
{ "SETOPTS", CSERVE2_SETOPTS, parse_input_setopts },
|
||||
{ "SETOPTSED", CSERVE2_SETOPTSED, NULL },
|
||||
{ "LOAD", CSERVE2_LOAD, parse_input_load },
|
||||
{ "LOADED", CSERVE2_LOADED, NULL },
|
||||
{ "PRELOAD", CSERVE2_PRELOAD, parse_input_preload },
|
||||
|
|
|
@ -35,21 +35,6 @@ cserve2_client_error_send(Client *client, unsigned int rid, int error_code)
|
|||
cserve2_client_send(client, &msg, sizeof(msg));
|
||||
}
|
||||
|
||||
static void
|
||||
_cserve2_client_image_setoptsed(Client *client, unsigned int rid)
|
||||
{
|
||||
int size;
|
||||
Msg_Setoptsed msg;
|
||||
|
||||
memset(&msg, 0, sizeof(msg));
|
||||
msg.base.rid = rid;
|
||||
msg.base.type = CSERVE2_SETOPTSED;
|
||||
|
||||
size = sizeof(msg);
|
||||
cserve2_client_send(client, &size, sizeof(size));
|
||||
cserve2_client_send(client, &msg, size);
|
||||
}
|
||||
|
||||
static void
|
||||
_cserve2_client_close(Client *client)
|
||||
{
|
||||
|
@ -88,39 +73,11 @@ _cserve2_client_load(Client *client)
|
|||
{
|
||||
Msg_Load *msg = (Msg_Load *)client->msg.buf;
|
||||
|
||||
INF("Received LOAD command: RID=%d, Image_ID: %d", msg->base.rid, msg->image_id);
|
||||
INF("Received LOAD command: RID=%d, Image_ID: %d",
|
||||
msg->base.rid, msg->image_id);
|
||||
cserve2_cache_image_load(client, msg->image_id, msg->base.rid);
|
||||
}
|
||||
|
||||
static void
|
||||
_cserve2_client_setopts(Client *client)
|
||||
{
|
||||
Msg_Setopts *msg = (Msg_Setopts *)client->msg.buf;
|
||||
|
||||
INF("Received SETOPTS command: RID=%d", msg->base.rid);
|
||||
INF("File_ID: %d, Image_ID: %d", msg->file_id, msg->image_id);
|
||||
INF("Load Options:");
|
||||
INF("\tdpi: %03.1f", msg->opts.dpi);
|
||||
INF("\tsize: %dx%d", msg->opts.w, msg->opts.h);
|
||||
INF("\tscale down: %d", msg->opts.scale_down_by);
|
||||
INF("\tregion: %d,%d + %dx%d",
|
||||
msg->opts.region.x, msg->opts.region.y, msg->opts.region.w, msg->opts.region.h);
|
||||
INF("\toriginal image's source coord: %d,%d",
|
||||
msg->opts.scale_load.src_x, msg->opts.scale_load.src_y);
|
||||
INF("\toriginal image size: %dx%d",
|
||||
msg->opts.scale_load.src_w, msg->opts.scale_load.src_h);
|
||||
INF("\tscale size: %dx%d", msg->opts.scale_load.dst_w, msg->opts.scale_load.dst_h);
|
||||
INF("\tscale smooth: %d", msg->opts.scale_load.smooth);
|
||||
INF("\tscale hint: %d", msg->opts.scale_load.scale_hint);
|
||||
INF("\tdegree: %d", msg->opts.degree);
|
||||
INF("\torientation: %d", msg->opts.orientation);
|
||||
|
||||
if (cserve2_cache_image_opts_set(client, msg) != 0)
|
||||
return;
|
||||
|
||||
_cserve2_client_image_setoptsed(client, msg->base.rid);
|
||||
}
|
||||
|
||||
static void
|
||||
_cserve2_client_open(Client *client)
|
||||
{
|
||||
|
@ -137,17 +94,33 @@ _cserve2_client_open(Client *client)
|
|||
cserve2_cache_file_open(client, msg->file_id, path, key, msg->base.rid);
|
||||
|
||||
if (!msg->has_load_opts)
|
||||
cserve2_cache_image_opts_set(client, msg->base.rid,
|
||||
msg->file_id, msg->image_id, NULL);
|
||||
else
|
||||
{
|
||||
/* FIXME: We should remove this fake call to setopts and do the
|
||||
* appropriate work instead. (split functions) */
|
||||
Msg_Setopts optsmsg;
|
||||
// FIXME: Check message size first?
|
||||
Evas_Image_Load_Opts *opts =
|
||||
(Evas_Image_Load_Opts*) (key + strlen(key) + 1);
|
||||
|
||||
memset(&optsmsg, 0, sizeof(optsmsg));
|
||||
optsmsg.base.rid = msg->base.rid;
|
||||
optsmsg.base.type = CSERVE2_SETOPTS;
|
||||
optsmsg.file_id = msg->file_id;
|
||||
optsmsg.image_id = msg->image_id;
|
||||
cserve2_cache_image_opts_set(client, &optsmsg);
|
||||
DBG("Load Options:");
|
||||
DBG("\tdpi: %03.1f", opts->dpi);
|
||||
DBG("\tsize: %dx%d", opts->w, opts->h);
|
||||
DBG("\tscale down: %d", opts->scale_down_by);
|
||||
DBG("\tregion: %d,%d + %dx%d",
|
||||
opts->region.x, opts->region.y, opts->region.w, opts->region.h);
|
||||
DBG("\toriginal image's source coord: %d,%d",
|
||||
opts->scale_load.src_x, opts->scale_load.src_y);
|
||||
DBG("\toriginal image size: %dx%d",
|
||||
opts->scale_load.src_w, opts->scale_load.src_h);
|
||||
DBG("\tscale size: %dx%d",
|
||||
opts->scale_load.dst_w, opts->scale_load.dst_h);
|
||||
DBG("\tscale smooth: %d", opts->scale_load.smooth);
|
||||
DBG("\tscale hint: %d", opts->scale_load.scale_hint);
|
||||
DBG("\tdegree: %d", opts->degree);
|
||||
DBG("\torientation: %d", opts->orientation);
|
||||
|
||||
cserve2_cache_image_opts_set(client, msg->base.rid,
|
||||
msg->file_id, msg->image_id, opts);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -238,9 +211,6 @@ cserve2_command_run(Client *client, Message_Type type)
|
|||
case CSERVE2_OPEN:
|
||||
_cserve2_client_open(client);
|
||||
break;
|
||||
case CSERVE2_SETOPTS:
|
||||
_cserve2_client_setopts(client);
|
||||
break;
|
||||
case CSERVE2_LOAD:
|
||||
_cserve2_client_load(client);
|
||||
break;
|
||||
|
|
|
@ -336,7 +336,7 @@ _image_file_header(Eina_File *fd, Eina_Stringshare *key, Evas_Image_Load_Opts *l
|
|||
}
|
||||
|
||||
static Error_Type
|
||||
image_open(const char *file, const char *key, Evas_Image_Load_Opts *load_opts,
|
||||
image_open(const char *file, const char *key,
|
||||
Slave_Msg_Image_Opened *result, const char **use_loader)
|
||||
{
|
||||
Evas_Module *module;
|
||||
|
@ -346,6 +346,9 @@ image_open(const char *file, const char *key, Evas_Image_Load_Opts *load_opts,
|
|||
unsigned int i;
|
||||
Error_Type ret = CSERVE2_NONE;
|
||||
Eina_Stringshare *skey = eina_stringshare_add(key);
|
||||
Evas_Image_Load_Opts load_opts;
|
||||
|
||||
memset(&load_opts, 0, sizeof(load_opts));
|
||||
|
||||
fd = eina_file_open(file, EINA_FALSE);
|
||||
if (!fd)
|
||||
|
@ -360,7 +363,7 @@ image_open(const char *file, const char *key, Evas_Image_Load_Opts *load_opts,
|
|||
module = evas_module_find_type(EVAS_MODULE_TYPE_IMAGE_LOADER, loader);
|
||||
if (module)
|
||||
{
|
||||
if (_image_file_header(fd, skey, load_opts, result, module))
|
||||
if (_image_file_header(fd, skey, &load_opts, result, module))
|
||||
goto success;
|
||||
}
|
||||
|
||||
|
@ -380,7 +383,7 @@ try_extension:
|
|||
if (loader)
|
||||
{
|
||||
module = evas_module_find_type(EVAS_MODULE_TYPE_IMAGE_LOADER, loader);
|
||||
if (_image_file_header(fd, skey, load_opts, result, module))
|
||||
if (_image_file_header(fd, skey, &load_opts, result, module))
|
||||
goto success;
|
||||
loader = NULL;
|
||||
module = NULL;
|
||||
|
@ -392,7 +395,7 @@ try_extension:
|
|||
loader = loaders_name[i];
|
||||
module = evas_module_find_type(EVAS_MODULE_TYPE_IMAGE_LOADER, loader);
|
||||
if (!module) continue;
|
||||
if (_image_file_header(fd, skey, load_opts, result, module))
|
||||
if (_image_file_header(fd, skey, &load_opts, result, module))
|
||||
goto success;
|
||||
}
|
||||
|
||||
|
@ -507,7 +510,6 @@ handle_image_open(int wfd, void *params)
|
|||
{
|
||||
Slave_Msg_Image_Open *p;
|
||||
Slave_Msg_Image_Opened result;
|
||||
Evas_Image_Load_Opts opts;
|
||||
Error_Type err;
|
||||
const char *loader = NULL, *file, *key, *ptr;
|
||||
char *resp;
|
||||
|
@ -517,18 +519,11 @@ handle_image_open(int wfd, void *params)
|
|||
file = (const char *)(p + sizeof(Slave_Msg_Image_Open));
|
||||
key = file + strlen(file) + 1;
|
||||
ptr = key + strlen(key) + 1;
|
||||
if (p->has_opts)
|
||||
{
|
||||
//opts = (Evas_Image_Load_Opts *)ptr;
|
||||
memcpy(&opts, ptr, sizeof(opts));
|
||||
ptr += sizeof(opts);
|
||||
}
|
||||
else memset(&opts, 0, sizeof(opts));
|
||||
if (p->has_loader_data)
|
||||
loader = ptr;
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
if ((err = image_open(file, key, &opts, &result, &loader))
|
||||
if ((err = image_open(file, key, &result, &loader))
|
||||
!= CSERVE2_NONE)
|
||||
{
|
||||
printf("OPEN failed at %s:%d\n", __FUNCTION__, __LINE__);
|
||||
|
|
|
@ -259,7 +259,7 @@ _evas_cache_image_entry_new(Evas_Cache2 *cache,
|
|||
if (lo) ie->load_opts = *lo;
|
||||
if (ie->file)
|
||||
{
|
||||
if (!evas_cserve2_image_load(ie, ie->file, ie->key, &(ie->load_opts)))
|
||||
if (!evas_cserve2_image_load(ie))
|
||||
{
|
||||
ERR("couldn't load '%s' '%s' with cserve2!",
|
||||
ie->file, ie->key ? ie->key : "");
|
||||
|
|
|
@ -10,8 +10,6 @@
|
|||
typedef enum {
|
||||
CSERVE2_OPEN = 1,
|
||||
CSERVE2_OPENED,
|
||||
CSERVE2_SETOPTS,
|
||||
CSERVE2_SETOPTSED,
|
||||
CSERVE2_LOAD,
|
||||
CSERVE2_LOADED,
|
||||
CSERVE2_PRELOAD,
|
||||
|
@ -59,6 +57,11 @@ struct _Msg_Open {
|
|||
unsigned int image_id;
|
||||
|
||||
Eina_Bool has_load_opts : 1;
|
||||
|
||||
// Followed by:
|
||||
// const char file[];
|
||||
// const char key[];
|
||||
// Evas_Image_Load_Opts opts; // if has_load_opts
|
||||
};
|
||||
|
||||
struct _Msg_Opened {
|
||||
|
@ -72,17 +75,6 @@ struct _Msg_Opened {
|
|||
} image;
|
||||
};
|
||||
|
||||
struct _Msg_Setopts {
|
||||
Msg_Base base;
|
||||
unsigned int file_id;
|
||||
unsigned int image_id;
|
||||
Evas_Image_Load_Opts opts;
|
||||
};
|
||||
|
||||
struct _Msg_Setoptsed {
|
||||
Msg_Base base;
|
||||
};
|
||||
|
||||
struct _Msg_Load {
|
||||
Msg_Base base;
|
||||
unsigned int image_id;
|
||||
|
@ -277,8 +269,6 @@ struct _Msg_Error {
|
|||
|
||||
typedef struct _Msg_Open Msg_Open;
|
||||
typedef struct _Msg_Opened Msg_Opened;
|
||||
typedef struct _Msg_Setopts Msg_Setopts;
|
||||
typedef struct _Msg_Setoptsed Msg_Setoptsed;
|
||||
typedef struct _Msg_Load Msg_Load;
|
||||
typedef struct _Msg_Loaded Msg_Loaded;
|
||||
typedef struct _Msg_Preload Msg_Preload;
|
||||
|
|
|
@ -221,7 +221,6 @@ _server_send(const void *buf, int size, Op_Callback cb, void *data)
|
|||
switch (msg->type)
|
||||
{
|
||||
case CSERVE2_OPEN:
|
||||
case CSERVE2_SETOPTS:
|
||||
case CSERVE2_LOAD:
|
||||
case CSERVE2_PRELOAD:
|
||||
case CSERVE2_FONT_LOAD:
|
||||
|
@ -616,7 +615,8 @@ _build_absolute_path(const char *path, char buf[], int size)
|
|||
}
|
||||
|
||||
static unsigned int
|
||||
_image_open_server_send(Image_Entry *ie, const char *file, const char *key, Eina_Bool has_load_opts)
|
||||
_image_open_server_send(Image_Entry *ie, const char *file, const char *key,
|
||||
Evas_Image_Load_Opts *opts)
|
||||
{
|
||||
int flen, klen;
|
||||
int size;
|
||||
|
@ -656,7 +656,6 @@ _image_open_server_send(Image_Entry *ie, const char *file, const char *key, Eina
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
memset(&msg_open, 0, sizeof(msg_open));
|
||||
|
||||
fentry->file_id = ++_file_id;
|
||||
|
@ -667,10 +666,12 @@ _image_open_server_send(Image_Entry *ie, const char *file, const char *key, Eina
|
|||
msg_open.file_id = fentry->file_id;
|
||||
msg_open.path_offset = 0;
|
||||
msg_open.key_offset = flen;
|
||||
msg_open.has_load_opts = has_load_opts;
|
||||
msg_open.has_load_opts = (opts != NULL);
|
||||
msg_open.image_id = ++_data_id;
|
||||
|
||||
size = sizeof(msg_open) + flen + klen;
|
||||
if (opts)
|
||||
size += sizeof(*opts);
|
||||
buf = malloc(size);
|
||||
if (!buf)
|
||||
{
|
||||
|
@ -681,6 +682,8 @@ _image_open_server_send(Image_Entry *ie, const char *file, const char *key, Eina
|
|||
memcpy(buf, &msg_open, sizeof(msg_open));
|
||||
memcpy(buf + sizeof(msg_open), filebuf, flen);
|
||||
memcpy(buf + sizeof(msg_open) + flen, key, klen);
|
||||
if (opts)
|
||||
memcpy(buf + sizeof(msg_open) + flen + klen, opts, sizeof(*opts));
|
||||
|
||||
if (!_server_send(buf, size, _image_opened_cb, ie))
|
||||
{
|
||||
|
@ -700,55 +703,6 @@ _image_open_server_send(Image_Entry *ie, const char *file, const char *key, Eina
|
|||
return msg_open.base.rid;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
_image_setopts_server_send(Image_Entry *ie)
|
||||
{
|
||||
File_Entry *fentry = ie->data1;
|
||||
Data_Entry *dentry = ie->data2;
|
||||
Msg_Setopts msg;
|
||||
|
||||
if (cserve2_init == 0)
|
||||
return 0;
|
||||
|
||||
if (!fentry || !dentry)
|
||||
return 0;
|
||||
|
||||
memset(&msg, 0, sizeof(msg));
|
||||
|
||||
msg.base.rid = _next_rid();
|
||||
msg.base.type = CSERVE2_SETOPTS;
|
||||
msg.file_id = fentry->file_id;
|
||||
msg.image_id = dentry->image_id;
|
||||
|
||||
msg.opts.scale_down_by = ie->load_opts.scale_down_by;
|
||||
msg.opts.dpi = ie->load_opts.dpi;
|
||||
msg.opts.w = ie->load_opts.w;
|
||||
msg.opts.h = ie->load_opts.h;
|
||||
msg.opts.region.x = ie->load_opts.region.x;
|
||||
msg.opts.region.y = ie->load_opts.region.y;
|
||||
msg.opts.region.w = ie->load_opts.region.w;
|
||||
msg.opts.region.h = ie->load_opts.region.h;
|
||||
msg.opts.scale_load.src_x = ie->load_opts.scale_load.src_x;
|
||||
msg.opts.scale_load.src_y = ie->load_opts.scale_load.src_y;
|
||||
msg.opts.scale_load.src_w = ie->load_opts.scale_load.src_w;
|
||||
msg.opts.scale_load.src_h = ie->load_opts.scale_load.src_h;
|
||||
msg.opts.scale_load.dst_w = ie->load_opts.scale_load.dst_w;
|
||||
msg.opts.scale_load.dst_h = ie->load_opts.scale_load.dst_h;
|
||||
msg.opts.scale_load.smooth = ie->load_opts.scale_load.smooth;
|
||||
msg.opts.scale_load.scale_hint = ie->load_opts.scale_load.scale_hint;
|
||||
msg.opts.degree = ie->load_opts.degree;
|
||||
msg.opts.orientation = ie->load_opts.orientation;
|
||||
|
||||
if (!_server_send(&msg, sizeof(msg), NULL, NULL))
|
||||
{
|
||||
free(dentry);
|
||||
ie->data2 = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return msg.base.rid;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
_image_load_server_send(Image_Entry *ie)
|
||||
{
|
||||
|
@ -887,26 +841,25 @@ _image_unload_server_send(Image_Entry *ie)
|
|||
}
|
||||
|
||||
Eina_Bool
|
||||
evas_cserve2_image_load(Image_Entry *ie, const char *file, const char *key, Evas_Image_Load_Opts *lopt)
|
||||
evas_cserve2_image_load(Image_Entry *ie)
|
||||
{
|
||||
unsigned int rid;
|
||||
Eina_Bool has_load_opts;
|
||||
const char *file, *key;
|
||||
Evas_Image_Load_Opts *opts = NULL;
|
||||
|
||||
if (!ie)
|
||||
return EINA_FALSE;
|
||||
|
||||
has_load_opts = !_memory_zero_cmp(lopt, sizeof(*lopt));
|
||||
rid = _image_open_server_send(ie, file, key, has_load_opts);
|
||||
file = ie->file;
|
||||
key = ie->key;
|
||||
if (!_memory_zero_cmp(&ie->load_opts, sizeof(ie->load_opts)))
|
||||
opts = &ie->load_opts;
|
||||
rid = _image_open_server_send(ie, file, key, opts);
|
||||
if (!rid)
|
||||
return EINA_FALSE;
|
||||
|
||||
ie->open_rid = rid;
|
||||
|
||||
if (has_load_opts)
|
||||
_image_setopts_server_send(ie);
|
||||
|
||||
// _server_dispatch_until(rid);
|
||||
|
||||
if (ie->data1)
|
||||
return EINA_TRUE;
|
||||
else
|
||||
|
|
|
@ -23,7 +23,7 @@ typedef struct _Font_Entry Font_Entry;
|
|||
int evas_cserve2_init(void);
|
||||
int evas_cserve2_shutdown(void);
|
||||
EAPI int evas_cserve2_use_get(void);
|
||||
Eina_Bool evas_cserve2_image_load(Image_Entry *ie, const char *file, const char *key, Evas_Image_Load_Opts *lopt);
|
||||
Eina_Bool evas_cserve2_image_load(Image_Entry *ie);
|
||||
int evas_cserve2_image_load_wait(Image_Entry *ie);
|
||||
Eina_Bool evas_cserve2_image_data_load(Image_Entry *ie);
|
||||
int evas_cserve2_image_load_data_wait(Image_Entry *ie);
|
||||
|
|
Loading…
Reference in New Issue