author | Sam Lantinga <slouken@libsdl.org> |
Sun, 25 Aug 2002 18:59:11 +0000 | |
changeset 473 | 30466f501b77 |
parent 380 | bce7171e7a85 |
child 538 | d3abe873e3f7 |
permissions | -rw-r--r-- |
0 | 1 |
|
2 |
/* Simple program: Fill a colormap with gray and stripe it down the screen */ |
|
3 |
||
4 |
#include <stdio.h> |
|
5 |
#include <stdlib.h> |
|
6 |
#include <string.h> |
|
7 |
#include <time.h> |
|
8 |
||
9 |
#include "SDL.h" |
|
10 |
||
11 |
#ifdef TEST_VGA16 /* Define this if you want to test VGA 16-color video modes */ |
|
12 |
#define NUM_COLORS 16 |
|
13 |
#else |
|
14 |
#define NUM_COLORS 256 |
|
15 |
#endif |
|
16 |
||
17 |
/* Draw a randomly sized and colored box centered about (X,Y) */ |
|
380
bce7171e7a85
Date: Wed, 22 May 2002 22:30:58 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
18 |
void DrawBox(SDL_Surface *screen, int X, int Y, int width, int height) |
0 | 19 |
{ |
20 |
static unsigned int seeded = 0; |
|
21 |
SDL_Rect area; |
|
22 |
Uint32 color; |
|
23 |
||
24 |
/* Seed the random number generator */ |
|
25 |
if ( seeded == 0 ) { |
|
26 |
srand(time(NULL)); |
|
27 |
seeded = 1; |
|
28 |
} |
|
29 |
||
30 |
/* Get the bounds of the rectangle */ |
|
380
bce7171e7a85
Date: Wed, 22 May 2002 22:30:58 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
31 |
area.w = (rand()%width); |
bce7171e7a85
Date: Wed, 22 May 2002 22:30:58 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
32 |
area.h = (rand()%height); |
0 | 33 |
area.x = X-(area.w/2); |
34 |
area.y = Y-(area.h/2); |
|
35 |
color = (rand()%NUM_COLORS); |
|
36 |
||
37 |
/* Do it! */ |
|
38 |
SDL_FillRect(screen, &area, color); |
|
39 |
SDL_UpdateRects(screen, 1, &area); |
|
40 |
} |
|
41 |
||
42 |
SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags) |
|
43 |
{ |
|
44 |
SDL_Surface *screen; |
|
45 |
int i; |
|
46 |
SDL_Color palette[NUM_COLORS]; |
|
47 |
Uint8 *buffer; |
|
48 |
||
49 |
/* Set the video mode */ |
|
50 |
screen = SDL_SetVideoMode(w, h, bpp, flags); |
|
51 |
if ( screen == NULL ) { |
|
52 |
fprintf(stderr, "Couldn't set display mode: %s\n", |
|
53 |
SDL_GetError()); |
|
54 |
return(NULL); |
|
55 |
} |
|
56 |
fprintf(stderr, "Screen is in %s mode\n", |
|
57 |
(screen->flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed"); |
|
58 |
||
59 |
/* Set a gray colormap, reverse order from white to black */ |
|
60 |
for ( i=0; i<NUM_COLORS; ++i ) { |
|
61 |
palette[i].r = (NUM_COLORS-1)-i * (256 / NUM_COLORS); |
|
62 |
palette[i].g = (NUM_COLORS-1)-i * (256 / NUM_COLORS); |
|
63 |
palette[i].b = (NUM_COLORS-1)-i * (256 / NUM_COLORS); |
|
64 |
} |
|
65 |
SDL_SetColors(screen, palette, 0, NUM_COLORS); |
|
66 |
||
67 |
/* Set the surface pixels and refresh! */ |
|
68 |
if ( SDL_LockSurface(screen) < 0 ) { |
|
69 |
fprintf(stderr, "Couldn't lock display surface: %s\n", |
|
70 |
SDL_GetError()); |
|
71 |
return(NULL); |
|
72 |
} |
|
73 |
buffer = (Uint8 *)screen->pixels; |
|
74 |
for ( i=0; i<screen->h; ++i ) { |
|
380
bce7171e7a85
Date: Wed, 22 May 2002 22:30:58 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
75 |
memset(buffer,(i*(NUM_COLORS-1))/screen->h, screen->w * screen->format->BytesPerPixel); |
0 | 76 |
buffer += screen->pitch; |
77 |
} |
|
78 |
SDL_UnlockSurface(screen); |
|
79 |
SDL_UpdateRect(screen, 0, 0, 0, 0); |
|
80 |
||
81 |
return(screen); |
|
82 |
} |
|
83 |
||
84 |
int main(int argc, char *argv[]) |
|
85 |
{ |
|
86 |
SDL_Surface *screen; |
|
87 |
Uint32 videoflags; |
|
88 |
int done; |
|
89 |
SDL_Event event; |
|
90 |
int width, height, bpp; |
|
91 |
||
92 |
/* Initialize SDL */ |
|
93 |
if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { |
|
94 |
fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); |
|
95 |
exit(1); |
|
96 |
} |
|
97 |
||
98 |
/* See if we try to get a hardware colormap */ |
|
99 |
width = 640; |
|
100 |
height = 480; |
|
101 |
bpp = 8; |
|
102 |
videoflags = SDL_SWSURFACE; |
|
103 |
while ( argc > 1 ) { |
|
104 |
--argc; |
|
105 |
if ( argv[argc-1] && (strcmp(argv[argc-1], "-width") == 0) ) { |
|
106 |
width = atoi(argv[argc]); |
|
107 |
--argc; |
|
108 |
} else |
|
109 |
if ( argv[argc-1] && (strcmp(argv[argc-1], "-height") == 0) ) { |
|
110 |
height = atoi(argv[argc]); |
|
111 |
--argc; |
|
112 |
} else |
|
113 |
if ( argv[argc-1] && (strcmp(argv[argc-1], "-bpp") == 0) ) { |
|
114 |
bpp = atoi(argv[argc]); |
|
115 |
--argc; |
|
116 |
} else |
|
117 |
if ( argv[argc] && (strcmp(argv[argc], "-hw") == 0) ) { |
|
118 |
videoflags |= SDL_HWSURFACE; |
|
119 |
} else |
|
120 |
if ( argv[argc] && (strcmp(argv[argc], "-hwpalette") == 0) ) { |
|
121 |
videoflags |= SDL_HWPALETTE; |
|
122 |
} else |
|
123 |
if ( argv[argc] && (strcmp(argv[argc], "-noframe") == 0) ) { |
|
124 |
videoflags |= SDL_NOFRAME; |
|
125 |
} else |
|
126 |
if ( argv[argc] && (strcmp(argv[argc], "-fullscreen") == 0) ) { |
|
127 |
videoflags |= SDL_FULLSCREEN; |
|
128 |
} else { |
|
380
bce7171e7a85
Date: Wed, 22 May 2002 22:30:58 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
129 |
fprintf(stderr, "Usage: %s [-width] [-height] [-bpp] [-hw] [-hwpalette] [-noframe] [-fullscreen]\n", |
0 | 130 |
argv[0]); |
131 |
exit(1); |
|
132 |
} |
|
133 |
} |
|
134 |
||
135 |
/* Set a video mode */ |
|
136 |
screen = CreateScreen(width, height, bpp, videoflags); |
|
137 |
if ( screen == NULL ) { |
|
138 |
exit(2); |
|
139 |
} |
|
140 |
||
141 |
/* Wait for a keystroke */ |
|
142 |
done = 0; |
|
143 |
while ( !done && SDL_WaitEvent(&event) ) { |
|
144 |
switch (event.type) { |
|
145 |
case SDL_MOUSEBUTTONDOWN: |
|
380
bce7171e7a85
Date: Wed, 22 May 2002 22:30:58 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
146 |
DrawBox(screen, event.button.x, event.button.y, width, height); |
0 | 147 |
break; |
148 |
case SDL_KEYDOWN: |
|
149 |
/* Ignore ALT-TAB for windows */ |
|
150 |
if ( (event.key.keysym.sym == SDLK_LALT) || |
|
151 |
(event.key.keysym.sym == SDLK_TAB) ) { |
|
152 |
break; |
|
153 |
} |
|
154 |
/* Center the mouse on <SPACE> */ |
|
155 |
if ( event.key.keysym.sym == SDLK_SPACE ) { |
|
380
bce7171e7a85
Date: Wed, 22 May 2002 22:30:58 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
156 |
SDL_WarpMouse(width/2, height/2); |
0 | 157 |
break; |
158 |
} |
|
159 |
/* Toggle fullscreen mode on <RETURN> */ |
|
160 |
if ( event.key.keysym.sym == SDLK_RETURN ) { |
|
161 |
videoflags ^= SDL_FULLSCREEN; |
|
162 |
screen = CreateScreen( |
|
163 |
screen->w, screen->h, |
|
164 |
screen->format->BitsPerPixel, |
|
165 |
videoflags); |
|
166 |
if ( screen == NULL ) { |
|
167 |
fprintf(stderr, |
|
168 |
"Couldn't toggle fullscreen mode\n"); |
|
169 |
done = 1; |
|
170 |
} |
|
171 |
break; |
|
172 |
} |
|
173 |
/* Any other key quits the application... */ |
|
174 |
case SDL_QUIT: |
|
175 |
done = 1; |
|
176 |
break; |
|
177 |
default: |
|
178 |
break; |
|
179 |
} |
|
180 |
} |
|
181 |
SDL_Quit(); |
|
182 |
return(0); |
|
183 |
} |