diff --git a/src/render/software/SDL_triangle.c b/src/render/software/SDL_triangle.c index 934851734e..856e336c91 100644 --- a/src/render/software/SDL_triangle.c +++ b/src/render/software/SDL_triangle.c @@ -743,12 +743,16 @@ end: #define FORMAT_ALPHA 0 #define FORMAT_NO_ALPHA -1 +#define FORMAT_INDEX8 -2 #define FORMAT_2101010 1 +#define FORMAT_INDEXED(format) format == FORMAT_INDEX8 #define FORMAT_HAS_ALPHA(format) format == 0 #define FORMAT_HAS_NO_ALPHA(format) format < 0 static int detect_format(const SDL_PixelFormatDetails *pf) { - if (pf->format == SDL_PIXELFORMAT_ARGB2101010) { + if (SDL_ISPIXELFORMAT_INDEXED(pf->format)) { + return FORMAT_INDEX8; + } if (pf->format == SDL_PIXELFORMAT_ARGB2101010) { return FORMAT_2101010; } else if (pf->Amask) { return FORMAT_ALPHA; @@ -766,6 +770,7 @@ static void SDL_BlitTriangle_Slow(SDL_BlitInfo *info, SDL_TextureAddressMode texture_address_mode_v) { SDL_Surface *src_surface = info->src_surface; + SDL_Palette *palette = src_surface->palette; const int flags = info->flags; Uint32 modulateR = info->r; Uint32 modulateG = info->g; @@ -796,7 +801,13 @@ static void SDL_BlitTriangle_Slow(SDL_BlitInfo *info, Uint8 *dst = dptr; TRIANGLE_GET_TEXTCOORD src = (info->src + (srcy * info->src_pitch) + (srcx * srcbpp)); - if (FORMAT_HAS_ALPHA(srcfmt_val)) { + if (FORMAT_INDEXED(srcfmt_val)) { + const SDL_Color *color = &palette->colors[*src]; + srcR = color->r; + srcG = color->g; + srcB = color->b; + srcA = color->a; + } else if (FORMAT_HAS_ALPHA(srcfmt_val)) { DISEMBLE_RGBA(src, srcbpp, src_fmt, srcpixel, srcR, srcG, srcB, srcA); } else if (FORMAT_HAS_NO_ALPHA(srcfmt_val)) { DISEMBLE_RGB(src, srcbpp, src_fmt, srcpixel, srcR, srcG, srcB);