From d669a4e84ac4e4292a8b95ab88f4948090282741 Mon Sep 17 00:00:00 2001
From: toasterbabe <rollerorbital@gmail.com>
Date: Sat, 29 Apr 2017 16:40:07 +0100
Subject: [PATCH] Introducing pMasterPalette.

Used instead of pLocalPalette when attempting to determine objective truths, such as "the colours of this gif without color profile modification" and "what indicies should this colormap remap to".

Also, made f_wipe.c's paldiv only get calculated once.
---
 src/f_wipe.c   |  7 ++++---
 src/m_anigif.c | 19 +++++++------------
 src/m_misc.c   | 46 +++++++++++++++++-----------------------------
 src/r_data.c   | 20 ++++++++++----------
 src/v_video.c  | 11 +++++++----
 src/v_video.h  |  1 +
 6 files changed, 46 insertions(+), 58 deletions(-)

diff --git a/src/f_wipe.c b/src/f_wipe.c
index a0b685a32..acc4efaaa 100644
--- a/src/f_wipe.c
+++ b/src/f_wipe.c
@@ -86,7 +86,7 @@ INT32 lastwipetic = 0;
 static UINT8 *wipe_scr_start; //screen 3
 static UINT8 *wipe_scr_end; //screen 4
 static UINT8 *wipe_scr; //screen 0 (main drawing)
-static fixed_t paldiv;
+static fixed_t paldiv = 0;
 
 /** Create fademask_t from lump
   *
@@ -145,7 +145,7 @@ static fademask_t *F_GetFadeMask(UINT8 masknum, UINT8 scrnnum) {
 	while (lsize--)
 	{
 		// Determine pixel to use from fademask
-		pcolor = &pLocalPalette[*lump++];
+		pcolor = &pMasterPalette[*lump++];
 		*mask++ = FixedDiv((pcolor->s.red+1)<<FRACBITS, paldiv)>>FRACBITS;
 	}
 
@@ -337,7 +337,8 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
 	UINT8 wipeframe = 0;
 	fademask_t *fmask;
 
-	paldiv = FixedDiv(257<<FRACBITS, 11<<FRACBITS);
+	if (!paldiv)
+		paldiv = FixedDiv(257<<FRACBITS, 11<<FRACBITS);
 
 	// Init the wipe
 	WipeInAction = true;
diff --git a/src/m_anigif.c b/src/m_anigif.c
index 4f7ed16ab..6ae112ea8 100644
--- a/src/m_anigif.c
+++ b/src/m_anigif.c
@@ -427,21 +427,16 @@ static void GIF_headwrite(void)
 	WRITEUINT8(p, 0x00);
 
 	// write color table
-	if (cv_screenshot_colorprofile.value)
 	{
+		RGBA_t *pal = ((cv_screenshot_colorprofile.value)
+		? pLocalPalette
+		: pMasterPalette);
+
 		for (i = 0; i < 256; i++)
 		{
-			WRITEUINT8(p, pLocalPalette[i].s.red);
-			WRITEUINT8(p, pLocalPalette[i].s.green);
-			WRITEUINT8(p, pLocalPalette[i].s.blue);
-		}
-	}
-	else
-	{
-		const UINT8 *pal = (UINT8 *)W_CacheLumpName(GetPalette(), PU_CACHE);
-		for (i = 0; i < 256*3; i++)
-		{
-			WRITEUINT8(p, *pal); pal++;
+			WRITEUINT8(p, pal[i].s.red);
+			WRITEUINT8(p, pal[i].s.green);
+			WRITEUINT8(p, pal[i].s.blue);
 		}
 	}
 
diff --git a/src/m_misc.c b/src/m_misc.c
index 87e65f6ce..f4e94189d 100644
--- a/src/m_misc.c
+++ b/src/m_misc.c
@@ -619,25 +619,18 @@ static void M_PNGhdr(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png_
 	{
 		png_colorp png_PLTE = png_malloc(png_ptr, sizeof(png_color)*256); //palette
 		png_uint_16 i;
-		if (cv_screenshot_colorprofile.value)
+
+		RGBA_t *pal = ((cv_screenshot_colorprofile.value)
+		? pLocalPalette
+		: pMasterPalette);
+
+		for (i = 0; i < 256; i++)
 		{
-			for (i = 0; i < 256; i++)
-			{
-				png_PLTE[i].red   = pLocalPalette[i].s.red;
-				png_PLTE[i].green = pLocalPalette[i].s.green;
-				png_PLTE[i].blue  = pLocalPalette[i].s.blue;
-			}
-		}
-		else
-		{
-			const png_byte *pal = (png_byte *)W_CacheLumpName(GetPalette(), PU_CACHE);
-			for (i = 0; i < 256; i++)
-			{
-				png_PLTE[i].red   = *pal++;
-				png_PLTE[i].green = *pal++;
-				png_PLTE[i].blue  = *pal++;
-			}
+			png_PLTE[i].red   = pal[i].s.red;
+			png_PLTE[i].green = pal[i].s.green;
+			png_PLTE[i].blue  = pal[i].s.blue;
 		}
+
 		png_set_IHDR(png_ptr, png_info_ptr, width, height, 8, PNG_COLOR_TYPE_PALETTE,
 		 png_interlace, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
 		png_write_info_before_PLTE(png_ptr, png_info_ptr);
@@ -1385,21 +1378,16 @@ static boolean WritePCXfile(const char *filename, const UINT8 *data, int width,
 	*pack++ = 0x0c; // palette ID byte
 
 	// write color table
-	if (cv_screenshot_colorprofile.value)
 	{
+		RGBA_t *pal = ((cv_screenshot_colorprofile.value)
+		? pLocalPalette
+		: pMasterPalette);
+
 		for (i = 0; i < 256; i++)
 		{
-			*pack++ = pLocalPalette[i].s.red;
-			*pack++ = pLocalPalette[i].s.green;
-			*pack++ = pLocalPalette[i].s.blue;
-		}
-	}
-	else
-	{
-		const UINT8 *pal = (UINT8 *)W_CacheLumpName(GetPalette(), PU_CACHE);
-		for (i = 0; i < 256*3; i++)
-		{
-			*pack++ = *pal++;
+			*pack++ = pal[i].s.red;
+			*pack++ = pal[i].s.green;
+			*pack++ = pal[i].s.blue;
 		}
 	}
 
diff --git a/src/r_data.c b/src/r_data.c
index d29c625e7..49ec786b9 100644
--- a/src/r_data.c
+++ b/src/r_data.c
@@ -22,7 +22,7 @@
 #include "w_wad.h"
 #include "z_zone.h"
 #include "p_setup.h" // levelflats
-#include "v_video.h" // pLocalPalette
+#include "v_video.h" // pMasterPalette
 #include "dehacked.h"
 
 #if defined (_WIN32) || defined (_WIN32_WCE)
@@ -1410,9 +1410,9 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3)
 	{
 		for (i = 0; i < 256; i++)
 		{
-			r = pLocalPalette[i].s.red;
-			g = pLocalPalette[i].s.green;
-			b = pLocalPalette[i].s.blue;
+			r = pMasterPalette[i].s.red;
+			g = pMasterPalette[i].s.green;
+			b = pMasterPalette[i].s.blue;
 			cbrightness = sqrt((r*r) + (g*g) + (b*b));
 
 			map[i][0] = (cbrightness * cmaskr) + (r * othermask);
@@ -1553,9 +1553,9 @@ void R_CreateColormap2(char *p1, char *p2, char *p3)
 	{
 		for (i = 0; i < 256; i++)
 		{
-			r = pLocalPalette[i].s.red;
-			g = pLocalPalette[i].s.green;
-			b = pLocalPalette[i].s.blue;
+			r = pMasterPalette[i].s.red;
+			g = pMasterPalette[i].s.green;
+			b = pMasterPalette[i].s.blue;
 			cbrightness = sqrt((r*r) + (g*g) + (b*b));
 
 			map[i][0] = (cbrightness * cmaskr) + (r * othermask);
@@ -1635,9 +1635,9 @@ static UINT8 NearestColor(UINT8 r, UINT8 g, UINT8 b)
 
 	for (i = 0; i < 256; i++)
 	{
-		dr = r - pLocalPalette[i].s.red;
-		dg = g - pLocalPalette[i].s.green;
-		db = b - pLocalPalette[i].s.blue;
+		dr = r - pMasterPalette[i].s.red;
+		dg = g - pMasterPalette[i].s.green;
+		db = b - pMasterPalette[i].s.blue;
 		distortion = dr*dr + dg*dg + db*db;
 		if (distortion < bestdistortion)
 		{
diff --git a/src/v_video.c b/src/v_video.c
index 01b630755..a0f2a86b5 100644
--- a/src/v_video.c
+++ b/src/v_video.c
@@ -111,6 +111,7 @@ consvar_t cv_grmd2 = {"gr_md2", "Off", CV_SAVE, CV_MD2, NULL, 0, NULL, NULL, 0,
 
 // local copy of the palette for V_GetColor()
 RGBA_t *pLocalPalette = NULL;
+RGBA_t *pMasterPalette = NULL;
 
 /*
 The following was an extremely helpful resource when developing my Colour Cube LUT.
@@ -337,16 +338,18 @@ static void LoadPalette(const char *lumpname)
 	UINT8 *pal;
 
 	Z_Free(pLocalPalette);
+	Z_Free(pMasterPalette);
 
 	pLocalPalette = Z_Malloc(sizeof (*pLocalPalette)*palsize, PU_STATIC, NULL);
+	pMasterPalette = Z_Malloc(sizeof (*pMasterPalette)*palsize, PU_STATIC, NULL);
 
 	pal = W_CacheLumpNum(lumpnum, PU_CACHE);
 	for (i = 0; i < palsize; i++)
 	{
-		pLocalPalette[i].s.red = correctiontable[*pal++];
-		pLocalPalette[i].s.green = correctiontable[*pal++];
-		pLocalPalette[i].s.blue = correctiontable[*pal++];
-		pLocalPalette[i].s.alpha = 0xFF;
+		pMasterPalette[i].s.red = pLocalPalette[i].s.red = correctiontable[*pal++];
+		pMasterPalette[i].s.green = pLocalPalette[i].s.green = correctiontable[*pal++];
+		pMasterPalette[i].s.blue = pLocalPalette[i].s.blue = correctiontable[*pal++];
+		pMasterPalette[i].s.alpha = pLocalPalette[i].s.alpha = 0xFF;
 
 		// lerp of colour cubing!
 		if (cube)
diff --git a/src/v_video.h b/src/v_video.h
index 5d4715235..3781f3337 100644
--- a/src/v_video.h
+++ b/src/v_video.h
@@ -45,6 +45,7 @@ const char *R_GetPalname(UINT16 num);
 const char *GetPalette(void);
 
 extern RGBA_t *pLocalPalette;
+extern RGBA_t *pMasterPalette;
 
 // Retrieve the ARGB value from a palette color index
 #define V_GetColor(color) (pLocalPalette[color&0xFF])