Extrenal srt problem gst-1 solved.
[openblackhole/openblackhole-enigma2.git] / lib / gdi / gpixmap.h
1 #ifndef __gpixmap_h
2 #define __gpixmap_h
3
4 #include <pthread.h>
5 #include <string>
6 #include <lib/base/object.h>
7 #include <lib/base/smartptr.h>
8 #include <lib/base/elock.h>
9 #include <lib/gdi/erect.h>
10 #include <lib/gdi/fb.h>
11 #include <byteswap.h>
12
13 struct gRGB
14 {
15         union {
16 #if BYTE_ORDER == LITTLE_ENDIAN
17                 struct {
18                         unsigned char b, g, r, a;
19                 };
20 #else
21                 struct {
22                         unsigned char a, r, g, b;
23                 };
24 #endif
25                 unsigned long value;
26         };
27         gRGB(int r, int g, int b, int a=0): b(b), g(g), r(r), a(a)
28         {
29         }
30         gRGB(unsigned long val): value(val)
31         {
32         }
33         gRGB(const gRGB& other): value(other.value)
34         {
35         }
36         gRGB(const char *colorstring)
37         {
38                 unsigned long val = 0;
39                 if (colorstring)
40                 {
41                         for (int i = 0; i < 8; i++)
42                         {
43                                 if (i) val <<= 4;
44                                 if (!colorstring[i]) break;
45                                 val |= (colorstring[i]) & 0x0f;
46                         }
47                 }
48                 value = val;
49         }
50         gRGB(): value(0)
51         {
52         }
53
54         unsigned long argb() const
55         {
56                 return value;
57         }
58
59         void set(unsigned long val)
60         {
61                 value = val;
62         }
63
64         void operator=(unsigned long val)
65         {
66                 value = val;
67         }
68         bool operator < (const gRGB &c) const
69         {
70                 if (b < c.b)
71                         return true;
72                 if (b == c.b)
73                 {
74                         if (g < c.g)
75                                 return true;
76                         if (g == c.g)
77                         {
78                                 if (r < c.r)
79                                         return true;
80                                 if (r == c.r)
81                                         return a < c.a;
82                         }
83                 }
84                 return false;
85         }
86         bool operator==(const gRGB &c) const
87         {
88                 return c.value == value;
89         }
90         bool operator != (const gRGB &c) const
91         {
92                 return c.value != value;
93         }
94         operator const std::string () const
95         {
96                 unsigned long val = value;
97                 std::string escapecolor = "\\c";
98                 escapecolor.resize(10);
99                 for (int i = 9; i >= 2; i--)
100                 {
101                         escapecolor[i] = 0x40 | (val & 0xf);
102                         val >>= 4;
103                 }
104                 return escapecolor;
105         }
106         void alpha_blend(const gRGB other)
107         {
108 #define BLEND(x, y, a) (y + (((x-y) * a)>>8))
109                 b = BLEND(other.b, b, other.a);
110                 g = BLEND(other.g, g, other.a);
111                 r = BLEND(other.r, r, other.a);
112                 a = BLEND(0xFF, a, other.a);
113 #undef BLEND
114         }
115 };
116
117 #ifndef SWIG
118 struct gColor
119 {
120         int color;
121         gColor(int color): color(color)
122         {
123         }
124         gColor(): color(0)
125         {
126         }
127         operator int() const { return color; }
128         bool operator==(const gColor &o) const { return o.color==color; }
129 };
130
131 struct gPalette
132 {
133         int start, colors;
134         gRGB *data;
135         unsigned long data_phys;
136         gColor findColor(const gRGB rgb) const;
137         gPalette():     start(0), colors(0), data(0), data_phys(0) {}
138 };
139
140 struct gLookup
141 {
142         int size;
143         gColor *lookup;
144         gLookup(int size, const gPalette &pal, const gRGB &start, const gRGB &end);
145         gLookup();
146         ~gLookup() { delete [] lookup; }
147         void build(int size, const gPalette &pal, const gRGB &start, const gRGB &end);
148 };
149
150 struct gUnmanagedSurface
151 {
152         int x, y, bpp, bypp, stride;
153         gPalette clut;
154         void *data;
155         int data_phys;
156
157         gUnmanagedSurface();
158         gUnmanagedSurface(int width, int height, int bpp);
159 };
160
161 struct gSurface: gUnmanagedSurface
162 {
163         gSurface(): gUnmanagedSurface() {}
164         gSurface(int width, int height, int bpp, int accel);
165         ~gSurface();
166 private:
167         gSurface(const gSurface&); /* Copying managed gSurface is not allowed */
168         gSurface& operator =(const gSurface&);
169 };
170 #endif
171
172 class gRegion;
173
174 SWIG_IGNORE(gPixmap);
175 class gPixmap: public iObject
176 {
177         DECLARE_REF(gPixmap);
178 public:
179 #ifdef SWIG
180         gPixmap();
181 #else
182         enum
183         {
184                 blitAlphaTest=1,
185                 blitAlphaBlend=2,
186                 blitScale=4,
187                 blitKeepAspectRatio=8
188         };
189
190         enum {
191                 accelNever = -1,
192                 accelAuto = 0,
193                 accelAlways = 1,
194         };
195
196         typedef void (*gPixmapDisposeCallback)(gPixmap* pixmap);
197
198         gPixmap(gUnmanagedSurface *surface);
199         gPixmap(eSize, int bpp, int accel = 0);
200         gPixmap(int width, int height, int bpp, gPixmapDisposeCallback on_dispose, int accel = accelAuto);
201
202         gUnmanagedSurface *surface;
203
204         inline bool needClut() const { return surface && surface->bpp <= 8; }
205 #endif
206         virtual ~gPixmap();
207         eSize size() const { return eSize(surface->x, surface->y); }
208
209 private:
210         gPixmapDisposeCallback on_dispose;
211
212         friend class gDC;
213         void fill(const gRegion &clip, const gColor &color);
214         void fill(const gRegion &clip, const gRGB &color);
215
216         void blit(const gPixmap &src, const eRect &pos, const gRegion &clip, int flags=0);
217
218         void mergePalette(const gPixmap &target);
219         void line(const gRegion &clip, ePoint start, ePoint end, gColor color);
220         void line(const gRegion &clip, ePoint start, ePoint end, gRGB color);
221         void line(const gRegion &clip, ePoint start, ePoint end, unsigned int color);
222 };
223 SWIG_TEMPLATE_TYPEDEF(ePtr<gPixmap>, gPixmapPtr);
224
225 #endif