]> icculus.org git repositories - theoddone33/hheretic.git/blob - base/v_video.c
Initial revision
[theoddone33/hheretic.git] / base / v_video.c
1
2 // V_video.c
3
4 #include "doomdef.h"
5
6 #define SC_INDEX 0x3c4
7
8 byte *screen;
9 int dirtybox[4];
10 int usegamma;
11
12 byte gammatable[5][256] =
13 {
14 {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255},
15
16 {2,4,5,7,8,10,11,12,14,15,16,18,19,20,21,23,24,25,26,27,29,30,31,32,33,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,54,55,56,57,58,59,60,61,62,63,64,65,66,67,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,163,164,165,166,167,168,169,170,171,172,173,174,175,175,176,177,178,179,180,181,182,183,184,185,186,186,187,188,189,190,191,192,193,194,195,196,196,197,198,199,200,201,202,203,204,205,205,206,207,208,209,210,211,212,213,214,214,215,216,217,218,219,220,221,222,222,223,224,225,226,227,228,229,230,230,231,232,233,234,235,236,237,237,238,239,240,241,242,243,244,245,245,246,247,248,249,250,251,252,252,253,254,255},
17
18 {4,7,9,11,13,15,17,19,21,22,24,26,27,29,30,32,33,35,36,38,39,40,42,43,45,46,47,48,50,51,52,54,55,56,57,59,60,61,62,63,65,66,67,68,69,70,72,73,74,75,76,77,78,79,80,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,133,134,135,136,137,138,139,140,141,142,143,144,144,145,146,147,148,149,150,151,152,153,153,154,155,156,157,158,159,160,160,161,162,163,164,165,166,166,167,168,169,170,171,172,172,173,174,175,176,177,178,178,179,180,181,182,183,183,184,185,186,187,188,188,189,190,191,192,193,193,194,195,196,197,197,198,199,200,201,201,202,203,204,205,206,206,207,208,209,210,210,211,212,213,213,214,215,216,217,217,218,219,220,221,221,222,223,224,224,225,226,227,228,228,229,230,231,231,232,233,234,235,235,236,237,238,238,239,240,241,241,242,243,244,244,245,246,247,247,248,249,250,251,251,252,253,254,254,255},
19
20 {8,12,16,19,22,24,27,29,31,34,36,38,40,41,43,45,47,49,50,52,53,55,57,58,60,61,63,64,65,67,68,70,71,72,74,75,76,77,79,80,81,82,84,85,86,87,88,90,91,92,93,94,95,96,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,135,136,137,138,139,140,141,142,143,143,144,145,146,147,148,149,150,150,151,152,153,154,155,155,156,157,158,159,160,160,161,162,163,164,165,165,166,167,168,169,169,170,171,172,173,173,174,175,176,176,177,178,179,180,180,181,182,183,183,184,185,186,186,187,188,189,189,190,191,192,192,193,194,195,195,196,197,197,198,199,200,200,201,202,202,203,204,205,205,206,207,207,208,209,210,210,211,212,212,213,214,214,215,216,216,217,218,219,219,220,221,221,222,223,223,224,225,225,226,227,227,228,229,229,230,231,231,232,233,233,234,235,235,236,237,237,238,238,239,240,240,241,242,242,243,244,244,245,246,246,247,247,248,249,249,250,251,251,252,253,253,254,254,255},
21
22 {16,23,28,32,36,39,42,45,48,50,53,55,57,60,62,64,66,68,69,71,73,75,76,78,80,81,83,84,86,87,89,90,92,93,94,96,97,98,100,101,102,103,105,106,107,108,109,110,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,143,144,145,146,147,148,149,150,150,151,152,153,154,155,155,156,157,158,159,159,160,161,162,163,163,164,165,166,166,167,168,169,169,170,171,172,172,173,174,175,175,176,177,177,178,179,180,180,181,182,182,183,184,184,185,186,187,187,188,189,189,190,191,191,192,193,193,194,195,195,196,196,197,198,198,199,200,200,201,202,202,203,203,204,205,205,206,207,207,208,208,209,210,210,211,211,212,213,213,214,214,215,216,216,217,217,218,219,219,220,220,221,221,222,223,223,224,224,225,225,226,227,227,228,228,229,229,230,230,231,232,232,233,233,234,234,235,235,236,236,237,237,238,239,239,240,240,241,241,242,242,243,243,244,244,245,245,246,246,247,247,248,248,249,249,250,250,251,251,252,252,253,254,254,255,255}
23 };
24
25 //---------------------------------------------------------------------------
26 //
27 // PROC V_DrawPatch
28 //
29 // Draws a column based masked pic to the screen.
30 //
31 //---------------------------------------------------------------------------
32
33 void V_DrawPatch(int x, int y, patch_t *patch)
34 {
35         int count;
36         int col;
37         column_t *column;
38         byte *desttop;
39         byte *dest;
40         byte *source;
41         int w;
42
43         y -= SHORT(patch->topoffset);
44         x -= SHORT(patch->leftoffset);
45         if(x < 0 || x+SHORT(patch->width) > SCREENWIDTH || y < 0
46                 || y+SHORT(patch->height) > SCREENHEIGHT)
47         {
48                 I_Error("Bad V_DrawPatch");
49         }
50         col = 0;
51         desttop = screen+y*SCREENWIDTH+x;
52         w = SHORT(patch->width);
53         for(; col < w; x++, col++, desttop++)
54         {
55                 column = (column_t *)((byte *)patch+LONG(patch->columnofs[col]));
56                 // Step through the posts in a column
57                 while(column->topdelta != 0xff)
58                 {
59                         source = (byte *)column+3;
60                         dest = desttop+column->topdelta*SCREENWIDTH;
61                         count = column->length;
62                         while(count--)
63                         {
64                                 *dest = *source++;
65                                 dest += SCREENWIDTH;
66                         }
67                         column = (column_t *)((byte *)column+column->length+4);
68                 }
69         }
70 }
71
72 /*
73 ==================
74 =
75 = V_DrawFuzzPatch
76 =
77 = Masks a column based translucent masked pic to the screen.
78 =
79 ==================
80 */
81 extern byte *tinttable;
82
83 void V_DrawFuzzPatch (int x, int y, patch_t *patch)
84 {
85         int                     count,col;
86         column_t        *column;
87         byte            *desttop, *dest, *source;
88         int                     w;
89         
90         y -= SHORT(patch->topoffset);
91         x -= SHORT(patch->leftoffset);
92
93         if (x<0||x+SHORT(patch->width) >SCREENWIDTH || y<0 || y+SHORT(patch->height)>SCREENHEIGHT)
94                 I_Error ("Bad V_DrawPatch");
95
96         col = 0;
97         desttop = screen+y*SCREENWIDTH+x;
98         
99         w = SHORT(patch->width);
100         for ( ; col<w ; x++, col++, desttop++)
101         {
102                 column = (column_t *)((byte *)patch + LONG(patch->columnofs[col]));
103
104 // step through the posts in a column
105         
106                 while (column->topdelta != 0xff )
107                 {
108                         source = (byte *)column + 3;
109                         dest = desttop + column->topdelta*SCREENWIDTH;
110                         count = column->length;
111                         
112                         while (count--)
113                         {
114                                 *dest = tinttable[((*dest)<<8) + *source++];
115                                 dest += SCREENWIDTH;
116                         }
117                         column = (column_t *)(  (byte *)column + column->length
118 + 4 );
119                 }
120         }                       
121 }
122
123 /*
124 ==================
125 =
126 = V_DrawShadowedPatch
127 =
128 = Masks a column based masked pic to the screen.
129 =
130 ==================
131 */
132
133 void V_DrawShadowedPatch(int x, int y, patch_t *patch)
134 {
135         int                     count,col;
136         column_t        *column;
137         byte            *desttop, *dest, *source;
138         byte            *desttop2, *dest2;
139         int                     w;
140         
141         y -= SHORT(patch->topoffset);
142         x -= SHORT(patch->leftoffset);
143
144         if (x<0||x+SHORT(patch->width) >SCREENWIDTH || y<0 || y+SHORT(patch->height)>SCREENHEIGHT)
145                 I_Error ("Bad V_DrawPatch");
146
147         col = 0;
148         desttop = screen+y*SCREENWIDTH+x;
149         desttop2 = screen+(y+2)*SCREENWIDTH+x+2;
150         
151         w = SHORT(patch->width);
152         for ( ; col<w ; x++, col++, desttop++, desttop2++)
153         {
154                 column = (column_t *)((byte *)patch + LONG(patch->columnofs[col]));
155
156 // step through the posts in a column
157         
158                 while (column->topdelta != 0xff )
159                 {
160                         source = (byte *)column + 3;
161                         dest = desttop + column->topdelta*SCREENWIDTH;
162                         dest2 = desttop2 + column->topdelta*SCREENWIDTH;
163                         count = column->length;
164                         
165                         while (count--)
166                         {
167                                 *dest2 = tinttable[((*dest2)<<8)];
168                                 dest2 += SCREENWIDTH;
169                                 *dest = *source++;
170                                 dest += SCREENWIDTH;
171
172                         }
173                         column = (column_t *)(  (byte *)column + column->length
174 + 4 );
175                 }
176         }                       
177 }
178
179 //---------------------------------------------------------------------------
180 //
181 // PROC V_DrawRawScreen
182 //
183 //---------------------------------------------------------------------------
184
185 void V_DrawRawScreen(byte *raw)
186 {
187         memcpy(screen, raw, SCREENWIDTH*SCREENHEIGHT);
188 }
189
190 //---------------------------------------------------------------------------
191 //
192 // PROC V_Init
193 //
194 //---------------------------------------------------------------------------
195
196 void V_Init(void)
197 {
198         // I_AllocLow will put screen in low dos memory on PCs.
199         screen = I_AllocLow(SCREENWIDTH*SCREENHEIGHT);
200 }