CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Core/Dialog/PSPScreenshotDialog.cpp
Views: 1401
// Copyright (c) 2012- PPSSPP Project.12// This program is free software: you can redistribute it and/or modify3// it under the terms of the GNU General Public License as published by4// the Free Software Foundation, version 2.0 or later versions.56// This program is distributed in the hope that it will be useful,7// but WITHOUT ANY WARRANTY; without even the implied warranty of8// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9// GNU General Public License 2.0 for more details.1011// A copy of the GPL 2.0 should have been included with the program.12// If not, see http://www.gnu.org/licenses/1314// Official git repository and contact information can be found at15// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.1617#include "Common/Serialize/Serializer.h"18#include "Common/Serialize/SerializeFuncs.h"19#include "Core/Dialog/PSPDialog.h"20#include "Core/Dialog/PSPScreenshotDialog.h"21#include "Core/HLE/sceKernel.h"22#include "Core/MemMap.h"23#include "Core/Reporting.h"2425enum SceUtilityScreenshotType {26SCE_UTILITY_SCREENSHOT_TYPE_GUI = 0,27SCE_UTILITY_SCREENSHOT_TYPE_AUTO = 1,28SCE_UTILITY_SCREENSHOT_TYPE_SAVE = 2,29SCE_UTILITY_SCREENSHOT_TYPE_VIEW = 3,3031// Names are just guesses based on status value behavior.32SCE_UTILITY_SCREENSHOT_TYPE_CONT_START = 100,33SCE_UTILITY_SCREENSHOT_TYPE_CONT_FINISH = 101,34SCE_UTILITY_SCREENSHOT_TYPE_CONT_STOP = 102,35};3637static const int SCE_UTILITY_SCREENSHOTDIALOG_SIZE_V1 = 436;38static const int SCE_UTILITY_SCREENSHOTDIALOG_SIZE_V2 = 928;39static const int SCE_UTILITY_SCREENSHOTDIALOG_SIZE_V3 = 932;4041#if COMMON_LITTLE_ENDIAN42typedef SceUtilityScreenshotType SceUtilityScreenshotType_le;43#else44typedef swap_struct_t<SceUtilityScreenshotType, swap_32_t<SceUtilityScreenshotType> > SceUtilityScreenshotType_le;45#endif4647struct SceUtilityScreenshotParams {48pspUtilityDialogCommon base;49SceUtilityScreenshotType_le mode;5051// TODO52};5354PSPScreenshotDialog::PSPScreenshotDialog(UtilityDialogType type) : PSPDialog(type) {55}5657PSPScreenshotDialog::~PSPScreenshotDialog() {58}5960int PSPScreenshotDialog::Init(u32 paramAddr) {61// Already running62if (ReadStatus() != SCE_UTILITY_STATUS_NONE && ReadStatus() != SCE_UTILITY_STATUS_SHUTDOWN) {63ERROR_LOG_REPORT(Log::HLE, "sceUtilityScreenshotInitStart(%08x): invalid status", paramAddr);64return SCE_ERROR_UTILITY_INVALID_STATUS;65}6667params_ = PSPPointer<SceUtilityScreenshotParams>::Create(paramAddr);68if (!params_.IsValid()) {69ERROR_LOG_REPORT(Log::HLE, "sceUtilityScreenshotInitStart(%08x): invalid pointer", paramAddr);70return SCE_KERNEL_ERROR_INVALID_POINTER;71}7273switch ((u32)params_->base.size) {74case SCE_UTILITY_SCREENSHOTDIALOG_SIZE_V1:75case SCE_UTILITY_SCREENSHOTDIALOG_SIZE_V2:76case SCE_UTILITY_SCREENSHOTDIALOG_SIZE_V3:77break;7879default:80ERROR_LOG_REPORT(Log::HLE, "sceUtilityScreenshotInitStart(%08x): invalid size %d", paramAddr, (u32)params_->base.size);81return SCE_ERROR_UTILITY_INVALID_PARAM_SIZE;82}8384mode = params_->mode;85ChangeStatus(SCE_UTILITY_STATUS_INITIALIZE, 0);86InitCommon();8788return 0;89}9091int PSPScreenshotDialog::Update(int animSpeed) {92UpdateCommon();93if (UseAutoStatus()) {94if (ReadStatus() == SCE_UTILITY_STATUS_INITIALIZE) {95ChangeStatus(SCE_UTILITY_STATUS_RUNNING, 0);96} else if (ReadStatus() == SCE_UTILITY_STATUS_RUNNING) {97if (mode == SCE_UTILITY_SCREENSHOT_TYPE_CONT_START) {98ChangeStatus(SCE_UTILITY_STATUS_SCREENSHOT_UNKNOWN, 0);99} else {100ChangeStatus(SCE_UTILITY_STATUS_FINISHED, 0);101}102} else if (ReadStatus() == SCE_UTILITY_STATUS_FINISHED) {103ChangeStatus(SCE_UTILITY_STATUS_SHUTDOWN, 0);104}105}106return 0;107}108109int PSPScreenshotDialog::ContStart() {110// Based on JPCSP http://code.google.com/p/jpcsp/source/detail?r=3381111if (ReadStatus() != SCE_UTILITY_STATUS_SCREENSHOT_UNKNOWN)112return SCE_ERROR_UTILITY_INVALID_STATUS;113114// Check with JPCSPTrace log of Dream Club Portable115ChangeStatus(SCE_UTILITY_STATUS_FINISHED, 0);116117return 0;118}119120void PSPScreenshotDialog::DoState(PointerWrap &p) {121PSPDialog::DoState(p);122123auto s = p.Section("PSPScreenshotDialog", 0, 2);124if (!s)125return;126127Do(p, mode);128if (s >= 2) {129Do(p, params_);130}131}132133pspUtilityDialogCommon *PSPScreenshotDialog::GetCommonParam() {134if (params_.IsValid())135return ¶ms_->base;136return nullptr;137}138139140