-hopefully fixed theme memory issues completely now, there was a font bug left which didnt cache in fonts properly so they got written over and over again filling up nearly the whole memory

This commit is contained in:
fix94.1 2013-08-11 20:56:25 +00:00
parent d1dbfef055
commit 51f5860dd9
2 changed files with 31 additions and 8 deletions

View File

@ -1198,24 +1198,28 @@ SFont CMenu::_font(CMenu::FontSet &fontSet, const char *domain, const char *key,
fonts[i].res = min(max(fonts[i].min, fonts[i].res <= 0 ? fonts[i].def : fonts[i].res), fonts[i].max);
}
// Try to find the same font with the same size
CMenu::FontSet::iterator i = fontSet.find(CMenu::FontDesc(upperCase(filename.c_str()), fonts[0].res));
/* ONLY return the font if spacing and weight are the same */
if (i != fontSet.end() && i->second.lineSpacing == fonts[1].res && i->second.weight == fonts[2].res) return i->second;
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;
// 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))
{
// Theme Font
fontSet[CMenu::FontDesc(upperCase(filename.c_str()), fonts[0].res)] = retFont;
fontSet[font_req] = 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))
{
// Default font
fontSet[CMenu::FontDesc(upperCase(filename.c_str()), fonts[0].res)] = retFont;
fontSet[font_req] = retFont;
return retFont;
}
return retFont;

View File

@ -695,8 +695,27 @@ private:
WO_FORMAT,
WO_COPY_GAME,
};
typedef pair<string, u32> FontDesc;
typedef map<FontDesc, SFont> FontSet;
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<fnt_type, SFont, cmp_fnt_type> FontSet;
typedef map<string, TexData> TexSet;
typedef map<string, GuiSound*> SoundSet;
struct SThemeData