summaryrefslogtreecommitdiff
path: root/logo.c
blob: c8355c148fb85d78879efa5dd67207608255b4c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * logo.c: The 'EnigmaNG' VDR skin
 *
 * See the README file for copyright information and how to reach the author.
 *
 */

#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)
{ }

cEnigmaLogoCache::~cEnigmaLogoCache()
{
  // let's flush the cache
  Flush();
}

bool cEnigmaLogoCache::Resize(unsigned int cacheSizeP)
{
  debug("cPluginSkinEnigma::Resize(%d)\n", cacheSizeP);
  // flush cache only if it's smaller than before
  if (cacheSizeP < cacheSizeM) {
    Flush();
  }
  // resize current cache
  cacheSizeM = cacheSizeP;
  return true;
}

bool cEnigmaLogoCache::Load(const char *fileNameP)
{
  debug("cPluginSkinEnigma::Load(%s)\n", fileNameP);
  // does the logo exist already in map
  std::map < std::string, cBitmap * >::iterator i = cacheMapM.find(fileNameP);
  if (i != cacheMapM.end()) {
    // yes - cache hit!
    debug("cPluginSkinEnigma::Load() CACHE HIT!\n");
    // check if logo really exist
    if (i->second == NULL) {
      debug("cPluginSkinEnigma::Load() EMPTY\n");
      // empty logo in cache
      return false;
    }
    bitmapM = i->second;
  } else {
    // no - cache miss!
    debug("cPluginSkinEnigma::Load() CACHE MISS!\n");
    // try to load xpm logo
    LoadXpm(fileNameP);
    // check if cache is active
    if (cacheSizeM) {
      // update map
      if (cacheMapM.size() >= cacheSizeM) {
        // cache full - remove first
        debug("cPluginSkinEnigma::Load() DELETE\n");
        if (cacheMapM.begin()->second != NULL) {
          // logo exists - delete it
          cBitmap *bmp = cacheMapM.begin()->second;
          DELETENULL(bmp);
        }
        // erase item
        cacheMapM.erase(cacheMapM.begin());
      }
      // insert logo into map
      debug("cPluginSkinEnigma::Load() INSERT(%s)\n", fileNameP);
      cacheMapM.insert(std::make_pair(fileNameP, bitmapM));
    }
    // check if logo really exist
    if (bitmapM == NULL) {
      debug("cPluginSkinEnigma::Load() EMPTY\n");
      // empty logo in cache
      return false;
    }
  }
  return true;
}

cBitmap & cEnigmaLogoCache::Get(void)
{
  return *bitmapM;
}

bool cEnigmaLogoCache::LoadXpm(const char *fileNameP)
{
  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);
  // 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;
  }
  // no xpm logo found - delete bitmap
  printf("NOT FOUND: %s\n", filename);
  debug("cPluginSkinEnigma::LoadXpm() LOGO NOT FOUND\n");
  delete bmp;
  bitmapM = NULL;
  free(filename);
  return false;
}

bool cEnigmaLogoCache::Flush(void)
{
  debug("cPluginSkinEnigma::Flush()\n");
  // check if map is empty
  if (!cacheMapM.empty()) {
    debug("cPluginSkinEnigma::Flush() NON-EMPTY\n");
    // delete bitmaps and clear map
    for (std::map < std::string, cBitmap * >::iterator i = cacheMapM.begin();
         i != cacheMapM.end(); ++i) {
      cBitmap *bmp = i->second;
      if (bmp)
        DELETENULL(bmp);
      cacheMapM.erase(i);
    }
    // nullify bitmap pointer
    bitmapM = NULL;
  }
  return true;
}