1 /* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2014 Sam Lantinga <slouken (at) libsdl.org> 4 5 This software is provided 'as-is', without any express or implied 6 warranty. In no event will the authors be held liable for any damages 7 arising from the use of this software. 8 9 Permission is granted to anyone to use this software for any purpose, 10 including commercial applications, and to alter it and redistribute it 11 freely, subject to the following restrictions: 12 13 1. The origin of this software must not be misrepresented; you must not 14 claim that you wrote the original software. If you use this software 15 in a product, an acknowledgment in the product documentation would be 16 appreciated but is not required. 17 2. Altered source versions must be plainly marked as such, and must not be 18 misrepresented as being the original software. 19 3. This notice may not be removed or altered from any source distribution. 20 */ 21 22 /** 23 * \file SDL_pixels.h 24 * 25 * Header for the enumerated pixel format definitions. 26 */ 27 28 #ifndef _SDL_pixels_h 29 #define _SDL_pixels_h 30 31 #include "SDL_stdinc.h" 32 33 #include "begin_code.h" 34 /* Set up for C function definitions, even when using C++ */ 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 /** 40 * \name Transparency definitions 41 * 42 * These define alpha as the opacity of a surface. 43 */ 44 /* @{ */ 45 #define SDL_ALPHA_OPAQUE 255 46 #define SDL_ALPHA_TRANSPARENT 0 47 /* @} */ 48 49 /** Pixel type. */ 50 enum 51 { 52 SDL_PIXELTYPE_UNKNOWN, 53 SDL_PIXELTYPE_INDEX1, 54 SDL_PIXELTYPE_INDEX4, 55 SDL_PIXELTYPE_INDEX8, 56 SDL_PIXELTYPE_PACKED8, 57 SDL_PIXELTYPE_PACKED16, 58 SDL_PIXELTYPE_PACKED32, 59 SDL_PIXELTYPE_ARRAYU8, 60 SDL_PIXELTYPE_ARRAYU16, 61 SDL_PIXELTYPE_ARRAYU32, 62 SDL_PIXELTYPE_ARRAYF16, 63 SDL_PIXELTYPE_ARRAYF32 64 }; 65 66 /** Bitmap pixel order, high bit -> low bit. */ 67 enum 68 { 69 SDL_BITMAPORDER_NONE, 70 SDL_BITMAPORDER_4321, 71 SDL_BITMAPORDER_1234 72 }; 73 74 /** Packed component order, high bit -> low bit. */ 75 enum 76 { 77 SDL_PACKEDORDER_NONE, 78 SDL_PACKEDORDER_XRGB, 79 SDL_PACKEDORDER_RGBX, 80 SDL_PACKEDORDER_ARGB, 81 SDL_PACKEDORDER_RGBA, 82 SDL_PACKEDORDER_XBGR, 83 SDL_PACKEDORDER_BGRX, 84 SDL_PACKEDORDER_ABGR, 85 SDL_PACKEDORDER_BGRA 86 }; 87 88 /** Array component order, low byte -> high byte. */ 89 enum 90 { 91 SDL_ARRAYORDER_NONE, 92 SDL_ARRAYORDER_RGB, 93 SDL_ARRAYORDER_RGBA, 94 SDL_ARRAYORDER_ARGB, 95 SDL_ARRAYORDER_BGR, 96 SDL_ARRAYORDER_BGRA, 97 SDL_ARRAYORDER_ABGR 98 }; 99 100 /** Packed component layout. */ 101 enum 102 { 103 SDL_PACKEDLAYOUT_NONE, 104 SDL_PACKEDLAYOUT_332, 105 SDL_PACKEDLAYOUT_4444, 106 SDL_PACKEDLAYOUT_1555, 107 SDL_PACKEDLAYOUT_5551, 108 SDL_PACKEDLAYOUT_565, 109 SDL_PACKEDLAYOUT_8888, 110 SDL_PACKEDLAYOUT_2101010, 111 SDL_PACKEDLAYOUT_1010102 112 }; 113 114 #define SDL_DEFINE_PIXELFOURCC(A, B, C, D) SDL_FOURCC(A, B, C, D) 115 116 #define SDL_DEFINE_PIXELFORMAT(type, order, layout, bits, bytes) \ 117 ((1 << 28) | ((type) << 24) | ((order) << 20) | ((layout) << 16) | \ 118 ((bits) << 8) | ((bytes) << 0)) 119 120 #define SDL_PIXELFLAG(X) (((X) >> 28) & 0x0F) 121 #define SDL_PIXELTYPE(X) (((X) >> 24) & 0x0F) 122 #define SDL_PIXELORDER(X) (((X) >> 20) & 0x0F) 123 #define SDL_PIXELLAYOUT(X) (((X) >> 16) & 0x0F) 124 #define SDL_BITSPERPIXEL(X) (((X) >> 8) & 0xFF) 125 #define SDL_BYTESPERPIXEL(X) \ 126 (SDL_ISPIXELFORMAT_FOURCC(X) ? \ 127 ((((X) == SDL_PIXELFORMAT_YUY2) || \ 128 ((X) == SDL_PIXELFORMAT_UYVY) || \ 129 ((X) == SDL_PIXELFORMAT_YVYU)) ? 2 : 1) : (((X) >> 0) & 0xFF)) 130 131 #define SDL_ISPIXELFORMAT_INDEXED(format) \ 132 (!SDL_ISPIXELFORMAT_FOURCC(format) && \ 133 ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1) || \ 134 (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) || \ 135 (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8))) 136 137 #define SDL_ISPIXELFORMAT_ALPHA(format) \ 138 (!SDL_ISPIXELFORMAT_FOURCC(format) && \ 139 ((SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB) || \ 140 (SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA) || \ 141 (SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR) || \ 142 (SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA))) 143 144 /* The flag is set to 1 because 0x1? is not in the printable ASCII range */ 145 #define SDL_ISPIXELFORMAT_FOURCC(format) \ 146 ((format) && (SDL_PIXELFLAG(format) != 1)) 147 148 /* Note: If you modify this list, update SDL_GetPixelFormatName() */ 149 enum 150 { 151 SDL_PIXELFORMAT_UNKNOWN, 152 SDL_PIXELFORMAT_INDEX1LSB = 153 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_4321, 0, 154 1, 0), 155 SDL_PIXELFORMAT_INDEX1MSB = 156 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_1234, 0, 157 1, 0), 158 SDL_PIXELFORMAT_INDEX4LSB = 159 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_4321, 0, 160 4, 0), 161 SDL_PIXELFORMAT_INDEX4MSB = 162 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_1234, 0, 163 4, 0), 164 SDL_PIXELFORMAT_INDEX8 = 165 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX8, 0, 0, 8, 1), 166 SDL_PIXELFORMAT_RGB332 = 167 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED8, SDL_PACKEDORDER_XRGB, 168 SDL_PACKEDLAYOUT_332, 8, 1), 169 SDL_PIXELFORMAT_RGB444 = 170 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, 171 SDL_PACKEDLAYOUT_4444, 12, 2), 172 SDL_PIXELFORMAT_RGB555 = 173 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, 174 SDL_PACKEDLAYOUT_1555, 15, 2), 175 SDL_PIXELFORMAT_BGR555 = 176 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, 177 SDL_PACKEDLAYOUT_1555, 15, 2), 178 SDL_PIXELFORMAT_ARGB4444 = 179 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB, 180 SDL_PACKEDLAYOUT_4444, 16, 2), 181 SDL_PIXELFORMAT_RGBA4444 = 182 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA, 183 SDL_PACKEDLAYOUT_4444, 16, 2), 184 SDL_PIXELFORMAT_ABGR4444 = 185 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR, 186 SDL_PACKEDLAYOUT_4444, 16, 2), 187 SDL_PIXELFORMAT_BGRA4444 = 188 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA, 189 SDL_PACKEDLAYOUT_4444, 16, 2), 190 SDL_PIXELFORMAT_ARGB1555 = 191 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB, 192 SDL_PACKEDLAYOUT_1555, 16, 2), 193 SDL_PIXELFORMAT_RGBA5551 = 194 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA, 195 SDL_PACKEDLAYOUT_5551, 16, 2), 196 SDL_PIXELFORMAT_ABGR1555 = 197 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR, 198 SDL_PACKEDLAYOUT_1555, 16, 2), 199 SDL_PIXELFORMAT_BGRA5551 = 200 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA, 201 SDL_PACKEDLAYOUT_5551, 16, 2), 202 SDL_PIXELFORMAT_RGB565 = 203 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, 204 SDL_PACKEDLAYOUT_565, 16, 2), 205 SDL_PIXELFORMAT_BGR565 = 206 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, 207 SDL_PACKEDLAYOUT_565, 16, 2), 208 SDL_PIXELFORMAT_RGB24 = 209 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_RGB, 0, 210 24, 3), 211 SDL_PIXELFORMAT_BGR24 = 212 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_BGR, 0, 213 24, 3), 214 SDL_PIXELFORMAT_RGB888 = 215 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XRGB, 216 SDL_PACKEDLAYOUT_8888, 24, 4), 217 SDL_PIXELFORMAT_RGBX8888 = 218 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBX, 219 SDL_PACKEDLAYOUT_8888, 24, 4), 220 SDL_PIXELFORMAT_BGR888 = 221 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XBGR, 222 SDL_PACKEDLAYOUT_8888, 24, 4), 223 SDL_PIXELFORMAT_BGRX8888 = 224 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRX, 225 SDL_PACKEDLAYOUT_8888, 24, 4), 226 SDL_PIXELFORMAT_ARGB8888 = 227 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, 228 SDL_PACKEDLAYOUT_8888, 32, 4), 229 SDL_PIXELFORMAT_RGBA8888 = 230 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBA, 231 SDL_PACKEDLAYOUT_8888, 32, 4), 232 SDL_PIXELFORMAT_ABGR8888 = 233 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ABGR, 234 SDL_PACKEDLAYOUT_8888, 32, 4), 235 SDL_PIXELFORMAT_BGRA8888 = 236 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRA, 237 SDL_PACKEDLAYOUT_8888, 32, 4), 238 SDL_PIXELFORMAT_ARGB2101010 = 239 SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, 240 SDL_PACKEDLAYOUT_2101010, 32, 4), 241 242 SDL_PIXELFORMAT_YV12 = /**< Planar mode: Y + V + U (3 planes) */ 243 SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2'), 244 SDL_PIXELFORMAT_IYUV = /**< Planar mode: Y + U + V (3 planes) */ 245 SDL_DEFINE_PIXELFOURCC('I', 'Y', 'U', 'V'), 246 SDL_PIXELFORMAT_YUY2 = /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */ 247 SDL_DEFINE_PIXELFOURCC('Y', 'U', 'Y', '2'), 248 SDL_PIXELFORMAT_UYVY = /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */ 249 SDL_DEFINE_PIXELFOURCC('U', 'Y', 'V', 'Y'), 250 SDL_PIXELFORMAT_YVYU = /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */ 251 SDL_DEFINE_PIXELFOURCC('Y', 'V', 'Y', 'U') 252 }; 253 254 typedef struct SDL_Color 255 { 256 Uint8 r; 257 Uint8 g; 258 Uint8 b; 259 Uint8 a; 260 } SDL_Color; 261 #define SDL_Colour SDL_Color 262 263 typedef struct SDL_Palette 264 { 265 int ncolors; 266 SDL_Color *colors; 267 Uint32 version; 268 int refcount; 269 } SDL_Palette; 270 271 /** 272 * \note Everything in the pixel format structure is read-only. 273 */ 274 typedef struct SDL_PixelFormat 275 { 276 Uint32 format; 277 SDL_Palette *palette; 278 Uint8 BitsPerPixel; 279 Uint8 BytesPerPixel; 280 Uint8 padding[2]; 281 Uint32 Rmask; 282 Uint32 Gmask; 283 Uint32 Bmask; 284 Uint32 Amask; 285 Uint8 Rloss; 286 Uint8 Gloss; 287 Uint8 Bloss; 288 Uint8 Aloss; 289 Uint8 Rshift; 290 Uint8 Gshift; 291 Uint8 Bshift; 292 Uint8 Ashift; 293 int refcount; 294 struct SDL_PixelFormat *next; 295 } SDL_PixelFormat; 296 297 /** 298 * \brief Get the human readable name of a pixel format 299 */ 300 extern DECLSPEC const char* SDLCALL SDL_GetPixelFormatName(Uint32 format); 301 302 /** 303 * \brief Convert one of the enumerated pixel formats to a bpp and RGBA masks. 304 * 305 * \return SDL_TRUE, or SDL_FALSE if the conversion wasn't possible. 306 * 307 * \sa SDL_MasksToPixelFormatEnum() 308 */ 309 extern DECLSPEC SDL_bool SDLCALL SDL_PixelFormatEnumToMasks(Uint32 format, 310 int *bpp, 311 Uint32 * Rmask, 312 Uint32 * Gmask, 313 Uint32 * Bmask, 314 Uint32 * Amask); 315 316 /** 317 * \brief Convert a bpp and RGBA masks to an enumerated pixel format. 318 * 319 * \return The pixel format, or ::SDL_PIXELFORMAT_UNKNOWN if the conversion 320 * wasn't possible. 321 * 322 * \sa SDL_PixelFormatEnumToMasks() 323 */ 324 extern DECLSPEC Uint32 SDLCALL SDL_MasksToPixelFormatEnum(int bpp, 325 Uint32 Rmask, 326 Uint32 Gmask, 327 Uint32 Bmask, 328 Uint32 Amask); 329 330 /** 331 * \brief Create an SDL_PixelFormat structure from a pixel format enum. 332 */ 333 extern DECLSPEC SDL_PixelFormat * SDLCALL SDL_AllocFormat(Uint32 pixel_format); 334 335 /** 336 * \brief Free an SDL_PixelFormat structure. 337 */ 338 extern DECLSPEC void SDLCALL SDL_FreeFormat(SDL_PixelFormat *format); 339 340 /** 341 * \brief Create a palette structure with the specified number of color 342 * entries. 343 * 344 * \return A new palette, or NULL if there wasn't enough memory. 345 * 346 * \note The palette entries are initialized to white. 347 * 348 * \sa SDL_FreePalette() 349 */ 350 extern DECLSPEC SDL_Palette *SDLCALL SDL_AllocPalette(int ncolors); 351 352 /** 353 * \brief Set the palette for a pixel format structure. 354 */ 355 extern DECLSPEC int SDLCALL SDL_SetPixelFormatPalette(SDL_PixelFormat * format, 356 SDL_Palette *palette); 357 358 /** 359 * \brief Set a range of colors in a palette. 360 * 361 * \param palette The palette to modify. 362 * \param colors An array of colors to copy into the palette. 363 * \param firstcolor The index of the first palette entry to modify. 364 * \param ncolors The number of entries to modify. 365 * 366 * \return 0 on success, or -1 if not all of the colors could be set. 367 */ 368 extern DECLSPEC int SDLCALL SDL_SetPaletteColors(SDL_Palette * palette, 369 const SDL_Color * colors, 370 int firstcolor, int ncolors); 371 372 /** 373 * \brief Free a palette created with SDL_AllocPalette(). 374 * 375 * \sa SDL_AllocPalette() 376 */ 377 extern DECLSPEC void SDLCALL SDL_FreePalette(SDL_Palette * palette); 378 379 /** 380 * \brief Maps an RGB triple to an opaque pixel value for a given pixel format. 381 * 382 * \sa SDL_MapRGBA 383 */ 384 extern DECLSPEC Uint32 SDLCALL SDL_MapRGB(const SDL_PixelFormat * format, 385 Uint8 r, Uint8 g, Uint8 b); 386 387 /** 388 * \brief Maps an RGBA quadruple to a pixel value for a given pixel format. 389 * 390 * \sa SDL_MapRGB 391 */ 392 extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA(const SDL_PixelFormat * format, 393 Uint8 r, Uint8 g, Uint8 b, 394 Uint8 a); 395 396 /** 397 * \brief Get the RGB components from a pixel of the specified format. 398 * 399 * \sa SDL_GetRGBA 400 */ 401 extern DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, 402 const SDL_PixelFormat * format, 403 Uint8 * r, Uint8 * g, Uint8 * b); 404 405 /** 406 * \brief Get the RGBA components from a pixel of the specified format. 407 * 408 * \sa SDL_GetRGB 409 */ 410 extern DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, 411 const SDL_PixelFormat * format, 412 Uint8 * r, Uint8 * g, Uint8 * b, 413 Uint8 * a); 414 415 /** 416 * \brief Calculate a 256 entry gamma ramp for a gamma value. 417 */ 418 extern DECLSPEC void SDLCALL SDL_CalculateGammaRamp(float gamma, Uint16 * ramp); 419 420 421 /* Ends C function definitions when using C++ */ 422 #ifdef __cplusplus 423 } 424 #endif 425 #include "close_code.h" 426 427 #endif /* _SDL_pixels_h */ 428 429 /* vi: set ts=4 sw=4 expandtab: */ 430