From 32946bef84165949decd5a9204951a1164829cf2 Mon Sep 17 00:00:00 2001 From: "fix94.1" Date: Sun, 1 Sep 2013 22:31:46 +0000 Subject: [PATCH] -rewrote the font fix of r960 to hopefully fix issues for some people -fixed two very minor bugs --- source/gc/gc.cpp | 20 +++++++-------- source/gui/text.cpp | 16 ++++++------ source/gui/text.hpp | 8 +++--- source/menu/menu.cpp | 51 +++++++++++++++++++------------------- source/menu/menu.hpp | 25 ++----------------- source/music/gui_sound.cpp | 4 +-- 6 files changed, 54 insertions(+), 70 deletions(-) diff --git a/source/gc/gc.cpp b/source/gc/gc.cpp index 7ac43d70..f26cf61d 100644 --- a/source/gc/gc.cpp +++ b/source/gc/gc.cpp @@ -192,8 +192,9 @@ void DEVO_SetOptions(const char *isopath, const char *gameID, bool memcard_emu, stat(isopath, &st); FILE *f = fopen(isopath, "rb"); gprintf("Devolution: ISO Header %s\n", isopath); - fread((u8*)0x80000000, 1, 32, f); + fread((u8*)Disc_ID, 1, 32, f); fclose(f); + f = NULL; // fill out the Devolution config struct memset(DEVO_CONFIG, 0, sizeof(gconfig)); @@ -227,14 +228,13 @@ void DEVO_SetOptions(const char *isopath, const char *gameID, bool memcard_emu, f = fopen(iso2path, "rb"); } } - } - - if(f != NULL) - { - gprintf("Devolution: 2nd ISO File for Multi DVD Game %s\n", iso2path); - stat(iso2path, &st); - DEVO_CONFIG->disc2_cluster = st.st_ino; - fclose(f); + if(f != NULL) + { + gprintf("Devolution: 2nd ISO File for Multi DVD Game %s\n", iso2path); + stat(iso2path, &st); + DEVO_CONFIG->disc2_cluster = st.st_ino; + fclose(f); + } } // make sure these directories exist, they are required for Devolution to function correctly @@ -285,7 +285,7 @@ void DEVO_SetOptions(const char *isopath, const char *gameID, bool memcard_emu, DEVO_CONFIG->memcard_cluster = st.st_ino; // flush disc ID and Devolution config out to memory - DCFlushRange((void*)0x80000000, 64); + DCFlushRange((void*)Disc_ID, 64); DeviceHandle.UnMountDevolution(); } diff --git a/source/gui/text.cpp b/source/gui/text.cpp index 6e7c9cc0..46e49e8f 100644 --- a/source/gui/text.cpp +++ b/source/gui/text.cpp @@ -164,11 +164,11 @@ void SFont::ClearData(void) dataSize = 0; } -bool SFont::fromBuffer(const u8 *buffer, const u32 bufferSize, u32 size, u32 lspacing, u32 w, u32 idx, const char *) +bool SFont::fromBuffer(const u8 *buffer, const u32 bufferSize, u32 size, u32 lspacing, u32 w, u32 idx, const char *fontname) { if(buffer == NULL) return false; - size = min(max(6u, size), 1000u); + fSize = min(max(6u, size), 1000u); lineSpacing = min(max(6u, lspacing), 1000u); weight = min(w, 32u); index = idx; @@ -182,14 +182,15 @@ bool SFont::fromBuffer(const u8 *buffer, const u32 bufferSize, u32 size, u32 lsp memcpy(data, buffer, bufferSize); DCFlushRange(data, dataSize); + memcpy(name, fontname, 127); font = new FreeTypeGX(); - font->loadFont(data, dataSize, size, weight, index, false); + font->loadFont(data, dataSize, fSize, weight, index, false); return true; } -bool SFont::fromFile(const char *filename, u32 size, u32 lspacing, u32 w, u32 idx) +bool SFont::fromFile(const char *path, u32 size, u32 lspacing, u32 w, u32 idx, const char *fontname) { - size = min(max(6u, size), 1000u); + fSize = min(max(6u, size), 1000u); weight = min(w, 32u); index = idx = 0; @@ -197,14 +198,15 @@ bool SFont::fromFile(const char *filename, u32 size, u32 lspacing, u32 w, u32 id if(data != NULL) free(data); - data = fsop_ReadFile(filename, &dataSize); + data = fsop_ReadFile(path, &dataSize); if(data == NULL) return false; DCFlushRange(data, dataSize); + memcpy(name, fontname, 127); font = new FreeTypeGX(); - font->loadFont(data, dataSize, size, weight, index, false); + font->loadFont(data, dataSize, fSize, weight, index, false); return true; } diff --git a/source/gui/text.hpp b/source/gui/text.hpp index adee1dc6..1c0724ca 100644 --- a/source/gui/text.hpp +++ b/source/gui/text.hpp @@ -15,15 +15,17 @@ using namespace std; class SFont { public: - SFont(void) : font(NULL), lineSpacing(0), weight(0), index(0), data(NULL), dataSize(0) { } + SFont(void) : font(NULL), fSize(0), lineSpacing(0), weight(0), index(0), data(NULL), dataSize(0) { memset(name, 0, 128); }; ~SFont(void) { }; void ClearData(void); - bool fromBuffer(const u8 *buffer, const u32 bufferSize, u32 size, u32 lspacing, u32 w = 0, u32 idx = 0, const char *genKey = NULL); - bool fromFile(const char *filename, u32 size, u32 lspacing, u32 w = 0, u32 idx = 0); + bool fromBuffer(const u8 *buffer, const u32 bufferSize, u32 size, u32 lspacing, u32 w = 0, u32 idx = 0, const char *fontname = ""); + bool fromFile(const char *path, u32 size, u32 lspacing, u32 w = 0, u32 idx = 0, const char *fontname = ""); FreeTypeGX *font; + u32 fSize; u32 lineSpacing; u32 weight; u32 index; + char name[128]; private: u8 *data; size_t dataSize; diff --git a/source/menu/menu.cpp b/source/menu/menu.cpp index 7d7d311e..13cda7f0 100644 --- a/source/menu/menu.cpp +++ b/source/menu/menu.cpp @@ -619,8 +619,8 @@ void CMenu::_Theme_Cleanup(void) /* Other Theme Stuff */ for(TexSet::iterator texture = theme.texSet.begin(); texture != theme.texSet.end(); ++texture) TexHandle.Cleanup(texture->second); - for(FontSet::iterator font = theme.fontSet.begin(); font != theme.fontSet.end(); ++font) - font->second.ClearData(); + for(vector::iterator font = theme.fontSet.begin(); font != theme.fontSet.end(); ++font) + font->ClearData(); for(SoundSet::iterator sound = theme.soundSet.begin(); sound != theme.soundSet.end(); ++sound) sound->second->FreeMemory(); theme.texSet.clear(); @@ -679,7 +679,7 @@ void CMenu::_loadCFCfg() string texNoCoverFlat = fmt("%s/%s", m_themeDataDir.c_str(), m_theme.getString(domain, "missing_cover_flat").c_str()); CoverFlow.setTextures(texLoading, texLoadingFlat, texNoCover, texNoCoverFlat); // Font - CoverFlow.setFont(_font(theme.fontSet, domain, "font", TITLEFONT), m_theme.getColor(domain, "font_color", CColor(0xFFFFFFFF))); + CoverFlow.setFont(_font(domain, "font", TITLEFONT), m_theme.getColor(domain, "font_color", CColor(0xFFFFFFFF))); // Coverflow Count m_numCFVersions = min(max(2, m_theme.getInt("_COVERFLOW", "number_of_modes", 2)), 15); } @@ -959,16 +959,16 @@ void CMenu::_loadCFLayout(int version, bool forceAA, bool otherScrnFmt) void CMenu::_buildMenus(void) { // Default fonts - theme.btnFont = _font(theme.fontSet, "GENERAL", "button_font", BUTTONFONT); + theme.btnFont = _font("GENERAL", "button_font", BUTTONFONT); theme.btnFontColor = m_theme.getColor("GENERAL", "button_font_color", 0xD0BFDFFF); - theme.lblFont = _font(theme.fontSet, "GENERAL", "label_font", LABELFONT); + theme.lblFont = _font("GENERAL", "label_font", LABELFONT); theme.lblFontColor = m_theme.getColor("GENERAL", "label_font_color", 0xD0BFDFFF); - theme.titleFont = _font(theme.fontSet, "GENERAL", "title_font", TITLEFONT); + theme.titleFont = _font("GENERAL", "title_font", TITLEFONT); theme.titleFontColor = m_theme.getColor("GENERAL", "title_font_color", 0xFFFFFFFF); - theme.txtFont = _font(theme.fontSet, "GENERAL", "text_font", TEXTFONT); + theme.txtFont = _font("GENERAL", "text_font", TEXTFONT); theme.txtFontColor = m_theme.getColor("GENERAL", "text_font_color", 0xFFFFFFFF); // Default Sounds @@ -1186,9 +1186,9 @@ typedef struct u32 res; } FontHolder; -SFont CMenu::_font(CMenu::FontSet &fontSet, const char *domain, const char *key, u32 fontSize, u32 lineSpacing, u32 weight, u32 index, const char *genKey) +SFont CMenu::_font(const char *domain, const char *key, u32 fontSize, u32 lineSpacing, u32 weight, u32 index, const char *genKey) { - string filename = ""; + string filename; bool general = strncmp(domain, "GENERAL", 7) == 0; FontHolder fonts[3] = {{ "_size", 6u, 300u, fontSize, 0 }, { "_line_height", 6u, 300u, lineSpacing, 0 }, { "_weight", 1u, 32u, weight, 0 }}; @@ -1214,27 +1214,28 @@ SFont CMenu::_font(CMenu::FontSet &fontSet, const char *domain, const char *key, } /* ONLY return the font if spacing and weight are the same */ - fnt_type font_req; - font_req.name = upperCase(filename.c_str()); - font_req.t1 = fonts[0].res; - font_req.t2 = fonts[1].res; - font_req.t3 = fonts[2].res; - FontSet::iterator i = fontSet.find(font_req); - if (i != fontSet.end()) return i->second; + std::vector::iterator font_itr; + for(font_itr = theme.fontSet.begin(); font_itr != theme.fontSet.end(); ++font_itr) + { + if(strncmp(filename.c_str(), font_itr->name, 127) == 0 && font_itr->fSize == fonts[0].res && + font_itr->lineSpacing == fonts[1].res && font_itr->weight && fonts[2].res) + break; + } + if (font_itr != theme.fontSet.end()) return *font_itr; // TTF not found in memory, load it to create a new font SFont retFont; - if (!useDefault && retFont.fromFile(fmt("%s/%s", m_themeDataDir.c_str(), filename.c_str()), fonts[0].res, fonts[1].res, fonts[2].res, index)) + if(!useDefault && retFont.fromFile(fmt("%s/%s", m_themeDataDir.c_str(), filename.c_str()), fonts[0].res, fonts[1].res, fonts[2].res, index, filename.c_str())) { // Theme Font - fontSet[font_req] = retFont; + theme.fontSet.push_back(retFont); return retFont; } /* Fallback to default font */ - if(retFont.fromBuffer(m_base_font, m_base_font_size, fonts[0].res, fonts[1].res, fonts[2].res, index)) + if(retFont.fromBuffer(m_base_font, m_base_font_size, fonts[0].res, fonts[1].res, fonts[2].res, index, filename.c_str())) { // Default font - fontSet[font_req] = retFont; + theme.fontSet.push_back(retFont); return retFont; } return retFont; @@ -1386,7 +1387,7 @@ s16 CMenu::_addButton(const char *domain, SFont font, const wstringEx &text, int btnTexSet.leftSel = _texture(domain, "texture_left_selected", theme.btnTexLS, false); btnTexSet.rightSel = _texture(domain, "texture_right_selected", theme.btnTexRS, false); btnTexSet.centerSel = _texture(domain, "texture_center_selected", theme.btnTexCS, false); - font = _font(theme.fontSet, domain, "font", BUTTONFONT); + font = _font(domain, "font", BUTTONFONT); GuiSound *clickSound = _sound(theme.soundSet, domain, "click_sound", theme.clickSound->GetName()); GuiSound *hoverSound = _sound(theme.soundSet, domain, "hover_sound", theme.hoverSound->GetName()); return m_btnMgr.addButton(font, text, x, y, width, height, c, btnTexSet, clickSound, hoverSound); @@ -1414,7 +1415,7 @@ s16 CMenu::_addTitle(const char *domain, SFont font, const wstringEx &text, int y = m_theme.getInt(domain, "y", y); width = m_theme.getInt(domain, "width", width); height = m_theme.getInt(domain, "height", height); - font = _font(theme.fontSet, domain, "font", TITLEFONT); + font = _font(domain, "font", TITLEFONT); style = _textStyle(domain, "style", style); return m_btnMgr.addLabel(font, text, x, y, width, height, c, style); } @@ -1428,7 +1429,7 @@ s16 CMenu::_addText(const char *domain, SFont font, const wstringEx &text, int x y = m_theme.getInt(domain, "y", y); width = m_theme.getInt(domain, "width", width); height = m_theme.getInt(domain, "height", height); - font = _font(theme.fontSet, domain, "font", TEXTFONT); + font = _font(domain, "font", TEXTFONT); style = _textStyle(domain, "style", style); return m_btnMgr.addLabel(font, text, x, y, width, height, c, style); } @@ -1442,7 +1443,7 @@ s16 CMenu::_addLabel(const char *domain, SFont font, const wstringEx &text, int y = m_theme.getInt(domain, "y", y); width = m_theme.getInt(domain, "width", width); height = m_theme.getInt(domain, "height", height); - font = _font(theme.fontSet, domain, "font", LABELFONT); + font = _font(domain, "font", LABELFONT); style = _textStyle(domain, "style", style); return m_btnMgr.addLabel(font, text, x, y, width, height, c, style); } @@ -1456,7 +1457,7 @@ s16 CMenu::_addLabel(const char *domain, SFont font, const wstringEx &text, int y = m_theme.getInt(domain, "y", y); width = m_theme.getInt(domain, "width", width); height = m_theme.getInt(domain, "height", height); - font = _font(theme.fontSet, domain, "font", BUTTONFONT); + font = _font(domain, "font", BUTTONFONT); TexData texBg = _texture(domain, "background_texture", bg, false); style = _textStyle(domain, "style", style); return m_btnMgr.addLabel(font, text, x, y, width, height, c, style, texBg); diff --git a/source/menu/menu.hpp b/source/menu/menu.hpp index 94e0fdd0..86e01bfa 100644 --- a/source/menu/menu.hpp +++ b/source/menu/menu.hpp @@ -701,33 +701,12 @@ private: WO_FORMAT, WO_COPY_GAME, }; - struct fnt_type { - string name; - u32 t1; - u32 t2; - u32 t3; - }; - struct cmp_fnt_type { - bool operator()(const fnt_type& l, const fnt_type& r) - { - if (l.name < r.name) return true; - if (l.name > r.name) return false; - if (l.t1 < r.t1) return true; - if (l.t1 > r.t1) return false; - if (l.t2 < r.t2) return true; - if (l.t2 > r.t2) return false; - if (l.t3 < r.t3) return true; - if (l.t3 > r.t3) return false; - return false; - } - }; - typedef map FontSet; typedef map TexSet; typedef map SoundSet; struct SThemeData { TexSet texSet; - FontSet fontSet; + vector fontSet; SoundSet soundSet; SFont btnFont; SFont lblFont; @@ -1072,7 +1051,7 @@ private: void UpdateCache(u32 view = COVERFLOW_MAX); void MIOSisDML(); void RemoveCover(const char *id); - SFont _font(CMenu::FontSet &fontSet, const char *domain, const char *key, u32 fontSize, u32 lineSpacing, u32 weight, u32 index, const char *genKey); + SFont _font(const char *domain, const char *key, u32 fontSize, u32 lineSpacing, u32 weight, u32 index, const char *genKey); TexData _texture(const char *domain, const char *key, TexData &def, bool freeDef = true); vector _textures(const char *domain, const char *key); void _showWaitMessage(); diff --git a/source/music/gui_sound.cpp b/source/music/gui_sound.cpp index 51dddc73..f3d720f1 100644 --- a/source/music/gui_sound.cpp +++ b/source/music/gui_sound.cpp @@ -30,6 +30,7 @@ #include "SoundHandler.hpp" #include "MusicPlayer.hpp" #include "WavDecoder.hpp" +#include "fileOps/fileOps.h" #include "loader/sys.h" #include "banner/AnimatedBanner.h" #include "memory/mem2.hpp" @@ -166,8 +167,7 @@ bool GuiSound::Load(const char *path) if(path == NULL || path[strlen(path)-1] == '/') return false; - FILE *f = fopen(path, "rb"); - if(!f) + if(!fsop_FileExist(path)) { gprintf("gui_sound.cpp: Failed to load file %s!!\n", path); return false;