summaryrefslogtreecommitdiff
path: root/logo.c
diff options
context:
space:
mode:
Diffstat (limited to 'logo.c')
-rw-r--r--logo.c154
1 files changed, 129 insertions, 25 deletions
diff --git a/logo.c b/logo.c
index 117c308..30a0cbe 100644
--- a/logo.c
+++ b/logo.c
@@ -5,22 +5,30 @@
*
*/
+#include <strings.h>
+
+#include "bitmap.h"
#include "common.h"
#include "config.h"
#include "logo.h"
#include <vdr/tools.h>
#include <vdr/plugin.h>
-#undef debug
-#define debug(x...) ;
-
cEnigmaLogoCache EnigmaLogoCache(0);
cEnigmaLogoCache::cEnigmaLogoCache(unsigned int cacheSizeP) :cacheSizeM(cacheSizeP), bitmapM(NULL)
-{ }
+{
+#ifdef HAVE_IMAGEMAGICK
+ bmpImage = new cBitmap(8, 8, 1);
+#endif
+}
cEnigmaLogoCache::~cEnigmaLogoCache()
{
+#ifdef HAVE_IMAGEMAGICK
+ delete bmpImage;
+#endif
+
// let's flush the cache
Flush();
}
@@ -37,11 +45,97 @@ bool cEnigmaLogoCache::Resize(unsigned int cacheSizeP)
return true;
}
-bool cEnigmaLogoCache::Load(const char *fileNameP)
+bool cEnigmaLogoCache::LoadEventImage(const cEvent *Event, int w, int h, int c)
+{
+ if (Event == NULL)
+ return false;
+
+ char *strFilename = NULL;
+ asprintf(&strFilename, "%s/%d.%s", EnigmaConfig.GetImagesDir(), Event->EventID(), EnigmaConfig.GetImageExtension());
+ int rc = LoadImage(strFilename, w, h, c);
+ free (strFilename);
+ return rc;
+}
+
+bool cEnigmaLogoCache::LoadRecordingImage(const cRecording *Recording, int w, int h, int c)
+{
+ if (Recording == NULL)
+ return false;
+
+ char *strFilename = NULL;
+ asprintf(&strFilename, "%s/%s.%s", Recording->FileName(), RECORDING_COVER, EnigmaConfig.GetImageExtension());
+ int rc = LoadImage(strFilename, w, h, c);
+ free (strFilename);
+ return rc;
+}
+
+bool cEnigmaLogoCache::LoadImage(const char *fileNameP, int w, int h, int c)
{
- debug("cPluginSkinEnigma::Load(%s)\n", fileNameP);
+ struct stat stbuf;
+ if (lstat(fileNameP, &stbuf) != 0) {
+ error("cPluginSkinEnigma::LoadImage(%s) FILE NOT FOUND\n", fileNameP);
+ bitmapM = NULL;
+ return false;
+ }
+
+#ifdef HAVE_IMAGEMAGICK
+ int rc = image.LoadImage(fileNameP, w, h, c, *bmpImage);
+ bitmapM = rc ? bmpImage : NULL;
+ return rc;
+#else
+ return LoadXpm(fileNameP, w, h);
+#endif
+}
+
+bool cEnigmaLogoCache::LoadChannelLogo(const cChannel *Channel)
+{
+ if (Channel == NULL)
+ return false;
+
+ bool fFoundLogo = false;
+ char *strChannelID = EnigmaConfig.useChannelId ? strdup(*Channel->GetChannelID().ToString()) : NULL;
+ const char *logoname = EnigmaConfig.useChannelId ? strChannelID : Channel->Name();
+ if (logoname) {
+ char *filename = (char *)malloc(strlen(logoname) + 20 /* should be enough for folder */);
+ if (filename == NULL) return false;
+ strcpy(filename, "hqlogos/");
+ strcat(filename, logoname);
+ if (!(fFoundLogo = Load(filename, ChannelLogoWidth, ChannelLogoHeight))) {
+ strcpy(filename, "logos/");
+ strcat(filename, logoname);
+ if (!(fFoundLogo = EnigmaLogoCache.Load(filename, ChannelLogoWidth, ChannelLogoHeight))) {
+ fFoundLogo = Load("hqlogos/no_logo", ChannelLogoWidth, ChannelLogoHeight); //TODO? different default logo for channel/group?
+ }
+ }
+ free(filename);
+ free(strChannelID);
+ }
+ return fFoundLogo;
+}
+
+bool cEnigmaLogoCache::LoadSymbol(const char *fileNameP)
+{
+ return Load(fileNameP, SymbolWidth, SymbolHeight);
+}
+
+bool cEnigmaLogoCache::LoadIcon(const char *fileNameP)
+{
+ return Load(fileNameP, IconWidth, IconHeight);
+}
+
+bool cEnigmaLogoCache::Load(const char *fileNameP, int w, int h)
+{
+ if (fileNameP == NULL)
+ return false;
+
+ char *strFilename;
+ asprintf(&strFilename, "%s/%s.xpm", EnigmaConfig.GetLogoDir(), fileNameP);
+ if (strFilename == NULL)
+ return false;
+
+ debug("cPluginSkinEnigma::Load(%s)\n", strFilename);
// does the logo exist already in map
- std::map < std::string, cBitmap * >::iterator i = cacheMapM.find(fileNameP);
+ std::map < std::string, cBitmap * >::iterator i = cacheMapM.find(strFilename);
if (i != cacheMapM.end()) {
// yes - cache hit!
debug("cPluginSkinEnigma::Load() CACHE HIT!\n");
@@ -49,6 +143,7 @@ bool cEnigmaLogoCache::Load(const char *fileNameP)
if (i->second == NULL) {
debug("cPluginSkinEnigma::Load() EMPTY\n");
// empty logo in cache
+ free(strFilename);
return false;
}
bitmapM = i->second;
@@ -56,7 +151,8 @@ bool cEnigmaLogoCache::Load(const char *fileNameP)
// no - cache miss!
debug("cPluginSkinEnigma::Load() CACHE MISS!\n");
// try to load xpm logo
- LoadXpm(fileNameP);
+ if (!LoadXpm(strFilename, w, h))
+ return false;
// check if cache is active
if (cacheSizeM) {
// update map
@@ -72,16 +168,18 @@ bool cEnigmaLogoCache::Load(const char *fileNameP)
cacheMapM.erase(cacheMapM.begin());
}
// insert logo into map
- debug("cPluginSkinEnigma::Load() INSERT(%s)\n", fileNameP);
- cacheMapM.insert(std::make_pair(fileNameP, bitmapM));
+ debug("cPluginSkinEnigma::Load() INSERT(%s)\n", strFilename);
+ cacheMapM.insert(std::make_pair(strFilename, bitmapM));
}
// check if logo really exist
if (bitmapM == NULL) {
debug("cPluginSkinEnigma::Load() EMPTY\n");
// empty logo in cache
+ free(strFilename);
return false;
}
}
+ free(strFilename);
return true;
}
@@ -90,30 +188,34 @@ cBitmap & cEnigmaLogoCache::Get(void)
return *bitmapM;
}
-bool cEnigmaLogoCache::LoadXpm(const char *fileNameP)
+bool cEnigmaLogoCache::LoadXpm(const char *fileNameP, int w, int h)
{
+ if (fileNameP == NULL)
+ return false;
+
struct stat stbuf;
- char *filename;
cBitmap *bmp = new cBitmap(1, 1, 1);
// create absolute filename
- asprintf(&filename, "%s/%s.xpm", EnigmaConfig.GetLogoDir(), fileNameP);
- debug("cPluginSkinEnigma::LoadXpm(%s)\n", filename);
+ debug("cPluginSkinEnigma::LoadXpm(%s)\n", fileNameP);
// check validity
- if ((stat(filename, &stbuf) == 0) && bmp->LoadXpm(filename)
- /*TODO? && (bmp->Width() == ChannelLogoWidth)
- && (bmp->Height() == ChannelLogoHeight)*/) {
- debug("cPluginSkinEnigma::LoadXpm() LOGO FOUND\n");
- // assign bitmap
- bitmapM = bmp;
- free(filename);
- return true;
+ if ((lstat(fileNameP, &stbuf) == 0) && bmp->LoadXpm(fileNameP)) {
+ if ((bmp->Width() <= w) && (bmp->Height() <= h)) {
+ debug("cPluginSkinEnigma::LoadXpm(%s) LOGO FOUND\n", fileNameP);
+ // assign bitmap
+ bitmapM = bmp;
+ return true;
+ } else {
+ // wrong size
+ error("cPluginSkinEnigma::LoadXpm(%s) LOGO HAS WRONG SIZE %d/%d (%d/%d)\n", fileNameP, bmp->Width(), bmp->Height(), w, h);
+ }
+ } else {
+ // no xpm logo found
+ error("cPluginSkinEnigma::LoadXpm(%s) LOGO NOT FOUND\n", fileNameP);
}
- // no xpm logo found - delete bitmap
- error("cPluginSkinEnigma::LoadXpm(%s) LOGO NOT FOUND\n", filename);
+
delete bmp;
bitmapM = NULL;
- free(filename);
return false;
}
@@ -136,3 +238,5 @@ bool cEnigmaLogoCache::Flush(void)
}
return true;
}
+
+// vim:et:sw=2:ts=2: