mirror of
				https://projects.vdr-developer.org/git/vdr-plugin-skindesigner.git
				synced 2023-10-19 15:58:31 +00:00 
			
		
		
		
	fixed memory leak when creating fonts
This commit is contained in:
		
							
								
								
									
										5
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								HISTORY
									
									
									
									
									
								
							@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user