Added support for SDL_PIXELFORMAT_INDEX8 to SDL_BlitTriangle_Slow()
Fixes https://github.com/libsdl-org/SDL/issues/14419
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user