From 74bfc913ac47600ecb01db4fb576471c1abc891a Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 21 Feb 2026 12:51:26 -0800 Subject: [PATCH] Improved support for byte array pixel formats Fixes https://github.com/libsdl-org/SDL/issues/15082 (cherry picked from commit 4f06087b361eea5ebab50e0c9d119a56374815cc) --- src/video/SDL_pixels.c | 104 ++++++++++++++++++++++++++++++++++------- 1 file changed, 86 insertions(+), 18 deletions(-) diff --git a/src/video/SDL_pixels.c b/src/video/SDL_pixels.c index 3f828147f7..444f98e50f 100644 --- a/src/video/SDL_pixels.c +++ b/src/video/SDL_pixels.c @@ -259,30 +259,98 @@ bool SDL_GetMasksForPixelFormat(SDL_PixelFormat format, int *bpp, Uint32 *Rmask, } *Rmask = *Gmask = *Bmask = *Amask = 0; - if (format == SDL_PIXELFORMAT_RGB24) { + if (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU8) { + switch (SDL_BYTESPERPIXEL(format)) { + case 3: + switch (SDL_PIXELORDER(format)) { + case SDL_ARRAYORDER_RGB: #if SDL_BYTEORDER == SDL_BIG_ENDIAN - *Rmask = 0x00FF0000; - *Gmask = 0x0000FF00; - *Bmask = 0x000000FF; + *Rmask = 0x00FF0000; + *Gmask = 0x0000FF00; + *Bmask = 0x000000FF; #else - *Rmask = 0x000000FF; - *Gmask = 0x0000FF00; - *Bmask = 0x00FF0000; + *Rmask = 0x000000FF; + *Gmask = 0x0000FF00; + *Bmask = 0x00FF0000; #endif - return true; - } - - if (format == SDL_PIXELFORMAT_BGR24) { + return true; + case SDL_ARRAYORDER_BGR: #if SDL_BYTEORDER == SDL_BIG_ENDIAN - *Rmask = 0x000000FF; - *Gmask = 0x0000FF00; - *Bmask = 0x00FF0000; + *Rmask = 0x000000FF; + *Gmask = 0x0000FF00; + *Bmask = 0x00FF0000; #else - *Rmask = 0x00FF0000; - *Gmask = 0x0000FF00; - *Bmask = 0x000000FF; + *Rmask = 0x00FF0000; + *Gmask = 0x0000FF00; + *Bmask = 0x000000FF; #endif - return true; + return true; + default: + break; + } + break; + case 4: + switch (SDL_PIXELORDER(format)) { + case SDL_ARRAYORDER_RGBA: +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + *Rmask = 0xFF000000; + *Gmask = 0x00FF0000; + *Bmask = 0x0000FF00; + *Amask = 0x000000FF; +#else + *Rmask = 0x000000FF; + *Gmask = 0x0000FF00; + *Bmask = 0x00FF0000; + *Amask = 0xFF000000; +#endif + return true; + case SDL_ARRAYORDER_ARGB: +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + *Rmask = 0x00FF0000; + *Gmask = 0x0000FF00; + *Bmask = 0x000000FF; + *Amask = 0xFF000000; +#else + *Rmask = 0x0000FF00; + *Gmask = 0x00FF0000; + *Bmask = 0xFF000000; + *Amask = 0x000000FF; +#endif + return true; + case SDL_ARRAYORDER_BGRA: +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + *Rmask = 0x0000FF00; + *Gmask = 0x00FF0000; + *Bmask = 0xFF000000; + *Amask = 0x000000FF; +#else + *Rmask = 0x00FF0000; + *Gmask = 0x0000FF00; + *Bmask = 0x000000FF; + *Amask = 0xFF000000; +#endif + return true; + case SDL_ARRAYORDER_ABGR: +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + *Rmask = 0x000000FF; + *Gmask = 0x0000FF00; + *Bmask = 0x00FF0000; + *Amask = 0xFF000000; +#else + *Rmask = 0xFF000000; + *Gmask = 0x00FF0000; + *Bmask = 0x0000FF00; + *Amask = 0x000000FF; +#endif + return true; + default: + break; + } + break; + default: + break; + } + return SDL_SetError("Unknown pixel format"); } if (SDL_PIXELTYPE(format) != SDL_PIXELTYPE_PACKED8 &&