fixed memory leak when creating fonts
This commit is contained in:
parent
bbe8c56fcb
commit
a0a6e21d5a
3
HISTORY
3
HISTORY
|
@ -372,3 +372,6 @@ Version 0.5.2
|
||||||
- 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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,9 +12,8 @@ cTemplate::cTemplate(eViewType viewType, string pluginName, int viewID) {
|
||||||
}
|
}
|
||||||
|
|
||||||
cTemplate::~cTemplate() {
|
cTemplate::~cTemplate() {
|
||||||
|
if (rootView)
|
||||||
if (rootView)
|
delete rootView;
|
||||||
delete rootView;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue