From 09998a6f7aebbe0338e97dfc95f0e4f896de86f3 Mon Sep 17 00:00:00 2001
From: TimeServ <timeserv@users.sourceforge.net>
Date: Sat, 11 Mar 2006 07:55:04 +0000
Subject: [PATCH] improve colormap generation for 16-bpp software

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@2085 fc73d0e0-1445-4013-8a0c-d673dee63da5
---
 engine/sw/vid_win2.c | 18 +++++++++++++++---
 engine/sw/vid_x.c    | 17 ++++++++++++++---
 2 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/engine/sw/vid_win2.c b/engine/sw/vid_win2.c
index d758ec279..2b5efcabe 100644
--- a/engine/sw/vid_win2.c
+++ b/engine/sw/vid_win2.c
@@ -77,6 +77,7 @@ void R_GammaCorrectAndSetPalette(const unsigned char *pal)
 	{
 		extern qbyte gammatable[256];
 		int j, i;
+		int r, g, b;
 		float f;
 		unsigned short *data;
 		r_flushcache++;
@@ -87,11 +88,22 @@ void R_GammaCorrectAndSetPalette(const unsigned char *pal)
 		{
 			f = (1 - ((float)j/VID_GRADES));
 			f = (float)gammatable[(int)(f*255)]/255;
+			f *= 2;
 			for (i = 0; i < 256; i++)
 			{
-				data[i] =	((int)(pal[i*3+0]*f*(1<<redbits)/256)<<redshift) +
-							((int)(pal[i*3+1]*f*(1<<greenbits)/256)<<greenshift) +
-							((int)(pal[i*3+2]*f*(1<<bluebits)/256)<<blueshift);
+				r = pal[i*3+0]*f;
+				g = pal[i*3+1]*f;
+				b = pal[i*3+2]*f;
+				if (r > 255)
+					r = 255;
+				if (g > 255)
+					g = 255;
+				if (b > 255)
+					b = 255;
+				r >>= 8 - redbits;
+				g >>= 8 - greenbits;
+				b >>= 8 - bluebits;
+				data[i] = (r<<redshift) + (g<<greenshift) + (b<<blueshift);
 			}
 			data+=256;
 		}
diff --git a/engine/sw/vid_x.c b/engine/sw/vid_x.c
index ff8fb8a28..39916d354 100644
--- a/engine/sw/vid_x.c
+++ b/engine/sw/vid_x.c
@@ -703,11 +703,22 @@ printf("%8x\n", (int)vid_dpy);
 		{
 			f = (1 - ((float)j/VID_GRADES));
 			f = (float)gammatable[(int)(f*255)]/255;
+			f *= 2;
 			for (i = 0; i < 256; i++)
 			{
-				data[i] =	((int)(pal[i*3+0]*f*(1<<redbits)/256)<<redshift) +
-							((int)(pal[i*3+1]*f*(1<<greenbits)/256)<<greenshift) +
-							((int)(pal[i*3+2]*f*(1<<bluebits)/256)<<blueshift);
+				r = pal[i*3+0]*f;
+				g = pal[i*3+1]*f;
+				b = pal[i*3+2]*f;
+				if (r > 255)
+					r = 255;
+				if (g > 255)
+					g = 255;
+				if (b > 255)
+					b = 255;
+				r >>= 8 - redbits;
+				g >>= 8 - greenbits;
+				b >>= 8 - bluebits;
+				data[i] = (r<<redshift) + (g<<greenshift) + (b<<blueshift);
 			}
 			data+=256;
 		}