2 Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
4 This software is provided 'as-is', without any express or implied
5 warranty. In no event will the authors be held liable for any damages
6 arising from the use of this software.
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it
13 /* Simple program: draw as many random objects on the screen as possible */
21 #define SWAP(typ,a,b) do{typ t=a;a=b;b=t;}while(0)
22 #define NUM_OBJECTS 100
24 static CommonState *state;
25 static int num_objects;
26 static SDL_bool cycle_color;
27 static SDL_bool cycle_alpha;
28 static int cycle_direction = 1;
29 static int current_alpha = 255;
30 static int current_color = 255;
31 static SDL_BlendMode blendMode = SDL_BLENDMODE_NONE;
34 DrawPoints(SDL_Renderer * renderer)
41 SDL_RenderGetViewport(renderer, &viewport);
43 for (i = 0; i < num_objects * 4; ++i) {
44 /* Cycle the color and alpha, if desired */
46 current_color += cycle_direction;
47 if (current_color < 0) {
49 cycle_direction = -cycle_direction;
51 if (current_color > 255) {
53 cycle_direction = -cycle_direction;
57 current_alpha += cycle_direction;
58 if (current_alpha < 0) {
60 cycle_direction = -cycle_direction;
62 if (current_alpha > 255) {
64 cycle_direction = -cycle_direction;
67 SDL_SetRenderDrawColor(renderer, 255, (Uint8) current_color,
68 (Uint8) current_color, (Uint8) current_alpha);
70 x = rand() % viewport.w;
71 y = rand() % viewport.h;
72 SDL_RenderDrawPoint(renderer, x, y);
78 SDL_Rect lines[MAX_LINES];
80 add_line(int x1, int y1, int x2, int y2)
82 if (num_lines >= MAX_LINES)
84 if ((x1 == x2) && (y1 == y2))
87 printf("adding line (%d, %d), (%d, %d)\n", x1, y1, x2, y2);
88 lines[num_lines].x = x1;
89 lines[num_lines].y = y1;
90 lines[num_lines].w = x2;
91 lines[num_lines].h = y2;
98 DrawLines(SDL_Renderer * renderer)
104 /* Query the sizes */
105 SDL_RenderGetViewport(renderer, &viewport);
107 SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
109 for (i = 0; i < num_lines; ++i) {
111 SDL_RenderDrawLine(renderer, 0, 0, viewport.w - 1, viewport.h - 1);
112 SDL_RenderDrawLine(renderer, 0, viewport.h - 1, viewport.w - 1, 0);
113 SDL_RenderDrawLine(renderer, 0, viewport.h / 2, viewport.w - 1, viewport.h / 2);
114 SDL_RenderDrawLine(renderer, viewport.w / 2, 0, viewport.w / 2, viewport.h - 1);
116 SDL_RenderDrawLine(renderer, lines[i].x, lines[i].y, lines[i].w, lines[i].h);
123 SDL_Rect rects[MAX_RECTS];
125 add_rect(int x1, int y1, int x2, int y2)
127 if (num_rects >= MAX_RECTS)
129 if ((x1 == x2) || (y1 == y2))
137 printf("adding rect (%d, %d), (%d, %d) [%dx%d]\n", x1, y1, x2, y2,
140 rects[num_rects].x = x1;
141 rects[num_rects].y = y1;
142 rects[num_rects].w = x2 - x1;
143 rects[num_rects].h = y2 - y1;
149 DrawRects(SDL_Renderer * renderer)
151 SDL_SetRenderDrawColor(renderer, 255, 127, 0, 255);
152 SDL_RenderFillRects(renderer, rects, num_rects);
156 DrawRectLineIntersections(SDL_Renderer * renderer)
160 SDL_SetRenderDrawColor(renderer, 0, 255, 55, 255);
162 for (i = 0; i < num_rects; i++)
163 for (j = 0; j < num_lines; j++) {
173 if (SDL_IntersectRectAndLine(&r, &x1, &y1, &x2, &y2)) {
174 SDL_RenderDrawLine(renderer, x1, y1, x2, y2);
180 DrawRectRectIntersections(SDL_Renderer * renderer)
184 SDL_SetRenderDrawColor(renderer, 255, 200, 0, 255);
186 for (i = 0; i < num_rects; i++)
187 for (j = i + 1; j < num_rects; j++) {
189 if (SDL_IntersectRect(&rects[i], &rects[j], &r)) {
190 SDL_RenderFillRect(renderer, &r);
196 main(int argc, char *argv[])
198 int mouse_begin_x = -1, mouse_begin_y = -1;
201 Uint32 then, now, frames;
203 /* Initialize parameters */
204 num_objects = NUM_OBJECTS;
206 /* Initialize test framework */
207 state = CommonCreateState(argv, SDL_INIT_VIDEO);
211 for (i = 1; i < argc;) {
214 consumed = CommonArg(state, i);
217 if (SDL_strcasecmp(argv[i], "--blend") == 0) {
219 if (SDL_strcasecmp(argv[i + 1], "none") == 0) {
220 blendMode = SDL_BLENDMODE_NONE;
222 } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
223 blendMode = SDL_BLENDMODE_BLEND;
225 } else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
226 blendMode = SDL_BLENDMODE_ADD;
228 } else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
229 blendMode = SDL_BLENDMODE_MOD;
233 } else if (SDL_strcasecmp(argv[i], "--cyclecolor") == 0) {
234 cycle_color = SDL_TRUE;
236 } else if (SDL_strcasecmp(argv[i], "--cyclealpha") == 0) {
237 cycle_alpha = SDL_TRUE;
239 } else if (SDL_isdigit(*argv[i])) {
240 num_objects = SDL_atoi(argv[i]);
246 "Usage: %s %s [--blend none|blend|add|mod] [--cyclecolor] [--cyclealpha]\n",
247 argv[0], CommonUsage(state));
252 if (!CommonInit(state)) {
256 /* Create the windows and initialize the renderers */
257 for (i = 0; i < state->num_windows; ++i) {
258 SDL_Renderer *renderer = state->renderers[i];
259 SDL_SetRenderDrawBlendMode(renderer, blendMode);
260 SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
261 SDL_RenderClear(renderer);
266 /* Main render loop */
268 then = SDL_GetTicks();
271 /* Check for events */
273 while (SDL_PollEvent(&event)) {
274 CommonEvent(state, &event, &done);
275 switch (event.type) {
276 case SDL_MOUSEBUTTONDOWN:
277 mouse_begin_x = event.button.x;
278 mouse_begin_y = event.button.y;
280 case SDL_MOUSEBUTTONUP:
281 if (event.button.button == 3)
282 add_line(mouse_begin_x, mouse_begin_y, event.button.x,
284 if (event.button.button == 1)
285 add_rect(mouse_begin_x, mouse_begin_y, event.button.x,
289 switch (event.key.keysym.sym) {
291 if (event.key.keysym.mod & KMOD_SHIFT)
294 add_line(rand() % 640, rand() % 480, rand() % 640,
298 if (event.key.keysym.mod & KMOD_SHIFT)
301 add_rect(rand() % 640, rand() % 480, rand() % 640,
310 for (i = 0; i < state->num_windows; ++i) {
311 SDL_Renderer *renderer = state->renderers[i];
312 SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
313 SDL_RenderClear(renderer);
316 DrawPoints(renderer);
317 DrawRectRectIntersections(renderer);
319 DrawRectLineIntersections(renderer);
321 SDL_RenderPresent(renderer);
327 /* Print out some timing information */
328 now = SDL_GetTicks();
330 double fps = ((double) frames * 1000) / (now - then);
331 printf("%2.2f frames per second\n", fps);
336 /* vi: set ts=4 sw=4 expandtab: */