mirror of
https://projects.vdr-developer.org/git/vdr-plugin-skindesigner.git
synced 2023-10-19 17:58:31 +02:00
fixed memory leak when creating fonts
This commit is contained in:
parent
bbe8c56fcb
commit
a0a6e21d5a
5
HISTORY
5
HISTORY
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
@ -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());
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -12,9 +12,8 @@ cTemplate::cTemplate(eViewType viewType, string pluginName, int viewID) {
|
||||
}
|
||||
|
||||
cTemplate::~cTemplate() {
|
||||
|
||||
if (rootView)
|
||||
delete rootView;
|
||||
if (rootView)
|
||||
delete rootView;
|
||||
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,6 @@ cTemplateView::cTemplateView(void) {
|
||||
}
|
||||
|
||||
cTemplateView::~cTemplateView() {
|
||||
|
||||
for (map < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
|
||||
delete it->second;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user