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) */
DrawBox(SDL_Surface * screen,int X,int Y,int width,int height)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((unsigned int) 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 
DrawBackground(SDL_Surface * screen)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 
CreateScreen(Uint16 w,Uint16 h,Uint8 bpp,Uint32 flags)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 
main(int argc,char * argv[])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 }
258