From 0f21e4658659c58449e454c07c284e4e54ca1ab9 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Fri, 7 Nov 2025 11:00:55 -0800
Subject: [PATCH] Added support for SDL_PIXELFORMAT_INDEX8 to
SDL_BlitTriangle_Slow()
Fixes https://github.com/libsdl-org/SDL/issues/14419
---
src/render/software/SDL_triangle.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/src/render/software/SDL_triangle.c b/src/render/software/SDL_triangle.c
index 934851734e90a..856e336c91292 100644
--- a/src/render/software/SDL_triangle.c
+++ b/src/render/software/SDL_triangle.c
@@ -743,12 +743,16 @@ bool SDL_SW_BlitTriangle(
#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);