static int cb_nbio_image_menu_wallpaper(void *data, size_t len) { void *ptr = NULL; nbio_handle_t *nbio = (nbio_handle_t*)data; if (!nbio || !data) return -1; nbio->image.handle = (struct rpng_t*)calloc(1, sizeof(struct rpng_t)); nbio->image.cb = &cb_image_menu_wallpaper; if (!nbio->image.handle) { nbio->image.cb = NULL; return -1; } ptr = nbio_get_ptr(nbio->handle, &len); if (!ptr) { free(nbio->image.handle); nbio->image.handle = NULL; nbio->image.cb = NULL; return -1; } nbio->image.handle->buff_data = (uint8_t*)ptr; nbio->image.pos_increment = (len / 2) ? (len / 2) : 1; nbio->image.processing_pos_increment = (len / 4) ? (len / 4) : 1; if (!rpng_nbio_load_image_argb_start(nbio->image.handle)) { rpng_nbio_load_image_free(nbio->image.handle); return -1; } nbio->image.is_blocking = false; nbio->image.is_finished = false; nbio->is_blocking = false; nbio->is_finished = true; return 0; }
static int cb_nbio_generic(nbio_handle_t *nbio, size_t *len) { void *ptr = NULL; if (!nbio->image.handle) { nbio->image.cb = NULL; return -1; } ptr = nbio_get_ptr(nbio->handle, len); if (!ptr) { rpng_nbio_load_image_free(nbio->image.handle); nbio->image.handle = NULL; nbio->image.cb = NULL; return -1; } rpng_set_buf_ptr(nbio->image.handle, (uint8_t*)ptr); nbio->image.pos_increment = (*len / 2) ? (*len / 2) : 1; nbio->image.processing_pos_increment = (*len / 4) ? (*len / 4) : 1; if (!rpng_nbio_load_image_argb_start(nbio->image.handle)) { rpng_nbio_load_image_free(nbio->image.handle); return -1; } nbio->image.is_blocking = false; nbio->image.is_finished = false; nbio->is_finished = true; return 0; }
static bool rpng_nbio_load_image_argb(const char *path, uint32_t **data, unsigned *width, unsigned *height) { int retval; size_t file_len; bool ret = true; struct rpng_t *rpng = NULL; void *ptr = NULL; unsigned val = 0; struct nbio_t* handle = (void*)nbio_open(path, NBIO_READ); if (!handle) goto end; ptr = nbio_get_ptr(handle, &file_len); nbio_begin_read(handle); while (!nbio_iterate(handle)); ptr = nbio_get_ptr(handle, &file_len); if (!ptr) { ret = false; goto end; } rpng = (struct rpng_t*)calloc(1, sizeof(struct rpng_t)); if (!rpng) { ret = false; goto end; } rpng->buff_data = (uint8_t*)ptr; if (!rpng->buff_data) { ret = false; goto end; } if (!rpng_nbio_load_image_argb_start(rpng)) { ret = false; goto end; } while (rpng_nbio_load_image_argb_iterate( rpng->buff_data, rpng, &val)) { rpng->buff_data += val; } #if 0 fprintf(stderr, "has_ihdr: %d\n", rpng->has_ihdr); fprintf(stderr, "has_idat: %d\n", rpng->has_idat); fprintf(stderr, "has_iend: %d\n", rpng->has_iend); #endif if (!rpng->has_ihdr || !rpng->has_idat || !rpng->has_iend) { ret = false; goto end; } do { retval = rpng_nbio_load_image_argb_process(rpng, data, width, height); }while(retval == IMAGE_PROCESS_NEXT); if (retval == IMAGE_PROCESS_ERROR || retval == IMAGE_PROCESS_ERROR_END) ret = false; end: if (handle) nbio_free(handle); if (rpng) rpng_nbio_load_image_free(rpng); rpng = NULL; if (!ret) free(*data); return ret; }