From b2db570ce9dfc70c6bef4b70f5f9a24bbaf3d59f Mon Sep 17 00:00:00 2001
From: Sylvain <[EMAIL REDACTED]>
Date: Wed, 16 Mar 2022 18:09:40 +0100
Subject: [PATCH] SDL_triangle_blit_slow: sync code with SDL_blit_slow to
handle ARGB2101010
---
src/render/software/SDL_triangle.c | 57 ++++++++++++++++++++++--------
1 file changed, 43 insertions(+), 14 deletions(-)
diff --git a/src/render/software/SDL_triangle.c b/src/render/software/SDL_triangle.c
index ce003e16925..694cb4d9126 100644
--- a/src/render/software/SDL_triangle.c
+++ b/src/render/software/SDL_triangle.c
@@ -718,6 +718,21 @@ int SDL_SW_BlitTriangle(
}
+#define FORMAT_ALPHA 0
+#define FORMAT_NO_ALPHA -1
+#define FORMAT_2101010 1
+#define FORMAT_HAS_ALPHA(format) format == 0
+#define FORMAT_HAS_NO_ALPHA(format) format < 0
+static int SDL_INLINE detect_format(SDL_PixelFormat *pf) {
+ if (pf->format == SDL_PIXELFORMAT_ARGB2101010) {
+ return FORMAT_2101010;
+ } else if (pf->Amask) {
+ return FORMAT_ALPHA;
+ } else {
+ return FORMAT_NO_ALPHA;
+ }
+}
+
static void
SDL_BlitTriangle_Slow(SDL_BlitInfo *info,
SDL_Point s2_x_area, SDL_Rect dstrect, int area, int bias_w0, int bias_w1, int bias_w2,
@@ -738,25 +753,32 @@ SDL_BlitTriangle_Slow(SDL_BlitInfo *info,
SDL_PixelFormat *dst_fmt = info->dst_fmt;
int srcbpp = src_fmt->BytesPerPixel;
int dstbpp = dst_fmt->BytesPerPixel;
+ int srcfmt_val;
+ int dstfmt_val;
Uint32 rgbmask = ~src_fmt->Amask;
Uint32 ckey = info->colorkey & rgbmask;
Uint8 *dst_ptr = info->dst;
int dst_pitch = info->dst_pitch;;
+ srcfmt_val = detect_format(src_fmt);
+ dstfmt_val = detect_format(dst_fmt);
+
TRIANGLE_BEGIN_LOOP
{
Uint8 *src;
Uint8 *dst = dptr;
TRIANGLE_GET_TEXTCOORD
src = (info->src + (srcy * info->src_pitch) + (srcx * srcbpp));
- if (src_fmt->Amask) {
- DISEMBLE_RGBA(src, srcbpp, src_fmt, srcpixel, srcR, srcG,
- srcB, srcA);
- } else {
- DISEMBLE_RGB(src, srcbpp, src_fmt, srcpixel, srcR, srcG,
- srcB);
+ 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);
srcA = 0xFF;
+ } else {
+ /* SDL_PIXELFORMAT_ARGB2101010 */
+ srcpixel = *((Uint32 *)(src));
+ RGBA_FROM_ARGB2101010(srcpixel, srcR, srcG, srcB, srcA);
}
if (flags & SDL_COPY_COLORKEY) {
/* srcpixel isn't set for 24 bpp */
@@ -768,13 +790,15 @@ SDL_BlitTriangle_Slow(SDL_BlitInfo *info,
continue;
}
}
- if (dst_fmt->Amask) {
- DISEMBLE_RGBA(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG,
- dstB, dstA);
- } else {
- DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG,
- dstB);
+ if (FORMAT_HAS_ALPHA(dstfmt_val)) {
+ DISEMBLE_RGBA(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB, dstA);
+ } else if (FORMAT_HAS_NO_ALPHA(dstfmt_val)) {
+ DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB);
dstA = 0xFF;
+ } else {
+ /* SDL_PIXELFORMAT_ARGB2101010 */
+ dstpixel = *((Uint32 *)(dst));
+ RGBA_FROM_ARGB2101010(dstpixel, dstR, dstG, dstB, dstA);
}
if (! is_uniform) {
@@ -845,10 +869,15 @@ SDL_BlitTriangle_Slow(SDL_BlitInfo *info,
dstA = 255;
break;
}
- if (dst_fmt->Amask) {
+ if (FORMAT_HAS_ALPHA(dstfmt_val)) {
ASSEMBLE_RGBA(dst, dstbpp, dst_fmt, dstR, dstG, dstB, dstA);
- } else {
+ } else if (FORMAT_HAS_NO_ALPHA(dstfmt_val)) {
ASSEMBLE_RGB(dst, dstbpp, dst_fmt, dstR, dstG, dstB);
+ } else {
+ /* SDL_PIXELFORMAT_ARGB2101010 */
+ Uint32 pixel;
+ ARGB2101010_FROM_RGBA(pixel, dstR, dstG, dstB, dstA);
+ *(Uint32 *)dst = pixel;
}
}
TRIANGLE_END_LOOP