fixed memory leak when creating fonts

This commit is contained in:
louis 2015-06-18 10:21:43 +02:00
parent bbe8c56fcb
commit a0a6e21d5a
8 changed files with 43 additions and 34 deletions

View File

@ -371,4 +371,7 @@ Version 0.5.2
- changed "Update from Git" to "Update"
- made viewelement scrapercontent in displayreplay detachable
Version 0.5.3
Version 0.5.3
- added SVG Template parsing
- fixed memory leak when creating fonts

View File

@ -128,7 +128,7 @@ void cSkinDesigner::Reload(void) {
esyslog("skindesigner: OSD is open, close first!");
return;
}
DeleteTemplates();
cStopWatch watch;
bool ok = LoadTemplates();
if (!ok) {
@ -390,6 +390,7 @@ void cSkinDesigner::CacheTemplates(void) {
}
}
dsyslog("skindesigner: templates cached");
fontManager->DeleteFonts();
fontManager->CacheFonts(channelTemplate);
fontManager->CacheFonts(menuTemplate);
fontManager->CacheFonts(messageTemplate);

View File

@ -132,6 +132,8 @@ cFont *cFontManager::CreateFont(string name, int size) {
}
void cFontManager::InsertFont(string name, int size) {
if (FontExists(name, size))
return;
cFont *newFont = CreateFont(name, size);
if (!newFont)
return;
@ -145,6 +147,16 @@ void cFontManager::InsertFont(string name, int size) {
}
}
bool cFontManager::FontExists(string name, int size) {
map < string, map< int, cFont* > >::iterator hit = fonts.find(name);
if (hit == fonts.end())
return false;
map< int, cFont* >::iterator hit2 = (hit->second).find(size);
if (hit2 == (hit->second).end())
return false;
return true;
}
cFont *cFontManager::GetFont(string name, int size) {
map< string, map<int,cFont*> >::iterator hitName = fonts.find(name);
if (hitName == fonts.end())
@ -192,4 +204,3 @@ bool cFontManager::FontInstalled(string fontName) {
}
return false;
}

View File

@ -11,27 +11,28 @@
using namespace std;
class cFontManager {
private:
static cMutex mutex;
map < string, map< int, cFont* > > fonts;
cFont *CreateFont(string name, int size);
void InsertFont(string name, int size);
cFont *GetFont(string name, int size);
int GetFontHeight(const char *name, int height, int charWidth = 0);
public:
cFontManager();
~cFontManager();
void Lock(void) { mutex.Lock(); };
void Unlock(void) { mutex.Unlock(); };
void CacheFonts(cTemplate *tpl);
void DeleteFonts(void);
int Width(string fontName, int fontSize, const char *text);
int Height(string fontName, int fontSize);
cFont *Font(string fontName, int fontSize);
cFont *FontUncached(string fontName, int fontSize);
void Debug(void);
void ListAvailableFonts(void);
bool FontInstalled(string fontName);
private:
static cMutex mutex;
map < string, map< int, cFont* > > fonts;
cFont *CreateFont(string name, int size);
void InsertFont(string name, int size);
bool FontExists(string name, int size);
cFont *GetFont(string name, int size);
int GetFontHeight(const char *name, int height, int charWidth = 0);
public:
cFontManager();
~cFontManager();
void Lock(void) { mutex.Lock(); };
void Unlock(void) { mutex.Unlock(); };
void CacheFonts(cTemplate *tpl);
void DeleteFonts(void);
int Width(string fontName, int fontSize, const char *text);
int Height(string fontName, int fontSize);
cFont *Font(string fontName, int fontSize);
cFont *FontUncached(string fontName, int fontSize);
void Debug(void);
void ListAvailableFonts(void);
bool FontInstalled(string fontName);
};
#endif //__FONTMANAGER_H

View File

@ -390,15 +390,12 @@ bool cImageCache::LoadIcon(eImageType type, string name) {
return LoadImage(*subIconSkinPath, name, "png");
//and finally check if a svg template exists
esyslog("skindesigner: checking svg template for %s", name.c_str());
cSVGTemplate svgTemplate(name, svgTemplatePath);
if (!svgTemplate.Exists())
return false;
esyslog("skindesigner: template found for %s", name.c_str());
svgTemplate.ReadTemplate();
if (!svgTemplate.ParseTemplate())
return false;
esyslog("skindesigner: template parsed for %s", name.c_str());
string tmpImageName = svgTemplate.WriteImage();
return LoadImage(tmpImageName.c_str());
}
@ -444,15 +441,12 @@ bool cImageCache::LoadSkinpart(string name) {
return LoadImage(skinPartsPathSkin.c_str(), name, "png");
//check if a svg template exists
esyslog("skindesigner: checking svg template for %s", name.c_str());
cSVGTemplate svgTemplate(name, svgTemplatePath);
if (!svgTemplate.Exists())
return false;
esyslog("skindesigner: template found for %s", name.c_str());
svgTemplate.ReadTemplate();
if (!svgTemplate.ParseTemplate())
return false;
esyslog("skindesigner: template parsed for %s", name.c_str());
string tmpImageName = svgTemplate.WriteImage();
return LoadImage(tmpImageName.c_str());
}

View File

@ -502,5 +502,6 @@ void cSVGTemplate::ReplaceTokens(string &line, size_t tokenStart, size_t tokenEn
}
tIndex alpha = (color & 0xFF000000) >> 24;
string svgAlpha = *cString::sprintf("%f", (float)(alpha / (float)255));
std::replace( svgAlpha.begin(), svgAlpha.end(), ',', '.');
line.replace(hitAlpha, hitAlphaEnd - hitAlpha + 2, svgAlpha);
}

View File

@ -12,9 +12,8 @@ cTemplate::cTemplate(eViewType viewType, string pluginName, int viewID) {
}
cTemplate::~cTemplate() {
if (rootView)
delete rootView;
if (rootView)
delete rootView;
}

View File

@ -14,7 +14,6 @@ cTemplateView::cTemplateView(void) {
}
cTemplateView::~cTemplateView() {
for (map < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
delete it->second;
}