|
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) */ |
|
18 void DrawBox(SDL_Surface *screen, int X, int Y, int width, int height) |
|
19 { |
|
20 static unsigned int seeded = 0; |
|
21 SDL_Rect area; |
|
22 Uint32 color; |
|
23 Uint32 randc; |
|
24 |
|
25 /* Seed the random number generator */ |
|
26 if ( seeded == 0 ) { |
|
27 srand(time(NULL)); |
|
28 seeded = 1; |
|
29 } |
|
30 |
|
31 /* Get the bounds of the rectangle */ |
|
32 area.w = (rand()%width); |
|
33 area.h = (rand()%height); |
|
34 area.x = X-(area.w/2); |
|
35 area.y = Y-(area.h/2); |
|
36 randc = (rand()%NUM_COLORS); |
|
37 |
|
38 if (screen->format->BytesPerPixel==1) |
|
39 { |
|
40 color = randc; |
|
41 } |
|
42 else |
|
43 { |
|
44 color = SDL_MapRGB(screen->format, randc, randc, randc); |
|
45 } |
|
46 |
|
47 /* Do it! */ |
|
48 SDL_FillRect(screen, &area, color); |
|
49 if ( screen->flags & SDL_DOUBLEBUF ) { |
|
50 SDL_Flip(screen); |
|
51 } else { |
|
52 SDL_UpdateRects(screen, 1, &area); |
|
53 } |
|
54 } |
|
55 |
|
56 void DrawBackground(SDL_Surface *screen) |
|
57 { |
|
58 int i, j, k; |
|
59 Uint8 *buffer; |
|
60 Uint16 *buffer16; |
|
61 Uint16 color; |
|
62 Uint8 gradient; |
|
63 |
|
64 /* Set the surface pixels and refresh! */ |
|
65 /* Use two loops in case the surface is double-buffered (both sides) */ |
|
66 |
|
67 for ( j=0; j<2; ++j ) { |
|
68 if ( SDL_LockSurface(screen) < 0 ) { |
|
69 fprintf(stderr, "Couldn't lock display surface: %s\n", |
|
70 SDL_GetError()); |
|
71 return; |
|
72 } |
|
73 buffer = (Uint8 *)screen->pixels; |
|
74 |
|
75 if (screen->format->BytesPerPixel!=2) { |
|
76 for ( i=0; i<screen->h; ++i ) { |
|
77 memset(buffer,(i*(NUM_COLORS-1))/screen->h, screen->w * screen->format->BytesPerPixel); |
|
78 buffer += screen->pitch; |
|
79 } |
|
80 } |
|
81 else |
|
82 { |
|
83 for ( i=0; i<screen->h; ++i ) { |
|
84 gradient=((i*(NUM_COLORS-1))/screen->h); |
|
85 color = SDL_MapRGB(screen->format, gradient, gradient, gradient); |
|
86 buffer16=(Uint16*)buffer; |
|
87 for (k=0; k<screen->w; k++) |
|
88 { |
|
89 *(buffer16+k)=color; |
|
90 } |
|
91 buffer += screen->pitch; |
|
92 } |
|
93 } |
|
94 |
|
95 SDL_UnlockSurface(screen); |
|
96 if ( screen->flags & SDL_DOUBLEBUF ) { |
|
97 SDL_Flip(screen); |
|
98 } else { |
|
99 SDL_UpdateRect(screen, 0, 0, 0, 0); |
|
100 break; |
|
101 } |
|
102 } |
|
103 } |
|
104 |
|
105 SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags) |
|
106 { |
|
107 SDL_Surface *screen; |
|
108 int i; |
|
109 SDL_Color palette[NUM_COLORS]; |
|
110 |
|
111 /* Set the video mode */ |
|
112 screen = SDL_SetVideoMode(w, h, bpp, flags); |
|
113 if ( screen == NULL ) { |
|
114 fprintf(stderr, "Couldn't set display mode: %s\n", |
|
115 SDL_GetError()); |
|
116 return(NULL); |
|
117 } |
|
118 fprintf(stderr, "Screen is in %s mode\n", |
|
119 (screen->flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed"); |
|
120 |
|
121 if (bpp==8) { |
|
122 /* Set a gray colormap, reverse order from white to black */ |
|
123 for ( i=0; i<NUM_COLORS; ++i ) { |
|
124 palette[i].r = (NUM_COLORS-1)-i * (256 / NUM_COLORS); |
|
125 palette[i].g = (NUM_COLORS-1)-i * (256 / NUM_COLORS); |
|
126 palette[i].b = (NUM_COLORS-1)-i * (256 / NUM_COLORS); |
|
127 } |
|
128 SDL_SetColors(screen, palette, 0, NUM_COLORS); |
|
129 } |
|
130 |
|
131 return(screen); |
|
132 } |
|
133 |
|
134 int main(int argc, char *argv[]) |
|
135 { |
|
136 SDL_Surface *screen; |
|
137 Uint32 videoflags; |
|
138 int done; |
|
139 SDL_Event event; |
|
140 int width, height, bpp; |
|
141 |
|
142 /* Initialize SDL */ |
|
143 if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { |
|
144 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); |
|
145 exit(1); |
|
146 } |
|
147 |
|
148 /* See if we try to get a hardware colormap */ |
|
149 width = 640; |
|
150 height = 480; |
|
151 bpp = 8; |
|
152 videoflags = SDL_SWSURFACE; |
|
153 while ( argc > 1 ) { |
|
154 --argc; |
|
155 if ( argv[argc-1] && (strcmp(argv[argc-1], "-width") == 0) ) { |
|
156 width = atoi(argv[argc]); |
|
157 --argc; |
|
158 } else |
|
159 if ( argv[argc-1] && (strcmp(argv[argc-1], "-height") == 0) ) { |
|
160 height = atoi(argv[argc]); |
|
161 --argc; |
|
162 } else |
|
163 if ( argv[argc-1] && (strcmp(argv[argc-1], "-bpp") == 0) ) { |
|
164 bpp = atoi(argv[argc]); |
|
165 --argc; |
|
166 } else |
|
167 if ( argv[argc] && (strcmp(argv[argc], "-hw") == 0) ) { |
|
168 videoflags |= SDL_HWSURFACE; |
|
169 } else |
|
170 if ( argv[argc] && (strcmp(argv[argc], "-hwpalette") == 0) ) { |
|
171 videoflags |= SDL_HWPALETTE; |
|
172 } else |
|
173 if ( argv[argc] && (strcmp(argv[argc], "-flip") == 0) ) { |
|
174 videoflags |= SDL_DOUBLEBUF; |
|
175 } else |
|
176 if ( argv[argc] && (strcmp(argv[argc], "-noframe") == 0) ) { |
|
177 videoflags |= SDL_NOFRAME; |
|
178 } else |
|
179 if ( argv[argc] && (strcmp(argv[argc], "-resize") == 0) ) { |
|
180 videoflags |= SDL_RESIZABLE; |
|
181 } else |
|
182 if ( argv[argc] && (strcmp(argv[argc], "-fullscreen") == 0) ) { |
|
183 videoflags |= SDL_FULLSCREEN; |
|
184 } else { |
|
185 fprintf(stderr, "Usage: %s [-width] [-height] [-bpp] [-hw] [-hwpalette] [-flip] [-noframe] [-fullscreen] [-resize]\n", |
|
186 argv[0]); |
|
187 exit(1); |
|
188 } |
|
189 } |
|
190 |
|
191 /* Set a video mode */ |
|
192 screen = CreateScreen(width, height, bpp, videoflags); |
|
193 if ( screen == NULL ) { |
|
194 exit(2); |
|
195 } |
|
196 |
|
197 DrawBackground(screen); |
|
198 |
|
199 /* Wait for a keystroke */ |
|
200 done = 0; |
|
201 while ( !done && SDL_WaitEvent(&event) ) { |
|
202 switch (event.type) { |
|
203 case SDL_MOUSEBUTTONDOWN: |
|
204 DrawBox(screen, event.button.x, event.button.y, width, height); |
|
205 break; |
|
206 case SDL_KEYDOWN: |
|
207 /* Ignore ALT-TAB for windows */ |
|
208 if ( (event.key.keysym.sym == SDLK_LALT) || |
|
209 (event.key.keysym.sym == SDLK_TAB) ) { |
|
210 break; |
|
211 } |
|
212 /* Center the mouse on <SPACE> */ |
|
213 if ( event.key.keysym.sym == SDLK_SPACE ) { |
|
214 SDL_WarpMouse(width/2, height/2); |
|
215 break; |
|
216 } |
|
217 /* Toggle fullscreen mode on <RETURN> */ |
|
218 if ( event.key.keysym.sym == SDLK_RETURN ) { |
|
219 videoflags ^= SDL_FULLSCREEN; |
|
220 screen = CreateScreen( |
|
221 screen->w, screen->h, |
|
222 screen->format->BitsPerPixel, |
|
223 videoflags); |
|
224 if ( screen == NULL ) { |
|
225 fprintf(stderr, |
|
226 "Couldn't toggle fullscreen mode\n"); |
|
227 done = 1; |
|
228 } |
|
229 DrawBackground(screen); |
|
230 break; |
|
231 } |
|
232 /* Any other key quits the application... */ |
|
233 case SDL_QUIT: |
|
234 done = 1; |
|
235 break; |
|
236 case SDL_VIDEOEXPOSE: |
|
237 DrawBackground(screen); |
|
238 break; |
|
239 case SDL_VIDEORESIZE: |
|
240 screen = CreateScreen( |
|
241 event.resize.w, event.resize.h, |
|
242 screen->format->BitsPerPixel, |
|
243 videoflags); |
|
244 if ( screen == NULL ) { |
|
245 fprintf(stderr, |
|
246 "Couldn't resize video mode\n"); |
|
247 done = 1; |
|
248 } |
|
249 DrawBackground(screen); |
|
250 break; |
|
251 default: |
|
252 break; |
|
253 } |
|
254 } |
|
255 SDL_Quit(); |
|
256 return(0); |
|
257 } |