static bool input_overlay_load_overlays(input_overlay_t *ol, const char *path) { size_t i; bool ret = true; config_file_t *conf = config_file_new(path); if (!conf) { RARCH_ERR("Failed to load config file: %s.\n", path); return false; } unsigned overlays = 0; if (!config_get_uint(conf, "overlays", &overlays)) { RARCH_ERR("overlays variable not defined in config.\n"); ret = false; goto end; } if (!overlays) { ret = false; goto end; } ol->overlays = (struct overlay*)calloc(overlays, sizeof(*ol->overlays)); if (!ol->overlays) { ret = false; goto end; } ol->size = overlays; for (i = 0; i < ol->size; i++) { if (!input_overlay_load_overlay(ol, conf, path, &ol->overlays[i], i)) { RARCH_ERR("[Overlay]: Failed to load overlay #%u.\n", (unsigned)i); ret = false; goto end; } } for (i = 0; i < ol->size; i++) { if (!input_overlay_resolve_targets(ol->overlays, i, ol->size)) { RARCH_ERR("[Overlay]: Failed to resolve next targets.\n"); ret = false; goto end; } } end: config_file_free(conf); return ret; }
bool input_overlay_load_overlays_iterate(input_overlay_t *ol) { bool not_done = true; if (!ol) return false; not_done = ol->pos < ol->size; if (!not_done) { ol->state = OVERLAY_STATUS_DEFERRED_LOADING_RESOLVE; return true; } switch (ol->loading_status) { case OVERLAY_IMAGE_TRANSFER_NONE: case OVERLAY_IMAGE_TRANSFER_BUSY: ol->loading_status = OVERLAY_IMAGE_TRANSFER_DONE; break; case OVERLAY_IMAGE_TRANSFER_DONE: input_overlay_load_overlay_image_done(&ol->overlays[ol->pos]); ol->loading_status = OVERLAY_IMAGE_TRANSFER_DESC_ITERATE; break; case OVERLAY_IMAGE_TRANSFER_DESC_ITERATE: if (!input_overlay_load_overlay(ol, ol->overlay_path, &ol->overlays[ol->pos], ol->pos)) { RARCH_ERR("[Overlay]: Failed to load overlay #%u.\n", (unsigned)ol->pos); goto error; } break; case OVERLAY_IMAGE_TRANSFER_DESC_DONE: if (ol->pos == 0) input_overlay_load_overlays_resolve_iterate(ol); ol->pos += 1; ol->loading_status = OVERLAY_IMAGE_TRANSFER_NONE; break; case OVERLAY_IMAGE_TRANSFER_ERROR: goto error; } return true; error: ol->state = OVERLAY_STATUS_DEFERRED_ERROR; return false; }