enigma2 20120430 master -> 20120509 master
[enigma2.git] / usr / include / enigma2 / lib / gdi / gpixmap.h
1 #ifndef __gpixmap_h
2 #define __gpixmap_h
3
4 #include <pthread.h>
5 #include <string>
6 #include <vector>
7 #include <lib/base/object.h>
8 #include <lib/base/smartptr.h>
9 #include <lib/base/elock.h>
10 #include <lib/gdi/erect.h>
11 #include <lib/gdi/fb.h>
12
13 class QBrush;
14 class QColor;
15 class QImage;
16 typedef unsigned int QRgb;
17
18 class gRGB
19 {
20 public:
21         unsigned char b, g, r, a;
22         gRGB(int r, int g, int b, int a=0): b(b), g(g), r(r), a(a)
23         {
24         }
25         gRGB(unsigned int val): b(val&0xFF), g((val>>8)&0xFF), r((val>>16)&0xFF), a((val>>24)&0xFF)             // ARGB
26         {
27         }
28         gRGB(): b(0), g(0), r(0), a(0)
29         {
30         }
31
32 #if defined(HAVE_QT) && !defined(SWIG)
33         gRGB(const QBrush &);
34         gRGB(const QColor &);
35         operator QBrush() const;
36         operator QColor() const;
37         operator QRgb() const;
38 #endif
39
40         unsigned int argb() const
41         {
42                 return (a<<24)|(r<<16)|(g<<8)|b;
43         }
44
45         void operator=(unsigned int val)
46         {
47                 b = val&0xFF;
48                 g = (val>>8)&0xFF;
49                 r = (val>>16)&0xFF;
50                 a = (val>>24)&0xFF;
51         }
52         bool operator < (const gRGB &c) const
53         {
54                 if (b < c.b)
55                         return 1;
56                 if (b == c.b)
57                 {
58                         if (g < c.g)
59                                 return 1;
60                         if (g == c.g)
61                         {
62                                 if (r < c.r)
63                                         return 1;
64                                 if (r == c.r)
65                                         return a < c.a;
66                         }
67                 }
68                 return 0;
69         }
70         bool operator==(const gRGB &c) const
71         {
72                 return (b == c.b) && (g == c.g) && (r == c.r) && (a == c.a);
73         }
74 };
75
76 #ifndef SWIG
77 struct gColor
78 {
79         int color;
80         gColor(int color): color(color)
81         {
82         }
83         gColor(): color(0)
84         {
85         }
86         operator int() const { return color; }
87         bool operator==(const gColor &o) const { return o.color==color; }
88 };
89
90 class gPalette
91 {
92         friend class gDC;
93         friend class gDirectFBDC;
94         friend class gFBDC;
95         friend class gSDLDC;
96         friend class gPainter;
97         friend class gPixmap;
98
99         std::vector<gRGB> m_colorTable;
100
101         void setColorCount(int colorCount)
102         {
103                 if (colorCount >= 0)
104                         m_colorTable.resize(colorCount);
105         }
106
107         void setColor(int index, const gRGB &colorValue)
108         {
109                 if ((index >= 0) && (index < colorCount()))
110                         m_colorTable[index] = colorValue;
111         }
112
113         void setColorTable(const std::vector<gRGB> &colors)
114         {
115                 m_colorTable = colors;
116         }
117
118 public:
119         gPalette()
120         {
121         }
122
123         gPalette(const gPalette &p) :
124                 m_colorTable(p.m_colorTable)
125         {
126         }
127
128         gColor findColor(const gRGB &rgb) const;
129
130         gRGB color(int index) const
131         {
132                 if ((index >= 0) && (index < colorCount()))
133                         return m_colorTable[index];
134
135                 return gRGB();
136         }
137
138         int colorCount() const
139         {
140                 return m_colorTable.size();
141         }
142
143         std::vector<gRGB> colorTable() const
144         {
145                 return m_colorTable;
146         }
147 };
148
149 struct gLookup
150 {
151         int size;
152         gColor *lookup;
153         gLookup(int size, const gPalette &pal, const gRGB &start, const gRGB &end);
154         gLookup();
155         ~gLookup() { delete [] lookup; }
156         void build(int size, const gPalette &pal, const gRGB &start, const gRGB &end);
157 };
158
159 struct gSurface
160 {
161         typedef enum
162         {
163             ARGB, ABGR, RGBA, BGRA, INDEXED
164         } colorformat_t;
165
166         colorformat_t colorformat;
167         bool premult;   // premultiplied alpha
168
169         int type;
170         int x, y, bpp, bypp, stride;
171         gPalette clut;
172         
173         void *data;
174         int data_phys;
175         int offset; // only for backbuffers
176
177         gSurface();
178         gSurface(eSize size, int bpp, int accel, bool premult = false);
179         ~gSurface();
180 };
181 #endif
182
183 class gRegion;
184
185 SWIG_IGNORE(gPixmap);
186 class gPixmap: public iObject
187 {
188         DECLARE_REF(gPixmap);
189         E_DISABLE_COPY(gPixmap)
190
191 public:
192 #ifndef SWIG
193         enum
194         {
195                 blitAlphaTest=1,
196                 blitAlphaBlend=2,
197                 blitScale=4
198         };
199
200         gPixmap(gSurface *surface);
201         gPixmap(eSize, int bpp, int accel = 0, bool premult = false);
202
203 #if defined(HAVE_QT) && !defined(SWIG)
204         gPixmap(const char *filename, const char *format = 0);
205         QImage &toQImage();
206 #endif
207
208         bool isNull() const;
209         gSurface *surface;
210         int final;
211
212         inline bool needClut() const { return surface && surface->bpp <= 8; }
213 #endif
214         virtual ~gPixmap();
215         eSize size() const { return eSize(surface->x, surface->y); }
216
217         gRGB color(int index) const;
218         int colorCount() const;
219         std::vector<gRGB> colorTable() const;
220         void setColor(int index, const gRGB &colorValue);
221         void setColorCount(int colorCount);
222         void setColorTable(const std::vector<gRGB> &colors);
223         void setColorFormat(gSurface::colorformat_t colorformat);
224
225 private:
226         E_DECLARE_PRIVATE(gPixmap)
227
228         friend class gDC;
229         void fill(const gRegion &clip, const gColor &color);
230         void fill(const gRegion &clip, const gRGB &color);
231         
232         void blit(const gPixmap &src, const eRect &pos, const gRegion &clip, int flags=0);
233         
234         void mergePalette(const gPixmap &target);
235         void line(const gRegion &clip, ePoint start, ePoint end, gColor color);
236 #ifdef SWIG
237         gPixmap();
238 #endif
239 };
240 SWIG_TEMPLATE_TYPEDEF(ePtr<gPixmap>, gPixmapPtr);
241
242 #endif