From edb2cb505e9616fb28653ece88b6f4f2c197fce5 Mon Sep 17 00:00:00 2001
From: Lactozilla <jp6781615@gmail.com>
Date: Sun, 25 Jun 2023 02:02:01 -0300
Subject: [PATCH] Slight refactor

---
 src/r_draw.c   | 129 +++++++++++++++++++++++++------------------------
 src/r_draw8.c  |  96 ++++++++++++++++++------------------
 src/r_plane.c  |   4 +-
 src/r_things.c |   2 +-
 4 files changed, 117 insertions(+), 114 deletions(-)

diff --git a/src/r_draw.c b/src/r_draw.c
index 0c5a2c383c..4b2c782166 100644
--- a/src/r_draw.c
+++ b/src/r_draw.c
@@ -107,6 +107,12 @@ UINT8 *blendtables[NUMBLENDMAPS];
 UINT8 *dc_transmap; // one of the translucency tables
 UINT8 dc_alpha; // column alpha
 
+static INT32 multtable[0x10000];
+static INT32 multtableinv[0x10000];
+
+static INT32 *dp_multtable = NULL;
+static INT32 *dp_multtableinv = NULL;
+
 UINT32 (*R_BlendModeMix)(UINT32, UINT32, UINT8) = NULL;
 
 // ----------------------
@@ -210,8 +216,7 @@ void R_InitTranslucencyTables(void)
 	// Load here the transparency lookup tables 'TRANSx0'
 	// NOTE: the TRANSx0 resources MUST BE aligned on 64k for the asm
 	// optimised code (in other words, transtables pointer low word is 0)
-	transtables = Z_MallocAlign(NUMTRANSTABLES*0x10000, PU_STATIC,
-		NULL, 16);
+	transtables = Z_MallocAlign(NUMTRANSTABLES*0x10000, PU_STATIC, NULL, 16);
 
 	W_ReadLump(W_GetNumForName("TRANS10"), transtables);
 	W_ReadLump(W_GetNumForName("TRANS20"), transtables+0x10000);
@@ -223,6 +228,15 @@ void R_InitTranslucencyTables(void)
 	W_ReadLump(W_GetNumForName("TRANS80"), transtables+0x70000);
 	W_ReadLump(W_GetNumForName("TRANS90"), transtables+0x80000);
 
+	for (unsigned alpha = 0; alpha < 0x100; alpha++)
+	{
+		for (unsigned color = 0; color < 0x100; color++)
+		{
+			multtable[alpha << 8 | color] = (alpha * color) >> 8;
+			multtableinv[alpha << 8 | color] = (((int)alpha ^ 0xFF) * color) >> 8;
+		}
+	}
+
 	R_GenerateBlendTables();
 }
 
@@ -1011,42 +1025,38 @@ static inline UINT32 Blend_Copy(UINT32 fg, UINT32 bg, UINT8 alpha)
 {
 	(void)bg;
 	(void)alpha;
-	return (0xFF000000 | fg);
+	return 0xFF000000 | fg;
 }
 
 static inline UINT32 Blend_Translucent(UINT32 fg, UINT32 bg, UINT8 alpha)
 {
-	fg = R_TranslucentMix(bg, fg, alpha);
-	return (0xFF000000 | fg);
+	(void)alpha;
+
+	return 0xFF000000 | R_PutRgbaRGB(
+		(dp_multtable[R_GetRgbaR(fg)] + dp_multtableinv[R_GetRgbaR(bg)]),
+		(dp_multtable[R_GetRgbaG(fg)] + dp_multtableinv[R_GetRgbaG(bg)]),
+		(dp_multtable[R_GetRgbaB(fg)] + dp_multtableinv[R_GetRgbaB(bg)]));
 }
 
 static inline UINT32 Blend_Additive(UINT32 fg, UINT32 bg, UINT8 alpha)
 {
-	UINT8 r = clamp(R_GetRgbaR(bg) + R_GetRgbaR(fg));
-	UINT8 g = clamp(R_GetRgbaG(bg) + R_GetRgbaG(fg));
-	UINT8 b = clamp(R_GetRgbaB(bg) + R_GetRgbaB(fg));
+	(void)alpha;
 
-	fg = R_PutRgbaRGB(r, g, b);
-	fg = R_TranslucentMix(bg, fg, alpha);
+	UINT8 r = clamp(dp_multtable[R_GetRgbaR(fg)] + R_GetRgbaR(bg));
+	UINT8 g = clamp(dp_multtable[R_GetRgbaG(fg)] + R_GetRgbaG(bg));
+	UINT8 b = clamp(dp_multtable[R_GetRgbaB(fg)] + R_GetRgbaB(bg));
 
-	return (0xFF000000 | fg);
+	return 0xFF000000 | R_PutRgbaRGB(
+		(dp_multtable[r] + dp_multtableinv[R_GetRgbaR(bg)]),
+		(dp_multtable[g] + dp_multtableinv[R_GetRgbaG(bg)]),
+		(dp_multtable[b] + dp_multtableinv[R_GetRgbaB(bg)]));
 }
 
 static inline UINT32 Blend_Subtractive(UINT32 fg, UINT32 bg, UINT8 alpha)
 {
-	INT32 mixR, mixG, mixB;
-	UINT8 r, g, b;
-
-	if (alpha == 0)
-		return 0xFF000000;
-
-	mixR = R_GetRgbaR(fg);
-	mixG = R_GetRgbaG(fg);
-	mixB = R_GetRgbaB(fg);
-
-	r = clamp((INT32)(-R_GetRgbaR(bg) + mixR));
-	g = clamp((INT32)(-R_GetRgbaG(bg) + mixG));
-	b = clamp((INT32)(-R_GetRgbaB(bg) + mixB));
+	UINT8 r = clamp((INT32)(-R_GetRgbaR(bg) + R_GetRgbaR(fg)));
+	UINT8 g = clamp((INT32)(-R_GetRgbaG(bg) + R_GetRgbaG(fg)));
+	UINT8 b = clamp((INT32)(-R_GetRgbaB(bg) + R_GetRgbaB(fg)));
 
 	alpha = (0xFF - alpha);
 
@@ -1054,44 +1064,34 @@ static inline UINT32 Blend_Subtractive(UINT32 fg, UINT32 bg, UINT8 alpha)
 	g = clamp((INT32)(g - alpha));
 	b = clamp((INT32)(b - alpha));
 
-	return (0xFF000000 | R_PutRgbaRGB(r, g, b));
+	return 0xFF000000 | R_PutRgbaRGB(r, g, b);
 }
 
 static inline UINT32 Blend_ReverseSubtractive(UINT32 fg, UINT32 bg, UINT8 alpha)
 {
-	INT32 mixR, mixG, mixB;
-	UINT8 r, g, b;
-
-	if (alpha == 0)
-		return bg;
-
-	mixR = R_GetRgbaR(fg);
-	mixG = R_GetRgbaG(fg);
-	mixB = R_GetRgbaB(fg);
+	(void)alpha;
 
-	r = clamp((INT32)(R_GetRgbaR(bg) - mixR));
-	g = clamp((INT32)(R_GetRgbaG(bg) - mixG));
-	b = clamp((INT32)(R_GetRgbaB(bg) - mixB));
+	INT32 bgr = R_GetRgbaR(bg);
+	INT32 bgg = R_GetRgbaG(bg);
+	INT32 bgb = R_GetRgbaB(bg);
 
-	fg = R_PutRgbaRGB(r, g, b);
-	fg = R_TranslucentMix(bg, fg, alpha);
+	UINT8 r = clamp((INT32)(bgr - R_GetRgbaR(fg)));
+	UINT8 g = clamp((INT32)(bgg - R_GetRgbaG(fg)));
+	UINT8 b = clamp((INT32)(bgb - R_GetRgbaB(fg)));
 
-	return (0xFF000000 | fg);
+	return 0xFF000000 | R_PutRgbaRGB(
+		(dp_multtable[r] + dp_multtableinv[bgr]),
+		(dp_multtable[g] + dp_multtableinv[bgg]),
+		(dp_multtable[b] + dp_multtableinv[bgb]));
 }
 
 static inline UINT32 Blend_Multiplicative(UINT32 fg, UINT32 bg, UINT8 alpha)
 {
-	float mixR = ((float)R_GetRgbaR(fg) / 256.0f);
-	float mixG = ((float)R_GetRgbaG(fg) / 256.0f);
-	float mixB = ((float)R_GetRgbaB(fg) / 256.0f);
-
-	UINT8 r = clamp((int)(R_GetRgbaR(bg) * mixR));
-	UINT8 g = clamp((int)(R_GetRgbaG(bg) * mixG));
-	UINT8 b = clamp((int)(R_GetRgbaB(bg) * mixB));
-
 	(void)alpha;
-
-	return (0xFF000000 | R_PutRgbaRGB(r, g, b));
+	UINT8 r = ((INT32)R_GetRgbaR(bg) * (INT32)R_GetRgbaR(fg)) >> 8;
+	UINT8 g = ((INT32)R_GetRgbaG(bg) * (INT32)R_GetRgbaG(fg)) >> 8;
+	UINT8 b = ((INT32)R_GetRgbaB(bg) * (INT32)R_GetRgbaB(fg)) >> 8;
+	return 0xFF000000 | R_PutRgbaRGB(r, g, b);
 }
 
 static inline void R_SetBlendingFunction(INT32 blendmode)
@@ -1120,11 +1120,11 @@ static inline void R_SetBlendingFunction(INT32 blendmode)
 	}
 }
 
-static void R_AlphaBlend_8(UINT8 src, UINT8 alpha, UINT8 *dest)
+static UINT8 R_AlphaBlend_8(UINT8 src, UINT8 alpha, UINT8 *dest)
 {
 	RGBA_t result;
 	result.rgba = R_BlendModeMix(GetTrueColor(src), GetTrueColor(*dest), alpha);
-	*dest = GetColorLUT(&r_draw_lut, result.s.red, result.s.green, result.s.blue);
+	return GetColorLUT(&r_draw_lut, result.s.red, result.s.green, result.s.blue);
 }
 
 static UINT8 R_AlphaBlend_s8d8(UINT8 src, UINT8 alpha, UINT8 dest)
@@ -1146,6 +1146,9 @@ void R_SetColumnBlendingFunction(INT32 blendmode)
 	else
 #endif
 		R_SetBlendingFunction(blendmode);
+
+	dp_multtable = &multtable[dc_alpha << 8];
+	dp_multtableinv = &multtableinv[dc_alpha << 8];
 }
 
 void R_SetSpanBlendingFunction(INT32 blendmode)
@@ -1156,6 +1159,9 @@ void R_SetSpanBlendingFunction(INT32 blendmode)
 	else
 #endif
 		R_SetBlendingFunction(blendmode);
+
+	dp_multtable = &multtable[ds_alpha << 8];
+	dp_multtableinv = &multtableinv[ds_alpha << 8];
 }
 
 void R_InitAlphaLUT(void)
@@ -1216,7 +1222,7 @@ static UINT32 TC_ColorMix(UINT32 fg, UINT32 bg)
 	// Apply the color cube
 	fg = ColorCube_ApplyRGBA(fg);
 
-	cache->result = (0xFF000000 | fg);
+	cache->result = 0xFF000000 | fg;
 	return cache->result;
 }
 
@@ -1250,7 +1256,7 @@ static UINT32 TC_ColorMix2(UINT32 fg, UINT32 bg)
 	// Apply the color cube
 	fg = ColorCube_ApplyRGBA(fg);
 
-	cache->result = (0xFF000000 | fg);
+	cache->result = 0xFF000000 | fg;
 	return cache->result;
 }
 
@@ -1306,15 +1312,12 @@ static inline UINT32 TC_Colormap32Mix(UINT32 color)
 static inline UINT32 Blend_ColorMix_Copy(UINT32 fg, UINT32 bg, UINT8 alpha)
 {
 	(void)alpha;
-	fg = TC_ColorMix(fg, bg);
-	return (0xFF000000 | fg);
+	return TC_ColorMix(fg, bg);
 }
 
 static inline UINT32 Blend_ColorMix_Translucent(UINT32 fg, UINT32 bg, UINT8 alpha)
 {
-	fg = TC_ColorMix(fg, bg);
-	fg = R_TranslucentMix(bg, fg, alpha);
-	return (0xFF000000 | fg);
+	return Blend_Translucent(fg, TC_ColorMix(fg, bg), alpha);
 }
 
 static inline UINT32 Blend_ColorMix_Additive(UINT32 fg, UINT32 bg, UINT8 alpha)
@@ -1419,15 +1422,15 @@ static inline void R_SetBlendingFunction_ColorMix(INT32 blendmode)
 
 #undef clamp
 
-#define WriteTranslucentColumn(idx) *dest = R_BlendModeMix(GetTrueColor(idx), *(UINT32 *)dest, dc_alpha)
-#define WriteTranslucentColumn32(idx) *dest = R_BlendModeMix(idx, *(UINT32 *)dest, dc_alpha)
+#define WriteTranslucentColumn(idx) *dest = R_AlphaBlend_8(idx, dc_alpha, dest)
+#define WriteTranslucentColumn32(idx) *dest = R_BlendModeMix(idx, dc_alpha, (UINT32 *)dest)
 
-#define WriteTranslucentSpan(idx) *dest = R_BlendModeMix(GetTrueColor(idx), *(UINT32 *)dest, ds_alpha)
+#define WriteTranslucentSpan(idx) *dest = R_AlphaBlend_8(idx, ds_alpha, dest)
 #define WriteTranslucentSpan32(idx) *dest = R_BlendModeMix(idx, *(UINT32 *)dest, ds_alpha)
 #define WriteTranslucentSpanIdx(idx, destidx) dest[destidx] = R_BlendModeMix(GetTrueColor(idx), dest[destidx], ds_alpha)
 #define WriteTranslucentSpanIdx32(idx, destidx) dest[destidx] = R_BlendModeMix(idx, dest[destidx], ds_alpha)
 
-#define WriteTranslucentWaterSpan(idx) *dest = R_BlendModeMix(GetTrueColor(idx), *(UINT32 *)dsrc, ds_alpha); dsrc++
+#define WriteTranslucentWaterSpan(idx) *dest = R_AlphaBlend_8(idx, ds_alpha, dsrc); dsrc++
 #define WriteTranslucentWaterSpan32(idx) *dest = R_BlendModeMix(idx, *(UINT32 *)dsrc, ds_alpha); dsrc++
 #define WriteTranslucentWaterSpanIdx(idx, destidx) dest[destidx] = R_BlendModeMix(GetTrueColor(idx), *(UINT32 *)dsrc, ds_alpha); dsrc++
 #define WriteTranslucentWaterSpanIdx32(idx, destidx) dest[destidx] = R_BlendModeMix(idx, *(UINT32 *)dsrc, ds_alpha); dsrc++
diff --git a/src/r_draw8.c b/src/r_draw8.c
index 7ab2f3e9cb..3f43f4309f 100644
--- a/src/r_draw8.c
+++ b/src/r_draw8.c
@@ -355,7 +355,7 @@ void R_Draw2sMultiPatchAlphaColumn_8(void)
 				val = source[frac>>FRACBITS];
 
 				if (val != TRANSPARENTPIXEL)
-					R_AlphaBlend_8(colormap[val], dc_alpha, dest);
+					*dest = R_AlphaBlend_8(colormap[val], dc_alpha, dest);
 
 				dest += vid.width;
 
@@ -375,12 +375,12 @@ void R_Draw2sMultiPatchAlphaColumn_8(void)
 			{
 				val = source[(frac>>FRACBITS) & heightmask];
 				if (val != TRANSPARENTPIXEL)
-					R_AlphaBlend_8(colormap[val], dc_alpha, dest);
+					*dest = R_AlphaBlend_8(colormap[val], dc_alpha, dest);
 				dest += vid.width;
 				frac += fracstep;
 				val = source[(frac>>FRACBITS) & heightmask];
 				if (val != TRANSPARENTPIXEL)
-					R_AlphaBlend_8(colormap[val], dc_alpha, dest);
+					*dest = R_AlphaBlend_8(colormap[val], dc_alpha, dest);
 				dest += vid.width;
 				frac += fracstep;
 			}
@@ -388,7 +388,7 @@ void R_Draw2sMultiPatchAlphaColumn_8(void)
 			{
 				val = source[(frac>>FRACBITS) & heightmask];
 				if (val != TRANSPARENTPIXEL)
-					R_AlphaBlend_8(colormap[val], dc_alpha, dest);
+					*dest = R_AlphaBlend_8(colormap[val], dc_alpha, dest);
 			}
 		}
 	}
@@ -535,13 +535,13 @@ void R_DrawDropShadowColumn_8(void)
 	{
 		while ((count -= 2) >= 0)
 		{
-			R_AlphaBlend_8(DSCOLOR, dc_alpha, dest);
+			*dest = R_AlphaBlend_8(DSCOLOR, dc_alpha, dest);
 			dest += vid.width;
-			R_AlphaBlend_8(DSCOLOR, dc_alpha, dest);
+			*dest = R_AlphaBlend_8(DSCOLOR, dc_alpha, dest);
 			dest += vid.width;
 		}
 		if (count & 1)
-			R_AlphaBlend_8(DSCOLOR, dc_alpha, dest);
+			*dest = R_AlphaBlend_8(DSCOLOR, dc_alpha, dest);
 	}
 	else
 	{
@@ -608,7 +608,7 @@ void R_DrawAlphaColumn_8(void)
 				// Re-map color indices from wall texture column
 				// using a lighting/special effects LUT.
 				// heightmask is the Tutti-Frutti fix
-				R_AlphaBlend_8(colormap[source[frac>>FRACBITS]], dc_alpha, dest);
+				*dest = R_AlphaBlend_8(colormap[source[frac>>FRACBITS]], dc_alpha, dest);
 				dest += vid.width;
 				if ((frac += fracstep) >= heightmask)
 					frac -= heightmask;
@@ -619,15 +619,15 @@ void R_DrawAlphaColumn_8(void)
 		{
 			while ((count -= 2) >= 0) // texture height is a power of 2
 			{
-				R_AlphaBlend_8(colormap[source[(frac>>FRACBITS)&heightmask]], dc_alpha, dest);
+				*dest = R_AlphaBlend_8(colormap[source[(frac>>FRACBITS)&heightmask]], dc_alpha, dest);
 				dest += vid.width;
 				frac += fracstep;
-				R_AlphaBlend_8(colormap[source[(frac>>FRACBITS)&heightmask]], dc_alpha, dest);
+				*dest = R_AlphaBlend_8(colormap[source[(frac>>FRACBITS)&heightmask]], dc_alpha, dest);
 				dest += vid.width;
 				frac += fracstep;
 			}
 			if (count & 1)
-				R_AlphaBlend_8(colormap[source[(frac>>FRACBITS)&heightmask]], dc_alpha, dest);
+				*dest = R_AlphaBlend_8(colormap[source[(frac>>FRACBITS)&heightmask]], dc_alpha, dest);
 		}
 	}
 }
@@ -744,7 +744,7 @@ void R_DrawTranslatedAlphaColumn_8(void)
 				// Re-map color indices from wall texture column
 				//  using a lighting/special effects LUT.
 				// heightmask is the Tutti-Frutti fix
-				R_AlphaBlend_8(dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]], dc_alpha, dest);
+				*dest = R_AlphaBlend_8(dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]], dc_alpha, dest);
 				dest += vid.width;
 				if ((frac += fracstep) >= heightmask)
 					frac -= heightmask;
@@ -755,15 +755,15 @@ void R_DrawTranslatedAlphaColumn_8(void)
 		{
 			while ((count -= 2) >= 0) // texture height is a power of 2
 			{
-				R_AlphaBlend_8(dc_colormap[dc_translation[dc_source[(frac>>FRACBITS)&heightmask]]], dc_alpha, dest);
+				*dest = R_AlphaBlend_8(dc_colormap[dc_translation[dc_source[(frac>>FRACBITS)&heightmask]]], dc_alpha, dest);
 				dest += vid.width;
 				frac += fracstep;
-				R_AlphaBlend_8(dc_colormap[dc_translation[dc_source[(frac>>FRACBITS)&heightmask]]], dc_alpha, dest);
+				*dest = R_AlphaBlend_8(dc_colormap[dc_translation[dc_source[(frac>>FRACBITS)&heightmask]]], dc_alpha, dest);
 				dest += vid.width;
 				frac += fracstep;
 			}
 			if (count & 1)
-				R_AlphaBlend_8(dc_colormap[dc_translation[dc_source[(frac>>FRACBITS)&heightmask]]], dc_alpha, dest);
+				*dest = R_AlphaBlend_8(dc_colormap[dc_translation[dc_source[(frac>>FRACBITS)&heightmask]]], dc_alpha, dest);
 		}
 	}
 }
@@ -1174,7 +1174,7 @@ void R_DrawTiltedAlphaSpan_8(void)
 		for (i = SPANSIZE-1; i >= 0; i--)
 		{
 			colormap = planezlight[tiltlighting[ds_x1++]] + (ds_colormap - colormaps);
-			R_AlphaBlend_8(colormap[source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)]], ds_alpha, dest);
+			*dest = R_AlphaBlend_8(colormap[source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)]], ds_alpha, dest);
 			dest++;
 			u += stepu;
 			v += stepv;
@@ -1190,7 +1190,7 @@ void R_DrawTiltedAlphaSpan_8(void)
 			u = (INT64)(startu);
 			v = (INT64)(startv);
 			colormap = planezlight[tiltlighting[ds_x1++]] + (ds_colormap - colormaps);
-			R_AlphaBlend_8(colormap[source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)]], ds_alpha, dest);
+			*dest = R_AlphaBlend_8(colormap[source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)]], ds_alpha, dest);
 		}
 		else
 		{
@@ -1211,7 +1211,7 @@ void R_DrawTiltedAlphaSpan_8(void)
 			for (; width != 0; width--)
 			{
 				colormap = planezlight[tiltlighting[ds_x1++]] + (ds_colormap - colormaps);
-				R_AlphaBlend_8(colormap[source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)]], ds_alpha, dest);
+				*dest = R_AlphaBlend_8(colormap[source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)]], ds_alpha, dest);
 				dest++;
 				u += stepu;
 				v += stepv;
@@ -1788,49 +1788,49 @@ void R_DrawAlphaSplat_8(void)
 		// need!
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val != TRANSPARENTPIXEL)
-			R_AlphaBlend_8(colormap[val], ds_alpha, dest + 0);
+			*dest = R_AlphaBlend_8(colormap[val], ds_alpha, dest + 0);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val != TRANSPARENTPIXEL)
-			R_AlphaBlend_8(colormap[val], ds_alpha, dest + 1);
+			*dest = R_AlphaBlend_8(colormap[val], ds_alpha, dest + 1);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val != TRANSPARENTPIXEL)
-			R_AlphaBlend_8(colormap[val], ds_alpha, dest + 2);
+			*dest = R_AlphaBlend_8(colormap[val], ds_alpha, dest + 2);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val != TRANSPARENTPIXEL)
-			R_AlphaBlend_8(colormap[val], ds_alpha, dest + 3);
+			*dest = R_AlphaBlend_8(colormap[val], ds_alpha, dest + 3);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val != TRANSPARENTPIXEL)
-			R_AlphaBlend_8(colormap[val], ds_alpha, dest + 4);
+			*dest = R_AlphaBlend_8(colormap[val], ds_alpha, dest + 4);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val != TRANSPARENTPIXEL)
-			R_AlphaBlend_8(colormap[val], ds_alpha, dest + 5);
+			*dest = R_AlphaBlend_8(colormap[val], ds_alpha, dest + 5);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val != TRANSPARENTPIXEL)
-			R_AlphaBlend_8(colormap[val], ds_alpha, dest + 6);
+			*dest = R_AlphaBlend_8(colormap[val], ds_alpha, dest + 6);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val != TRANSPARENTPIXEL)
-			R_AlphaBlend_8(colormap[val], ds_alpha, dest + 7);
+			*dest = R_AlphaBlend_8(colormap[val], ds_alpha, dest + 7);
 		xposition += xstep;
 		yposition += ystep;
 
@@ -1841,7 +1841,7 @@ void R_DrawAlphaSplat_8(void)
 	{
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val != TRANSPARENTPIXEL)
-			R_AlphaBlend_8(colormap[val], ds_alpha, dest);
+			*dest = R_AlphaBlend_8(colormap[val], ds_alpha, dest);
 		dest++;
 		xposition += xstep;
 		yposition += ystep;
@@ -2102,49 +2102,49 @@ void R_DrawAlphaFloorSprite_8(void)
 		// need!
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val & 0xFF00)
-			R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 0);
+			*dest = R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 0);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val & 0xFF00)
-			R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 1);
+			*dest = R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 1);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val & 0xFF00)
-			R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 2);
+			*dest = R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 2);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val & 0xFF00)
-			R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 3);
+			*dest = R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 3);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val & 0xFF00)
-			R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 4);
+			*dest = R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 4);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val & 0xFF00)
-			R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 5);
+			*dest = R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 5);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val & 0xFF00)
-			R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 6);
+			*dest = R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 6);
 		xposition += xstep;
 		yposition += ystep;
 
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val & 0xFF00)
-			R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 7);
+			*dest = R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest + 7);
 		xposition += xstep;
 		yposition += ystep;
 
@@ -2155,7 +2155,7 @@ void R_DrawAlphaFloorSprite_8(void)
 	{
 		val = source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)];
 		if (val & 0xFF00)
-			R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest);
+			*dest = R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest);
 		dest++;
 		xposition += xstep;
 		yposition += ystep;
@@ -2433,7 +2433,7 @@ void R_DrawTiltedAlphaFloorSprite_8(void)
 		{
 			val = source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)];
 			if (val & 0xFF00)
-				R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest);
+				*dest = R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest);
 			dest++;
 
 			u += stepu;
@@ -2451,7 +2451,7 @@ void R_DrawTiltedAlphaFloorSprite_8(void)
 			v = (INT64)(startv);
 			val = source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)];
 			if (val & 0xFF00)
-				R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest);
+				*dest = R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest);
 		}
 		else
 		{
@@ -2473,7 +2473,7 @@ void R_DrawTiltedAlphaFloorSprite_8(void)
 			{
 				val = source[((v >> nflatyshift) & nflatmask) | (u >> nflatxshift)];
 				if (val & 0xFF00)
-					R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest);
+					*dest = R_AlphaBlend_8(colormap[translation[val & 0xFF]], ds_alpha, dest);
 				dest++;
 
 				u += stepu;
@@ -2603,35 +2603,35 @@ void R_DrawAlphaSpan_8(void)
 		// SoM: Why didn't I see this earlier? the spot variable is a waste now because we don't
 		// have the uber complicated math to calculate it now, so that was a memory write we didn't
 		// need!
-		R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 0);
+		*dest = R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 0);
 		xposition += xstep;
 		yposition += ystep;
 
-		R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 1);
+		*dest = R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 1);
 		xposition += xstep;
 		yposition += ystep;
 
-		R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 2);
+		*dest = R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 2);
 		xposition += xstep;
 		yposition += ystep;
 
-		R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 3);
+		*dest = R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 3);
 		xposition += xstep;
 		yposition += ystep;
 
-		R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 4);
+		*dest = R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 4);
 		xposition += xstep;
 		yposition += ystep;
 
-		R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 5);
+		*dest = R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 5);
 		xposition += xstep;
 		yposition += ystep;
 
-		R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 6);
+		*dest = R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 6);
 		xposition += xstep;
 		yposition += ystep;
 
-		R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 7);
+		*dest = R_AlphaBlend_8(colormap[source[(((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift)]], ds_alpha, dest + 7);
 		xposition += xstep;
 		yposition += ystep;
 
@@ -2641,7 +2641,7 @@ void R_DrawAlphaSpan_8(void)
 	while (count-- && dest <= deststop)
 	{
 		val = (((UINT32)yposition >> nflatyshift) & nflatmask) | ((UINT32)xposition >> nflatxshift);
-		R_AlphaBlend_8(colormap[source[val]], ds_alpha, dest);
+		*dest = R_AlphaBlend_8(colormap[source[val]], ds_alpha, dest);
 		dest++;
 		xposition += xstep;
 		yposition += ystep;
diff --git a/src/r_plane.c b/src/r_plane.c
index 788b820efa..751fd95dc0 100644
--- a/src/r_plane.c
+++ b/src/r_plane.c
@@ -945,8 +945,8 @@ void R_DrawSinglePlane(visplane_t *pl)
 
 			if (!usetranstables)
 			{
-				R_SetSpanBlendingFunction(AST_TRANSLUCENT);
 				ds_alpha = R_TransnumToAlpha(transval);
+				R_SetSpanBlendingFunction(AST_TRANSLUCENT);
 			}
 			else
 				ds_transmap = R_GetTranslucencyTable(transval);
@@ -958,8 +958,8 @@ void R_DrawSinglePlane(visplane_t *pl)
 			spanfunctype = SPAN_SPLAT;
 
 #ifdef TRUECOLOR
-			R_SetSpanBlendingFunction(AST_COPY);
 			ds_alpha = 0xFF;
+			R_SetSpanBlendingFunction(AST_COPY);
 #endif
 		}
 
diff --git a/src/r_things.c b/src/r_things.c
index 6ad93c5591..30da91e94a 100644
--- a/src/r_things.c
+++ b/src/r_things.c
@@ -1075,8 +1075,8 @@ static void R_DrawPrecipitationVisSprite(vissprite_t *vis)
 
 		if (!usetranstables)
 		{
-			R_SetColumnBlendingFunction(vis->blendmode);
 			dc_alpha = vis->alpha;
+			R_SetColumnBlendingFunction(vis->blendmode);
 		}
 		else
 			dc_transmap = vis->transmap;    //Fab : 29-04-98: translucency table
-- 
GitLab