From a40bd5286ac4a97e019ec97338d0bd55a6762b4f Mon Sep 17 00:00:00 2001 From: "fix94.1" Date: Thu, 28 Mar 2013 13:02:50 +0000 Subject: [PATCH] -reduced the memory usage of each game by 320 bytes, should increase the maximum games you can have and should increase wiiflows cache reloading speed -hopefully fixed that gc disc 2 hide problem correctly now --- source/gui/coverflow.cpp | 43 ++++++--- source/gui/coverflow.hpp | 8 +- source/menu/menu.cpp | 164 ++++++++++++++++++-------------- source/menu/menu.hpp | 7 ++ source/menu/menu_categories.cpp | 2 +- source/menu/menu_config4.cpp | 2 +- 6 files changed, 134 insertions(+), 92 deletions(-) diff --git a/source/gui/coverflow.cpp b/source/gui/coverflow.cpp index 06fce7eb..0a3374d8 100644 --- a/source/gui/coverflow.cpp +++ b/source/gui/coverflow.cpp @@ -15,6 +15,7 @@ #include "fonts.h" #include "types.h" #include "gecko/gecko.hpp" +#include "menu/menu.hpp" #include "memory/mem2.hpp" #include "wstringEx/wstringEx.hpp" @@ -77,19 +78,14 @@ CCoverFlow::CCover::CCover(void) targetScale = Vector3D(1.f, 1.f, 1.f); } -CCoverFlow::CItem::CItem(dir_discHdr *itemHdr, const char *itemPic, const char *itemBoxPic, const char *itemBlankBoxPic, int playcount, unsigned int lastPlayed) : +CCoverFlow::CItem::CItem(dir_discHdr *itemHdr, int playcount, unsigned int lastPlayed) : hdr(itemHdr), playcount(playcount), lastPlayed(lastPlayed), boxTexture(false), state(STATE_Loading) { - strncpy(picPath, itemPic, 127); - picPath[127] = '\0'; - strncpy(boxPicPath, itemBoxPic, 127); - boxPicPath[127] = '\0'; - strncpy(blankBoxPicPath, itemBlankBoxPic, 63); - blankBoxPicPath[63] = '\0'; + } static inline wchar_t upperCaseWChar(wchar_t c) @@ -708,10 +704,10 @@ void CCoverFlow::reserve(u32 capacity) m_items.reserve(capacity); } -void CCoverFlow::addItem(dir_discHdr *hdr, const char *picPath, const char *boxPicPath, const char *blankBoxPicPath, int playcount, unsigned int lastPlayed) +void CCoverFlow::addItem(dir_discHdr *hdr, int playcount, unsigned int lastPlayed) { if (m_covers != NULL) return; - m_items.push_back(CCoverFlow::CItem(hdr, picPath, boxPicPath, blankBoxPicPath, playcount, lastPlayed)); + m_items.push_back(CCoverFlow::CItem(hdr, playcount, lastPlayed)); } // Draws a plane in the Z-Buffer only. @@ -2622,8 +2618,8 @@ bool CCoverFlow::_loadCoverTexPNG(u32 i, bool box, bool hq, bool blankBoxCover) if (!m_loadingCovers) return false; u8 textureFmt = m_compressTextures ? GX_TF_CMPR : GX_TF_RGB565; - const char *path = box ? (blankBoxCover ? m_items[i].blankBoxPicPath : - m_items[i].boxPicPath) : m_items[i].picPath; + const char *path = box ? (blankBoxCover ? mainMenu.getBlankCoverPath(m_items[i].hdr) : + mainMenu.getBoxPath(m_items[i].hdr)) : mainMenu.getFrontPath(m_items[i].hdr); TexData tex; tex.thread = true; m_renderingTex = &tex; @@ -2653,7 +2649,11 @@ bool CCoverFlow::_loadCoverTexPNG(u32 i, bool box, bool hq, bool blankBoxCover) { const char *gamePath = NULL; if(blankBoxCover) - gamePath = strrchr(m_items[i].blankBoxPicPath, '/') + 1; + { + const char *menuPath = mainMenu.getBlankCoverPath(m_items[i].hdr); + if(menuPath != NULL && strrchr(menuPath, '/') != NULL) + gamePath = strrchr(menuPath, '/') + 1; + } else if(NoGameID(m_items[i].hdr->type)) { if(strrchr(m_items[i].hdr->path, '/') != NULL) @@ -2663,7 +2663,10 @@ bool CCoverFlow::_loadCoverTexPNG(u32 i, bool box, bool hq, bool blankBoxCover) } else gamePath = m_items[i].hdr->id; - FILE *file = fopen(fmt("%s/%s.wfc", m_cachePath.c_str(), gamePath), "wb"); + + FILE *file = NULL; + if(gamePath != NULL) + file = fopen(fmt("%s/%s.wfc", m_cachePath.c_str(), gamePath), "wb"); if(file != NULL) { SWFCHeader header(tex, box, m_compressCache); @@ -2735,7 +2738,11 @@ CCoverFlow::CLRet CCoverFlow::_loadCoverTex(u32 i, bool box, bool hq, bool blank { const char *gamePath = NULL; if(blankBoxCover) - gamePath = strrchr(m_items[i].blankBoxPicPath, '/') + 1; + { + const char *menuPath = mainMenu.getBlankCoverPath(m_items[i].hdr); + if(menuPath != NULL && strrchr(menuPath, '/') != NULL) + gamePath = strrchr(menuPath, '/') + 1; + } else if(NoGameID(m_items[i].hdr->type)) { if(strrchr(m_items[i].hdr->path, '/') != NULL) @@ -2745,7 +2752,13 @@ CCoverFlow::CLRet CCoverFlow::_loadCoverTex(u32 i, bool box, bool hq, bool blank } else gamePath = m_items[i].hdr->id; - FILE *fp = fopen(fmt("%s/%s.wfc", m_cachePath.c_str(), gamePath), "rb"); + + FILE *fp = NULL; + if(gamePath != NULL) + { + const char *path = fmt("%s/%s.wfc", m_cachePath.c_str(), gamePath); + fp = fopen(path, "rb"); + } if(fp != NULL) { bool success = false; diff --git a/source/gui/coverflow.hpp b/source/gui/coverflow.hpp index 4c0afb36..c31ff812 100644 --- a/source/gui/coverflow.hpp +++ b/source/gui/coverflow.hpp @@ -44,7 +44,7 @@ public: void clear(void); void shutdown(void); void reserve(u32 capacity); - void addItem(dir_discHdr *hdr, const char *picPath, const char *boxPicPath, const char *blankBoxPicPath, int playcount = 0, unsigned int lastPlayed = 0); + void addItem(dir_discHdr *hdr, int playcount = 0, unsigned int lastPlayed = 0); bool empty(void) const { return m_items.empty(); } // bool start(); @@ -194,12 +194,8 @@ private: enum TexState { STATE_Loading, STATE_Ready, STATE_NoCover }; struct CItem { - CItem(dir_discHdr *itemHdr, const char *itemPic, const char *itemBoxPic, - const char *itemBlankBoxPic, int playcount, unsigned int lastPlayed); + CItem(dir_discHdr *itemHdr, int playcount, unsigned int lastPlayed); dir_discHdr *hdr; - char picPath[128]; - char boxPicPath[128]; - char blankBoxPicPath[64]; int playcount; unsigned int lastPlayed; TexData texture; diff --git a/source/menu/menu.cpp b/source/menu/menu.cpp index 49a1cd45..2cf19fc6 100644 --- a/source/menu/menu.cpp +++ b/source/menu/menu.cpp @@ -1649,35 +1649,32 @@ void CMenu::_initCF(void) for(vector::iterator element = m_gameList.begin(); element != m_gameList.end(); ++element) { string id; - string tempname = element->path; + char tmp_id[256]; u64 chantitle = TITLE_ID(element->settings[0],element->settings[1]); if(element->type == TYPE_HOMEBREW) - { - tempname.assign(&tempname[tempname.find_last_of('/') + 1]); - id = tempname; - } + id = strrchr(element->path, '/') + 1; else if(element->type == TYPE_PLUGIN) { - if(tempname.find(':') != string::npos) + if(strchr(element->path, ':') != NULL) { - if(tempname.empty() || tempname.find_first_of('/') == string::npos) + if(strchr(element->path, '/') == NULL) continue; - tempname.erase(0, tempname.find_first_of('/')+1); - string dirName = tempname.substr(0, tempname.find_first_of('/')+1); - if (tempname.find_first_of('/') == string::npos) - { + memset(tmp_id, 0, 256); + strncpy(tmp_id, strchr(element->path, '/') + 1, 255); + if(strchr(tmp_id, '/') == NULL) continue; - } - tempname.assign(&tempname[tempname.find_last_of('/') + 1]); - if(tempname.find_last_of('.') == string::npos) - { + /* first subpath */ + *(strchr(tmp_id, '/') + 1) = '\0'; + id.append(tmp_id); + /* filename */ + strncpy(tmp_id, strrchr(element->path, '/') + 1, 255); + if(strchr(tmp_id, '.') == NULL) continue; - } - tempname.erase(tempname.find_last_of('.'), tempname.size() - tempname.find_last_of('.')); - id = dirName+tempname; + *strchr(tmp_id, '.') = '\0'; + id.append(tmp_id); } else - id = tempname; + id = element->path; } else { @@ -1857,66 +1854,25 @@ void CMenu::_initCF(void) if(dumpGameLst) dump.setWString(domain, id, element->title); - const char *blankCoverKey = NULL; - switch(element->type) + if(element->type == TYPE_PLUGIN && EnabledPlugins.size() > 0) { - case TYPE_CHANNEL: - blankCoverKey = "channels"; - break; - case TYPE_HOMEBREW: - blankCoverKey = "homebrew"; - break; - case TYPE_GC_GAME: - blankCoverKey = "gamecube"; - break; - case TYPE_PLUGIN: - char PluginMagicWord[9]; - memset(PluginMagicWord, 0, sizeof(PluginMagicWord)); - strncpy(PluginMagicWord, fmt("%08x", element->settings[0]), 8); - blankCoverKey = PluginMagicWord; - break; - default: - blankCoverKey = "wii"; - } - const string &blankCoverName = m_theme.getString("BLANK_COVERS", blankCoverKey, fmt("%s.jpg", blankCoverKey)); - if(element->type == TYPE_PLUGIN) - { - string tempname(element->path); - if(tempname.find_last_of("/") != string::npos) - tempname.assign(&tempname[tempname.find_last_of("/") + 1]); - string coverFolder(m_plugin.GetCoverFolderName(element->settings[0])); - if(EnabledPlugins.size() == 0) //all plugins + for(u8 j = 0; j < EnabledPlugins.size(); j++) { - if(coverFolder.size() > 0) - CoverFlow.addItem(&(*element), fmt("%s/%s/%s.png", m_picDir.c_str(), coverFolder.c_str(), tempname.c_str()), fmt("%s/%s/%s.png", m_boxPicDir.c_str(), coverFolder.c_str(), tempname.c_str()), fmt("%s/%s", m_boxPicDir.c_str(), blankCoverName.c_str()), playcount, lastPlayed); - else - CoverFlow.addItem(&(*element), fmt("%s/%s.png", m_picDir.c_str(), tempname.c_str()), fmt("%s/%s.png", m_boxPicDir.c_str(), tempname.c_str()), fmt("%s/%s", m_boxPicDir.c_str(), blankCoverName.c_str()), playcount, lastPlayed); - } - else - { - for(u8 j = 0; j < EnabledPlugins.size(); j++) + if(EnabledPlugins.at(j) == true && element->settings[0] == m_plugin.getPluginMagic(j)) { - if(EnabledPlugins.at(j) == true && element->settings[0] == m_plugin.getPluginMagic(j)) - { - if(coverFolder.size() > 0) - CoverFlow.addItem(&(*element), fmt("%s/%s/%s.png", m_picDir.c_str(), coverFolder.c_str(), tempname.c_str()), fmt("%s/%s/%s.png", m_boxPicDir.c_str(), coverFolder.c_str(), tempname.c_str()), fmt("%s/%s", m_boxPicDir.c_str(), blankCoverName.c_str()), playcount, lastPlayed); - else - CoverFlow.addItem(&(*element), fmt("%s/%s.png", m_picDir.c_str(), tempname.c_str()), fmt("%s/%s.png", m_boxPicDir.c_str(), tempname.c_str()), fmt("%s/%s", m_boxPicDir.c_str(), blankCoverName.c_str()), playcount, lastPlayed); - break; - } + CoverFlow.addItem(&(*element), playcount, lastPlayed); + break; } } } - else if(element->type == TYPE_HOMEBREW) - CoverFlow.addItem(&(*element), fmt("%s/icon.png", element->path), fmt("%s/%s.png", m_boxPicDir.c_str(), id.c_str()), fmt("%s/%s", m_boxPicDir.c_str(), blankCoverName.c_str()), playcount, lastPlayed); else - CoverFlow.addItem(&(*element), fmt("%s/%s.png", m_picDir.c_str(), element->id), fmt("%s/%s.png", m_boxPicDir.c_str(), element->id), fmt("%s/%s", m_boxPicDir.c_str(), blankCoverName.c_str()), playcount, lastPlayed); + CoverFlow.addItem(&(*element), playcount, lastPlayed); } } if(gametdb.IsLoaded()) gametdb.CloseFile(); m_gcfg1.unload(); - if (dumpGameLst) + if (dumpGameLst) { dump.save(true); m_cfg.setBool(domain, "dump_list", false); @@ -2288,7 +2244,7 @@ bool CMenu::_loadList(void) if(sources > 1) m_current_view = COVERFLOW_MAX; - gprintf("Games found: %i\n", m_gameList.size()); + gprintf("Games found: %i\n", m_gameList.size()); return m_gameList.size() > 0 ? true : false; } @@ -2592,7 +2548,15 @@ const char *CMenu::_getId() id = tmp; } else - id = CoverFlow.getId(); + { + id = hdr->id; + if(hdr->type == TYPE_GC_GAME && hdr->settings[0] == 1) /* disc 2 */ + { + tmp[0] = '\0'; + strcat(tmp, fmt("%.6s_2", hdr->id)); + id = tmp; + } + } return id; } @@ -2694,3 +2658,65 @@ void CMenu::TempLoadIOS(int IOS) _netInit(); } } + +const char *CMenu::getBlankCoverPath(const dir_discHdr *element) +{ + const char *blankCoverKey = NULL; + switch(element->type) + { + case TYPE_CHANNEL: + blankCoverKey = "channels"; + break; + case TYPE_HOMEBREW: + blankCoverKey = "homebrew"; + break; + case TYPE_GC_GAME: + blankCoverKey = "gamecube"; + break; + case TYPE_PLUGIN: + char PluginMagicWord[9]; + memset(PluginMagicWord, 0, sizeof(PluginMagicWord)); + strncpy(PluginMagicWord, fmt("%08x", element->settings[0]), 8); + blankCoverKey = PluginMagicWord; + break; + default: + blankCoverKey = "wii"; + } + return m_theme.getString("BLANK_COVERS", blankCoverKey, fmt("%s.jpg", blankCoverKey)).c_str(); +} + +const char *CMenu::getBoxPath(const dir_discHdr *element) +{ + if(element->type == TYPE_PLUGIN) + { + const char *tempname = element->path; + if(strchr(element->path, '/') != NULL) + tempname = strrchr(element->path, '/') + 1; + const char *coverFolder = m_plugin.GetCoverFolderName(element->settings[0]); + if(strlen(coverFolder) > 0) + return fmt("%s/%s/%s.png", m_boxPicDir.c_str(), coverFolder, tempname); + else + return fmt("%s/%s.png", m_boxPicDir.c_str(), tempname); + } + else if(element->type == TYPE_HOMEBREW) + return fmt("%s/%s.png", m_boxPicDir.c_str(), strrchr(element->path, '/') + 1); + return fmt("%s/%s.png", m_boxPicDir.c_str(), element->id); +} + +const char *CMenu::getFrontPath(const dir_discHdr *element) +{ + if(element->type == TYPE_PLUGIN) + { + const char *tempname = element->path; + if(strchr(element->path, '/') != NULL) + tempname = strrchr(element->path, '/') + 1; + const char *coverFolder = m_plugin.GetCoverFolderName(element->settings[0]); + if(strlen(coverFolder) > 0) + return fmt("%s/%s/%s.png", m_picDir.c_str(), coverFolder, tempname); + else + return fmt("%s/%s.png", m_picDir.c_str(), tempname); + } + else if(element->type == TYPE_HOMEBREW) + return fmt("%s/icon.png", element->path); + return fmt("%s/%s.png", m_picDir.c_str(), element->id); +} diff --git a/source/menu/menu.hpp b/source/menu/menu.hpp index 81d9dace..2548644c 100644 --- a/source/menu/menu.hpp +++ b/source/menu/menu.hpp @@ -42,6 +42,11 @@ public: void cleanup(void); void loadDefaultFont(void); void TempLoadIOS(int IOS = 0); + + const char *getBoxPath(const dir_discHdr *element); + const char *getFrontPath(const dir_discHdr *element); + const char *getBlankCoverPath(const dir_discHdr *element); + u8 m_current_view; int m_last_view; u8 enabledPluginPos; @@ -1107,6 +1112,8 @@ private: static const u32 SVN_REV_NUM; }; +extern CMenu mainMenu; + #define ARRAY_SIZE(a) (sizeof a / sizeof a[0]) #endif // !defined(__MENU_HPP) diff --git a/source/menu/menu_categories.cpp b/source/menu/menu_categories.cpp index cab8f20b..38d0dff1 100644 --- a/source/menu/menu_categories.cpp +++ b/source/menu/menu_categories.cpp @@ -270,7 +270,7 @@ void CMenu::_CategorySettings(bool fromGameSet) _hideCategorySettings(); CoverFlow.left(); curPage = 1; - m_categories.assign(m_max_categories, '0'); + m_categories.assign(m_max_categories, '0'); _getIDCats(); _showCategorySettings(); } diff --git a/source/menu/menu_config4.cpp b/source/menu/menu_config4.cpp index 1a5b578b..4d5bbf6c 100644 --- a/source/menu/menu_config4.cpp +++ b/source/menu/menu_config4.cpp @@ -61,7 +61,7 @@ void CMenu::_showConfig4(void) for(u32 i = 0; i < ARRAY_SIZE(m_config4LblUser); ++i) if(m_config4LblUser[i] != -1) m_btnMgr.show(m_config4LblUser[i]); - + int i; i = min(max(0, m_cfg.getInt("GENERAL", "exit_to", 0)), (int)ARRAY_SIZE(CMenu::_exitTo) - 1); m_btnMgr.setText(m_config4BtnHome, _t(CMenu::_exitTo[i].id, CMenu::_exitTo[i].text));