2 Copyright (C) Prikol Software 1996-1997
3 Copyright (C) Aleksey Volynskov 1996-1997
4 Copyright (C) <ARembo@gmail.com> 2011
6 This file is part of the Doom2D:Rembo project.
8 Doom2D:Rembo is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License version 2 as
10 published by the Free Software Foundation.
12 Doom2D:Rembo is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, see <http://www.gnu.org/licenses/> or
19 write to the Free Software Foundation, Inc.,
20 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
34 // адрес экранного буфера
38 unsigned char scrbuf
[64000];
44 SDL_Surface
* screen
= NULL
;
48 char fullscreen
= OFF
;
51 byte mixmap
[256][256];
54 static byte flametab
[16] = {
55 0xBC,0xBA,0xB8,0xB6,0xB4,0xB2,0xB0,0xD5,0xD6,0xD7,0xA1,0xA0,0xE3,0xE2,0xE1,0xE0
58 extern void *walp
[256];
62 vgaimg
*V_getvgaimg (int id
) {
63 int loaded
= M_was_locked(id
);
64 vgaimg
*v
= M_lock(id
);
65 if (v
!= NULL
&& !loaded
) {
66 v
->w
= short2host(v
->w
);
67 v
->h
= short2host(v
->h
);
68 v
->sx
= short2host(v
->sx
);
69 v
->sy
= short2host(v
->sy
);
74 vgaimg
*V_loadvgaimg (char *name
) {
75 return V_getvgaimg(F_getresid(name
));
80 Uint32 flags
= SDL_SWSURFACE
|SDL_DOUBLEBUF
|SDL_HWPALETTE
;
81 if (fullscreen
) flags
= flags
| SDL_FULLSCREEN
;
82 screen
= SDL_SetVideoMode(SCRW
, SCRH
, 8, flags
);
83 if (!screen
) ERR_failinit("Unable to set video mode: %s\n", SDL_GetError());
89 // переключение в текстовый режим
95 void draw_rect (int x
, int y
, int w
, int h
, int c
)
102 SDL_FillRect(screen
, &dstrect
, c
);
105 // установить область вывода
106 void V_setrect(short x
,short w
,short y
,short h
)
113 SDL_SetClipRect(screen
, &r
);
114 SDL_GetClipRect(screen
, &r
);
120 if (cx2
>=SCRW
) cx2
=SCRW
-1;
122 if (cy2
>=SCRH
) cy2
=SCRH
-1;
125 void putpixel(int x
, int y
, Uint8 color
)
127 if(x
>=cx1
&& x
<=cx2
&& y
>=cy1
&& y
<=cy2
) {
130 Uint8
*p
= (Uint8
*)screen
->pixels
+ y
*screen
->pitch
+ x
;
139 byte
getpixel(int x
, int y
)
141 if(x
>=cx1
&& x
<=cx2
&& y
>=cy1
&& y
<=cy2
) {
144 return *((Uint8
*)screen
->pixels
+ y
*screen
->pitch
+ x
);
149 void mappixel(int x
,int y
,byte
* cmap
)
151 byte c
= getpixel(x
,y
);
152 putpixel(x
,y
,cmap
[c
]);
160 if (f
) V_offset(SCRW
/2-320/2, SCRH
/2-200/2);
164 void V_offset(int ox
, int oy
)
170 void draw_spr(short x
,short y
,vgaimg
*i
, int d
, int c
)
175 if (d
& 1) x
=x
-i
->w
+i
->sx
; else x
-=i
->sx
;
176 if (d
& 2) y
=y
-i
->h
+i
->sy
; else y
-=i
->sy
;
177 if(x
+i
->w
>=cx1
&& x
<=cx2
&& y
+i
->h
>=cy1
&& y
<=cy2
) {
179 byte
*p
= (byte
*)i
+ sizeof(vgaimg
);
180 for (ly
=0; ly
<i
->h
; ly
++) {
181 for(lx
=0; lx
<i
->w
; lx
++) {
183 rx
= (d
& 1) ? (i
->w
-lx
-1) : (rx
=lx
);
184 ry
= (d
& 2) ? (i
->h
-ly
-1) : (ry
=ly
);
187 if (c
) if (t
>=0x70 && t
<=0x7F) t
=t
-0x70+c
;
188 putpixel(x
+rx
,y
+ry
,t
);
196 void V_rotspr (int x
, int y
, vgaimg
* i
, int d
)
203 void V_pic(short x
,short y
,vgaimg
*i
)
205 draw_spr(x
,y
,i
, 0, 0);
208 void V_manspr(int x
,int y
,void *p
, unsigned char c
)
210 draw_spr(x
,y
,p
, 0, c
);
213 void V_manspr2(int x
,int y
,void *p
, unsigned char c
)
215 draw_spr(x
,y
,p
, 1, c
);
218 // вывести точку цвета c в координатах (x,y)
219 void V_dot(short x
,short y
, unsigned char c
)
224 void smoke_sprf(int x
, int y
, byte c
)
226 byte t
= getpixel(x
,y
);
230 putpixel(x
,y
,mixmap
[c
][t
]);
233 void flame_sprf(int x
, int y
, byte c
)
235 byte t
= getpixel(x
,y
);
237 putpixel(x
,y
,flametab
[c
]);
240 void V_sprf(short x
,short y
,vgaimg
*i
,spr_f
*f
)
248 for (cy
=y
; cy
<y
+i
->h
; cy
++) {
249 for(cx
=x
; cx
<x
+i
->w
; cx
++) {
258 void V_spr(short x
,short y
,vgaimg
*i
)
260 draw_spr(x
,y
,i
,0, 0);
263 void V_spr2(short x
,short y
,vgaimg
*i
)
268 void V_clr(short x
,short w
,short y
,short h
,unsigned char c
)
270 draw_rect(x
,y
,w
,h
, c
);
273 // установить палитру из массива p
274 void VP_setall(void *p
)
279 // установить n цветов, начиная с f, из массива p
280 void VP_set(void *p
,short f
,short n
)
282 byte
*ptr
= (byte
*)p
;
283 SDL_Color colors
[256];
287 colors
[i
].r
=ptr
[0]*4;
288 colors
[i
].g
=ptr
[1]*4;
289 colors
[i
].b
=ptr
[2]*4;
292 SDL_SetPalette(screen
, SDL_LOGPAL
|SDL_PHYSPAL
, colors
, f
, n
);
295 // установить адрес экранного буфера
296 // NULL - реальный экран
297 void V_setscr(void *p
)
299 if (screen
) SDL_Flip(screen
);
302 // скопировать прямоугольник на экран
303 void V_copytoscr(short x
,short w
,short y
,short h
)
305 x
*=HQ
; y
*=HQ
; w
*=HQ
; h
*=HQ
;
306 SDL_UpdateRect(screen
, x
, y
, w
, h
);
309 void V_maptoscr(int x
,int w
,int y
,int h
,void *cmap
)
312 for (cx
=x
; cx
<x
+w
; cx
++)
313 for (cy
=y
; cy
<y
+h
; cy
++)
314 mappixel(cx
,cy
,(byte
*)cmap
);
315 V_copytoscr(x
,w
,y
,h
);
318 void V_remap_rect(int x
,int y
,int w
,int h
,byte
*cmap
)
321 for (cx
=x
; cx
<x
+w
; cx
++)
322 for (cy
=y
; cy
<y
+h
; cy
++)
323 mappixel(cx
,cy
,cmap
);
326 void Z_drawfld (byte
*fld
, int bg
)
330 for (y
= 0; y
< FLDH
; y
++) {
331 for (x
= 0; x
< FLDW
; x
++) {
332 int sx
= x
* CELW
- w_x
+ WD
/ 2;
333 int sy
= y
* CELH
- w_y
+ HT
/ 2 + 1 + w_o
;
335 vgaimg
*pic
= walp
[*p
];
336 // special pointer value setted for _WATER_* in view.c
337 if ((intptr_t)pic
<= 3) {
339 byte
*cmap
= clrmap
+ ((intptr_t)pic
+7)*256;
340 V_remap_rect(sx
, sy
, CELW
, CELH
, cmap
);
353 if (!SDL_WM_ToggleFullScreen(screen
)) {
354 int ncolors
= screen
->format
->palette
->ncolors
;
355 SDL_Color colors
[256];
357 for (i
=0; i
<ncolors
; i
++) {
358 colors
[i
].r
= screen
->format
->palette
->colors
[i
].r
;
359 colors
[i
].g
= screen
->format
->palette
->colors
[i
].g
;
360 colors
[i
].b
= screen
->format
->palette
->colors
[i
].b
;
363 Uint32 flags
= screen
->flags
;
365 SDL_FreeSurface(screen
);
367 screen
= SDL_SetVideoMode(0, 0, 0, flags
^ SDL_FULLSCREEN
);
369 ERR_fatal("Unable to set video mode\n");
373 SDL_SetPalette(screen
, SDL_LOGPAL
|SDL_PHYSPAL
, colors
, 0, ncolors
);