From df6199d353f1d12f20cdccf926cc46df60b19302 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 9 Jun 2013 13:41:15 +0200 Subject: [PATCH] Move some stuff to native. Show game icon on newui game screen. Turn it off again (oops) --- Common/StringUtils.cpp | 172 +---------------------------------------- Common/StringUtils.h | 8 -- UI/GameInfoCache.cpp | 11 ++- UI/GameInfoCache.h | 2 + UI/GameScreen.cpp | 16 +++- UI/GameScreen.h | 1 + UI/MenuScreens.cpp | 8 +- native | 2 +- 8 files changed, 31 insertions(+), 189 deletions(-) diff --git a/Common/StringUtils.cpp b/Common/StringUtils.cpp index 992e6ce208..02f5933f65 100644 --- a/Common/StringUtils.cpp +++ b/Common/StringUtils.cpp @@ -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; - } -} +} \ No newline at end of file diff --git a/Common/StringUtils.h b/Common/StringUtils.h index 0c27481d88..e0cbc93128 100644 --- a/Common/StringUtils.h +++ b/Common/StringUtils.h @@ -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_ diff --git a/UI/GameInfoCache.cpp b/UI/GameInfoCache.cpp index 286bb059d9..bfa8e8be6d 100644 --- a/UI/GameInfoCache.cpp +++ b/UI/GameInfoCache.cpp @@ -61,7 +61,6 @@ u64 GameInfo::GetGameSizeInBytes() { } std::vector 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; } diff --git a/UI/GameInfoCache.h b/UI/GameInfoCache.h index afbd930237..e9bbdf0ce3 100644 --- a/UI/GameInfoCache.h +++ b/UI/GameInfoCache.h @@ -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; diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index 432fbfcbae..9112ad3096 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -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); } } diff --git a/UI/GameScreen.h b/UI/GameScreen.h index 1a4cb082fe..e73192a449 100644 --- a/UI/GameScreen.h +++ b/UI/GameScreen.h @@ -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_; diff --git a/UI/MenuScreens.cpp b/UI/MenuScreens.cpp index 75b4c8f7a9..95247b7e5e 100644 --- a/UI/MenuScreens.cpp +++ b/UI/MenuScreens.cpp @@ -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; } } diff --git a/native b/native index 73f5870096..2f46baa138 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit 73f587009694f3860f00600dc4c7723de0c1f85e +Subproject commit 2f46baa138febef0cb6ef8f1a086056dde09a5f1