forked from enlightenment/efl
evas/cserve2: _cserve2_cache_fast_scaling_check()
Adapt function to new Data/Entry model.
This commit is contained in:
parent
ee74562bf0
commit
db66f69104
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue