static void update_save_state_item(fs_emu_menu_item* item, int slot, int save) { char *title = check_save_state(slot); if (title) { fs_emu_menu_item_set_title(item, title); free(title); } else { fs_emu_menu_item_set_title(item, _("Empty")); } }
static int save_state_menu_function(fs_emu_menu_item *menu_item, void **result_data) { int slot = menu_item->idata; fs_emu_menu_item *item; fs_emu_menu *menu = fs_emu_menu_new(); //fs_emu_menu_set_update_function(menu, update_save_states_menu); char *title = check_save_state(slot); item = fs_emu_menu_item_new(); fs_emu_menu_append_item(menu, item); if (title) { fs_emu_menu_item_set_title(item, title); } else { fs_emu_menu_item_set_title(item, _("Empty")); } fs_emu_menu_item_set_type(item, FS_EMU_MENU_ITEM_TYPE_HEADING); item = fs_emu_menu_item_new(); fs_emu_menu_append_item(menu, item); fs_emu_menu_item_set_title(item, _("Load")); fs_emu_menu_item_set_idata(item, slot); fs_emu_menu_item_set_enabled(item, title != NULL); fs_emu_menu_item_set_activate_function(item, load_function); item = fs_emu_menu_item_new(); fs_emu_menu_append_item(menu, item); fs_emu_menu_item_set_title(item, _("Save")); fs_emu_menu_item_set_idata(item, slot); fs_emu_menu_item_set_activate_function(item, save_function); if (title) { free(title); } *result_data = menu; return FS_EMU_MENU_RESULT_MENU; }
// Test out SkPictureRecorder::partialReplay DEF_TEST(PictureRecorder_replay, reporter) { // check save/saveLayer state { SkPictureRecorder recorder; SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->saveLayer(nullptr, nullptr); sk_sp<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&recorder)); // The extra save and restore comes from the Copy process. check_save_state(reporter, copy.get(), 2, 1, 3); canvas->saveLayer(nullptr, nullptr); sk_sp<SkPicture> final(recorder.finishRecordingAsPicture()); check_save_state(reporter, final.get(), 1, 2, 3); // The copy shouldn't pick up any operations added after it was made check_save_state(reporter, copy.get(), 2, 1, 3); } // (partially) check leakage of draw ops { SkPictureRecorder recorder; SkCanvas* canvas = recorder.beginRecording(10, 10); SkRect r = SkRect::MakeWH(5, 5); SkPaint p; canvas->drawRect(r, p); sk_sp<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&recorder)); REPORTER_ASSERT(reporter, !copy->willPlayBackBitmaps()); SkBitmap bm; make_bm(&bm, 10, 10, SK_ColorRED, true); r.offset(5.0f, 5.0f); canvas->drawBitmapRect(bm, r, nullptr); sk_sp<SkPicture> final(recorder.finishRecordingAsPicture()); REPORTER_ASSERT(reporter, final->willPlayBackBitmaps()); REPORTER_ASSERT(reporter, copy->uniqueID() != final->uniqueID()); // The snapshot shouldn't pick up any operations added after it was made REPORTER_ASSERT(reporter, !copy->willPlayBackBitmaps()); } // Recreate the Android partialReplay test case { SkPictureRecorder recorder; SkCanvas* canvas = recorder.beginRecording(4, 3, nullptr, 0); create_imbalance(canvas); int expectedSaveCount = canvas->getSaveCount(); sk_sp<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&recorder)); check_balance(reporter, copy.get()); REPORTER_ASSERT(reporter, expectedSaveCount = canvas->getSaveCount()); // End the recording of source to test the picture finalization // process isn't complicated by the partialReplay step sk_sp<SkPicture> final(recorder.finishRecordingAsPicture()); } }