Selaa lähdekoodia

Added support for SDL_PIXELFORMAT_INDEX8 to SDL_BlitTriangle_Slow()

Fixes https://github.com/libsdl-org/SDL/issues/14419
Sam Lantinga 4 kuukautta sitten
vanhempi
commit
0f21e46586
1 muutettua tiedostoa jossa 13 lisäystä ja 2 poistoa
  1. 13 2
      src/render/software/SDL_triangle.c

+ 13 - 2
src/render/software/SDL_triangle.c

@@ -743,12 +743,16 @@ end:
 
 
 #define FORMAT_ALPHA                0
 #define FORMAT_ALPHA                0
 #define FORMAT_NO_ALPHA             -1
 #define FORMAT_NO_ALPHA             -1
+#define FORMAT_INDEX8               -2
 #define FORMAT_2101010              1
 #define FORMAT_2101010              1
+#define FORMAT_INDEXED(format)      format == FORMAT_INDEX8
 #define FORMAT_HAS_ALPHA(format)    format == 0
 #define FORMAT_HAS_ALPHA(format)    format == 0
 #define FORMAT_HAS_NO_ALPHA(format) format < 0
 #define FORMAT_HAS_NO_ALPHA(format) format < 0
 static int detect_format(const SDL_PixelFormatDetails *pf)
 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;
         return FORMAT_2101010;
     } else if (pf->Amask) {
     } else if (pf->Amask) {
         return FORMAT_ALPHA;
         return FORMAT_ALPHA;
@@ -766,6 +770,7 @@ static void SDL_BlitTriangle_Slow(SDL_BlitInfo *info,
                                   SDL_TextureAddressMode texture_address_mode_v)
                                   SDL_TextureAddressMode texture_address_mode_v)
 {
 {
     SDL_Surface *src_surface = info->src_surface;
     SDL_Surface *src_surface = info->src_surface;
+    SDL_Palette *palette = src_surface->palette;
     const int flags = info->flags;
     const int flags = info->flags;
     Uint32 modulateR = info->r;
     Uint32 modulateR = info->r;
     Uint32 modulateG = info->g;
     Uint32 modulateG = info->g;
@@ -796,7 +801,13 @@ static void SDL_BlitTriangle_Slow(SDL_BlitInfo *info,
         Uint8 *dst = dptr;
         Uint8 *dst = dptr;
         TRIANGLE_GET_TEXTCOORD
         TRIANGLE_GET_TEXTCOORD
         src = (info->src + (srcy * info->src_pitch) + (srcx * srcbpp));
         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);
             DISEMBLE_RGBA(src, srcbpp, src_fmt, srcpixel, srcR, srcG, srcB, srcA);
         } else if (FORMAT_HAS_NO_ALPHA(srcfmt_val)) {
         } else if (FORMAT_HAS_NO_ALPHA(srcfmt_val)) {
             DISEMBLE_RGB(src, srcbpp, src_fmt, srcpixel, srcR, srcG, srcB);
             DISEMBLE_RGB(src, srcbpp, src_fmt, srcpixel, srcR, srcG, srcB);