static bool rpng_nbio_load_image_argb_nonblocking(const char *path, uint32_t **data, unsigned *width, unsigned *height) { size_t file_len; bool ret = true; struct rpng_t *rpng = NULL; void *ptr = NULL; 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)) { rpng->buff_data += 4 + 4 + rpng->chunk.size + 4; } #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; } rpng_nbio_load_image_argb_process(rpng, data, width, height); end: if (handle) nbio_free(handle); if (rpng) rpng_nbio_load_image_free(rpng); rpng = NULL; if (!ret) free(*data); return ret; }
static bool rpng_load_image_argb(const char *path, uint32_t **data, unsigned *width, unsigned *height) { int retval; size_t file_len; bool ret = true; rpng_t *rpng = NULL; void *ptr = NULL; struct nbio_t* handle = (struct nbio_t*)nbio_open(path, NBIO_READ); if (!handle) goto end; nbio_begin_read(handle); while (!nbio_iterate(handle)); ptr = nbio_get_ptr(handle, &file_len); if (!ptr) { ret = false; goto end; } rpng = rpng_alloc(); if (!rpng) { ret = false; goto end; } if (!rpng_set_buf_ptr(rpng, (uint8_t*)ptr)) { ret = false; goto end; } if (!rpng_start(rpng)) { ret = false; goto end; } while (rpng_iterate_image(rpng)); if (!rpng_is_valid(rpng)) { ret = false; goto end; } do { retval = rpng_process_image(rpng, (void**)data, file_len, 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_free(rpng); rpng = NULL; if (!ret) free(*data); return ret; }