/* Save state */ PspImage* SaveState(const char *path, PspImage *icon) { /* Open file for writing */ FILE *f; if (!(f = fopen(path, "w"))) return NULL; /* Create thumbnail */ PspImage *thumb; thumb = (icon->Viewport.Width < 200) ? pspImageCreateCopy(icon) : pspImageCreateThumbnail(icon); if (!thumb) { fclose(f); return NULL; } /* Write the thumbnail */ if (!pspImageSavePngFd(f, thumb)) { pspImageDestroy(thumb); fclose(f); return NULL; } /* Save state */ //system_save_state(f); fclose(f); return thumb; }
/* Release menu resources */ void TrashMenu() { TrashEmulator(); /* Save options */ SaveOptions(); /* Trash menus */ pl_menu_destroy(&SystemUiMenu.Menu); pl_menu_destroy(&OptionUiMenu.Menu); pl_menu_destroy(&ControlUiMenu.Menu); pl_menu_destroy(&SaveStateGallery.Menu); /* Trash images */ if (Background) pspImageDestroy(Background); if (NoSaveIcon) pspImageDestroy(NoSaveIcon); }
/* Load state */ int LoadState(const char *path) { /* Open file for reading */ FILE *f = fopen(path, "r"); if (!f) return 0; /* Load image into temporary object */ PspImage *image = pspImageLoadPngFd(f); pspImageDestroy(image); //system_load_state(f); fclose(f); return 1; }
void pl_vk_destroy(pl_vk_layout *layout) { /* Destroy sticky keys */ if (layout->stickies) { int i; pl_vk_sticky *sticky; for (i = 0, sticky = layout->stickies; i < layout->sticky_count; i++, sticky++) free(sticky->key_index); free(layout->stickies); } if (layout->keys) free(layout->keys); if (layout->keyb_image) pspImageDestroy(layout->keyb_image); }
static void DisplayStateTab() { if (!GAME_LOADED) { TabIndex++; return; } pl_menu_item *item, *sel; SceIoStat stat; char caption[32]; ScePspDateTime latest; const char *config_name = pl_file_get_filename(CURRENT_GAME); char *path = (char*)malloc(strlen(SaveStatePath) + strlen(config_name) + 8); char *game_name = strdup(config_name); char *dot = strrchr(game_name, '.'); if (dot) *dot='\0'; memset(&latest, 0, sizeof(latest)); /* Initialize icons */ sel = SaveStateGallery.Menu.items; for (item = SaveStateGallery.Menu.items; item; item = item->next) { sprintf(path, "%s%s.s%02i", SaveStatePath, config_name, item->id); if (pl_file_exists(path)) { if (sceIoGetstat(path, &stat) < 0) sprintf(caption, "ERROR"); else { /* Determine the latest save state */ if (pl_util_date_compare(&latest, &stat.st_mtime) < 0) { sel = item; latest = stat.st_mtime; } sprintf(caption, "%02i/%02i/%02i %02i:%02i", stat.st_mtime.month, stat.st_mtime.day, stat.st_mtime.year - (stat.st_mtime.year / 100) * 100, stat.st_mtime.hour, stat.st_mtime.minute); } pl_menu_set_item_caption(item, caption); item->param = LoadStateIcon(path); pl_menu_set_item_help_text(item, PresentSlotText); } else { pl_menu_set_item_caption(item, "Empty"); item->param = NoSaveIcon; pl_menu_set_item_help_text(item, EmptySlotText); } } free(path); /* Highlight the latest save state if none are selected */ if (SaveStateGallery.Menu.selected == NULL) SaveStateGallery.Menu.selected = sel; pspUiOpenGallery(&SaveStateGallery, game_name); free(game_name); /* Destroy any icons */ for (item = SaveStateGallery.Menu.items; item; item = item->next) if (item->param != NULL && item->param != NoSaveIcon) pspImageDestroy((PspImage*)item->param); }
int OnSaveStateButtonPress(const PspUiGallery *gallery, pl_menu_item *sel, u32 button_mask) { if (!GAME_LOADED) return 0; if (button_mask & PSP_CTRL_SQUARE || button_mask & PSP_CTRL_TRIANGLE) { char caption[32]; char *path; const char *config_name = pl_file_get_filename(CURRENT_GAME); path = (char*)malloc(strlen(SaveStatePath) + strlen(config_name) + 8); sprintf(path, "%s%s.s%02i", SaveStatePath, config_name, sel->id); do /* not a real loop; flow control construct */ { if (button_mask & PSP_CTRL_SQUARE) { if (pl_file_exists(path) && !pspUiConfirm("Overwrite existing state?")) break; pspUiFlashMessage("Saving, please wait ..."); PspImage *icon; if (!(icon = SaveState(path, Screen))) { pspUiAlert("ERROR: State not saved"); break; } SceIoStat stat; /* Trash the old icon (if any) */ if (sel->param && sel->param != NoSaveIcon) pspImageDestroy((PspImage*)sel->param); /* Update icon, help text */ sel->param = icon; pl_menu_set_item_help_text(sel, PresentSlotText); /* Get file modification time/date */ if (sceIoGetstat(path, &stat) < 0) sprintf(caption, "ERROR"); else sprintf(caption, "%02i/%02i/%02i %02i:%02i", stat.st_mtime.month, stat.st_mtime.day, stat.st_mtime.year - (stat.st_mtime.year / 100) * 100, stat.st_mtime.hour, stat.st_mtime.minute); pl_menu_set_item_caption(sel, caption); } else if (button_mask & PSP_CTRL_TRIANGLE) { if (!pl_file_exists(path) || !pspUiConfirm("Delete state?")) break; if (!pl_file_rm(path)) { pspUiAlert("ERROR: State not deleted"); break; } /* Trash the old icon (if any) */ if (sel->param && sel->param != NoSaveIcon) pspImageDestroy((PspImage*)sel->param); /* Update icon, caption */ sel->param = NoSaveIcon; pl_menu_set_item_help_text(sel, EmptySlotText); pl_menu_set_item_caption(sel, "Empty"); } } while (0); if (path) free(path); return 0; } return OnGenericButtonPress(NULL, NULL, button_mask); }