1 #include "gr.h"
2 #include "grdef.h"
3 #include "palette.h"
4 
5 #include <ddraw.h>
6 
7 
8 //added on 7/11/99 by adb to fix palette problem
9 #undef min
min(int x,int y)10 static __inline int min(int x, int y) { return x < y ? x : y; }
11 //end additions - adb
12 
13 static int last_r=0, last_g=0, last_b=0;
14 
15 extern void Win32_DoSetPalette(PALETTEENTRY *rgpe);
16 extern void Win32_DoGetPalette(PALETTEENTRY *rgpe);
17 extern void Win32_MakePalVisible(void);
18 
gr_palette_step_up(int r,int g,int b)19 void gr_palette_step_up( int r, int g, int b )
20 {
21 	int i;
22 	ubyte *p;
23 	int temp;
24 
25 	PALETTEENTRY pe[256];
26 
27 	if (gr_palette_faded_out) return;
28 
29 	if ( (r==last_r) && (g==last_g) && (b==last_b) ) return;
30 
31 	last_r = r;
32 	last_g = g;
33 	last_b = b;
34 
35 	p=gr_palette;
36 	for (i=0; i<256; i++)
37 	{
38 		temp = (int)(*p++) + r;
39 		if (temp<0) temp=0;
40 			else if (temp>63) temp=63;
41 		pe[i].peRed = min(temp + gr_palette_gamma, 63) * 4;
42 		temp = (int)(*p++) + g;
43 		if (temp<0) temp=0;
44 			else if (temp>63) temp=63;
45 		pe[i].peGreen = min(temp + gr_palette_gamma, 63) * 4 ;
46 		temp = (int)(*p++) + b;
47 		if (temp<0) temp=0;
48 			else if (temp>63) temp=63;
49 		pe[i].peBlue = min(temp + gr_palette_gamma, 63) * 4;
50 		pe[i].peFlags = 0;
51 	}
52 	Win32_DoSetPalette (pe);
53 }
54 
gr_palette_clear()55 void gr_palette_clear()
56 {
57 	int i;
58 
59 	PALETTEENTRY pe[256];
60 	for (i=0;i<256;i++)
61 	{
62 		pe[i].peRed=pe[i].peGreen=pe[i].peBlue=pe[i].peFlags=0;
63 	}
64 
65 	Win32_DoSetPalette (pe);
66 
67 	gr_palette_faded_out = 1;
68 }
69 
gr_palette_load(ubyte * pal)70 void gr_palette_load( ubyte *pal )
71 {
72 	int i, j;
73 	PALETTEENTRY pe[256];
74 
75 	for (i=0; i<768; i++ ) {
76 		//gr_current_pal[i] = pal[i] + gr_palette_gamma;
77 		//if (gr_current_pal[i] > 63) gr_current_pal[i] = 63;
78 		gr_current_pal[i] = pal[i];
79 	}
80 	for (i=0,j=0;j<256;j++)
81 	{
82 		pe[j].peRed = min(gr_current_pal[i++] + gr_palette_gamma, 63) * 4;
83 		pe[j].peGreen= min(gr_current_pal[i++] + gr_palette_gamma, 63) * 4;
84 		pe[j].peBlue = min(gr_current_pal[i++] + gr_palette_gamma, 63) * 4;
85 		pe[j].peFlags = 0;
86 	}
87 	Win32_DoSetPalette (pe);
88 
89 	gr_palette_faded_out = 0;
90 	init_computed_colors();
91 }
92 
gr_palette_fade_out(ubyte * pal,int nsteps,int allow_keys)93 int gr_palette_fade_out(ubyte *pal, int nsteps, int allow_keys )
94 {
95 	int i,j,k;
96 	fix fade_palette[768];
97 	fix fade_palette_delta[768];
98 	PALETTEENTRY pe[256];
99 
100 	allow_keys  = allow_keys;
101 
102 	if (gr_palette_faded_out) return 0;
103 
104 	if (pal==NULL) pal=gr_current_pal;
105 
106 	for (i=0; i<768; i++ )
107 	{
108 		gr_current_pal[i] = pal[i];
109 		fade_palette[i] = i2f(pal[i]);
110 		fade_palette_delta[i] = fade_palette[i] / nsteps;
111 	}
112 
113 	for (j=0; j<nsteps; j++ )
114 	{
115 		for (i=0, k = 0; k < 256; k++)
116 		{
117 			fade_palette[i] -= fade_palette_delta[i];
118 			if (fade_palette[i] < 0 )
119 				fade_palette[i] = 0;
120 			if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma) )
121 				fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
122 
123 			pe[k].peRed = min(f2i(fade_palette[i]), 63) * 4;
124  			i++;
125 			fade_palette[i] -= fade_palette_delta[i];
126 			if (fade_palette[i] < 0 )
127 				fade_palette[i] = 0;
128 			if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma) )
129 				fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
130 
131 			pe[k].peGreen = min(f2i(fade_palette[i]), 63) * 4;
132  			i++;
133 			fade_palette[i] -= fade_palette_delta[i];
134 			if (fade_palette[i] < 0 )
135 				fade_palette[i] = 0;
136 			if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma) )
137 				fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
138 
139 			pe[k].peBlue = min(f2i(fade_palette[i]), 63) * 4;
140 			pe[k].peFlags = 0;
141  			i++;
142 		}
143 
144 		Win32_DoSetPalette (pe);
145 		Win32_MakePalVisible ();
146 	}
147 
148 	gr_palette_faded_out = 1;
149 	return 0;
150 }
151 
gr_palette_fade_in(ubyte * pal,int nsteps,int allow_keys)152 int gr_palette_fade_in(ubyte *pal, int nsteps, int allow_keys)
153 {
154 	int i,j, k;
155 //	ubyte c;
156 	fix fade_palette[768];
157 	fix fade_palette_delta[768];
158 
159 	PALETTEENTRY pe[256];
160 
161 	allow_keys  = allow_keys;
162 
163 	if (!gr_palette_faded_out) return 0;
164 
165 	if (pal==NULL) pal=gr_current_pal;
166 
167 
168 	for (i=0; i<768; i++ )	{
169 		gr_current_pal[i] = pal[i];
170 		fade_palette[i] = 0;
171 		fade_palette_delta[i] = i2f(pal[i]) / nsteps;
172 	}
173 
174 	for (j=0; j<nsteps; j++ )	{
175 		for (i=0, k = 0; k<256; k++ )	{
176 			fade_palette[i] += fade_palette_delta[i];
177 			if (fade_palette[i] < 0 )
178 				fade_palette[i] = 0;
179 			if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma) )
180 				fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
181 
182 			pe[k].peRed = min(f2i(fade_palette[i]), 63) * 4;
183  			i++;
184 			fade_palette[i] += fade_palette_delta[i];
185 			if (fade_palette[i] < 0 )
186 				fade_palette[i] = 0;
187 			if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma) )
188 				fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
189 
190 			pe[k].peGreen = min(f2i(fade_palette[i]), 63) * 4;
191  			i++;
192 			fade_palette[i] += fade_palette_delta[i];
193 			if (fade_palette[i] < 0 )
194 				fade_palette[i] = 0;
195 			if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma) )
196 				fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
197 
198 			pe[k].peBlue = min(f2i(fade_palette[i]), 63) * 4;
199 			pe[k].peFlags = 0;
200  			i++;
201 		}
202 
203 		Win32_DoSetPalette (pe);
204 		//added on 7/11/99 by adb to allow fade in on non-palette displays
205 		Win32_MakePalVisible ();
206 		//end additions - adb
207 	}
208 
209 	gr_palette_faded_out = 0;
210 	return 0;
211 }
212 
gr_palette_read(ubyte * pal)213 void gr_palette_read(ubyte * pal)
214 {
215 	int i;
216 //        char c;
217 	PALETTEENTRY rgpe [256];
218 	Win32_DoGetPalette (rgpe);
219 	for (i = 0; i < 256; i++)
220 	{
221 		*pal++ = (rgpe[i].peRed) / 4;
222 		*pal++ = (rgpe[i].peGreen) / 4;
223 		*pal++ = (rgpe[i].peBlue) / 4;
224 	}
225 }
226