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