4.2.3r1
[enigma2.git] / usr / include / enigma2 / lib / gdi / gpixelformat.h
1 #ifndef __gpixelformat_h
2 #define __gpixelformat_h
3
4 #include <string>
5
6 //
7 // Bit layout of gPixelFormat:
8 //
9 //   28   24   20   16   12    8   5     0
10 // RRRR GGGG BBBB AAAA rrrr FFFF TTT bbbbb
11 //
12 // R = 4 bits: number of red or Y bits [0..15]
13 // G = 4 bits: number of green or U (Cb) bits [0..15]
14 // B = 4 bits: number of blue or V (Cr) bits [0..15]
15 // A = 4 bits: number of alpha or don't care bits [0..15]
16 // r = 4 bits: reserved [= 0]
17 // F = 4 bits: type specific flags
18 // T = 3 bits: type [0..7]
19 // b = 5 bits: bits per pixel minus 1 [0..31]
20 //
21 // types: RGB=0, Palette=1, Gray=2, Alpha=3, YUV=4
22 //
23 // Specific flags for RGB:
24 //  bit 0: has alpha: 0=no 1=yes
25 //  bit 1: color order: 0=RGB, 1=BGR
26 //  bit 2: alpha position: 0=MSB, 1=LSB
27 //
28 // Specific bits for Palette:
29 //  None
30 //
31 // Specific bits for Grey:
32 //  None
33 //
34 // Specific bits for Alpha:
35 //  None
36 //
37 // Specific flags for YUV:
38 //  bit 0: has alpha: 0=no 1=yes
39 //  bit 1: color order: 0=RGB, 1=BGR
40 //  bit 2: alpha position: 0=MSB, 1=LSB
41 //  bit 3: format: 0=packed, 1=planar
42 //
43
44 #define __PIXEL_FMT_SHIFT_SIZE_R        28
45 #define __PIXEL_FMT_MASK_SIZE_R         0x0f
46 #define __PIXEL_FMT_SHIFT_SIZE_G        24
47 #define __PIXEL_FMT_MASK_SIZE_G         0x0f
48 #define __PIXEL_FMT_SHIFT_SIZE_B        20
49 #define __PIXEL_FMT_MASK_SIZE_B         0x0f
50 #define __PIXEL_FMT_SHIFT_SIZE_A        16
51 #define __PIXEL_FMT_MASK_SIZE_A         0x0f
52 #define __PIXEL_FMT_SHIFT_FLAGS         8
53 #define __PIXEL_FMT_MASK_FLAGS          0xff
54 #define __PIXEL_FMT_SHIFT_TYPE          5
55 #define __PIXEL_FMT_MASK_TYPE           0x07
56 #define __PIXEL_FMT_SHIFT_BPP           0
57 #define __PIXEL_FMT_MASK_BPP            0x3f
58
59 #define __PIXEL_FMT_FLAG_RGB_BYTE_ORDER_RGB     (0 << 0)
60 #define __PIXEL_FMT_FLAG_RGB_BYTE_ORDER_BGR     (1 << 0)
61 #define __PIXEL_FMT_FLAG_RGB_ALPHA_FIRST        (0 << 1)
62 #define __PIXEL_FMT_FLAG_RGB_ALPHA_LAST         (1 << 1)
63 #define __PIXEL_FMT_FLAG_RGB_NO_ALPHA           (0 << 2)
64 #define __PIXEL_FMT_FLAG_RGB_HAS_ALPHA          (1 << 2)
65
66 #define __PIXEL_FMT_FLAG_YUV_BYTE_ORDER_YUV     (0 << 0)
67 #define __PIXEL_FMT_FLAG_YUV_BYTE_ORDER_YVU     (1 << 0)
68 #define __PIXEL_FMT_FLAG_YUV_ALPHA_FIRST        (0 << 1)
69 #define __PIXEL_FMT_FLAG_YUV_ALPHA_LAST         (1 << 1)
70 #define __PIXEL_FMT_FLAG_YUV_NO_ALPHA           (0 << 2)
71 #define __PIXEL_FMT_FLAG_YUV_HAS_ALPHA          (1 << 2)
72 #define __PIXEL_FMT_FLAG_YUV_PACKED             (0 << 3)
73 #define __PIXEL_FMT_FLAG_YUV_PLANAR             (1 << 3)
74
75 #define __PIXEL_FMT_MASK(name)          __PIXEL_FMT_MASK_##name
76 #define __PIXEL_FMT_SHIFT(name)         __PIXEL_FMT_SHIFT_##name
77 #define __PIXEL_FMT_FLAG_RGB(name)      __PIXEL_FMT_FLAG_RGB_##name
78 #define __PIXEL_FMT_FLAG_YUV(name)      __PIXEL_FMT_FLAG_YUV_##name
79
80 #define __PIXEL_FMT_SET_COMPONENT(name, value)  \
81         (((value) & __PIXEL_FMT_MASK(name)) << __PIXEL_FMT_SHIFT(name))
82
83 #define __PIXEL_FMT_GET_COMPONENT(fmt, name)    \
84         (unsigned long)(((fmt) >> __PIXEL_FMT_SHIFT(name)) & __PIXEL_FMT_MASK(name))
85
86 enum {
87         __PIXEL_FMT_TYPE_RGB = 0,
88         __PIXEL_FMT_TYPE_PALETTE = 1,
89         __PIXEL_FMT_TYPE_GRAY = 2,
90         __PIXEL_FMT_TYPE_ALPHA = 3,
91         __PIXEL_FMT_TYPE_YUV = 4,
92 };
93
94 #define __PIXEL_FMT_RGB_TEMPLATE(sr, sg, sb, sa, byte_order, alpha_pos, has_alpha) \
95         __PIXEL_FMT_SET_COMPONENT(SIZE_R, sr) | \
96         __PIXEL_FMT_SET_COMPONENT(SIZE_G, sg) | \
97         __PIXEL_FMT_SET_COMPONENT(SIZE_B, sb) | \
98         __PIXEL_FMT_SET_COMPONENT(SIZE_A, sa) | \
99         __PIXEL_FMT_SET_COMPONENT(FLAGS, \
100                 __PIXEL_FMT_FLAG_RGB(byte_order) | \
101                 __PIXEL_FMT_FLAG_RGB(alpha_pos) | \
102                 __PIXEL_FMT_FLAG_RGB(has_alpha)) | \
103         __PIXEL_FMT_SET_COMPONENT(TYPE, __PIXEL_FMT_TYPE_RGB) | \
104         __PIXEL_FMT_SET_COMPONENT(BPP, sr + sg + sb + sa - 1)
105
106 #define E_PIXEL_FMT_RGB(sr, sg, sb, byte_order) \
107         __PIXEL_FMT_RGB_TEMPLATE(sr, sg, sb, 0, byte_order, ALPHA_FIRST, NO_ALPHA)
108
109 #define E_PIXEL_FMT_RGBA(sr, sg, sb, sa, byte_order, alpha_pos) \
110         __PIXEL_FMT_RGB_TEMPLATE(sr, sg, sb, sa, byte_order, alpha_pos, HAS_ALPHA)
111
112 #define E_PIXEL_FMT_RGBX(sr, sg, sb, sa, byte_order, alpha_pos) \
113         __PIXEL_FMT_RGB_TEMPLATE(sr, sg, sb, sa, byte_order, alpha_pos, NO_ALPHA)
114
115 #define E_PIXEL_FMT_PALETTE(bpp) \
116         __PIXEL_FMT_SET_COMPONENT(TYPE, __PIXEL_FMT_TYPE_PALETTE) | \
117         __PIXEL_FMT_SET_COMPONENT(BPP, bpp - 1)
118
119 #define E_PIXEL_FMT_ALPHA(bpp) \
120         __PIXEL_FMT_SET_COMPONENT(TYPE, __PIXEL_FMT_TYPE_ALPHA) | \
121         __PIXEL_FMT_SET_COMPONENT(BPP, bpp - 1)
122
123 #define E_PIXEL_FMT_GRAY(bpp) \
124         __PIXEL_FMT_SET_COMPONENT(TYPE, __PIXEL_FMT_TYPE_GRAY) | \
125         __PIXEL_FMT_SET_COMPONENT(BPP, bpp - 1)
126
127 #define __PIXEL_FMT_YUV_TEMPLATE(sy, su, sv, sa, byte_order, alpha_pos, has_alpha, planar) \
128         __PIXEL_FMT_SET_COMPONENT(SIZE_R, sy) | \
129         __PIXEL_FMT_SET_COMPONENT(SIZE_G, su) | \
130         __PIXEL_FMT_SET_COMPONENT(SIZE_B, sv) | \
131         __PIXEL_FMT_SET_COMPONENT(SIZE_A, sa) | \
132         __PIXEL_FMT_SET_COMPONENT(FLAGS, \
133                 __PIXEL_FMT_FLAG_YUV(byte_order) | \
134                 __PIXEL_FMT_FLAG_YUV(alpha_pos) | \
135                 __PIXEL_FMT_FLAG_YUV(has_alpha) | \
136                 __PIXEL_FMT_FLAG_YUV(planar)) | \
137         __PIXEL_FMT_SET_COMPONENT(TYPE, __PIXEL_FMT_TYPE_YUV) | \
138         __PIXEL_FMT_SET_COMPONENT(BPP, sy + su + sv + sa - 1)
139
140 #define E_PIXEL_FMT_YUV(sy, su, sv, byte_order, planar) \
141         __PIXEL_FMT_YUV_TEMPLATE(sy, su, sv, 0, byte_order, ALPHA_FIRST, NO_ALPHA, planar)
142
143 // All multi-channel pixel formats are big-endian, i.e. correspond to the
144 // order of bytes stored in memory.
145 class gPixel {
146 public:
147         enum Channel {
148                 R,
149                 Y = R,
150                 G,
151                 U = G,
152                 Cb = U,
153                 B,
154                 V = B,
155                 Cr = V,
156                 A,
157                 X = A,
158         };
159
160         enum Format {
161                 ANY = 0,
162
163                 A_8 = E_PIXEL_FMT_ALPHA(8),
164                 GRAY_8 = E_PIXEL_FMT_GRAY(8),
165                 PALETTE_8 = E_PIXEL_FMT_PALETTE(8),
166
167                 RGBA_4444 = E_PIXEL_FMT_RGBA(4, 4, 4, 4, BYTE_ORDER_RGB, ALPHA_LAST),
168                 ARGB_4444 = E_PIXEL_FMT_RGBA(4, 4, 4, 4, BYTE_ORDER_RGB, ALPHA_FIRST),
169                 BGRA_4444 = E_PIXEL_FMT_RGBA(4, 4, 4, 4, BYTE_ORDER_BGR, ALPHA_LAST),
170                 ABGR_4444 = E_PIXEL_FMT_RGBA(4, 4, 4, 4, BYTE_ORDER_BGR, ALPHA_FIRST),
171
172                 RGBA_5551 = E_PIXEL_FMT_RGBA(5, 5, 5, 1, BYTE_ORDER_RGB, ALPHA_LAST),
173                 ARGB_1555 = E_PIXEL_FMT_RGBA(5, 5, 5, 1, BYTE_ORDER_RGB, ALPHA_FIRST),
174                 BGRA_5551 = E_PIXEL_FMT_RGBA(5, 5, 5, 1, BYTE_ORDER_BGR, ALPHA_LAST),
175                 ABGR_1555 = E_PIXEL_FMT_RGBA(5, 5, 5, 1, BYTE_ORDER_BGR, ALPHA_FIRST),
176
177                 RGB_565 = E_PIXEL_FMT_RGB(5, 6, 5, BYTE_ORDER_RGB),
178                 BGR_565 = E_PIXEL_FMT_RGB(5, 6, 5, BYTE_ORDER_BGR),
179
180                 RGB_888 = E_PIXEL_FMT_RGB(8, 8, 8, BYTE_ORDER_RGB),
181                 BGR_888 = E_PIXEL_FMT_RGB(8, 8, 8, BYTE_ORDER_BGR),
182
183                 RGBX_8888 = E_PIXEL_FMT_RGBX(8, 8, 8, 8, BYTE_ORDER_RGB, ALPHA_LAST),
184                 XRGB_8888 = E_PIXEL_FMT_RGBX(8, 8, 8, 8, BYTE_ORDER_RGB, ALPHA_FIRST),
185                 BGRX_8888 = E_PIXEL_FMT_RGBX(8, 8, 8, 8, BYTE_ORDER_BGR, ALPHA_LAST),
186                 XBGR_8888 = E_PIXEL_FMT_RGBX(8, 8, 8, 8, BYTE_ORDER_BGR, ALPHA_FIRST),
187
188                 RGBA_8888 = E_PIXEL_FMT_RGBA(8, 8, 8, 8, BYTE_ORDER_RGB, ALPHA_LAST),
189                 ARGB_8888 = E_PIXEL_FMT_RGBA(8, 8, 8, 8, BYTE_ORDER_RGB, ALPHA_FIRST),
190                 BGRA_8888 = E_PIXEL_FMT_RGBA(8, 8, 8, 8, BYTE_ORDER_BGR, ALPHA_LAST),
191                 ABGR_8888 = E_PIXEL_FMT_RGBA(8, 8, 8, 8, BYTE_ORDER_BGR, ALPHA_FIRST),
192
193                 YUV_NV12 = E_PIXEL_FMT_YUV(8, 8, 8, BYTE_ORDER_YUV, PLANAR),
194                 YUV_NV21 = E_PIXEL_FMT_YUV(8, 8, 8, BYTE_ORDER_YVU, PLANAR),
195         };
196
197         static unsigned long bitsPerPixel(Format fmt);
198         static unsigned long bytesPerPixel(Format fmt);
199         static unsigned long size(Format fmt, Channel c);
200
201         static unsigned long byteOffset(Format fmt, Channel c);
202         static unsigned long shift(Format fmt, Channel c);
203
204         static unsigned int fromRGBA(Format fmt, unsigned long r, unsigned long g, unsigned long b, unsigned long a, unsigned long bitsPerChannel = 8);
205         static void toRGBA(Format fmt, unsigned int pixel, unsigned long *r, unsigned long *g, unsigned long *b, unsigned long *a, unsigned long bitsPerChannel = 8);
206         static bool isGray(Format fmt);
207         static bool isAlphaFirst(Format fmt);
208         static bool isBgr(Format fmt);
209         static bool hasAlpha(Format fmt);
210         static bool isIndexed(Format fmt);
211         static bool isPlanar(Format fmt);
212
213         static Format createFormat(unsigned long rsize, unsigned long gsize, unsigned long bsize, unsigned long asize, bool isBgr, bool alphaLast, bool hasAlpha);
214         static Format alphaPixelFormat(Format fmt);
215         static inline Format preferredFormat() { return g_preferredFormat; }
216         static void setPreferredFormat(Format fmt) { g_preferredFormat = fmt; }
217
218         static std::string name(Format fmt);
219
220 private:
221         static Format g_preferredFormat;
222         static const enum Channel *byteOrder(unsigned long flags);
223 };
224
225 typedef gPixel::Format gPixelFormat;
226
227 #endif /* __gpixelformat_h */