bool zlib_perform_mode(const char *path, const char *valid_exts, const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size, uint32_t crc32, void *userdata) { switch (cmode) { case 0: /* Uncompressed */ if (!zlib_write_file(path, cdata, size)) return false; break; case 8: /* Deflate */ { int ret = 0; zlib_file_handle_t handle = {0}; if (!zlib_inflate_data_to_file_init(&handle, cdata, csize, size)) return false; do{ ret = zlib_inflate_data_to_file_iterate(handle.stream); }while(ret == 0); if (!zlib_inflate_data_to_file(&handle, ret, path, valid_exts, cdata, csize, size, crc32)) return false; } break; default: return false; } return true; }
int rpng_load_image_argb_process_inflate_init(struct rpng_t *rpng, uint32_t **data, unsigned *width, unsigned *height) { int zstatus; bool to_continue = (zlib_stream_get_avail_in(rpng->process.stream) > 0 && zlib_stream_get_avail_out(rpng->process.stream) > 0); if (!to_continue) goto end; zstatus = zlib_inflate_data_to_file_iterate(rpng->process.stream); switch (zstatus) { case 1: goto end; case -1: goto error; default: break; } return 0; end: zlib_stream_free(rpng->process.stream); *width = rpng->ihdr.width; *height = rpng->ihdr.height; #ifdef GEKKO /* we often use these in textures, make sure they're 32-byte aligned */ *data = (uint32_t*)memalign(32, rpng->ihdr.width * rpng->ihdr.height * sizeof(uint32_t)); #else *data = (uint32_t*)malloc(rpng->ihdr.width * rpng->ihdr.height * sizeof(uint32_t)); #endif if (!*data) goto false_end; rpng->process.adam7_restore_buf_size = 0; rpng->process.restore_buf_size = 0; rpng->process.palette = rpng->palette; if (rpng->ihdr.interlace != 1) if (png_reverse_filter_init(&rpng->ihdr, &rpng->process) == -1) goto false_end; rpng->process.inflate_initialized = true; return 1; error: zlib_stream_free(rpng->process.stream); false_end: rpng->process.inflate_initialized = false; return -1; }
static int zip_extract_cb(const char *name, const char *valid_exts, const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size, uint32_t checksum, void *userdata) { struct zip_extract_userdata *data = (struct zip_extract_userdata*)userdata; /* Extract first content that matches our list. */ const char *ext = path_get_extension(name); if (ext && string_list_find_elem(data->ext, ext)) { char new_path[PATH_MAX_LENGTH] = {0}; if (data->extraction_directory) fill_pathname_join(new_path, data->extraction_directory, path_basename(name), sizeof(new_path)); else fill_pathname_resolve_relative(new_path, data->zip_path, path_basename(name), sizeof(new_path)); switch (cmode) { case ZLIB_MODE_UNCOMPRESSED: data->found_content = zlib_write_file(new_path, cdata, size); return false; case ZLIB_MODE_DEFLATE: { int ret = 0; zlib_file_handle_t handle = {0}; if (!zlib_inflate_data_to_file_init(&handle, cdata, csize, size)) return 0; do{ ret = zlib_inflate_data_to_file_iterate(handle.stream); }while(ret == 0); if (zlib_inflate_data_to_file(&handle, ret, new_path, valid_exts, cdata, csize, size, checksum)) { strlcpy(data->zip_path, new_path, data->zip_path_size); data->found_content = true; return 0; } return 0; } default: return 0; } } return 1; }