Skip to content

Commit

Permalink
Merge branch 'master' of github.com:rajkosto/rpcs3 into mgs4
Browse files Browse the repository at this point in the history
  • Loading branch information
rajkosto committed Oct 18, 2019
2 parents b9044bd + abdf700 commit 9589cc8
Show file tree
Hide file tree
Showing 26 changed files with 908 additions and 219 deletions.
2 changes: 1 addition & 1 deletion rpcs3/Emu/Cell/Modules/cellPad.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,5 +121,5 @@ struct CellPadFilterIIRSos
struct pad_info
{
atomic_t<u32> max_connect = 0;
std::array<u32, CELL_PAD_MAX_PORT_NUM> port_setting;
std::array<u32, CELL_PAD_MAX_PORT_NUM> port_setting{ 0 };
};
96 changes: 87 additions & 9 deletions rpcs3/Emu/Cell/Modules/cellScreenshot.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "stdafx.h"
#include "stdafx.h"
#include "Emu/System.h"
#include "Emu/IdManager.h"
#include "Emu/Cell/PPUModule.h"

#include "cellScreenshot.h"
Expand All @@ -8,27 +9,104 @@

LOG_CHANNEL(cellScreenshot);

s32 cellScreenShotSetParameter(vm::cptr<CellScreenShotSetParam> param)
template<>
void fmt_class_string<CellScreenShotError>::format(std::string& out, u64 arg)
{
cellScreenshot.todo("cellScreenShotSetParameter(param=*0x%x)", param);
format_enum(out, arg, [](auto error)
{
switch (error)
{
STR_CASE(CELL_SCREENSHOT_ERROR_INTERNAL);
STR_CASE(CELL_SCREENSHOT_ERROR_PARAM);
STR_CASE(CELL_SCREENSHOT_ERROR_DECODE);
STR_CASE(CELL_SCREENSHOT_ERROR_NOSPACE);
STR_CASE(CELL_SCREENSHOT_ERROR_UNSUPPORTED_COLOR_FORMAT);
}

return unknown;
});
}

error_code cellScreenShotSetParameter(vm::cptr<CellScreenShotSetParam> param)
{
cellScreenshot.warning("cellScreenShotSetParameter(param=*0x%x)", param);

if (!param) // TODO: check if param->reserved must be null
return CELL_SCREENSHOT_ERROR_PARAM;

if (param->photo_title && !memchr(param->photo_title.get_ptr(), '\0', CELL_SCREENSHOT_PHOTO_TITLE_MAX_LENGTH))
return CELL_SCREENSHOT_ERROR_PARAM;

if (param->game_title && !memchr(param->game_title.get_ptr(), '\0', CELL_SCREENSHOT_GAME_TITLE_MAX_LENGTH))
return CELL_SCREENSHOT_ERROR_PARAM;

if (param->game_comment && !memchr(param->game_comment.get_ptr(), '\0', CELL_SCREENSHOT_GAME_COMMENT_MAX_SIZE))
return CELL_SCREENSHOT_ERROR_PARAM;

const auto manager = g_fxo->get<screenshot_manager>();

if (param->photo_title && param->photo_title[0] != '\0')
manager->photo_title = std::string(param->photo_title.get_ptr());
else
manager->photo_title = "";

if (param->game_title && param->game_title[0] != '\0')
manager->game_title = std::string(param->game_title.get_ptr());
else
manager->game_title = "";

if (param->game_comment && param->game_comment[0] != '\0')
manager->game_comment = std::string(param->game_comment.get_ptr());
else
manager->game_comment = "";

cellScreenshot.notice("cellScreenShotSetParameter(photo_title=%s, game_title=%s, game_comment=%s)", manager->photo_title, manager->game_title, manager->game_comment);

return CELL_OK;
}

s32 cellScreenShotSetOverlayImage(vm::cptr<char> srcDir, vm::cptr<char> srcFile, s32 offset_x, s32 offset_y)
error_code cellScreenShotSetOverlayImage(vm::cptr<char> srcDir, vm::cptr<char> srcFile, s32 offset_x, s32 offset_y)
{
cellScreenshot.todo("cellScreenShotSetOverlayImage(srcDir=%s, srcFile=%s, offset_x=%d, offset_y=%d)", srcDir, srcFile, offset_x, offset_y);
cellScreenshot.warning("cellScreenShotSetOverlayImage(srcDir=%s, srcFile=%s, offset_x=%d, offset_y=%d)", srcDir, srcFile, offset_x, offset_y);

if (!srcDir || !srcFile)
return CELL_SCREENSHOT_ERROR_PARAM;

// TODO: check srcDir (size 1024) and srcFile (size 64) for '-' or '_' or '.' or '/' in some manner (range checks?)

// Make sure that srcDir starts with /dev_hdd0, /dev_bdvd, /app_home or /host_root
if (strncmp(srcDir.get_ptr(), "/dev_hdd0", 9) && strncmp(srcDir.get_ptr(), "/dev_bdvd", 9) && strncmp(srcDir.get_ptr(), "/app_home", 9) && strncmp(srcDir.get_ptr(), "/host_root", 10))
{
return CELL_SCREENSHOT_ERROR_PARAM;
}

const auto manager = g_fxo->get<screenshot_manager>();

manager->overlay_dir_name = std::string(srcDir.get_ptr());
manager->overlay_file_name = std::string(srcFile.get_ptr());
manager->overlay_offset_x = offset_x;
manager->overlay_offset_y = offset_y;

return CELL_OK;
}

s32 cellScreenShotEnable()
error_code cellScreenShotEnable()
{
cellScreenshot.todo("cellScreenShotEnable()");
cellScreenshot.warning("cellScreenShotEnable()");

const auto manager = g_fxo->get<screenshot_manager>();
manager->is_enabled = true;

return CELL_OK;
}

s32 cellScreenShotDisable()
error_code cellScreenShotDisable()
{
cellScreenshot.todo("cellScreenShotDisable()");
cellScreenshot.warning("cellScreenShotDisable()");

const auto manager = g_fxo->get<screenshot_manager>();
manager->is_enabled = false;

return CELL_OK;
}

Expand Down
62 changes: 56 additions & 6 deletions rpcs3/Emu/Cell/Modules/cellScreenshot.h
Original file line number Diff line number Diff line change
@@ -1,20 +1,70 @@
#pragma once
#pragma once

#include "Emu/Memory/vm_ptr.h"

// Return Codes
enum
enum CellScreenShotError : u32
{
CELL_SCREENSHOT_ERROR_INTERNAL = 0x8002d101,
CELL_SCREENSHOT_ERROR_PARAM = 0x8002d102,
CELL_SCREENSHOT_ERROR_DECODE = 0x8002d103,
CELL_SCREENSHOT_ERROR_NOSPACE = 0x8002d104,
CELL_SCREENSHOT_ERROR_INTERNAL = 0x8002d101,
CELL_SCREENSHOT_ERROR_PARAM = 0x8002d102,
CELL_SCREENSHOT_ERROR_DECODE = 0x8002d103,
CELL_SCREENSHOT_ERROR_NOSPACE = 0x8002d104,
CELL_SCREENSHOT_ERROR_UNSUPPORTED_COLOR_FORMAT = 0x8002d105,
};

enum CellScreenShotParamSize
{
CELL_SCREENSHOT_PHOTO_TITLE_MAX_LENGTH = 64,
CELL_SCREENSHOT_GAME_TITLE_MAX_LENGTH = 64,
CELL_SCREENSHOT_GAME_COMMENT_MAX_SIZE = 1024,
};

struct CellScreenShotSetParam
{
vm::bcptr<char> photo_title;
vm::bcptr<char> game_title;
vm::bcptr<char> game_comment;
vm::bptr<void> reserved;
};

struct screenshot_manager
{
atomic_t<bool> is_enabled{ false };

std::string photo_title;
std::string game_title;
std::string game_comment;

atomic_t<s32> overlay_offset_x{ 0 };
atomic_t<s32> overlay_offset_y{ 0 };
std::string overlay_dir_name;
std::string overlay_file_name;

std::string get_overlay_path() const
{
return vfs::get(overlay_dir_name + overlay_file_name);
}

std::string get_photo_title() const
{
std::string photo = photo_title;
if (photo.empty())
photo = Emu.GetTitle();
return photo;
}

std::string get_game_title() const
{
std::string game = game_title;
if (game.empty())
game = Emu.GetTitle();
return game;
}

std::string get_screenshot_path() const
{
// TODO: make sure the file can be saved, add suffix and increase counter if file exists
// TODO: maybe find a proper home for these
return fs::get_config_dir() + "/screenshots/cell/" + get_photo_title() + ".png";
}
};
Loading

0 comments on commit 9589cc8

Please sign in to comment.