Make image iteration nonblocking as well

This commit is contained in:
twinaphex 2015-02-25 05:30:30 +01:00
parent 46f68e6b3c
commit 717a92c698
2 changed files with 56 additions and 51 deletions

View file

@ -601,12 +601,14 @@ struct global
transfer_cb_t cb;
msg_queue_t *msg_queue;
struct rpng_t *handle;
unsigned pos_increment;
} image;
bool is_blocking;
bool is_finished;
transfer_cb_t cb;
struct nbio_t *handle;
unsigned pos_increment;
msg_queue_t *msg_queue;
} nbio;

View file

@ -131,58 +131,58 @@ static int rarch_main_iterate_http_poll(void)
#endif
#ifdef HAVE_MENU
static int cb_nbio_image_menu_wallpaper(void *data, size_t len)
static int cb_image_menu_wallpaper(void *data, size_t len)
{
struct rpng_t *rpng = NULL;
void *ptr = NULL;
struct texture_image ti = {0};
uint32_t **pixels = NULL;
unsigned *width = NULL;
unsigned *height = NULL;
rpng = (struct rpng_t*)calloc(1, sizeof(struct rpng_t));
uint32_t **pixels = &ti.pixels;
unsigned *width = &ti.width;
unsigned *height = &ti.height;
if (!rpng)
if ( !g_extern.nbio.image.handle->has_ihdr ||
!g_extern.nbio.image.handle->has_idat ||
!g_extern.nbio.image.handle->has_iend)
return -1;
ptr = nbio_get_ptr(g_extern.nbio.handle, &len);
rpng->buff_data = (uint8_t*)ptr;
if (!rpng_nbio_load_image_argb_start(rpng))
{
rpng_nbio_load_image_free(rpng);
return -1;
}
while (rpng_nbio_load_image_argb_iterate(
rpng->buff_data,
rpng))
{
rpng->buff_data +=
4 + 4 + rpng->chunk.size + 4;
}
if (!rpng->has_ihdr || !rpng->has_idat || !rpng->has_iend)
return -1;
pixels = &ti.pixels;
width = &ti.width;
height = &ti.height;
rpng_nbio_load_image_argb_process(rpng, pixels, width, height);
rpng_nbio_load_image_argb_process(g_extern.nbio.image.handle, pixels, width, height);
if (driver.menu_ctx && driver.menu_ctx->load_background)
driver.menu_ctx->load_background(&ti);
texture_image_free(&ti);
if (rpng)
rpng_nbio_load_image_free(rpng);
rpng = NULL;
g_extern.nbio.image.is_blocking = true;
g_extern.nbio.image.is_finished = true;
g_extern.nbio.is_blocking = true;
g_extern.nbio.is_finished = true;
g_extern.nbio.is_blocking = true;
g_extern.nbio.is_finished = true;
return 0;
}
static int cb_nbio_image_menu_wallpaper(void *data, size_t len)
{
void *ptr = NULL;
g_extern.nbio.image.handle = (struct rpng_t*)calloc(1, sizeof(struct rpng_t));
g_extern.nbio.image.cb = &cb_image_menu_wallpaper;
if (!g_extern.nbio.image.handle)
return -1;
ptr = nbio_get_ptr(g_extern.nbio.handle, &len);
g_extern.nbio.image.handle->buff_data = (uint8_t*)ptr;
g_extern.nbio.image.pos_increment = (len / 4) ? (len / 4) : 1;
if (!rpng_nbio_load_image_argb_start(g_extern.nbio.image.handle))
{
rpng_nbio_load_image_free(g_extern.nbio.image.handle);
return -1;
}
g_extern.nbio.image.is_blocking = false;
g_extern.nbio.image.is_finished = false;
g_extern.nbio.is_blocking = false;
g_extern.nbio.is_finished = true;
return 0;
}
@ -213,16 +213,21 @@ static int rarch_main_iterate_image_poll(void)
static int rarch_main_iterate_image_transfer(void)
{
unsigned i;
if (g_extern.nbio.image.is_finished)
return 0;
if (rpng_nbio_load_image_argb_iterate(
g_extern.nbio.image.handle->buff_data,
g_extern.nbio.image.handle))
for (i = 0; i < g_extern.nbio.image.pos_increment; i++)
{
g_extern.nbio.image.handle->buff_data +=
4 + 4 + g_extern.nbio.image.handle->chunk.size + 4;
return 0;
if (rpng_nbio_load_image_argb_iterate(
g_extern.nbio.image.handle->buff_data,
g_extern.nbio.image.handle))
{
g_extern.nbio.image.handle->buff_data +=
4 + 4 + g_extern.nbio.image.handle->chunk.size + 4;
return 0;
}
}
return -1;
@ -230,13 +235,8 @@ static int rarch_main_iterate_image_transfer(void)
static int rarch_main_iterate_image_parse_free(void)
{
if (!g_extern.nbio.image.is_finished)
return -1;
rpng_nbio_load_image_free(g_extern.nbio.image.handle);
g_extern.nbio.image.handle = NULL;
g_extern.nbio.image.is_blocking = false;
g_extern.nbio.image.is_finished = false;
msg_queue_clear(g_extern.nbio.image.msg_queue);
@ -330,6 +330,9 @@ error:
static int rarch_main_iterate_nbio_transfer(void)
{
if (g_extern.nbio.is_finished)
return 0;
if (!nbio_iterate(g_extern.nbio.handle))
return 0;