evas/cserve2: _cserve2_cache_fast_scaling_check()

Adapt function to new Data/Entry model.
This commit is contained in:
Jean-Philippe Andre 2013-07-24 18:32:07 +09:00
parent ee74562bf0
commit db66f69104
1 changed files with 82 additions and 72 deletions

View File

@ -1353,7 +1353,7 @@ cserve2_cache_client_del(Client *client)
static Image_Entry * static Image_Entry *
_image_entry_new(Client *client, int rid, _image_entry_new(Client *client, int rid,
unsigned int client_file_id, unsigned int client_image_id, unsigned int client_file_id, unsigned int client_image_id,
Evas_Image_Load_Opts *opts, char *buf) Evas_Image_Load_Opts *opts, char *buf, size_t buf_size)
{ {
Reference *ref, *oldref; Reference *ref, *oldref;
Image_Entry *ientry; Image_Entry *ientry;
@ -1424,15 +1424,19 @@ _image_entry_new(Client *client, int rid,
idata->refcount = 1; idata->refcount = 1;
idata->id = image_id; idata->id = image_id;
_image_key_set(idata->file_id, opts, buf, sizeof(buf)); _image_key_set(idata->file_id, opts, buf, buf_size);
eina_hash_add(image_entries, &image_id, ientry); eina_hash_add(image_entries, &image_id, ientry);
eina_hash_add(image_ids, buf, (void *)(intptr_t) image_id); eina_hash_add(image_ids, buf, (void *)(intptr_t) image_id);
oldref = eina_hash_find(client->images.referencing, &client_image_id); if (client_image_id)
ref = _entry_reference_add(ASENTRY(ientry), client, client_image_id); {
if (oldref) oldref = eina_hash_find(client->images.referencing, &client_image_id);
eina_hash_del_by_key(client->images.referencing, &client_image_id); ref = _entry_reference_add(ASENTRY(ientry), client, client_image_id);
eina_hash_add(client->images.referencing, &client_image_id, ref); if (oldref)
eina_hash_del_by_key(client->images.referencing, &client_image_id);
eina_hash_add(client->images.referencing, &client_image_id, ref);
}
// else: See _cserve2_cache_fast_scaling_check()
return ientry; return ientry;
} }
@ -2485,8 +2489,9 @@ static int
_cserve2_cache_fast_scaling_check(Client *client, Image_Entry *ientry) _cserve2_cache_fast_scaling_check(Client *client, Image_Entry *ientry)
{ {
Eina_Iterator *iter; Eina_Iterator *iter;
Image_Data *i; Image_Entry *i;
Image_Entry *original = NULL; Image_Entry *orig_entry = NULL;
Image_Data *orig_data = NULL;
Evas_Image_Load_Opts unscaled; Evas_Image_Load_Opts unscaled;
char buf[4096]; char buf[4096];
unsigned int image_id; unsigned int image_id;
@ -2496,42 +2501,41 @@ _cserve2_cache_fast_scaling_check(Client *client, Image_Entry *ientry)
File_Entry *fentry; File_Entry *fentry;
Image_Data *idata; Image_Data *idata;
return -1;
#if 0
if (!ientry) return -1; if (!ientry) return -1;
idata = _image_data_find(ENTRYID(ientry)); idata = _image_data_find(ENTRYID(ientry));
if (!idata) return -1; if (!idata) return -1;
dst_w = entry->opts.scale_load.dst_w; dst_w = idata->opts.scale_load.dst_w;
dst_h = entry->opts.scale_load.dst_h; dst_h = idata->opts.scale_load.dst_h;
// Copy opts w/o scaling // Copy opts w/o scaling
memset(&unscaled, 0, sizeof(unscaled)); memset(&unscaled, 0, sizeof(unscaled));
unscaled.dpi = entry->opts.dpi; unscaled.dpi = idata->opts.dpi;
//unscaled.w = entry->opts.w; //unscaled.w = idata->opts.w;
//unscaled.h = entry->opts.h; //unscaled.h = idata->opts.h;
//unscaled.scale_down_by = entry->opts.scale_down_by; //unscaled.scale_down_by = idata->opts.scale_down_by;
//unscaled.region.x = entry->opts.region.x; //unscaled.region.x = idata->opts.region.x;
//unscaled.region.y = entry->opts.region.y; //unscaled.region.y = idata->opts.region.y;
//unscaled.region.w = entry->opts.region.w; //unscaled.region.w = idata->opts.region.w;
//unscaled.region.h = entry->opts.region.h; //unscaled.region.h = idata->opts.region.h;
unscaled.scale_load.scale_hint = 0; unscaled.scale_load.scale_hint = 0;
unscaled.degree = entry->opts.degree; unscaled.degree = idata->opts.degree;
unscaled.orientation = entry->opts.orientation; unscaled.orientation = idata->opts.orientation;
unscaled.scale_load.smooth = entry->opts.scale_load.smooth; unscaled.scale_load.smooth = idata->opts.scale_load.smooth;
try_again: try_again:
image_id = _image_opts_id_get(entry->file_id, &unscaled, buf, sizeof(buf)); image_id = _image_opts_id_get(idata->file_id, &unscaled, buf, sizeof(buf));
if (image_id) if (image_id)
{ {
original = eina_hash_find(image_entries, &image_id); orig_data = _image_data_find(image_id);
if (!original) return -1; // Should not happen orig_entry = _image_entry_find(image_id);
if (!orig_data || !orig_entry) return -1;
DBG("Found original image in hash: %d,%d:%dx%d -> %dx%d shm %p", DBG("Found original image in hash: %d,%d:%dx%d -> %dx%d shm %p",
original->opts.scale_load.src_x, original->opts.scale_load.src_y, orig_data->opts.scale_load.src_x, orig_data->opts.scale_load.src_y,
original->opts.scale_load.src_w, original->opts.scale_load.src_h, orig_data->opts.scale_load.src_w, orig_data->opts.scale_load.src_h,
original->opts.scale_load.dst_w, original->opts.scale_load.dst_h, orig_data->opts.scale_load.dst_w, orig_data->opts.scale_load.dst_h,
original->shm); orig_entry->shm);
goto do_scaling; goto do_scaling;
} }
@ -2542,85 +2546,91 @@ try_again:
goto try_again; goto try_again;
} }
fentry = _file_entry_find(entry->file_id); fentry = _file_entry_find(idata->file_id);
iter = eina_list_iterator_new(fentry->images); iter = eina_list_iterator_new(fentry->images);
//iter = eina_list_iterator_new(entry->file->images);
EINA_ITERATOR_FOREACH(iter, i) EINA_ITERATOR_FOREACH(iter, i)
{ {
if (i == entry) continue; Image_Data *id;
if (i->opts.w && i->opts.h &&
(!i->opts.scale_load.dst_w && !i->opts.scale_load.dst_h)) if (i == ientry) continue;
id = _image_data_find(ENTRYID(i));
if (!id) continue;
if (id->opts.w && id->opts.h &&
(!id->opts.scale_load.dst_w &&
!id->opts.scale_load.dst_h))
{ {
DBG("Found image in list: %d,%d:%dx%d -> %dx%d shm %p", DBG("Found image in list: %d,%d:%dx%d -> %dx%d shm %p",
i->opts.scale_load.src_x, i->opts.scale_load.src_y, id->opts.scale_load.src_x, id->opts.scale_load.src_y,
i->opts.scale_load.src_w, i->opts.scale_load.src_h, id->opts.scale_load.src_w, id->opts.scale_load.src_h,
i->opts.scale_load.dst_w, i->opts.scale_load.dst_h, id->opts.scale_load.dst_w, id->opts.scale_load.dst_h,
i->shm); i->shm);
if (i->base.request || !i->shm) continue; // Not loaded yet if (i->base.request || !i->shm) continue; // Not loaded yet
original = i; orig_entry = i;
break; break;
} }
scaled_count++; scaled_count++;
} }
eina_iterator_free(iter); eina_iterator_free(iter);
if (!original) if (!orig_entry)
{ {
DBG("Found %d scaled images for image %u but none matches", DBG("Found %d scaled images for image %u but none matches",
scaled_count, entry->base.id); scaled_count, ENTRYID(ientry));
// FIXME: The value 4 is completely arbitrary. No benchmarks done yet.
if (scaled_count >= 4) if (scaled_count >= 4)
{ {
DBG("Forcing load of original image now!"); DBG("Forcing load of original image now!");
original = _image_entry_new(client, 0, entry->file_id, orig_entry = _image_entry_new(client, 0, idata->file_id,
0, &unscaled); 0, &unscaled, buf, sizeof(buf));
if (!original) return -1; if (!orig_entry) return -1;
_entry_unused_push(orig_entry);
// NOTE: NOT NEEDED ANYMORE. FIXME orig_data = _image_data_find(ENTRYID(orig_entry));
eina_hash_add(image_entries, &image_id, original); fentry = _file_entry_find(orig_data->file_id);
eina_hash_add(image_ids, buf, (void *)(intptr_t)image_id); fentry->images = eina_list_append(fentry->images, orig_entry);
_entry_unused_push(original);
fentry = _file_entry_find(original->file_id);
fentry->images = eina_list_append(fentry->images, original);
} }
else else
return -1; return -1;
} }
do_scaling: do_scaling:
if (!original) return -1; if (!orig_entry || !orig_data) return -1;
if (!original->shm && !original->base.request) if (!orig_entry->shm && !orig_entry->base.request)
{ {
if (original->base.id != image_id) abort(); if (orig_entry->base.id != image_id)
original->base.request = cserve2_request_add( {
CRIT("Entry IDs mismatch");
return -1;
}
orig_entry->base.request = cserve2_request_add(
CSERVE2_REQ_IMAGE_LOAD, CSERVE2_REQ_IMAGE_LOAD,
0, NULL, 0, &_load_funcs, original); 0, NULL, 0, &_load_funcs, orig_entry);
} }
if (original->base.request || !original->shm) if (orig_entry->base.request || !orig_entry->shm)
return -1; // Not loaded yet return -1; // Not loaded yet
if (entry->shm) if (ientry->shm)
cserve2_shm_unref(entry->shm); cserve2_shm_unref(ientry->shm);
entry->shm = cserve2_shm_request("img", dst_w * dst_h * 4); ientry->shm = cserve2_shm_request("img", dst_w * dst_h * 4);
if (!entry->shm) return -1; if (!ientry->shm) return -1;
if (_scaling_do(entry->shm, entry, original) != 0) if (_scaling_do(ientry->shm, idata, orig_entry) != 0)
{ {
cserve2_shm_unref(entry->shm); cserve2_shm_unref(ientry->shm);
entry->shm = NULL; ientry->shm = NULL;
return -1; return -1;
} }
if (original->unused) if (orig_data->unused)
{ {
image_entries_lru = eina_list_remove(image_entries_lru, original); image_entries_lru = eina_list_remove(image_entries_lru, orig_entry);
image_entries_lru = eina_list_prepend(image_entries_lru, original); image_entries_lru = eina_list_prepend(image_entries_lru, orig_entry);
} }
return 0; return 0;
#endif
} }
int int
@ -2683,7 +2693,7 @@ cserve2_cache_image_entry_create(Client *client, int rid,
} }
ientry = _image_entry_new(client, rid, client_file_id, client_image_id, ientry = _image_entry_new(client, rid, client_file_id, client_image_id,
opts, buf); opts, buf, sizeof(buf));
if (!ientry) if (!ientry)
return -1; return -1;