2 * This program is free software: you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation, either version 3 of the License, or
5 * (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #ifndef AWISH_NO_SOUND
22 # include "SDL_mixer.h"
26 ////////////////////////////////////////////////////////////////////////////////
27 SDL_Surface
*screen
= NULL
;
28 SDL_Surface
*backbuf
= NULL
;
29 Uint32 palette
[256]; // converted
33 ////////////////////////////////////////////////////////////////////////////////
34 static void quitCleanupCB (void) {
35 //if (TTF_WasInit()) TTF_Quit();
41 ////////////////////////////////////////////////////////////////////////////////
43 if (SDL_Init(SDL_INIT_VIDEO
| SDL_INIT_TIMER
44 #ifndef AWISH_NO_SOUND
48 fprintf(stderr
, "FATAL: can't set videomode!\n");
51 SDL_WM_SetCaption("Awish", "Awish");
52 SDL_EnableKeyRepeat(200, 25);
53 //SDL_EnableUNICODE(1); // just4fun
54 SDL_EnableUNICODE(0); // just4fun
55 #ifndef AWISH_NO_SOUND
57 if (Mix_OpenAudio(22050, AUDIO_U8
, 0, 8192)) {
59 fprintf(stderr
, "FATAL: unable to open audio!\n");
63 atexit(quitCleanupCB
);
67 void initVideo (void) {
68 screen
= SDL_SetVideoMode(640, 400, 32, SDL_SWSURFACE
/*|SDL_DOUBLEBUF*/);
70 fprintf(stderr
, "FATAL: can't set videomode!\n");
74 backbuf
= createSurface(640, 480);
75 if (backbuf
== NULL
) {
76 fprintf(stderr
, "FATAL: can't create backbuffer!\n");
79 SDL_SetColorKey(backbuf
, 0, 0);
80 //fprintf(stderr, "BPP: %u\n", screen->format->BytesPerPixel);
85 ////////////////////////////////////////////////////////////////////////////////
86 // create 24bpp surface with color key
87 SDL_Surface
*createSurface (int w
, int h
) {
88 //Uint32 rmask, gmask, bmask/*, amask*/;
91 if (w
< 1 || h
< 1) return NULL
;
93 #if SDL_BYTEORDER == SDL_BIG_ENDIAN
102 //amask = 0xff000000;
104 s = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, w, h, 32, rmask, gmask, bmask, amask);
106 s
= SDL_CreateRGBSurface(SDL_SRCCOLORKEY
, w
, h
, screen
->format
->BitsPerPixel
, screen
->format
->Rmask
, screen
->format
->Gmask
, screen
->format
->Bmask
, screen
->format
->Amask
);
108 SDL_SetColorKey(s
, SDL_SRCCOLORKEY
, palette
[255]);
114 void blitSurfaceEx (SDL_Surface
*dests
, int destx
, int desty
, SDL_Surface
*srcs
, int srcx
, int srcy
, int srcw
, int srch
) {
117 if (srcw
< 0) srcw
= srcs
->w
;
118 if (srch
< 0) srch
= srcs
->h
;
125 SDL_BlitSurface(srcs
, &src
, dests
, &dst
);
129 ////////////////////////////////////////////////////////////////////////////////
130 void lockSurface (SurfaceLock
*lock
, SDL_Surface
*s
) {
133 lock
->needUnlock
= 0;
134 if (s
!= NULL
&& SDL_MUSTLOCK(s
)) {
135 lock
->needUnlock
= (SDL_LockSurface(s
) == 0);
141 void unlockSurface (SurfaceLock
*lock
) {
142 if (lock
&& lock
->s
&& lock
->needUnlock
) {
143 SDL_UnlockSurface(lock
->s
);
144 lock
->needUnlock
= 0;
149 ////////////////////////////////////////////////////////////////////////////////
150 // surface must be locked!
151 void drawChar (SDL_Surface
*s
, char ch
, int x
, int y
, Uint8 clr
) {
152 unsigned char c
= (unsigned char)(ch
);
154 for (int dy
= 0; dy
< 8; ++dy
) {
155 Uint8 b
= font
[c
][dy
];
157 for (int dx
= 0; dx
< 8; ++dx
) {
158 if (b
&0x80) putPixel2x(s
, x
+dx
, y
+dy
, clr
);
165 void drawString (SDL_Surface
*s
, const char *str
, int x
, int y
, Uint8 clr
) {
166 for (; *str
; ++str
) {
167 drawChar(s
, *str
, x
, y
, clr
);