-added ability to cache covers. just select your source then go to home menu and click cache covers. it will go thru your current game list and convert the covers to wfc cache files. needed mainly for if you add a bunch of roms and cover pngs for a plugin. or if you for some reason need to remake the wfc files for all your wii or gc games. note using wiimpathy's wfc conv 0.1 on your pc is still a faster option.

This commit is contained in:
fledge68 2018-06-12 21:27:52 +00:00
parent db38a8b9ab
commit 6782d87f3a
7 changed files with 151 additions and 34 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 MiB

After

Width:  |  Height:  |  Size: 3.3 MiB

View File

@ -2570,6 +2570,40 @@ public:
} }
}; };
bool CCoverFlow::cacheCover(const char *wfcPath, const char *coverPath, bool full)
{
if(m_cachePath.empty())
{
return false;
}
TexData tex;
u8 textureFmt = m_compressTextures ? GX_TF_CMPR : GX_TF_RGB565;
if(TexHandle.fromImageFile(tex, coverPath, textureFmt, 32) != TE_OK)
{
return false;
}
u32 bufSize = fixGX_GetTexBufferSize(tex.width, tex.height, tex.format, tex.maxLOD > 0 ? GX_TRUE : GX_FALSE, tex.maxLOD);
uLongf zBufferSize = m_compressCache ? bufSize + bufSize / 100 + 12 : bufSize;
u8 *zBuffer = m_compressCache ? (u8*)MEM2_alloc(zBufferSize) : tex.data;
if(zBuffer != NULL && (!m_compressCache || compress(zBuffer, &zBufferSize, tex.data, bufSize) == Z_OK))
{
FILE *file = fopen(wfcPath, "wb");
if(file != NULL)
{
SWFCHeader header(tex, full, m_compressCache);
fwrite(&header, 1, sizeof(header), file);
fwrite(zBuffer, 1, zBufferSize, file);
fclose(file);
}
}
TexHandle.Cleanup(tex);
if(zBuffer != NULL && m_compressCache)
MEM2_free(zBuffer);
return true;
}
bool CCoverFlow::preCacheCover(const char *id, const u8 *png, bool full) bool CCoverFlow::preCacheCover(const char *id, const u8 *png, bool full)
{ {
if(m_cachePath.empty()) if(m_cachePath.empty())
@ -2600,11 +2634,11 @@ bool CCoverFlow::preCacheCover(const char *id, const u8 *png, bool full)
return true; return true;
} }
bool CCoverFlow::fullCoverCached(const char *id) bool CCoverFlow::fullCoverCached(const char *wfcPath)
{ {
bool found = false; bool found = false;
FILE *file = fopen(fmt("%s/%s.wfc", m_cachePath.c_str(), id), "rb"); FILE *file = fopen(wfcPath, "rb");
if(file != NULL) if(file != NULL)
{ {
SWFCHeader header; SWFCHeader header;

View File

@ -125,8 +125,9 @@ public:
// //
void applySettings(void); void applySettings(void);
void setCachePath(const char *path, bool deleteSource, bool compress, bool pluginCacheFolders); void setCachePath(const char *path, bool deleteSource, bool compress, bool pluginCacheFolders);
bool fullCoverCached(const char *id); bool fullCoverCached(const char *wfcPath);
bool preCacheCover(const char *id, const u8 *png, bool full); bool preCacheCover(const char *id, const u8 *png, bool full);
bool cacheCover(const char *wfcPath, const char *coverPath, bool full);
// //
const char *getId(void) const; const char *getId(void) const;
const char *getNextId(void) const; const char *getNextId(void) const;

View File

@ -1063,6 +1063,7 @@ private:
void _gameinfo(void); void _gameinfo(void);
void _gameSettings(const dir_discHdr *GameHdr, bool disc = false); void _gameSettings(const dir_discHdr *GameHdr, bool disc = false);
void _CoverBanner(void); void _CoverBanner(void);
int _cacheCovers(void);
void _Explorer(void); void _Explorer(void);
const char *_FolderExplorer(const char *startPath); const char *_FolderExplorer(const char *startPath);
void _wadExplorer(void); void _wadExplorer(void);

View File

@ -1385,7 +1385,7 @@ int CMenu::_coverDownloader(bool download_all)
update_pThread(1); update_pThread(1);
m_thrdMessage = wfmt(_fmt("dlmsg10", L"Making %s"), sfmt("%s.wfc", coverID.c_str())); m_thrdMessage = wfmt(_fmt("dlmsg10", L"Making %s"), sfmt("%s.wfc", coverID.c_str()));
m_thrdMessageAdded = true; m_thrdMessageAdded = true;
CoverFlow.preCacheCover(coverID.c_str(), download.data, true);//it may fail CoverFlow.preCacheCover(coverID.c_str(), download.data, false);//it may fail
++countFlat; ++countFlat;
update_pThread(1); update_pThread(1);
@ -1524,7 +1524,7 @@ int CMenu::_coverDownloader(bool download_all)
update_pThread(1); update_pThread(1);
m_thrdMessage = wfmt(_fmt("dlmsg10", L"Making %s"), sfmt("%s.wfc", coverID.c_str())); m_thrdMessage = wfmt(_fmt("dlmsg10", L"Making %s"), sfmt("%s.wfc", coverID.c_str()));
m_thrdMessageAdded = true; m_thrdMessageAdded = true;
CoverFlow.preCacheCover(coverID.c_str(), download.data, true);//it may fail CoverFlow.preCacheCover(coverID.c_str(), download.data, false);//it may fail
++countFlat; ++countFlat;
update_pThread(1); update_pThread(1);

View File

@ -19,13 +19,13 @@
#include "loader/nk.h" #include "loader/nk.h"
#include "const_str.hpp" #include "const_str.hpp"
/* home menu */
s16 m_homeLblTitle; s16 m_homeLblTitle;
s16 m_exittoLblTitle; s16 m_homeLblUser[4];
s16 m_exittoLblUser[4];
s16 m_homeBtnSettings; s16 m_homeBtnSettings;
s16 m_homeBtnReloadCache; s16 m_homeBtnReloadCache;
//s16 m_homeBtnUpdate; s16 m_homeBtnUpdate;
s16 m_homeBtnExplorer; s16 m_homeBtnExplorer;
s16 m_homeBtnInstall; s16 m_homeBtnInstall;
@ -33,15 +33,17 @@ s16 m_homeBtnAbout;
s16 m_homeBtnExitTo; s16 m_homeBtnExitTo;
s16 m_homeBtnSelPlugin; s16 m_homeBtnSelPlugin;
s16 m_homeLblBattery;
/* exit to menu */
s16 m_exittoLblTitle;
s16 m_exittoLblUser[4];
s16 m_homeBtnExitToHBC; s16 m_homeBtnExitToHBC;
s16 m_homeBtnExitToMenu; s16 m_homeBtnExitToMenu;
s16 m_homeBtnExitToPriiloader; s16 m_homeBtnExitToPriiloader;
s16 m_homeBtnExitToBootmii; s16 m_homeBtnExitToBootmii;
s16 m_homeBtnExitToNeek; s16 m_homeBtnExitToNeek;
s16 m_homeLblBattery;
s16 m_homeLblUser[4];
TexData m_homeBg; TexData m_homeBg;
bool CMenu::_Home(void) bool CMenu::_Home(void)
@ -89,20 +91,32 @@ bool CMenu::_Home(void)
m_refreshGameList = true; m_refreshGameList = true;
break; break;
} }
/*else if(m_btnMgr.selected(m_homeBtnUpdate) && !m_locked) else if(m_btnMgr.selected(m_homeBtnUpdate))
{ {
CoverFlow.stopCoverLoader(true); m_btnMgr.setProgress(m_wbfsPBar, 0.f, true);
_hideHome(); m_btnMgr.setText(m_wbfsLblMessage, L"0%");
_system(); m_btnMgr.setText(m_wbfsLblDialog, L"");
remove(m_ver.c_str()); m_btnMgr.show(m_wbfsPBar);
if(m_exit) m_btnMgr.show(m_wbfsLblMessage);
_launchHomebrew(m_dol.c_str(), m_homebrewArgs); m_btnMgr.show(m_wbfsLblDialog);
else
_start_pThread();
_cacheCovers();
_stop_pThread();
m_btnMgr.setText(m_wbfsLblDialog, _t("dlmsg14", L"Done."));
while(!m_exit)
{ {
_showHome(); _mainLoopCommon();
CoverFlow.startCoverLoader(); if(BTN_HOME_PRESSED || BTN_B_PRESSED)
{
m_btnMgr.hide(m_wbfsPBar);
m_btnMgr.hide(m_wbfsLblMessage);
m_btnMgr.hide(m_wbfsLblDialog);
break;
}
} }
}*/ _showHome();
}
else if(m_btnMgr.selected(m_homeBtnInstall)) else if(m_btnMgr.selected(m_homeBtnInstall))
{ {
_hideHome(); _hideHome();
@ -226,7 +240,7 @@ void CMenu::_showHome(void)
m_btnMgr.show(m_homeBtnSettings); m_btnMgr.show(m_homeBtnSettings);
m_btnMgr.show(m_homeBtnReloadCache); m_btnMgr.show(m_homeBtnReloadCache);
//m_btnMgr.show(m_homeBtnUpdate); m_btnMgr.show(m_homeBtnUpdate);
m_btnMgr.show(m_homeBtnExplorer); m_btnMgr.show(m_homeBtnExplorer);
m_btnMgr.show(m_homeBtnInstall); m_btnMgr.show(m_homeBtnInstall);
@ -264,7 +278,7 @@ void CMenu::_hideHome(bool instant)
m_btnMgr.hide(m_homeBtnSettings, instant); m_btnMgr.hide(m_homeBtnSettings, instant);
m_btnMgr.hide(m_homeBtnReloadCache, instant); m_btnMgr.hide(m_homeBtnReloadCache, instant);
//m_btnMgr.hide(m_homeBtnUpdate, instant); m_btnMgr.hide(m_homeBtnUpdate, instant);
m_btnMgr.hide(m_homeBtnExplorer, instant); m_btnMgr.hide(m_homeBtnExplorer, instant);
m_btnMgr.hide(m_homeBtnInstall, instant); m_btnMgr.hide(m_homeBtnInstall, instant);
@ -296,13 +310,11 @@ void CMenu::_hideExitTo(bool instant)
void CMenu::_initHomeAndExitToMenu() void CMenu::_initHomeAndExitToMenu()
{ {
_addUserLabels(m_homeLblUser, ARRAY_SIZE(m_homeLblUser), "HOME");
//Home Menu
m_homeBg = _texture("HOME/BG", "texture", theme.bg, false); m_homeBg = _texture("HOME/BG", "texture", theme.bg, false);
//Home Menu
_addUserLabels(m_homeLblUser, ARRAY_SIZE(m_homeLblUser), "HOME");
m_homeLblTitle = _addTitle("HOME/TITLE", theme.titleFont, L"", 0, 10, 640, 60, theme.titleFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE); m_homeLblTitle = _addTitle("HOME/TITLE", theme.titleFont, L"", 0, 10, 640, 60, theme.titleFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE);
_setHideAnim(m_homeLblTitle, "HOME/TITLE", 0, 0, -2.f, 0.f);
m_homeBtnSettings = _addButton("HOME/SETTINGS", theme.btnFont, L"", 60, 100, 250, 48, theme.btnFontColor); m_homeBtnSettings = _addButton("HOME/SETTINGS", theme.btnFont, L"", 60, 100, 250, 48, theme.btnFontColor);
m_homeBtnReloadCache = _addButton("HOME/RELOAD_CACHE", theme.btnFont, L"", 60, 180, 250, 48, theme.btnFontColor); m_homeBtnReloadCache = _addButton("HOME/RELOAD_CACHE", theme.btnFont, L"", 60, 180, 250, 48, theme.btnFontColor);
@ -312,10 +324,12 @@ void CMenu::_initHomeAndExitToMenu()
m_homeBtnAbout = _addButton("HOME/ABOUT", theme.btnFont, L"", 330, 100, 250, 48, theme.btnFontColor); m_homeBtnAbout = _addButton("HOME/ABOUT", theme.btnFont, L"", 330, 100, 250, 48, theme.btnFontColor);
m_homeBtnInstall = _addButton("HOME/INSTALL", theme.btnFont, L"", 330, 180, 250, 48, theme.btnFontColor); m_homeBtnInstall = _addButton("HOME/INSTALL", theme.btnFont, L"", 330, 180, 250, 48, theme.btnFontColor);
m_homeBtnExitTo = _addButton("HOME/EXIT_TO", theme.btnFont, L"", 330, 260, 250, 48, theme.btnFontColor); m_homeBtnExitTo = _addButton("HOME/EXIT_TO", theme.btnFont, L"", 330, 260, 250, 48, theme.btnFontColor);
//m_homeBtnUpdate = _addButton("HOME/UPDATE", theme.btnFont, L"", 330, 340, 250, 48, theme.btnFontColor); m_homeBtnUpdate = _addButton("HOME/UPDATE", theme.btnFont, L"", 330, 340, 250, 48, theme.btnFontColor);
m_homeLblBattery = _addLabel("HOME/BATTERY", theme.btnFont, L"", 0, 420, 640, 48, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC); m_homeLblBattery = _addLabel("HOME/BATTERY", theme.btnFont, L"", 0, 420, 640, 48, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC);
_setHideAnim(m_homeLblTitle, "HOME/TITLE", 0, 0, -2.f, 0.f);
_setHideAnim(m_homeBtnSettings, "HOME/SETTINGS", 50, 0, 1.f, 0.f); _setHideAnim(m_homeBtnSettings, "HOME/SETTINGS", 50, 0, 1.f, 0.f);
_setHideAnim(m_homeBtnReloadCache, "HOME/RELOAD_CACHE", 50, 0, 1.f, 0.f); _setHideAnim(m_homeBtnReloadCache, "HOME/RELOAD_CACHE", 50, 0, 1.f, 0.f);
_setHideAnim(m_homeBtnSelPlugin, "HOME/FTP", 50, 0, 1.f, 0.f); _setHideAnim(m_homeBtnSelPlugin, "HOME/FTP", 50, 0, 1.f, 0.f);
@ -324,7 +338,7 @@ void CMenu::_initHomeAndExitToMenu()
_setHideAnim(m_homeBtnInstall, "HOME/INSTALL", -50, 0, 1.f, 0.f); _setHideAnim(m_homeBtnInstall, "HOME/INSTALL", -50, 0, 1.f, 0.f);
_setHideAnim(m_homeBtnAbout, "HOME/ABOUT", -50, 0, 1.f, 0.f); _setHideAnim(m_homeBtnAbout, "HOME/ABOUT", -50, 0, 1.f, 0.f);
_setHideAnim(m_homeBtnExitTo, "HOME/EXIT_TO", -50, 0, 1.f, 0.f); _setHideAnim(m_homeBtnExitTo, "HOME/EXIT_TO", -50, 0, 1.f, 0.f);
//_setHideAnim(m_homeBtnUpdate, "HOME/UPDATE", -50, 0, 1.f, 0.f); _setHideAnim(m_homeBtnUpdate, "HOME/UPDATE", -50, 0, 1.f, 0.f);
_setHideAnim(m_homeLblBattery, "HOME/BATTERY", 0, 0, -2.f, 0.f); _setHideAnim(m_homeLblBattery, "HOME/BATTERY", 0, 0, -2.f, 0.f);
@ -335,14 +349,14 @@ void CMenu::_initHomeAndExitToMenu()
_addUserLabels(m_exittoLblUser, ARRAY_SIZE(m_exittoLblUser), "EXIT_TO"); _addUserLabels(m_exittoLblUser, ARRAY_SIZE(m_exittoLblUser), "EXIT_TO");
m_exittoLblTitle = _addTitle("EXIT_TO/TITLE", theme.titleFont, L"", 0, 10, 640, 60, theme.titleFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE); m_exittoLblTitle = _addTitle("EXIT_TO/TITLE", theme.titleFont, L"", 0, 10, 640, 60, theme.titleFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE);
_setHideAnim(m_exittoLblTitle, "EXIT_TO/TITLE", 0, 0, -2.f, 0.f);
m_homeBtnExitToHBC = _addButton("EXIT_TO/HBC", theme.btnFont, L"", 185, 120, 270, 48, theme.btnFontColor); m_homeBtnExitToHBC = _addButton("EXIT_TO/HBC", theme.btnFont, L"", 185, 120, 270, 48, theme.btnFontColor);
m_homeBtnExitToMenu = _addButton("EXIT_TO/MENU", theme.btnFont, L"", 185, 180, 270, 48, theme.btnFontColor); m_homeBtnExitToMenu = _addButton("EXIT_TO/MENU", theme.btnFont, L"", 185, 180, 270, 48, theme.btnFontColor);
m_homeBtnExitToNeek = _addButton("EXIT_TO/NEEK", theme.btnFont, L"", 185, 240, 270, 48, theme.btnFontColor); m_homeBtnExitToNeek = _addButton("EXIT_TO/NEEK", theme.btnFont, L"", 185, 240, 270, 48, theme.btnFontColor);
m_homeBtnExitToPriiloader = _addButton("EXIT_TO/PRIILOADER", theme.btnFont, L"", 185, 300, 270, 48, theme.btnFontColor); m_homeBtnExitToPriiloader = _addButton("EXIT_TO/PRIILOADER", theme.btnFont, L"", 185, 300, 270, 48, theme.btnFontColor);
m_homeBtnExitToBootmii = _addButton("EXIT_TO/BOOTMII", theme.btnFont, L"", 185, 360, 270, 48, theme.btnFontColor); m_homeBtnExitToBootmii = _addButton("EXIT_TO/BOOTMII", theme.btnFont, L"", 185, 360, 270, 48, theme.btnFontColor);
_setHideAnim(m_exittoLblTitle, "EXIT_TO/TITLE", 0, 0, -2.f, 0.f);
_setHideAnim(m_homeBtnExitToHBC, "EXIT_TO/HBC", 0, 0, -4.f, 0.f); _setHideAnim(m_homeBtnExitToHBC, "EXIT_TO/HBC", 0, 0, -4.f, 0.f);
_setHideAnim(m_homeBtnExitToMenu, "EXIT_TO/MENU", 0, 0, -4.f, 0.f); _setHideAnim(m_homeBtnExitToMenu, "EXIT_TO/MENU", 0, 0, -4.f, 0.f);
_setHideAnim(m_homeBtnExitToPriiloader, "EXIT_TO/PRIILOADER", 0, 0, -4.f, 0.f); _setHideAnim(m_homeBtnExitToPriiloader, "EXIT_TO/PRIILOADER", 0, 0, -4.f, 0.f);
@ -358,7 +372,7 @@ void CMenu::_textHome(void)
m_btnMgr.setText(m_homeLblTitle, VERSION_STRING); m_btnMgr.setText(m_homeLblTitle, VERSION_STRING);
m_btnMgr.setText(m_homeBtnSettings, _t("about10", L"Help Guide")); m_btnMgr.setText(m_homeBtnSettings, _t("about10", L"Help Guide"));
m_btnMgr.setText(m_homeBtnReloadCache, _t("home2", L"Reload Cache")); m_btnMgr.setText(m_homeBtnReloadCache, _t("home2", L"Reload Cache"));
//m_btnMgr.setText(m_homeBtnUpdate, _t("home3", L"Update")); m_btnMgr.setText(m_homeBtnUpdate, _t("home11", L"Cache Covers"));
m_btnMgr.setText(m_homeBtnExplorer, _t("home8", L"File Explorer")); m_btnMgr.setText(m_homeBtnExplorer, _t("home8", L"File Explorer"));
m_btnMgr.setText(m_homeBtnInstall, _t("home7", L"Install Game")); m_btnMgr.setText(m_homeBtnInstall, _t("home7", L"Install Game"));
@ -382,3 +396,68 @@ void CMenu::_textExitTo(void)
else else
m_btnMgr.setText(m_homeBtnExitToNeek, _t("real", L"Real Nand")); m_btnMgr.setText(m_homeBtnExitToNeek, _t("real", L"Real Nand"));
} }
/*******************************************************************************/
int CMenu::_cacheCovers()
{
CoverFlow.stopCoverLoader(true);
bool m_pluginCacheFolders = m_cfg.getBool(PLUGIN_DOMAIN, "subfolder_cache", true);
char coverPath[MAX_FAT_PATH];
char wfcPath[MAX_FAT_PATH+5];
char cachePath[MAX_FAT_PATH];
u32 total = m_gameList.size();
m_thrdTotal = total;
u32 index = 0;
for(vector<dir_discHdr>::iterator hdr = m_gameList.begin(); hdr != m_gameList.end(); ++hdr)
{
index++;
update_pThread(1);
m_thrdMessage = wfmt(_fmt("dlmsg31", L"converting cover %i of %i"), index, total);
m_thrdMessageAdded = true;
bool fullCover = true;
memset(&coverPath, 0, sizeof(coverPath));
memset(&wfcPath, 0, sizeof(wfcPath));
memset(&cachePath, 0, sizeof(cachePath));
/* get game name or ID */
const char *gameNameOrID = CoverFlow.getFilenameId(&(*hdr));
/* get cover png path */
strncpy(coverPath, getBoxPath(&(*hdr)), sizeof(coverPath));
if(!fsop_FileExist(coverPath))
{
fullCover = false;
strncpy(coverPath, getFrontPath(&(*hdr)), sizeof(coverPath));
if(!fsop_FileExist(coverPath))
continue;
}
/* get cover wfc path */
if(hdr->type == TYPE_PLUGIN && m_pluginCacheFolders)
{
snprintf(cachePath, sizeof(cachePath), "%s/%s", m_cacheDir.c_str(), m_plugin.GetCoverFolderName(hdr->settings[0]));
}
else
snprintf(cachePath, sizeof(cachePath), "%s", m_cacheDir.c_str());
snprintf(wfcPath, sizeof(wfcPath), "%s/%s.wfc", cachePath, gameNameOrID);
/* if wfc doesn't exist or is flat and have full cover */
if(!fsop_FileExist(wfcPath) || (!CoverFlow.fullCoverCached(wfcPath) && fullCover))
{
/* create cache subfolders if needed */
if(!fsop_FolderExist(cachePath))
fsop_MakeFolder(cachePath);
/* create cover texture */
CoverFlow.cacheCover(wfcPath, coverPath, fullCover);
}
}
CoverFlow.startCoverLoader();
return 0;
}

View File

@ -256,6 +256,7 @@ dlmsg28=Running FTP Server on %s:%u
dlmsg29=FTP Server is currently stopped. dlmsg29=FTP Server is currently stopped.
dlmsg3=Downloading %i/%i from %s dlmsg3=Downloading %i/%i from %s
dlmsg30=No covers missing. dlmsg30=No covers missing.
dlmsg31=converting cover %i of %i
dlmsg4=Saving %s dlmsg4=Saving %s
dlmsg5=%i/%i files downloaded dlmsg5=%i/%i files downloaded
dlmsg6=Canceling... dlmsg6=Canceling...
@ -323,6 +324,7 @@ home7=Install Game
home8=File Explorer home8=File Explorer
home9=Source Menu home9=Source Menu
home10=FTP Server home10=FTP Server
home11=Cache Covers
hooktype1=VBI hooktype1=VBI
hooktype2=KPAD Read hooktype2=KPAD Read
hooktype3=Joypad hooktype3=Joypad