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