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
|
/*
* $Id: render.h,v 1.6 2004/12/10 21:46:46 lordjaxom Exp $
*/
#ifndef VDR_TEXT2SKIN_RENDER_H
#define VDR_TEXT2SKIN_RENDER_H
#include "common.h"
#include "scroller.h"
#include "xml/skin.h"
#include "xml/type.h"
#include <vdr/osd.h>
#include <vdr/skins.h>
#include <vdr/thread.h>
class cChannel;
class cEvent;
class cText2SkinLoader;
class cText2SkinI18n;
class cText2SkinTheme;
class cText2SkinScreen;
class cText2SkinRender: public cThread {
friend class cText2SkinDisplayChannel;
friend class cText2SkinDisplayVolume;
friend class cText2SkinDisplayReplay;
friend class cText2SkinDisplayMessage;
friend class cText2SkinDisplayMenu;
/* Skin Editor */
friend class VSkinnerScreen;
private:
static cText2SkinRender *mRender;
cxSkin *mSkin;
cxDisplay *mDisplay;
cText2SkinI18n *mI18n;
cText2SkinTheme *mTheme;
cText2SkinScreen *mScreen;
cText2SkinScroller *mScroller;
std::string mBasePath;
bool mDirty;
// update thread
bool mActive;
cCondVar mDoUpdate;
cMutex mDoUpdateMutex;
//cCondVar mDoneUpdate;
//cMutex mDoneUpdateMutex;
cCondVar mStarted;
int mUpdateIn;
// coordinate transformation
txSize mBaseSize;
protected:
// Update thread
//void Lock(void) { mMutex.Lock(); }
//void Unlock(void) { mMutex.Unlock(); }
virtual void Action(void);
// Drawing operations
void DrawObject(const cxObject *Object);
void DrawBackground(const txPoint &Pos, const txSize &Size, const tColor *Bg, const tColor *Fg,
int Alpha, const std::string &Path);
void DrawImage(const txPoint &Pos, const tColor *Bg, const tColor *Fg, int Alpha,
const std::string &Path);
void DrawText(const txPoint &Pos, const txSize &Size, const tColor *Fg,
const std::string &Text, const cFont *Font, int Align);
void DrawRectangle(const txPoint &Pos, const txSize &Size,
const tColor *Fg);
void DrawEllipse(const txPoint &Pos, const txSize &Size, const tColor *Fg,
int Arc);
void DrawSlope(const txPoint &Pos, const txSize &Size, const tColor *Fg,
int Arc);
void DrawProgressbar(const txPoint &Pos, const txSize &Size, int Current,
int Total, const tColor *Fg, const tColor *Bg,
const tColor *Selected, const tColor *Mark, const tColor *Cur,
const cMarks *Marks = NULL);
void DrawMark(const txPoint &Pos, const txSize &Size, bool Start,
bool Current, bool Horizontal, const tColor *Mark,
const tColor *Cur);
void DrawScrolltext(const txPoint &Pos, const txSize &Size,
const tColor *Fg, const std::string &Text, const cFont *Font, int Align);
void DrawScrollbar(const txPoint &Pos, const txSize &Size, const tColor *Bg, const tColor *Fg);
void Update(void);
// all renderers shall return appropriate data for the tokens
virtual cxType GetTokenData(const txToken &Token);
// the replay renderer shall return its marks here
virtual const cMarks *GetMarks(void) const { return NULL; }
// the menu renderer shall return its tab information here
virtual int GetTab(int n) { return 0; }
virtual bool HasTabText(int Index, int n) { return false; }
virtual void SetEditableWidth(int Width) {}
// functions for display renderer to control behaviour
void Flush(bool Force = false);
void SetDirty(void) { mDirty = true; }
void Scroll(bool Up, bool Page) { if (mScroller) mScroller->Scroll(Up, Page); }
void Clear(void) { DELETENULL(mScroller); }
public:
cText2SkinRender(cText2SkinLoader *Loader, cxDisplay::eType Section, const std::string &BasePath = "",
bool OffScreen = false);
virtual ~cText2SkinRender();
// functions for object classes to obtain dynamic item information
static txPoint Transform(const txPoint &Pos);
static bool ItemColor(const std::string &Color, tColor &Result);
static std::string ImagePath(const std::string &Filename);
static cxType GetToken(const txToken &Token);
};
inline void cText2SkinRender::Flush(bool Force) {
if (mDirty || Force) {
//mDoneUpdateMutex.Lock();
mDoUpdateMutex.Lock();
mDoUpdate.Broadcast();
mDoUpdateMutex.Unlock();
//if (mActive) {
//Dprintf("flush wait\n");
//mDoneUpdate.Wait(mDoneUpdateMutex);
//Dprintf("flush wait done\n");
//}
//mDoneUpdateMutex.Unlock();
mDirty = false;
}
}
#endif // VDR_TEXT2SKIN_RENDER_H
|