1 // "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman
2 // Ken Silverman's official web site: "http://www.advsys.net/ken"
3 // See the included license file "BUILDLIC.TXT" for license info.
4 //
5 // This file has been modified from Ken Silverman's original release
6 // by Jonathon Fowler (jf@jonof.id.au)
7 // by the EDuke32 team (development@voidpoint.com)
8 
9 #pragma once
10 
11 #ifndef palette_h_
12 #define palette_h_
13 
14 #include "cache1d.h"
15 #include "vfs.h"
16 #include "xxhash.h"
17 
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21 
22 #define MAXBASEPALS 256
23 #define MAXPALOOKUPS 256
24 #define MAXBLENDTABS 256
25 
26 #define RESERVEDPALS 4 // don't forget to increment this when adding reserved pals
27 #define DETAILPAL   (MAXPALOOKUPS - 1)
28 #define GLOWPAL     (MAXPALOOKUPS - 2)
29 #define SPECULARPAL (MAXPALOOKUPS - 3)
30 #define NORMALPAL   (MAXPALOOKUPS - 4)
31 
32 extern uint8_t curbasepal;
33 
34 #define paletteGetBlendTable(blend) (blendtable[blend])
35 
36 extern uint8_t PaletteIndexFullbrights[32];
37 #define IsPaletteIndexFullbright(col) (PaletteIndexFullbrights[(col)>>3] & (1u<<((col)&7)))
38 #define SetPaletteIndexFullbright(col) (PaletteIndexFullbrights[(col)>>3] |= (1u<<((col)&7)))
39 
40 typedef struct {
41     char r, g, b, f;
42 } palette_t;
43 typedef struct {
44     uint8_t r, g, b;
45 } rgb24_t;
46 extern palette_t curpalette[256], curpalettefaded[256], palfadergb;
47 
48 extern char palfadedelta;
49 #ifdef USE_OPENGL
50 extern void fullscreen_tint_gl(uint8_t r, uint8_t g, uint8_t b, uint8_t f);
51 extern void fullscreen_tint_gl_blood(void);
52 #endif
53 extern void videoFadeToBlack(int32_t moreopaquep);
54 void paletteMakeLookupTable(int32_t palnum, const char *remapbuf, uint8_t r, uint8_t g, uint8_t b, char noFloorPal);
55 void paletteSetColorTable(int32_t id, uint8_t const *table);
56 void paletteFreeColorTable(int32_t id);
57 void paletteSetBlendTable(int32_t blend, const char *tab);
58 void paletteFreeBlendTable(int32_t blend);
59 int32_t paletteSetLookupTable(int32_t palnum, const uint8_t *shtab);
60 void paletteFreeLookupTable(int32_t palnum);
61 void videoSetPalette(char dabrightness, uint8_t dapalid, uint8_t flags);
62 void videoFadePalette(uint8_t r, uint8_t g, uint8_t b, uint8_t offset);
63 #ifdef USE_OPENGL
64 void videoTintBlood(int32_t r, int32_t g, int32_t b);
65 #endif
66 
67 extern int32_t realmaxshade;
68 extern float frealmaxshade;
69 
70 extern int32_t globalpal;
71 extern int32_t globalblend;
72 extern XXH64_hash_t g_lastpalettesum;
73 extern palette_t paletteGetColor(int32_t col);
74 extern void paletteLoadFromDisk(void);
75 extern void palettePostLoadTables(void);
76 extern void setup_blend(int32_t blend, int32_t doreverse);
77 extern uint8_t basepalreset;
78 extern int32_t curbrightness, gammabrightness;
79 
80 extern int32_t paletteLoadLookupTable(buildvfs_kfd fp);
81 extern void paletteSetupDefaultFog(void);
82 extern void palettePostLoadLookups(void);
83 extern void paletteFixTranslucencyMask(void);
84 
85 extern int8_t g_noFloorPal[MAXPALOOKUPS];
86 
87 extern char britable[16][256];
88 
89 #ifdef USE_OPENGL
90 extern palette_t palookupfog[MAXPALOOKUPS];
91 extern float palookupfogfactor[MAXPALOOKUPS];
92 
bricolor(palette_t * wpptr,int32_t dacol)93 static inline void bricolor(palette_t *wpptr, int32_t dacol)
94 {
95     if (gammabrightness)
96     {
97         wpptr->r = curpalette[dacol].r;
98         wpptr->g = curpalette[dacol].g;
99         wpptr->b = curpalette[dacol].b;
100     }
101     else
102     {
103         wpptr->r = britable[curbrightness][curpalette[dacol].r];
104         wpptr->g = britable[curbrightness][curpalette[dacol].g];
105         wpptr->b = britable[curbrightness][curpalette[dacol].b];
106     }
107 }
108 
109 enum
110 {
111     BLENDFACTOR_ZERO = 0,
112     BLENDFACTOR_ONE,
113     BLENDFACTOR_SRC_COLOR,
114     BLENDFACTOR_ONE_MINUS_SRC_COLOR,
115     BLENDFACTOR_SRC_ALPHA,
116     BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
117     BLENDFACTOR_DST_ALPHA,
118     BLENDFACTOR_ONE_MINUS_DST_ALPHA,
119     BLENDFACTOR_DST_COLOR,
120     BLENDFACTOR_ONE_MINUS_DST_COLOR,
121     NUMBLENDFACTORS,
122 };
123 
124 typedef struct glblenddef_
125 {
126     float alpha;
127     uint8_t src, dst, flags;
128 } glblenddef_t;
129 
130 typedef struct glblend_
131 {
132     glblenddef_t def[2];
133 } glblend_t;
134 
135 extern glblend_t const nullglblend, defaultglblend;
136 extern glblend_t glblend[MAXBLENDTABS];
137 
138 extern void handle_blend(uint8_t enable, uint8_t blend, uint8_t def);
139 #endif
140 
141 #ifdef __cplusplus
142 }
143 #endif
144 
145 #endif
146