summaryrefslogtreecommitdiff
path: root/texteffects.h
diff options
context:
space:
mode:
Diffstat (limited to 'texteffects.h')
-rw-r--r--texteffects.h148
1 files changed, 148 insertions, 0 deletions
diff --git a/texteffects.h b/texteffects.h
new file mode 100644
index 0000000..eb6dd8a
--- /dev/null
+++ b/texteffects.h
@@ -0,0 +1,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: