mirror of
https://github.com/libretro/ppsspp.git
synced 2024-11-27 18:30:56 +00:00
Move some stuff to native. Show game icon on newui game screen. Turn it off again (oops)
This commit is contained in:
parent
583927988c
commit
df6199d353
@ -42,20 +42,6 @@ long parseLong(std::string s) {
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
// faster than sscanf
|
||||
bool AsciiToHex(const char* _szValue, u32& result)
|
||||
{
|
||||
char *endptr = NULL;
|
||||
const u32 value = strtoul(_szValue, &endptr, 16);
|
||||
|
||||
if (!endptr || *endptr)
|
||||
return false;
|
||||
|
||||
result = value;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CharArrayFromFormatV(char* out, int outsize, const char* format, va_list args)
|
||||
{
|
||||
int writtenCount = vsnprintf(out, outsize, format, args);
|
||||
@ -114,160 +100,4 @@ void BuildCompleteFilename(std::string& _CompleteFilename, const std::string& _P
|
||||
|
||||
// add the filename
|
||||
_CompleteFilename += _Filename;
|
||||
}
|
||||
|
||||
std::string TabsToSpaces(int tab_size, const std::string &in)
|
||||
{
|
||||
const std::string spaces(tab_size, ' ');
|
||||
std::string out(in);
|
||||
|
||||
size_t i = 0;
|
||||
while (out.npos != (i = out.find('\t')))
|
||||
out.replace(i, 1, spaces);
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
std::string ReplaceAll(std::string result, const std::string& src, const std::string& dest)
|
||||
{
|
||||
while(1)
|
||||
{
|
||||
const size_t pos = result.find(src);
|
||||
if (pos == result.npos) break;
|
||||
result.replace(pos, src.size(), dest);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// UriDecode and UriEncode are from http://www.codeguru.com/cpp/cpp/string/conversions/print.php/c12759
|
||||
// by jinq0123 (November 2, 2006)
|
||||
|
||||
// Uri encode and decode.
|
||||
// RFC1630, RFC1738, RFC2396
|
||||
|
||||
// Some compilers don't like to assume (int)-1 will safely cast to (char)-1 as
|
||||
// the MSBs aren't 0's. Workaround the issue while maintaining table spacing.
|
||||
#define N1 (char)-1
|
||||
const char HEX2DEC[256] =
|
||||
{
|
||||
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
|
||||
/* 0 */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
/* 1 */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
/* 2 */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
/* 3 */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,N1,N1, N1,N1,N1,N1,
|
||||
|
||||
/* 4 */ N1,10,11,12, 13,14,15,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
/* 5 */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
/* 6 */ N1,10,11,12, 13,14,15,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
/* 7 */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
|
||||
/* 8 */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
/* 9 */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
/* A */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
/* B */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
|
||||
/* C */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
/* D */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
/* E */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1,
|
||||
/* F */ N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1, N1,N1,N1,N1
|
||||
};
|
||||
|
||||
std::string UriDecode(const std::string & sSrc)
|
||||
{
|
||||
// Note from RFC1630: "Sequences which start with a percent sign
|
||||
// but are not followed by two hexadecimal characters (0-9, A-F) are reserved
|
||||
// for future extension"
|
||||
|
||||
const unsigned char * pSrc = (const unsigned char *)sSrc.c_str();
|
||||
const size_t SRC_LEN = sSrc.length();
|
||||
const unsigned char * const SRC_END = pSrc + SRC_LEN;
|
||||
const unsigned char * const SRC_LAST_DEC = SRC_END - 2; // last decodable '%'
|
||||
|
||||
char * const pStart = new char[SRC_LEN];
|
||||
char * pEnd = pStart;
|
||||
|
||||
while (pSrc < SRC_LAST_DEC)
|
||||
{
|
||||
if (*pSrc == '%')
|
||||
{
|
||||
char dec1, dec2;
|
||||
if (-1 != (dec1 = HEX2DEC[*(pSrc + 1)])
|
||||
&& -1 != (dec2 = HEX2DEC[*(pSrc + 2)]))
|
||||
{
|
||||
*pEnd++ = (dec1 << 4) + dec2;
|
||||
pSrc += 3;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
*pEnd++ = *pSrc++;
|
||||
}
|
||||
|
||||
// the last 2- chars
|
||||
while (pSrc < SRC_END)
|
||||
*pEnd++ = *pSrc++;
|
||||
|
||||
std::string sResult(pStart, pEnd);
|
||||
delete [] pStart;
|
||||
return sResult;
|
||||
}
|
||||
|
||||
// Only alphanum is safe.
|
||||
const char SAFE[256] =
|
||||
{
|
||||
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
|
||||
/* 0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
||||
/* 1 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
||||
/* 2 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
||||
/* 3 */ 1,1,1,1, 1,1,1,1, 1,1,0,0, 0,0,0,0,
|
||||
|
||||
/* 4 */ 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
|
||||
/* 5 */ 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,0,
|
||||
/* 6 */ 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
|
||||
/* 7 */ 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,0,
|
||||
|
||||
/* 8 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
||||
/* 9 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
||||
/* A */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
||||
/* B */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
||||
|
||||
/* C */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
||||
/* D */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
||||
/* E */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
||||
/* F */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
|
||||
};
|
||||
|
||||
std::string UriEncode(const std::string & sSrc)
|
||||
{
|
||||
const char DEC2HEX[16 + 1] = "0123456789ABCDEF";
|
||||
const unsigned char * pSrc = (const unsigned char *)sSrc.c_str();
|
||||
const size_t SRC_LEN = sSrc.length();
|
||||
unsigned char * const pStart = new unsigned char[SRC_LEN * 3];
|
||||
unsigned char * pEnd = pStart;
|
||||
const unsigned char * const SRC_END = pSrc + SRC_LEN;
|
||||
|
||||
for (; pSrc < SRC_END; ++pSrc)
|
||||
{
|
||||
if (SAFE[*pSrc])
|
||||
*pEnd++ = *pSrc;
|
||||
else
|
||||
{
|
||||
// escape this char
|
||||
*pEnd++ = '%';
|
||||
*pEnd++ = DEC2HEX[*pSrc >> 4];
|
||||
*pEnd++ = DEC2HEX[*pSrc & 0x0F];
|
||||
}
|
||||
}
|
||||
|
||||
std::string sResult((char *)pStart, (char *)pEnd);
|
||||
delete [] pStart;
|
||||
return sResult;
|
||||
}
|
||||
|
||||
bool StringEndsWith(std::string const &fullString, std::string const &ending) {
|
||||
if (fullString.length() >= ending.length()) {
|
||||
return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
@ -52,19 +52,11 @@ std::string ThousandSeparate(I value, int spaces = 0)
|
||||
return oss.str();
|
||||
}
|
||||
|
||||
// TODO: kill this
|
||||
bool AsciiToHex(const char* _szValue, u32& result);
|
||||
|
||||
std::string TabsToSpaces(int tab_size, const std::string &in);
|
||||
|
||||
// "C:/Windows/winhelp.exe" to "C:/Windows/", "winhelp", ".exe"
|
||||
bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _pFilename, std::string* _pExtension);
|
||||
|
||||
void BuildCompleteFilename(std::string& _CompleteFilename, const std::string& _Path, const std::string& _Filename);
|
||||
std::string ReplaceAll(std::string result, const std::string& src, const std::string& dest);
|
||||
std::string UriDecode(const std::string & sSrc);
|
||||
std::string UriEncode(const std::string & sSrc);
|
||||
|
||||
bool StringEndsWith(std::string const &fullString, std::string const &ending);
|
||||
|
||||
#endif // _STRINGUTIL_H_
|
||||
|
@ -61,7 +61,6 @@ u64 GameInfo::GetGameSizeInBytes() {
|
||||
}
|
||||
|
||||
std::vector<std::string> GameInfo::GetSaveDataDirectories() {
|
||||
std::string id = paramSFO.GetValueString("DISC_ID");
|
||||
std::string memc, flash;
|
||||
GetSysDirectories(memc, flash);
|
||||
|
||||
@ -169,6 +168,9 @@ public:
|
||||
lock_guard lock(info_->lock);
|
||||
info_->paramSFO.ReadSFO(sfoData, sfoSize);
|
||||
info_->title = info_->paramSFO.GetValueString("TITLE");
|
||||
info_->id = info_->paramSFO.GetValueString("DISC_ID");
|
||||
info_->id_version = info_->paramSFO.GetValueString("DISC_ID") + "_" + info_->paramSFO.GetValueString("DISC_VERSION");
|
||||
|
||||
info_->paramSFOLoaded = true;
|
||||
}
|
||||
delete [] sfoData;
|
||||
@ -193,6 +195,10 @@ public:
|
||||
}
|
||||
case FILETYPE_PSP_ELF:
|
||||
// An elf on its own has no usable information, no icons, no nothing.
|
||||
info_->title = getFilename(filename);
|
||||
info_->id = "ELF000000";
|
||||
info_->id_version = "ELF000000_1.00";
|
||||
info_->paramSFOLoaded = true;
|
||||
return;
|
||||
|
||||
case FILETYPE_PSP_ISO:
|
||||
@ -213,6 +219,9 @@ public:
|
||||
lock_guard lock(info_->lock);
|
||||
info_->paramSFO.ReadSFO((const u8 *)paramSFOcontents.data(), paramSFOcontents.size());
|
||||
info_->title = info_->paramSFO.GetValueString("TITLE");
|
||||
info_->id = info_->paramSFO.GetValueString("DISC_ID");
|
||||
info_->id_version = info_->paramSFO.GetValueString("DISC_ID") + "_" + info_->paramSFO.GetValueString("DISC_VERSION");
|
||||
|
||||
info_->paramSFOLoaded = true;
|
||||
}
|
||||
|
||||
|
@ -56,6 +56,8 @@ public:
|
||||
|
||||
FileInfo fileInfo;
|
||||
std::string title; // for easy access, also available in paramSFO.
|
||||
std::string id;
|
||||
std::string id_version;
|
||||
EmuFileType fileType;
|
||||
ParamSFOData paramSFO;
|
||||
bool paramSFOLoaded;
|
||||
|
@ -44,9 +44,10 @@ void GameScreen::CreateViews() {
|
||||
|
||||
leftColumn->Add(new Choice("Back", "", new AnchorLayoutParams(150, WRAP_CONTENT, 10, NONE, NONE, 10)))->OnClick.Handle(this, &GameScreen::OnSwitchBack);
|
||||
if (info) {
|
||||
tvTitle_ = leftColumn->Add(new TextView(0, info->title, ALIGN_LEFT, 1.0f, new AnchorLayoutParams(10, 10, NONE, NONE)));
|
||||
tvGameSize_ = leftColumn->Add(new TextView(0, "...", ALIGN_LEFT, 1.0f, new AnchorLayoutParams(10, 50, NONE, NONE)));
|
||||
tvSaveDataSize_ = leftColumn->Add(new TextView(0, "...", ALIGN_LEFT, 1.0f, new AnchorLayoutParams(10, 90, NONE, NONE)));
|
||||
texvGameIcon_ = leftColumn->Add(new TextureView(0, IS_DEFAULT, new AnchorLayoutParams(144 * 2, 80 * 2, 10, 10, NONE, NONE)));
|
||||
tvTitle_ = leftColumn->Add(new TextView(0, info->title, ALIGN_LEFT, 1.0f, new AnchorLayoutParams(10, 200, NONE, NONE)));
|
||||
tvGameSize_ = leftColumn->Add(new TextView(0, "...", ALIGN_LEFT, 1.0f, new AnchorLayoutParams(10, 250, NONE, NONE)));
|
||||
tvSaveDataSize_ = leftColumn->Add(new TextView(0, "...", ALIGN_LEFT, 1.0f, new AnchorLayoutParams(10, 290, NONE, NONE)));
|
||||
}
|
||||
|
||||
ViewGroup *rightColumn = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(300, FILL_PARENT, actionMenuMargins));
|
||||
@ -94,13 +95,20 @@ void GameScreen::update(InputState &input) {
|
||||
UIScreen::update(input);
|
||||
|
||||
GameInfo *info = g_gameInfoCache.GetInfo(gamePath_, true);
|
||||
|
||||
if (tvTitle_)
|
||||
tvTitle_->SetText(info->title);
|
||||
if (info->iconTexture && texvGameIcon_) {
|
||||
texvGameIcon_->SetTexture(info->iconTexture);
|
||||
uint32_t color = whiteAlpha(ease((time_now_d() - info->timeIconWasLoaded) * 3));
|
||||
texvGameIcon_->SetColor(color);
|
||||
}
|
||||
|
||||
if (info->gameSize) {
|
||||
char temp[256];
|
||||
sprintf(temp, "Game: %1.1f MB", (float)(info->gameSize) / 1024.f / 1024.f);
|
||||
tvGameSize_->SetText(temp);
|
||||
sprintf(temp, "SaveData: %1.1f MB", (float)(info->saveDataSize) / 1024.f / 1024.f);
|
||||
sprintf(temp, "SaveData: %1.2f MB", (float)(info->saveDataSize) / 1024.f / 1024.f);
|
||||
tvSaveDataSize_->SetText(temp);
|
||||
}
|
||||
}
|
||||
|
@ -47,6 +47,7 @@ private:
|
||||
std::string gamePath_;
|
||||
|
||||
// As we load metadata in the background, we need to be able to update these after the fact.
|
||||
UI::TextureView *texvGameIcon_;
|
||||
UI::TextView *tvTitle_;
|
||||
UI::TextView *tvGameSize_;
|
||||
UI::TextView *tvSaveDataSize_;
|
||||
|
@ -310,15 +310,15 @@ void MenuScreen::render() {
|
||||
UIEnd();
|
||||
|
||||
// To try some new UI, enable this.
|
||||
screenManager()->switchScreen(new GameScreen(g_Config.recentIsos[i]));
|
||||
//screenManager()->switchScreen(new EmuScreen(g_Config.recentIsos[i]));
|
||||
// screenManager()->switchScreen(new GameScreen(g_Config.recentIsos[i]));
|
||||
screenManager()->switchScreen(new EmuScreen(g_Config.recentIsos[i]));
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (UIButton((int)GEN_ID_LOOP(i), vgrid_recent, textureButtonWidth, textureButtonHeight, filename.c_str(), ALIGN_LEFT)) {
|
||||
UIEnd();
|
||||
screenManager()->switchScreen(new GameScreen(g_Config.recentIsos[i]));
|
||||
//screenManager()->switchScreen(new EmuScreen(g_Config.recentIsos[i]));
|
||||
// screenManager()->switchScreen(new GameScreen(g_Config.recentIsos[i]));
|
||||
screenManager()->switchScreen(new EmuScreen(g_Config.recentIsos[i]));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
2
native
2
native
@ -1 +1 @@
|
||||
Subproject commit 73f587009694f3860f00600dc4c7723de0c1f85e
|
||||
Subproject commit 2f46baa138febef0cb6ef8f1a086056dde09a5f1
|
Loading…
Reference in New Issue
Block a user