From 5abd0f0a3a418d03dc30cd84ce29da53a1f9bf7e Mon Sep 17 00:00:00 2001 From: J-D-K Date: Thu, 2 Apr 2020 15:49:46 -0400 Subject: [PATCH] Use stdio instead of fstream, remove NAND backup options, remove kaboom guy(RIP brave warrior), skip keyboard in applet --- Makefile | 2 +- inc/data.h | 8 ++- inc/util.h | 6 -- romfs/img/icn/icnDefault.png | Bin 38643 -> 2896 bytes src/data.cpp | 78 +++++++++++++----------- src/file.cpp | 75 +++++++++++------------ src/main.cpp | 2 + src/ui.cpp | 3 +- src/ui/clsui.cpp | 113 ++--------------------------------- src/ui/fldrsel.cpp | 3 +- src/ui/miscui.cpp | 17 +++--- src/ui/ttlsel.cpp | 7 +-- src/ui/usrsel.cpp | 6 +- src/util.cpp | 55 +++++------------ 14 files changed, 125 insertions(+), 250 deletions(-) diff --git a/Makefile b/Makefile index 0d20f19..b60eae8 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ INCLUDES := inc EXEFS_SRC := exefs_src APP_TITLE := JKSV APP_AUTHOR := JK -APP_VERSION := 03.27.2020 +APP_VERSION := 04.02.2020 ROMFS := romfs #--------------------------------------------------------------------------------- diff --git a/inc/data.h b/inc/data.h index 7d7733a..819a888 100644 --- a/inc/data.h +++ b/inc/data.h @@ -16,6 +16,7 @@ namespace data void loadDataInfo(); void loadBlacklist(); void exit(); + bool isAppletMode(); //Class to help not load the same icons over and over class icn @@ -53,6 +54,7 @@ namespace data //Returns title + title without forbidden chars std::string getTitle() { return title;} std::string getTitleSafe() { return titleSafe; } + std::string getAuthor() { return author; } uint64_t getID() { return id; } FsSaveDataType getType(){ return (FsSaveDataType)info.save_data_type; } @@ -63,7 +65,7 @@ namespace data private: FsSaveDataInfo info; - std::string title, titleSafe; + std::string title, titleSafe, author; uint64_t id; }; @@ -113,8 +115,8 @@ namespace data extern titledata curData; extern user curUser; extern int selUser, selData; - - extern bool isSpcd; + extern std::string sysLang; + extern AppletType appletMode; } #endif // DATA_H diff --git a/inc/util.h b/inc/util.h index aaa1add..bde0a3a 100644 --- a/inc/util.h +++ b/inc/util.h @@ -24,9 +24,6 @@ namespace util //Returns 'JKSV/[title]/' std::string getTitleDir(data::user& u, data::titledata& t); - //Just returns string with '\n' inserted. - std::string getWrappedString(const std::string& s, const unsigned& sz, const unsigned& maxWidth); - //Copys dir list to a menu with 'D: ' + 'F: ' void copyDirListToMenu(fs::dirList& d, ui::menu& m); @@ -41,9 +38,6 @@ namespace util std::string generateAbbrev(data::titledata& dat); - //Loads default icon. - tex *loadDefaultIcon(); - //Creates a basic generic icon for stuff without one tex *createIconGeneric(const char *txt); diff --git a/romfs/img/icn/icnDefault.png b/romfs/img/icn/icnDefault.png index ee52d93cd125758de8b4514a05b81fd2969327db..72f6676a7de2ef43bbf9189c39e2daf7ad241d81 100644 GIT binary patch delta 8 Pcmeyomg$1nh5&8=6N&?r delta 36037 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�N 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 diff --git a/src/data.cpp b/src/data.cpp index 933c642..03bfd44 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -1,12 +1,10 @@ #include #include #include -#include #include #include #include #include -#include #include "data.h" #include "file.h" @@ -73,23 +71,25 @@ static tex *createDeviceIcon() namespace data { + //Current data titledata curData; user curUser; int selUser = 0, selData = 0; + + //Icon/User vectors std::vector icons; std::vector users; + bool forceMount = true; - bool isSpcd = false; + + //System language + std::string sysLang; + + //AppletType + AppletType appletMode; void loadDataInfo() { - //Check date - time_t raw; - time(&raw); - tm *locTime = localtime(&raw); - if(locTime->tm_mon == 3 && locTime->tm_mday == 1) - isSpcd = true; - //Clear titles + users just in case for(unsigned i = 0; i < users.size(); i++) users[i].titles.clear(); @@ -98,6 +98,14 @@ namespace data loadBlacklist(); + //Get system language and copy to std::string + uint64_t lang; + setGetSystemLanguage(&lang); + data::sysLang.assign((const char *)&lang); + + //Get applet type + appletMode = appletGetAppletType(); + FsSaveDataInfoReader saveIt; s64 total = 0; FsSaveDataInfo info; @@ -188,14 +196,16 @@ namespace data icons[i].deleteData(); } + bool isAppletMode() + { + return appletMode != AppletType_Application && appletMode != AppletType_SystemApplication; + } + void icn::load(const uint64_t& _id, const uint8_t *jpegData, const size_t& jpegSize) { titleID = _id; - if(isSpcd) - iconTex = util::loadDefaultIcon(); - else - iconTex = texLoadJPEGMem(jpegData, jpegSize); + iconTex = texLoadJPEGMem(jpegData, jpegSize); } void icn::load(const uint64_t& _id, const std::string& _png) @@ -248,6 +258,7 @@ namespace data { title.assign(ent->name); titleSafe.assign(util::safeString(title)); + author.assign(ent->author); if(titleSafe.empty()) { char tmp[18]; @@ -308,19 +319,14 @@ namespace data if(username.empty()) username = "Unknown"; userSafe = util::safeString(username); - if(!isSpcd) - { - uint32_t sz = 0; - accountProfileGetImageSize(&prof, &sz); - uint8_t *profJpeg = new uint8_t[sz]; + uint32_t sz = 0; + accountProfileGetImageSize(&prof, &sz); + uint8_t *profJpeg = new uint8_t[sz]; - accountProfileLoadImage(&prof, profJpeg, sz, &sz); - userIcon = texLoadJPEGMem(profJpeg, sz); + accountProfileLoadImage(&prof, profJpeg, sz, &sz); + userIcon = texLoadJPEGMem(profJpeg, sz); - delete[] profJpeg; - } - else - userIcon = util::loadDefaultIcon(); + delete[] profJpeg; accountProfileClose(&prof); @@ -336,7 +342,6 @@ namespace data //create generic icon userIcon = util::createIconGeneric(_backupName.c_str()); - //userIcon = texLoadPNGFile("romfs:/img/icn/icnDefault.png"); return true; } @@ -344,33 +349,34 @@ namespace data void loadBlacklist() { blacklist.clear(); + + char tmp[128]; if(fs::fileExists(fs::getWorkDir() + "blacklist.txt")) { - std::string line; - std::fstream bl(fs::getWorkDir() + "blacklist.txt", std::ios::in); + FILE *bl = fopen(std::string(fs::getWorkDir() + "blacklist.txt").c_str(), "r"); - while(std::getline(bl, line)) + while(fgets(tmp, 128, bl)) { - if(line[0] == '#' || line[0] == '\n') + if(tmp[0] == '#' || tmp[0] == '\n') continue; - blacklist.push_back(std::strtoull(line.c_str(), NULL, 16)); + blacklist.push_back(std::strtoull(tmp, NULL, 16)); } - bl.close(); + fclose(bl); } } void blacklistAdd(user& u, titledata& t) { - std::fstream bl(fs::getWorkDir() + "blacklist.txt", std::ios::app); + FILE *bl = fopen(std::string(fs::getWorkDir() + "blacklist.txt").c_str(), "a"); std::string titleLine = "#" + t.getTitle() + "\n"; char idLine[32]; sprintf(idLine, "0x%016lX\n", t.getID()); - bl.write(titleLine.c_str(), titleLine.length()); - bl.write(idLine, std::strlen(idLine)); - bl.close(); + fputs(titleLine.c_str(), bl); + fputs(idLine, bl); + fclose(bl); //Remove it from every user for(unsigned i = 0; i < users.size(); i++) diff --git a/src/file.cpp b/src/file.cpp index cce266d..9180aad 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -1,4 +1,3 @@ -#include #include #include #include @@ -187,29 +186,30 @@ namespace fs void copyFile(const std::string& from, const std::string& to) { - std::fstream f(from, std::ios::in | std::ios::binary); - std::fstream t(to, std::ios::out | std::ios::binary); + FILE *f = fopen(from.c_str(), "rb"); + FILE *t = fopen(to.c_str(), "wb"); - if(!f.is_open() || !t.is_open()) + if(f == NULL || t == NULL) { - f.close(); - t.close(); + //JIC + fclose(f); + fclose(t); return; } - f.seekg(0, f.end); - size_t fileSize = f.tellg(); - f.seekg(0, f.beg); + fseek(f, 0, SEEK_END); + size_t fileSize = ftell(f); + fseek(f, 0, SEEK_SET); uint8_t *buff = new uint8_t[BUFF_SIZE]; ui::progBar prog(fileSize); for(unsigned i = 0; i < fileSize; ) { - f.read((char *)buff, BUFF_SIZE); - t.write((char *)buff, f.gcount()); + size_t readCount = fread(buff, 1, BUFF_SIZE, f); + fwrite(buff, 1, readCount, t); - i += f.gcount(); + i += readCount; prog.update(i); gfxBeginFrame(); @@ -219,35 +219,35 @@ namespace fs delete[] buff; - f.close(); - t.close(); + fclose(f); + fclose(t); } void copyFileCommit(const std::string& from, const std::string& to, const std::string& dev) { - std::fstream f(from, std::ios::in | std::ios::binary); - std::fstream t(to, std::ios::out | std::ios::binary); + FILE *f = fopen(from.c_str(), "rb"); + FILE *t = fopen(to.c_str(), "wb"); - if(!f.is_open() || !t.is_open()) + if(f == NULL || t == NULL) { - f.close(); - t.close(); + fclose(f); + fclose(t); return; } - f.seekg(0, f.end); - size_t fileSize = f.tellg(); - f.seekg(0, f.beg); + fseek(f, 0, SEEK_END); + size_t fileSize = ftell(f); + fseek(f, 0, SEEK_SET); uint8_t *buff = new uint8_t[BUFF_SIZE]; ui::progBar prog(fileSize); for(unsigned i = 0; i < fileSize; ) { - f.read((char *)buff, BUFF_SIZE); - t.write((char *)buff, f.gcount()); + size_t readCount = fread(buff, 1, BUFF_SIZE, f); + fwrite(buff, 1, readCount, t); - i += f.gcount(); + i += readCount; prog.update(i); gfxBeginFrame(); @@ -257,8 +257,8 @@ namespace fs delete[] buff; - f.close(); - t.close(); + fclose(f); + fclose(t); if(R_FAILED(fsdevCommitDevice(dev.c_str()))) ui::showMessage("Error committing file to device!", "*ERROR*"); @@ -362,15 +362,16 @@ namespace fs std::string getFileProps(const std::string& _path) { std::string ret = ""; - std::fstream get(_path, std::ios::in | std::ios::binary); - if(get.is_open()) + + FILE *get = fopen(_path.c_str(), "rb"); + if(get != NULL) { //Size - get.seekg(0, get.end); - unsigned fileSize = get.tellg(); - get.seekg(0, get.beg); + fseek(get, 0, SEEK_END); + unsigned fileSize = ftell(get); + fseek(get, 0, SEEK_SET); - get.close(); + fclose(get); //Probably add more later @@ -405,10 +406,10 @@ namespace fs fileCount++; std::string filePath = _path + list.getItem(i); - std::fstream gSize(filePath.c_str(), std::ios::in | std::ios::binary); - gSize.seekg(0, gSize.end); - size_t fSize = gSize.tellg(); - gSize.close(); + FILE *gSize = fopen(filePath.c_str(), "rb"); + fseek(gSize, 0, SEEK_END); + size_t fSize = ftell(gSize); + fclose(gSize); totalSize += fSize; } diff --git a/src/main.cpp b/src/main.cpp index c300229..cfdff8b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,6 +18,7 @@ extern "C" hidInitialize(); nsInitialize(); setsysInitialize(); + setInitialize(); accountInitialize(AccountServiceType_System); } @@ -28,6 +29,7 @@ extern "C" hidExit(); nsExit(); setsysExit(); + setExit(); accountExit(); } } diff --git a/src/ui.cpp b/src/ui.cpp index fc406b8..75dd32d 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -11,7 +10,7 @@ #include "util.h" #include "file.h" -#define VER_STRING "v. 03.27.2020" +#define VER_STRING "v. 04.02.2020" //Nav buttons std::vector usrNav, ttlNav, fldNav; diff --git a/src/ui/clsui.cpp b/src/ui/clsui.cpp index bac6141..421f386 100644 --- a/src/ui/clsui.cpp +++ b/src/ui/clsui.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include @@ -102,7 +101,6 @@ namespace ui { util::makeTitleDir(data::curUser, data::curData); clsFolderPrep(data::curUser, data::curData); - folderMenuInfo = util::getInfoString(data::curUser, data::curData); mstate = CLS_FLD; } @@ -159,7 +157,7 @@ namespace ui { std::string folder; //Add back 3DS shortcut thing - if(held & KEY_R) + if(held & KEY_R || data::isAppletMode()) folder = data::curUser.getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_YMD); else if(held & KEY_L) folder = data::curUser.getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_YDM); @@ -266,8 +264,6 @@ namespace ui devMenu.addOpt("Bis: SAFE"); devMenu.addOpt("Bis: SYSTEM"); devMenu.addOpt("Bis: USER"); - devMenu.addOpt("NAND Backup (exFat)"); - devMenu.addOpt("NAND Backup (FAT32)"); devMenu.addOpt("Remove Downloaded Update"); devMenu.addOpt("Terminate Process ID"); devMenu.addOpt("Mount System Save ID"); @@ -333,107 +329,6 @@ namespace ui break; case 5: - { - fsdevUnmountDevice("sv"); - - FsStorage nand; - fsOpenBisStorage(&nand, FsBisPartitionId_UserDataRoot); - s64 nandSize = 0, offset = 0; - fsStorageGetSize(&nand, &nandSize); - - std::fstream nandOut("sdmc:/JKSV/nand.bin", std::ios::out | std::ios::binary); - - s64 nandBuffSize = 1024 * 1024 * 4; - uint8_t *nandBuff = new uint8_t[nandBuffSize]; - - progBar nandProg(nandSize); - - while(offset < nandSize) - { - size_t readLen = 0; - if(offset + nandBuffSize < nandSize) - readLen = nandBuffSize; - else - readLen = nandSize - offset; - - if(R_SUCCEEDED(fsStorageRead(&nand, offset, nandBuff, readLen))) - { - nandOut.write((char *)nandBuff, readLen); - offset += readLen; - } - else - { - ui::showMessage("Something went wrong while dumping your NAND.", "*ERROR*"); - break; - } - gfxBeginFrame(); - nandProg.update(offset); - nandProg.draw("", "Copying NAND"); - gfxEndFrame(); - } - - delete[] nandBuff; - nandOut.close(); - fsStorageClose(&nand); - } - break; - - case 6: - { - unsigned fcount = 1; - fsdevUnmountDevice("sv"); - - FsStorage nand; - fsOpenBisStorage(&nand, FsBisPartitionId_UserDataRoot); - s64 nandSize = 0, offset = 0; - fsStorageGetSize(&nand, &nandSize); - - std::fstream nandOut("sdmc:/JKSV/nand.bin.00", std::ios::out | std::ios::binary); - - s64 nandBuffSize = 1024 * 1024 * 3; - uint8_t *nandBuff = new uint8_t[nandBuffSize]; - - progBar nandProg(nandSize); - - while(offset < nandSize) - { - size_t readLen = 0; - if(offset + nandBuffSize < nandSize) - readLen = nandBuffSize; - else - readLen = nandSize - offset; - - if(R_SUCCEEDED(fsStorageRead(&nand, offset, nandBuff, readLen))) - { - if((size_t)nandOut.tellp() + readLen >= 0x100000000) - { - nandOut.close(); - char newPath[128]; - sprintf(newPath, "sdmc:/JKSV/nand.bin.%02d", fcount++); - nandOut.open(newPath, std::ios::out | std::ios::binary); - } - nandOut.write((char *)nandBuff, readLen); - offset += readLen; - } - else - { - ui::showMessage("Something went wrong while dumping your NAND.", "*ERROR*"); - break; - } - - gfxBeginFrame(); - nandProg.update(offset); - nandProg.draw("", "Copying NAND"); - gfxEndFrame(); - } - - delete[] nandBuff; - nandOut.close(); - fsStorageClose(&nand); - } - break; - - case 7: { fsdevUnmountDevice("sv"); fsOpenBisFileSystem(&sv, FsBisPartitionId_System, ""); @@ -456,7 +351,7 @@ namespace ui } break; - case 8: + case 6: { fsdevUnmountDevice("sv"); std::string idStr = util::getStringInput("0100000000000000", "Enter Process ID", 18, 0, NULL); @@ -471,7 +366,7 @@ namespace ui } break; - case 9: + case 7: { fsdevUnmountDevice("sv"); std::string idStr = util::getStringInput("8000000000000000", "Enter Sys Save ID", 18, 0, NULL); @@ -487,7 +382,7 @@ namespace ui } break; - case 10: + case 8: { fsdevUnmountDevice("sv"); FsFileSystem tromfs; diff --git a/src/ui/fldrsel.cpp b/src/ui/fldrsel.cpp index cebf5a8..f26d846 100644 --- a/src/ui/fldrsel.cpp +++ b/src/ui/fldrsel.cpp @@ -42,13 +42,14 @@ namespace ui data::curData.icon.draw(96, 98); drawTextWrap(folderMenuInfo.c_str(), frameBuffer, ui::shared, 64, 370, 18, ui::mnuTxt, 224); + if(down & KEY_A || fldNav[0].getEvent() == BUTTON_RELEASED || folderMenu.getTouchEvent() == MENU_DOUBLE_REL) { if(folderMenu.getSelected() == 0) { std::string folder; //Add back 3DS shortcut thing - if(held & KEY_R) + if(held & KEY_R || data::isAppletMode()) folder = data::curUser.getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_YMD); else if(held & KEY_L) folder = data::curUser.getUsernameSafe() + " - " + util::getDateTime(util::DATE_FMT_YDM); diff --git a/src/ui/miscui.cpp b/src/ui/miscui.cpp index e7738b4..4e81b66 100644 --- a/src/ui/miscui.cpp +++ b/src/ui/miscui.cpp @@ -8,7 +8,7 @@ static bool popDraw = false; static std::string popText; -static unsigned popY, popTextX, popState, frameCount, frameHold; +static unsigned popY, popX, popWidth, popState, frameCount, frameHold; enum popStates { @@ -20,8 +20,8 @@ enum popStates //8 static const std::string loadGlyphArray[] = { - "\ue020", "\ue021", "\ue022", "\ue023", "\ue024", - "\ue025", "\ue026", "\ue027" + "\ue020", "\ue021", "\ue022", "\ue023", + "\ue024", "\ue025", "\ue026", "\ue027" }; namespace ui @@ -266,7 +266,7 @@ namespace ui break; } - yes.setText(loadGlyphArray[loadFrame]); + yes.setText(std::string("(Hold) " + loadGlyphArray[loadFrame])); } else if((hold && heldDown) && (up & KEY_A || yes.getEvent() == BUTTON_RELEASED)) { @@ -364,7 +364,8 @@ namespace ui { frameCount = 0; frameHold = frames; - popTextX = 640 - (textGetWidth(mess.c_str(), ui::shared, 24) / 2); + popWidth = textGetWidth(mess.c_str(), ui::shared, 24) + 32; + popX = 640 - (popWidth / 2); popText = mess; popY = 721; @@ -380,7 +381,7 @@ namespace ui switch(popState) { case popRise: - if(popY > 559) + if(popY > 560) popY -= 24; else popState = popShow; @@ -399,7 +400,7 @@ namespace ui break; } - drawTextbox(60, popY, 1160, 64); - drawText(popText.c_str(), frameBuffer, ui::shared, popTextX, popY + 20, 24, ui::txtClr); + drawTextbox(popX, popY, popWidth, 64); + drawText(popText.c_str(), frameBuffer, ui::shared, popX + 16, popY + 20, 24, ui::txtClr); } } diff --git a/src/ui/ttlsel.cpp b/src/ui/ttlsel.cpp index d2fadf1..226a481 100644 --- a/src/ui/ttlsel.cpp +++ b/src/ui/ttlsel.cpp @@ -1,8 +1,6 @@ #include #include -#include - #include "ui.h" #include "uiupdate.h" #include "file.h" @@ -91,7 +89,6 @@ namespace ui { util::makeTitleDir(data::curUser, data::curData); folderMenuPrepare(data::curUser, data::curData); - folderMenuInfo = util::getInfoString(data::curUser, data::curData); mstate = FLD_SEL; } @@ -176,7 +173,9 @@ namespace ui { util::makeTitleDir(data::curUser, data::curData); folderMenuPrepare(data::curUser, data::curData); - folderMenuInfo = util::getInfoString(data::curUser, data::curData); + + //Wanna change this sometime + ui::folderMenuInfo = util::getInfoString(data::curUser, data::curData); mstate = FLD_SEL; } diff --git a/src/ui/usrsel.cpp b/src/ui/usrsel.cpp index 06d0bf9..8564b46 100644 --- a/src/ui/usrsel.cpp +++ b/src/ui/usrsel.cpp @@ -1,5 +1,4 @@ #include -#include #include #include @@ -143,9 +142,8 @@ namespace ui } else if(down & KEY_X || usrNav[2].getEvent() == BUTTON_RELEASED) { - //Just create file so user doesn't have to constantly enable - std::fstream cls(fs::getWorkDir() + "cls.txt", std::ios::out); - cls.close(); + FILE *cls = fopen(std::string(fs::getWorkDir() + "cls.txt").c_str(), "w"); + fclose(cls); clsUserPrep(); mstate = CLS_USR; clsMode = true; diff --git a/src/util.cpp b/src/util.cpp index 941fa7a..de4427e 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include @@ -10,7 +9,18 @@ #include "file.h" #include "ui.h" -static const char verboten[] = { ',', '/', '\\', '<', '>', ':', '"', '|', '?', '*'}; +static const char verboten[] = { ',', '/', '\\', '<', '>', ':', '"', '|', '?', '*', '™', '©', '®'}; + +static bool isVerboten(uint32_t t) +{ + for(unsigned i = 0; i < 13; i++) + { + if(t == verboten[i]) + return true; + } + + return false; +} //Missing swkbd config funcs for now typedef enum @@ -40,7 +50,7 @@ void swkbdDictWordCreate(dictWord *w, const char *read, const char *word) memcpy(w->word, tmp, 0x30); } -uint32_t replaceIfAccent(uint32_t c) +uint32_t replaceChar(uint32_t c) { switch(c) { @@ -113,17 +123,6 @@ namespace util _path.erase(last + 1, _path.length()); } - bool isVerboten(uint32_t t) - { - for(unsigned i = 0; i < 10; i++) - { - if(t == verboten[i]) - return true; - } - - return false; - } - std::string safeString(const std::string& s) { std::string ret = ""; @@ -134,12 +133,10 @@ namespace util i += untCnt; - tmpChr = replaceIfAccent(tmpChr); + tmpChr = replaceChar(tmpChr); if(isVerboten(tmpChr)) - { ret += ' '; - } else if(tmpChr < 31 || tmpChr > 126) return ""; //return empty string so titledata::init defaults to titleID else @@ -147,8 +144,8 @@ namespace util } //Check for spaces at end - if(ret[ret.length() - 1] == ' ') - ret.erase(ret.end() - 1, ret.end()); + while(ret[ret.length() - 1] == ' ') + ret.erase(ret.length() - 1, 1); return ret; } @@ -247,26 +244,6 @@ namespace util return ret; } - tex *loadDefaultIcon() - { - tex *ret; - - std::fstream iconIn("romfs:/img/icn/icnDefault.png", std::ios::in | std::ios::binary); - iconIn.seekg(0, iconIn.end); - size_t fileSize = iconIn.tellg(); - iconIn.seekg(0xB50, iconIn.beg); - - size_t iconSize = fileSize - 0xB50; - uint8_t *tmpBuff = new uint8_t[iconSize]; - iconIn.read((char *)tmpBuff, iconSize); - iconIn.close(); - - ret = texLoadJPEGMem(tmpBuff, iconSize); - delete[] tmpBuff; - - return ret; - } - tex *createIconGeneric(const char *txt) { tex *ret = texCreate(256, 256);