summaryrefslogtreecommitdiff
path: root/texteffects.h
blob: eb6dd8a4574628fc433d3de92b691f5415dfeccd (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
140
141
142
143
144
145
146
147
148
/*
 * status.h: 'EnigmaNG' skin for the Video Disk Recorder
 *
 * See the README file for copyright information and how to reach the author.
 *
 */

#ifndef __TEXTEFFECTS_H
#define __TEXTEFFECTS_H

#include "common.h"
#include "enigma.h"

#ifndef DISABLE_ANIMATED_TEXT
#include <vector>
#endif

#include <vdr/skins.h>

#ifdef DISABLE_ANIMATED_TEXT
#define TE_START(osd) ;
#define TE_STOP ;
#define TE_LOCK ;
#define TE_UNLOCK ;
#define TE_WAKEUP ;
#define TE_MARQUEE(osd, id, x...) osd->DrawText(x)
#define TE_BLINK(osd, id, x...) osd->DrawText(x)
#define TE_TITLE(osd, id, s, Font, Width, skin) osd->DrawTitle(s)

#else // !DISABLE_ANIMATED_TEXT
#include <vdr/thread.h>

#define TE_START(osd) EnigmaTextEffects.Start(osd);
#define TE_STOP EnigmaTextEffects.Stop();
#define TE_LOCK EnigmaTextEffects.UpdateLock();
#define TE_UNLOCK EnigmaTextEffects.UpdateUnlock();
#define TE_WAKEUP EnigmaTextEffects.RefreshEffects();
#define TE_MARQUEE(osd, id, x...) EnigmaTextEffects.DrawAnimatedText(id, 0, x)
#define TE_BLINK(osd, id, x...) EnigmaTextEffects.DrawAnimatedText(id, 1, x)
#define TE_TITLE(osd, id, x...) EnigmaTextEffects.DrawAnimatedTitle(id, 0, x)

#endif //DISABLE_ANIMATED_TEXT

#ifdef DISABLE_ANIMATED_TEXT
class cEnigmaTextEffects {
#else
class cEnigmaTextEffects : public cThread {
#endif
private:
  cOsd *osd;

#ifdef HAVE_FREETYPE
  char **availTTFs;
  int nMaxTTFs;
#endif

#ifndef DISABLE_ANIMATED_TEXT
  int yMessageTop;

  struct tEffect {
    int nAction;
    uint nOffset;
    int nDirection;
    uint64_t nNextUpdate;
    std::string strText;
    int x, y, Width, Height;
    tColor ColorFg, ColorBg;
    const cFont *Font;
    int Alignment;
    cSkinEnigmaOsd *Skin;

  public:
    tEffect(void) : nAction(0), nOffset(0), nDirection(0),
                    nNextUpdate(0), x(0), y(0), Width(0), Height(0),
                    ColorFg(0), ColorBg(0), Font(NULL), Alignment(taDefault),
                    Skin(NULL)
    {};
  };

  typedef std::vector<tEffect*> tEffects;
  tEffects vecEffects;
  cCondVar condSleep;
  cMutex mutexSleep;
  cMutex mutexRunning;

  void DoEffect(tEffect *e, uint64_t nNow = 0);
  void DoScroll(tEffect *e, uint64_t nNow, bool fDrawItem);
  void DoBlink(tEffect *e, uint64_t nNow, bool fDrawItem);

  void Wakeup(void)
  {
//    printf("WAKE1: %p\n", pthread_self());
    mutexSleep.Lock();
    condSleep.Broadcast();
    mutexSleep.Unlock();
//    printf("WAKE2: %p\n", pthread_self());
  }
#endif //DISABLE_ANIMATED_TEXT

public:
#ifdef DISABLE_ANIMATED_TEXT
  cEnigmaTextEffects(void);
  ~cEnigmaTextEffects(void);

#else
  cEnigmaTextEffects(const char *Description = NULL);
  ~cEnigmaTextEffects(void);

  virtual void Action(void);

  bool Start(cOsd *o);
  void Stop(void);
  void Clear(void);

  void ResetText(int i, tColor ColorFg = 0, tColor ColorBg = 0, bool fDraw = true);
  void PauseEffects(int y = 0);
  void UpdateTextWidth(int i, int Width);
  int DrawAnimatedTitle(int o_id, int action, const char *s, const cFont *Font, int Width, cSkinEnigmaOsd *skin);
  int DrawAnimatedText(int o_id, int action, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int Width = 0, int Height = 0, int Alignment = taDefault);

  void UpdateLock(void)
  { 
//    printf("LOCK1: %p\n", pthread_self());
    Lock();
//    printf("LOCK2: %p\n", pthread_self());
  }

  void UpdateUnlock(void)
  { 
//    printf("UNLOCK1: %p\n", pthread_self());
    Unlock();
//    printf("UNLOCK2: %p\n", pthread_self());
  }

  void RefreshEffects(void)
  { Wakeup(); }
#endif //DISABLE_ANIMATED_TEXT

#ifdef HAVE_FREETYPE
  int GetNumAvailTTFs(void) { return nMaxTTFs; }
  const char **GetAvailTTFs(void);
#endif
};

extern cEnigmaTextEffects EnigmaTextEffects;

#endif //__TEXTEFFECTS_H
// vim:et:sw=2:ts=2: