diff options
author | louis <louis.braun@gmx.de> | 2015-06-18 10:21:43 +0200 |
---|---|---|
committer | louis <louis.braun@gmx.de> | 2015-06-18 10:21:43 +0200 |
commit | a0a6e21d5a7e2ff3097bd851623cf1eef3daf431 (patch) | |
tree | c66a3986061a6c73f747418f94ec78008876dd41 /libcore | |
parent | bbe8c56fcb7890f43828a41363b9930ed4a2978d (diff) | |
download | vdr-plugin-skindesigner-a0a6e21d5a7e2ff3097bd851623cf1eef3daf431.tar.gz vdr-plugin-skindesigner-a0a6e21d5a7e2ff3097bd851623cf1eef3daf431.tar.bz2 |
fixed memory leak when creating fonts
Diffstat (limited to 'libcore')
-rw-r--r-- | libcore/fontmanager.c | 13 | ||||
-rw-r--r-- | libcore/fontmanager.h | 43 | ||||
-rw-r--r-- | libcore/imagecache.c | 6 | ||||
-rw-r--r-- | libcore/imageloader.c | 1 |
4 files changed, 35 insertions, 28 deletions
diff --git a/libcore/fontmanager.c b/libcore/fontmanager.c index 1bca226..2f1e79c 100644 --- a/libcore/fontmanager.c +++ b/libcore/fontmanager.c @@ -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; } - diff --git a/libcore/fontmanager.h b/libcore/fontmanager.h index 5661c2b..1dbdcde 100644 --- a/libcore/fontmanager.h +++ b/libcore/fontmanager.h @@ -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
\ No newline at end of file diff --git a/libcore/imagecache.c b/libcore/imagecache.c index 63edb42..fe07e98 100644 --- a/libcore/imagecache.c +++ b/libcore/imagecache.c @@ -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()); } diff --git a/libcore/imageloader.c b/libcore/imageloader.c index b417e01..62d284f 100644 --- a/libcore/imageloader.c +++ b/libcore/imageloader.c @@ -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); } |