diff options
Diffstat (limited to 'config.c')
-rw-r--r-- | config.c | 163 |
1 files changed, 152 insertions, 11 deletions
@@ -5,9 +5,17 @@ * */ -#include <stdlib.h> #include "common.h" #include "config.h" +#include "tools.h" + +#ifdef USE_PLUGIN_AVARDS +#include "../avards/avards_services.h" +#endif + +#include <stdlib.h> +#include <vdr/font.h> +#include <vdr/plugin.h> #ifdef HAVE_IMAGEMAGICK const char *imageExtensionTexts[NUM_IMAGEEXTENSIONTEXTS] = { "xpm", "jpg", "png" }; @@ -15,16 +23,64 @@ const char *imageExtensionTexts[NUM_IMAGEEXTENSIONTEXTS] = { "xpm", "jpg", "png" cEnigmaConfig EnigmaConfig; +#ifdef HAVE_FREETYPE +cGraphtftFont FontCache; +#endif + +FontConfig allFontConfig[FONT_NUMFONTS] = +{ + { FONT_OSDTITLE, "FontOsdTitle", "FontOsdTitleName" }, + { FONT_MESSAGE, "FontMessage", "FontMessageName" }, + { FONT_DATE, "FontDate", "FontDateName" }, + { FONT_HELPKEYS, "FontHelpKeys", "FontHelpKeysName" }, + { FONT_CITITLE, "FontCiTitle", "FontCiTitleName" }, + { FONT_CISUBTITLE, "FontCiSubtitle", "FontCiSubtitleName" }, + { FONT_CILANGUAGE, "FontCiLanguage", "FontCiLanguageName" }, + { FONT_LISTITEM, "FontListItem", "FontListItemName" }, + { FONT_INFOTIMERHEADLINE, "FontInfoTimerHeadline", "FontInfoTimerHeadlineName" }, + { FONT_INFOTIMERTEXT, "FontInfoTimerText", "FontInfoTimerTextName" }, + { FONT_INFOWARNHEADLINE, "FontInfoWarnHeadline", "FontInfoWarnHeadlineName" }, + { FONT_INFOWARNTEXT, "FontInfoWarnText", "FontInfoWarnTextName" }, + { FONT_DETAILSTITLE, "FontDetailsTitle", "FontDetailsTitleName" }, + { FONT_DETAILSSUBTITLE, "FontDetailsSubtitle", "FontDetailsSubtitleName" }, + { FONT_DETAILSDATE, "FontDetailsDate", "FontDetailsDateName" }, + { FONT_DETAILSTEXT, "FontDetailsText", "FontDetailsTextName" }, + { FONT_REPLAYTIMES, "FontReplayTimes", "FontReplayTimesName" }, + { FONT_FIXED, "FontFixed", "FontFixed" } +}; + cEnigmaConfig::cEnigmaConfig() : showAuxInfo(1), showLogo(1), showVps(1), showSymbols(1), + showSymbolsMenu(1), showSymbolsReplay(1), showSymbolsMsgs(1), showSymbolsAudio(1), showListSymbols(1), showProgressbar(1), cacheSize(50), useChannelId(0), showInfo(1), showRemaining(0), showMarker(1), singleArea(1), singleArea8Bpp(1), showFlags(1), numReruns(5), useSubtitleRerun(1), showTimerConflicts(1), showRecSize(2), - showImages(1), resizeImages(0), showMailIcon(0), - imageWidth(120), imageHeight(120), imageExtension(0), fullTitleWidth(0) + showImages(0), resizeImages(0), showMailIcon(0), + imageWidth(120), imageHeight(80), imageExtension(0), fullTitleWidth(0), + useTextEffects(0), scrollDelay(50), scrollPause(1500), scrollMode(0), + blinkPause(1000), scrollInfo(1), scrollListItem(1), scrollOther(1), scrollTitle(1), + dynOsd(0) { memset(logoDir, 0, sizeof(logoDir)); memset(strImagesDir, 0, sizeof(strImagesDir)); +#ifdef HAVE_FREETYPE + memset(strFontsDir, 0, sizeof(strFontsDir)); +#endif + + for (int id = 0; id < FONT_NUMFONTS; id++) { + switch (id) { + case FONT_CISUBTITLE: + case FONT_CILANGUAGE: + case FONT_DETAILSSUBTITLE: + allFonts[id].VdrId = fontSml + 1; + break; + default: + allFonts[id].VdrId = fontOsd + 2; + } + memset(allFonts[id].Name, 0, sizeof(allFonts[id].Name)); + allFonts[id].Width = 100; + allFonts[id].Size = 26; + } } cEnigmaConfig::~cEnigmaConfig() @@ -33,8 +89,7 @@ cEnigmaConfig::~cEnigmaConfig() void cEnigmaConfig::SetLogoDir(const char *logodirP) { - if (logodirP) - { + if (logodirP) { debug("cEnigmaConfig::SetLogoDir(%s)\n", logodirP); strncpy(logoDir, logodirP, sizeof(logoDir)); } @@ -42,19 +97,105 @@ void cEnigmaConfig::SetLogoDir(const char *logodirP) void cEnigmaConfig::SetImagesDir(const char *dir) { - if (dir) - { - debug("cEnigmaConfig::SetImagesDir(%s)\n", dir); + if (dir) { + debug("cEnigmaConfig::SetImagesDir(%s)\n", dir); strncpy(strImagesDir, dir, sizeof(strImagesDir)); - } + } } const char *cEnigmaConfig::GetImageExtension(void) { #ifdef HAVE_IMAGEMAGICK - return (0 <= imageExtension && imageExtension < NUM_IMAGEEXTENSIONTEXTS) ? imageExtensionTexts[imageExtension] : imageExtensionTexts[0]; + return (0 <= imageExtension && imageExtension < NUM_IMAGEEXTENSIONTEXTS) ? imageExtensionTexts[imageExtension] : imageExtensionTexts[0]; +#else + return "xpm"; +#endif +} + +#ifdef HAVE_FREETYPE +void cEnigmaConfig::SetFontsDir(const char *dir) +{ + if (dir) { + debug("cEnigmaConfig::SetFontsDir(%s)\n", dir); + strncpy(strFontsDir, dir, sizeof(strFontsDir)); + } +} +#endif + +const cFont *cEnigmaConfig::GetFont(int id) +{ + const cFont *res = NULL; + if (allFonts[id].VdrId == FONT_TRUETYPE) { +#ifdef HAVE_FREETYPE + char *cachename; + asprintf(&cachename, "%s_%d_%d_%d", allFonts[id].Name, allFonts[id].Size, allFonts[id].Width, Setup.OSDLanguage); + if (FontCache.Load(string(strFontsDir) + "/" + string(allFonts[id].Name), cachename, allFonts[id].Size, Setup.OSDLanguage, allFonts[id].Width)) { + res = FontCache.GetFont(cachename); + } else { + error("ERROR: EnigmaNG: Couldn't load font %s:%d", allFonts[id].Name, allFonts[id].Size); + } + free(cachename); #else - return "xpm"; + error("ERROR: EnigmaNG: Font engine not enabled at compile time!"); #endif + } else if (allFonts[id].VdrId > FONT_TRUETYPE) { + res = cFont::GetFont((eDvbFont)(allFonts[id].VdrId - 1)); + } else { + res = cFont::GetFont((eDvbFont)allFonts[id].VdrId); + } + if (res) + return res; + else + return cFont::GetFont(fontOsd); } +void cEnigmaConfig::SetFont(int id, const char *font) +{ + if (id >= 0 && id < FONT_NUMFONTS && font) { + char *tmp = strrchr(font, ':'); + if (tmp) { + strncpy(allFonts[id].Name, font, min((int)sizeof(allFonts[id].Name), tmp - font)); + allFonts[id].Size = atoi(tmp + 1); + tmp = strchr(tmp + 1, ','); + if (tmp) { + allFonts[id].Width = atoi(tmp + 1); + } + } else { + strncpy(allFonts[id].Name, font, sizeof(allFonts[id].Name)); + } + } +} + +void cEnigmaConfig::SetFont(int id, int vdrId) +{ + if (id >= 0 && id < FONT_NUMFONTS && vdrId >= 0) { + allFonts[id].VdrId = vdrId; + } +} + +void cEnigmaConfig::GetOsdSize(struct EnigmaOsdSize *size) +{ + if (size == NULL) + return; + + size->y = Setup.OSDTop; + size->x = Setup.OSDLeft; + size->w = Setup.OSDWidth; + size->h = Setup.OSDHeight; + +#ifdef USE_PLUGIN_AVARDS + if (dynOsd) { + cPlugin *p = cPluginManager::GetPlugin("avards"); + if (p) { + avards_MaxOSDsize_v1_0 OSDsize; + if (p->Service(AVARDS_MAXOSDSIZE_SERVICE_STRING_ID, &OSDsize)) { + size->y = OSDsize.top; + size->x = OSDsize.left; + size->w = OSDsize.width; + size->h = OSDsize.height; + } + } + } +#endif +} +// vim:et:sw=2:ts=2: |