enigma2 (20120327 rel32 -> 20120430 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         int type;
168         int x, y, bpp, bypp, stride;
169         gPalette clut;
170         
171         void *data;
172         int data_phys;
173         int offset; // only for backbuffers
174
175         gSurface();
176         gSurface(eSize size, int bpp, int accel);
177         ~gSurface();
178 };
179 #endif
180
181 class gRegion;
182
183 SWIG_IGNORE(gPixmap);
184 class gPixmap: public iObject
185 {
186         DECLARE_REF(gPixmap);
187         E_DISABLE_COPY(gPixmap)
188
189 public:
190 #ifndef SWIG
191         enum
192         {
193                 blitAlphaTest=1,
194                 blitAlphaBlend=2,
195                 blitScale=4
196         };
197
198         gPixmap(gSurface *surface);
199         gPixmap(eSize, int bpp, int accel = 0);
200
201 #if defined(HAVE_QT) && !defined(SWIG)
202         gPixmap(const char *filename, const char *format = 0);
203         QImage &toQImage();
204 #endif
205
206         bool isNull() const;
207         gSurface *surface;
208         int final;
209
210         inline bool needClut() const { return surface && surface->bpp <= 8; }
211 #endif
212         virtual ~gPixmap();
213         eSize size() const { return eSize(surface->x, surface->y); }
214
215         gRGB color(int index) const;
216         int colorCount() const;
217         std::vector<gRGB> colorTable() const;
218         void setColor(int index, const gRGB &colorValue);
219         void setColorCount(int colorCount);
220         void setColorTable(const std::vector<gRGB> &colors);
221         void setColorFormat(gSurface::colorformat_t colorformat);
222
223 private:
224         E_DECLARE_PRIVATE(gPixmap)
225
226         friend class gDC;
227         void fill(const gRegion &clip, const gColor &color);
228         void fill(const gRegion &clip, const gRGB &color);
229         
230         void blit(const gPixmap &src, const eRect &pos, const gRegion &clip, int flags=0);
231         
232         void mergePalette(const gPixmap &target);
233         void line(const gRegion &clip, ePoint start, ePoint end, gColor color);
234 #ifdef SWIG
235         gPixmap();
236 #endif
237 };
238 SWIG_TEMPLATE_TYPEDEF(ePtr<gPixmap>, gPixmapPtr);
239
240 #endif