Rev 300 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
298 | serge | 1 | // Emacs style mode select -*- C++ -*- |
2 | //----------------------------------------------------------------------------- |
||
3 | // |
||
4 | // $Id:$ |
||
5 | // |
||
6 | // Copyright (C) 1993-1996 by id Software, Inc. |
||
7 | // |
||
8 | // This source is available for distribution and/or modification |
||
9 | // only under the terms of the DOOM Source Code License as |
||
10 | // published by id Software. All rights reserved. |
||
11 | // |
||
12 | // The source is distributed in the hope that it will be useful, |
||
13 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
14 | // FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License |
||
15 | // for more details. |
||
16 | // |
||
17 | // $Log:$ |
||
18 | // |
||
19 | // DESCRIPTION: |
||
333 | serge | 20 | // DOOM graphics stuff for SDL library |
298 | serge | 21 | // |
22 | //----------------------------------------------------------------------------- |
||
23 | |||
24 | static const char |
||
25 | rcsid[] = "$Id: i_x.c,v 1.6 1997/02/03 22:45:10 b1 Exp $"; |
||
26 | |||
27 | #include |
||
28 | |||
333 | serge | 29 | #include "m_swap.h" |
298 | serge | 30 | #include "doomstat.h" |
31 | #include "i_system.h" |
||
32 | #include "v_video.h" |
||
33 | #include "m_argv.h" |
||
34 | #include "d_main.h" |
||
35 | |||
36 | #include "doomdef.h" |
||
37 | |||
333 | serge | 38 | #include "kolibri.h" |
39 | |||
40 | void BlitDIB(); |
||
41 | |||
42 | typedef struct SURFACE |
||
43 | { |
||
44 | unsigned char *pixels; |
||
45 | int w, h; |
||
46 | int pitch; |
||
47 | int offset; |
||
48 | } SURFACE; |
||
298 | serge | 49 | |
50 | SURFACE screen; |
||
51 | |||
52 | // Fake mouse handling. |
||
333 | serge | 53 | boolean grabMouse; |
298 | serge | 54 | |
55 | // Blocky mode, |
||
56 | // replace each 320x200 pixel with multiply*multiply pixels. |
||
57 | // According to Dave Taylor, it still is a bonehead thing |
||
58 | // to use .... |
||
333 | serge | 59 | static int multiply=2; |
298 | serge | 60 | |
61 | static int disableVerticalMouse = 0; |
||
62 | |||
333 | serge | 63 | static int scr_w =0; |
64 | static int scr_h =0; |
||
65 | static int win_x, win_y; |
||
66 | static int win_w, win_h; |
||
298 | serge | 67 | |
68 | |||
69 | |||
333 | serge | 70 | //int palette_color[256]; |
298 | serge | 71 | |
72 | |||
333 | serge | 73 | static int lastmousex = 0; |
74 | static int lastmousey = 0; |
||
75 | boolean mousemoved = false; |
||
298 | serge | 76 | |
77 | |||
78 | void I_ShutdownGraphics(void) |
||
79 | { |
||
333 | serge | 80 | |
298 | serge | 81 | } |
82 | |||
83 | |||
84 | |||
85 | // |
||
86 | // I_StartFrame |
||
87 | // |
||
88 | void I_StartFrame (void) |
||
89 | { |
||
90 | // er? |
||
333 | serge | 91 | |
92 | //printf("start new frame\n\r" ); |
||
298 | serge | 93 | |
94 | } |
||
95 | |||
333 | serge | 96 | int test_for_event(void) |
97 | { int retval; |
||
98 | _asm |
||
99 | { push ebx |
||
100 | push ecx |
||
101 | push edx |
||
102 | push esi |
||
103 | push edi |
||
104 | mov eax,11 |
||
105 | int 0x40 |
||
106 | mov [retval], eax |
||
107 | pop edi |
||
108 | pop esi |
||
109 | pop edx |
||
110 | pop ecx |
||
111 | pop ebx |
||
112 | }; |
||
113 | return retval; |
||
114 | }; |
||
298 | serge | 115 | |
116 | |||
117 | void I_GetEvent(void) |
||
118 | { |
||
333 | serge | 119 | event_t evnt; |
120 | int val; |
||
121 | int key; |
||
122 | //printf("begin get_event()\n\r"); |
||
123 | do |
||
124 | { val= test_for_event(); |
||
125 | switch(val) |
||
126 | { case EV_REDRAW: |
||
127 | BeginDraw(); |
||
128 | DrawWindow(win_x,win_y,win_w,win_h,0x404040,3,0,0,0); |
||
129 | EndDraw(); |
||
130 | BlitDIB(); |
||
131 | break; |
||
298 | serge | 132 | |
333 | serge | 133 | case EV_KEY: |
134 | if(!get_key(&key)) |
||
135 | { |
||
136 | switch(key) |
||
137 | { case 0xE0: |
||
138 | case 0xE1: |
||
139 | continue; |
||
140 | default: |
||
141 | if(key&0x80) |
||
142 | { //printf("key released\n\r"); |
||
143 | evnt.type = ev_keyup; |
||
144 | } |
||
145 | else |
||
146 | { //printf("key pressed %x\n\r",key); |
||
147 | evnt.type = ev_keydown; |
||
148 | }; |
||
149 | key&=0x7F; |
||
150 | evnt.data1=remap_key(key); |
||
151 | if ( evnt.data1 != 0 ) |
||
152 | D_PostEvent(&evnt); |
||
153 | continue; |
||
154 | }; |
||
155 | }; |
||
156 | continue; |
||
298 | serge | 157 | |
333 | serge | 158 | case EV_BUTTON: |
159 | switch(get_button_id()) |
||
160 | { case 1: |
||
161 | return; |
||
162 | |||
163 | default:; |
||
164 | }; |
||
165 | }; |
||
166 | }while(val); |
||
298 | serge | 167 | } |
168 | |||
169 | |||
170 | |||
171 | // |
||
172 | // I_StartTic |
||
173 | // |
||
174 | void I_StartTic (void) |
||
175 | { |
||
176 | I_GetEvent(); |
||
333 | serge | 177 | |
298 | serge | 178 | } |
179 | |||
180 | |||
181 | // |
||
182 | // I_UpdateNoBlit |
||
183 | // |
||
184 | void I_UpdateNoBlit (void) |
||
185 | { |
||
186 | // what is this? |
||
187 | } |
||
188 | |||
189 | // |
||
190 | // I_ReadScreen |
||
191 | // |
||
192 | void I_ReadScreen (byte* scr) |
||
193 | { |
||
194 | memcpy (scr, screens[0], SCREENWIDTH*SCREENHEIGHT); |
||
195 | } |
||
196 | |||
197 | |||
198 | // |
||
199 | // I_SetPalette |
||
200 | // |
||
201 | |||
333 | serge | 202 | unsigned int colors[256]; |
298 | serge | 203 | |
204 | void I_SetPalette (byte* palette) |
||
205 | { |
||
206 | int i; |
||
333 | serge | 207 | unsigned int r; |
208 | unsigned int g; |
||
209 | unsigned int b; |
||
210 | |||
211 | for ( i=0; i<256; ++i ) |
||
298 | serge | 212 | { |
333 | serge | 213 | r = gammatable[usegamma][*palette++]; |
214 | g = gammatable[usegamma][*palette++]; |
||
215 | b = gammatable[usegamma][*palette++]; |
||
216 | colors[i]= b|(g<<8)|(r<<16); |
||
298 | serge | 217 | } |
218 | } |
||
219 | |||
333 | serge | 220 | void BeginDraw() |
221 | { _asm |
||
222 | { push ebx |
||
223 | mov eax,12 |
||
224 | mov ebx, 1 |
||
225 | int 0x40 |
||
226 | pop ebx |
||
227 | }; |
||
228 | }; |
||
298 | serge | 229 | |
333 | serge | 230 | void EndDraw() |
231 | { _asm |
||
232 | { push ebx |
||
233 | mov eax,12 |
||
234 | mov ebx, 2 |
||
235 | int 0x40 |
||
236 | pop ebx |
||
237 | }; |
||
238 | }; |
||
298 | serge | 239 | |
240 | void I_InitGraphics(void) |
||
241 | { |
||
242 | static int firsttime=1; |
||
243 | |||
333 | serge | 244 | int frameX, frameY; |
245 | |||
298 | serge | 246 | if (!firsttime) |
333 | serge | 247 | return; |
298 | serge | 248 | firsttime = 0; |
249 | |||
250 | if (M_CheckParm("-2")) |
||
333 | serge | 251 | multiply = 2; |
298 | serge | 252 | |
253 | if (M_CheckParm("-3")) |
||
333 | serge | 254 | multiply = 3; |
298 | serge | 255 | |
256 | if (M_CheckParm("-4")) |
||
333 | serge | 257 | multiply = 4; |
298 | serge | 258 | |
333 | serge | 259 | win_w = SCREENWIDTH * multiply; |
260 | win_h = SCREENHEIGHT * multiply; |
||
298 | serge | 261 | |
262 | // check if the user wants to grab the mouse (quite unnice) |
||
263 | grabMouse = !!M_CheckParm("-grabmouse"); |
||
264 | |||
265 | /* [Petteri] New: Option to disable mouse vertical movement - useful |
||
266 | for players used to Quake: */ |
||
267 | disableVerticalMouse = !!M_CheckParm("-novertmouse"); |
||
268 | |||
269 | /* Build and initialize the window: */ |
||
270 | |||
333 | serge | 271 | frameX = 0; |
272 | frameY = 18; |
||
298 | serge | 273 | |
333 | serge | 274 | GetScreenSize(&scr_w, &scr_h); |
275 | win_x = (scr_w-win_w)/2; |
||
276 | win_y = (scr_h-win_h)/2; |
||
277 | |||
278 | // hCursor = LoadCursor( 0, IDC_ARROW ); |
||
298 | serge | 279 | |
333 | serge | 280 | printf("I_InitGraphics: Client area: %ux%u\n\r", win_w, win_h); |
298 | serge | 281 | |
333 | serge | 282 | screen.pixels= (byte*) UserAlloc(640*400*4); |
283 | screen.h = win_w; |
||
284 | screen.w = win_h; |
||
298 | serge | 285 | screen.pitch=640; |
333 | serge | 286 | |
287 | BeginDraw(); |
||
288 | DrawWindow(win_x,win_y,win_w,win_h,0x404040,3,0,0,0); |
||
289 | EndDraw(); |
||
298 | serge | 290 | |
291 | } |
||
292 | |||
293 | |||
333 | serge | 294 | void conv(char *dst, char *src); |
298 | serge | 295 | |
333 | serge | 296 | void BlitDIB() |
297 | { |
||
298 | _asm |
||
299 | { push ebx |
||
300 | push ecx |
||
301 | push edx |
||
302 | mov eax, 7 |
||
303 | mov ebx, dword ptr [screen] |
||
304 | mov ecx, 0x02800190 |
||
305 | xor edx, edx |
||
306 | int 0x40 |
||
307 | pop edx |
||
308 | pop ecx |
||
309 | pop ebx |
||
310 | } |
||
311 | }; |
||
298 | serge | 312 | |
313 | // |
||
314 | // I_FinishUpdate |
||
333 | serge | 315 | // |
298 | serge | 316 | void I_FinishUpdate (void) |
317 | { |
||
333 | serge | 318 | char *dst0; |
319 | char *dst1; |
||
320 | char *src; |
||
321 | |||
322 | int x, y; |
||
323 | |||
324 | dst0 = &((char *)screen.pixels)[0]; |
||
325 | dst1 = dst0+640*3; |
||
326 | src= (char*)screens[0]; |
||
327 | y = SCREENHEIGHT; |
||
328 | while (y--) |
||
298 | serge | 329 | { |
333 | serge | 330 | x = SCREENWIDTH; |
331 | conv(dst0,src); |
||
332 | src+=320; |
||
333 | dst0+=640*3*2; |
||
334 | dst1+=640*3*2; |
||
298 | serge | 335 | } |
333 | serge | 336 | BlitDIB(); |
298 | serge | 337 | } |
338 | |||
333 | serge | 339 | void conv(char *dst, char *src) |
298 | serge | 340 | { |
333 | serge | 341 | _asm |
342 | { |
||
343 | push ebx |
||
344 | push ecx |
||
345 | push esi |
||
346 | push edi |
||
347 | |||
348 | mov ecx, 320 |
||
349 | mov esi, [src] |
||
350 | mov edi, [dst] |
||
351 | cld |
||
352 | l1: |
||
353 | lodsb |
||
354 | movzx eax, al |
||
355 | mov eax, [colors+eax*4] |
||
356 | mov ebx, eax |
||
357 | bswap ebx |
||
358 | and ebx, 0xFF000000 |
||
359 | or eax, ebx |
||
360 | mov [edi],eax |
||
361 | mov [edi+640*3], eax |
||
362 | shr eax, 8 |
||
363 | mov [edi+4], ax |
||
364 | mov [edi+640*3+4], ax |
||
365 | add edi, 6 |
||
366 | dec ecx |
||
367 | jnz l1 |
||
368 | |||
369 | pop edi |
||
370 | pop esi |
||
371 | pop ecx |
||
372 | pop ebx |
||
373 | }; |
||
374 | };16); |
||
375 | |||
376 | |||
298 | serge | 377 | |
378 |