1 #ifndef __gpixelformat_h
2 #define __gpixelformat_h
7 // Bit layout of gPixelFormat:
9 // 28 24 20 16 12 8 5 0
10 // RRRR GGGG BBBB AAAA rrrr FFFF TTT bbbbb
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]
21 // types: RGB=0, Palette=1, Gray=2, Alpha=3, YUV=4
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
28 // Specific bits for Palette:
31 // Specific bits for Grey:
34 // Specific bits for Alpha:
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
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
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)
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)
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
80 #define __PIXEL_FMT_SET_COMPONENT(name, value) \
81 (((value) & __PIXEL_FMT_MASK(name)) << __PIXEL_FMT_SHIFT(name))
83 #define __PIXEL_FMT_GET_COMPONENT(fmt, name) \
84 (unsigned long)(((fmt) >> __PIXEL_FMT_SHIFT(name)) & __PIXEL_FMT_MASK(name))
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,
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)
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)
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)
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)
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)
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)
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)
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)
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)
143 // All multi-channel pixel formats are big-endian, i.e. correspond to the
144 // order of bytes stored in memory.
163 A_8 = E_PIXEL_FMT_ALPHA(8),
164 GRAY_8 = E_PIXEL_FMT_GRAY(8),
165 PALETTE_8 = E_PIXEL_FMT_PALETTE(8),
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),
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),
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),
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),
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),
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),
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),
197 static unsigned long bitsPerPixel(Format fmt);
198 static unsigned long bytesPerPixel(Format fmt);
199 static unsigned long size(Format fmt, Channel c);
201 static unsigned long byteOffset(Format fmt, Channel c);
202 static unsigned long shift(Format fmt, Channel c);
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);
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; }
218 static std::string name(Format fmt);
221 static Format g_preferredFormat;
222 static const enum Channel *byteOrder(unsigned long flags);
225 typedef gPixel::Format gPixelFormat;
227 #endif /* __gpixelformat_h */