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" - changed "Update from Git" to "Update"
- made viewelement scrapercontent in displayreplay detachable - 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!"); esyslog("skindesigner: OSD is open, close first!");
return; return;
} }
DeleteTemplates();
cStopWatch watch; cStopWatch watch;
bool ok = LoadTemplates(); bool ok = LoadTemplates();
if (!ok) { if (!ok) {
@ -390,6 +390,7 @@ void cSkinDesigner::CacheTemplates(void) {
} }
} }
dsyslog("skindesigner: templates cached"); dsyslog("skindesigner: templates cached");
fontManager->DeleteFonts();
fontManager->CacheFonts(channelTemplate); fontManager->CacheFonts(channelTemplate);
fontManager->CacheFonts(menuTemplate); fontManager->CacheFonts(menuTemplate);
fontManager->CacheFonts(messageTemplate); fontManager->CacheFonts(messageTemplate);

View File

@ -132,6 +132,8 @@ cFont *cFontManager::CreateFont(string name, int size) {
} }
void cFontManager::InsertFont(string name, int size) { void cFontManager::InsertFont(string name, int size) {
if (FontExists(name, size))
return;
cFont *newFont = CreateFont(name, size); cFont *newFont = CreateFont(name, size);
if (!newFont) if (!newFont)
return; 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) { cFont *cFontManager::GetFont(string name, int size) {
map< string, map<int,cFont*> >::iterator hitName = fonts.find(name); map< string, map<int,cFont*> >::iterator hitName = fonts.find(name);
if (hitName == fonts.end()) if (hitName == fonts.end())
@ -192,4 +204,3 @@ bool cFontManager::FontInstalled(string fontName) {
} }
return false; return false;
} }

View File

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

View File

@ -390,15 +390,12 @@ bool cImageCache::LoadIcon(eImageType type, string name) {
return LoadImage(*subIconSkinPath, name, "png"); return LoadImage(*subIconSkinPath, name, "png");
//and finally check if a svg template exists //and finally check if a svg template exists
esyslog("skindesigner: checking svg template for %s", name.c_str());
cSVGTemplate svgTemplate(name, svgTemplatePath); cSVGTemplate svgTemplate(name, svgTemplatePath);
if (!svgTemplate.Exists()) if (!svgTemplate.Exists())
return false; return false;
esyslog("skindesigner: template found for %s", name.c_str());
svgTemplate.ReadTemplate(); svgTemplate.ReadTemplate();
if (!svgTemplate.ParseTemplate()) if (!svgTemplate.ParseTemplate())
return false; return false;
esyslog("skindesigner: template parsed for %s", name.c_str());
string tmpImageName = svgTemplate.WriteImage(); string tmpImageName = svgTemplate.WriteImage();
return LoadImage(tmpImageName.c_str()); return LoadImage(tmpImageName.c_str());
} }
@ -444,15 +441,12 @@ bool cImageCache::LoadSkinpart(string name) {
return LoadImage(skinPartsPathSkin.c_str(), name, "png"); return LoadImage(skinPartsPathSkin.c_str(), name, "png");
//check if a svg template exists //check if a svg template exists
esyslog("skindesigner: checking svg template for %s", name.c_str());
cSVGTemplate svgTemplate(name, svgTemplatePath); cSVGTemplate svgTemplate(name, svgTemplatePath);
if (!svgTemplate.Exists()) if (!svgTemplate.Exists())
return false; return false;
esyslog("skindesigner: template found for %s", name.c_str());
svgTemplate.ReadTemplate(); svgTemplate.ReadTemplate();
if (!svgTemplate.ParseTemplate()) if (!svgTemplate.ParseTemplate())
return false; return false;
esyslog("skindesigner: template parsed for %s", name.c_str());
string tmpImageName = svgTemplate.WriteImage(); string tmpImageName = svgTemplate.WriteImage();
return LoadImage(tmpImageName.c_str()); 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; tIndex alpha = (color & 0xFF000000) >> 24;
string svgAlpha = *cString::sprintf("%f", (float)(alpha / (float)255)); string svgAlpha = *cString::sprintf("%f", (float)(alpha / (float)255));
std::replace( svgAlpha.begin(), svgAlpha.end(), ',', '.');
line.replace(hitAlpha, hitAlphaEnd - hitAlpha + 2, svgAlpha); line.replace(hitAlpha, hitAlphaEnd - hitAlpha + 2, svgAlpha);
} }

View File

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

View File

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