1555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/*
2555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
3555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
4555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  This software is provided 'as-is', without any express or implied
5555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  warranty.  In no event will the authors be held liable for any damages
6555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  arising from the use of this software.
7555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
8555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  Permission is granted to anyone to use this software for any purpose,
9555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  including commercial applications, and to alter it and redistribute it
10555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  freely.
11555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot*/
12555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* Simple program:  Move N sprites around on the screen as fast as possible */
13555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
14555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <stdlib.h>
15555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <stdio.h>
16555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <time.h>
17555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
18555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include "SDL_test.h"
19555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include "SDL_test_common.h"
20555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
21555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define NUM_SPRITES    100
22555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define MAX_SPEED     1
23555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
24555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic SDLTest_CommonState *state;
25555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic int num_sprites;
26555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic SDL_Texture **sprites;
27555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic SDL_bool cycle_color;
28555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic SDL_bool cycle_alpha;
29555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic int cycle_direction = 1;
30555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic int current_alpha = 0;
31555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic int current_color = 0;
32555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic SDL_Rect *positions;
33555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic SDL_Rect *velocities;
34555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic int sprite_w, sprite_h;
35555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic SDL_BlendMode blendMode = SDL_BLENDMODE_BLEND;
36555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
37555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* Number of iterations to move sprites - used for visual tests. */
38555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* -1: infinite random moves (default); >=0: enables N deterministic moves */
39555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic int iterations = -1;
40555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
41555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
42555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic void
43555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotquit(int rc)
44555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
45555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_free(sprites);
46555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_free(positions);
47555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_free(velocities);
48555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDLTest_CommonQuit(state);
49555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    exit(rc);
50555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
51555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
52555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotint
53555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotLoadSprite(const char *file)
54555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
55555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int i;
56555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Surface *temp;
57555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
58555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Load the sprite image */
59555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp = SDL_LoadBMP(file);
60555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (temp == NULL) {
61555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s", file, SDL_GetError());
62555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return (-1);
63555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
64555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    sprite_w = temp->w;
65555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    sprite_h = temp->h;
66555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
67555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Set transparent pixel as the pixel at (0,0) */
68555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (temp->format->palette) {
69555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_SetColorKey(temp, 1, *(Uint8 *) temp->pixels);
70555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    } else {
71555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        switch (temp->format->BitsPerPixel) {
72555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        case 15:
73555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDL_SetColorKey(temp, 1, (*(Uint16 *) temp->pixels) & 0x00007FFF);
74555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            break;
75555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        case 16:
76555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDL_SetColorKey(temp, 1, *(Uint16 *) temp->pixels);
77555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            break;
78555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        case 24:
79555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDL_SetColorKey(temp, 1, (*(Uint32 *) temp->pixels) & 0x00FFFFFF);
80555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            break;
81555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        case 32:
82555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDL_SetColorKey(temp, 1, *(Uint32 *) temp->pixels);
83555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            break;
84555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
85555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
86555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
87555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Create textures from the image */
88555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    for (i = 0; i < state->num_windows; ++i) {
89555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_Renderer *renderer = state->renderers[i];
90555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        sprites[i] = SDL_CreateTextureFromSurface(renderer, temp);
91555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (!sprites[i]) {
92555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create texture: %s\n", SDL_GetError());
93555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDL_FreeSurface(temp);
94555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            return (-1);
95555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
96555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_SetTextureBlendMode(sprites[i], blendMode);
97555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
98555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_FreeSurface(temp);
99555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
100555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* We're ready to roll. :) */
101555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    return (0);
102555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
103555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
104555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotvoid
105555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotMoveSprites(SDL_Renderer * renderer, SDL_Texture * sprite)
106555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
107555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int i;
108555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Rect viewport, temp;
109555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Rect *position, *velocity;
110555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
111555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Query the sizes */
112555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderGetViewport(renderer, &viewport);
113555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
114555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Cycle the color and alpha, if desired */
115555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (cycle_color) {
116555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        current_color += cycle_direction;
117555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (current_color < 0) {
118555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            current_color = 0;
119555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            cycle_direction = -cycle_direction;
120555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
121555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (current_color > 255) {
122555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            current_color = 255;
123555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            cycle_direction = -cycle_direction;
124555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
125555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_SetTextureColorMod(sprite, 255, (Uint8) current_color,
126555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                               (Uint8) current_color);
127555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
128555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (cycle_alpha) {
129555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        current_alpha += cycle_direction;
130555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (current_alpha < 0) {
131555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            current_alpha = 0;
132555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            cycle_direction = -cycle_direction;
133555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
134555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (current_alpha > 255) {
135555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            current_alpha = 255;
136555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            cycle_direction = -cycle_direction;
137555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
138555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_SetTextureAlphaMod(sprite, (Uint8) current_alpha);
139555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
140555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
141555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Draw a gray background */
142555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
143555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderClear(renderer);
144555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
145555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Test points */
146555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF);
147555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderDrawPoint(renderer, 0, 0);
148555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderDrawPoint(renderer, viewport.w-1, 0);
149555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderDrawPoint(renderer, 0, viewport.h-1);
150555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderDrawPoint(renderer, viewport.w-1, viewport.h-1);
151555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
152555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Test horizontal and vertical lines */
153555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF);
154555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderDrawLine(renderer, 1, 0, viewport.w-2, 0);
155555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderDrawLine(renderer, 1, viewport.h-1, viewport.w-2, viewport.h-1);
156555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderDrawLine(renderer, 0, 1, 0, viewport.h-2);
157555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderDrawLine(renderer, viewport.w-1, 1, viewport.w-1, viewport.h-2);
158555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
159555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Test fill and copy */
160555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
161555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.x = 1;
162555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.y = 1;
163555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.w = sprite_w;
164555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.h = sprite_h;
165555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderFillRect(renderer, &temp);
166555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderCopy(renderer, sprite, NULL, &temp);
167555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.x = viewport.w-sprite_w-1;
168555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.y = 1;
169555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.w = sprite_w;
170555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.h = sprite_h;
171555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderFillRect(renderer, &temp);
172555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderCopy(renderer, sprite, NULL, &temp);
173555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.x = 1;
174555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.y = viewport.h-sprite_h-1;
175555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.w = sprite_w;
176555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.h = sprite_h;
177555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderFillRect(renderer, &temp);
178555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderCopy(renderer, sprite, NULL, &temp);
179555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.x = viewport.w-sprite_w-1;
180555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.y = viewport.h-sprite_h-1;
181555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.w = sprite_w;
182555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    temp.h = sprite_h;
183555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderFillRect(renderer, &temp);
184555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderCopy(renderer, sprite, NULL, &temp);
185555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
186555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Test diagonal lines */
187555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF);
188555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderDrawLine(renderer, sprite_w, sprite_h,
189555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                       viewport.w-sprite_w-2, viewport.h-sprite_h-2);
190555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderDrawLine(renderer, viewport.w-sprite_w-2, sprite_h,
191555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                       sprite_w, viewport.h-sprite_h-2);
192555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
193555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Conditionally move the sprites, bounce at the wall */
194555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (iterations == -1 || iterations > 0) {
195555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        for (i = 0; i < num_sprites; ++i) {
196555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            position = &positions[i];
197555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            velocity = &velocities[i];
198555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            position->x += velocity->x;
199555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            if ((position->x < 0) || (position->x >= (viewport.w - sprite_w))) {
200555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            	velocity->x = -velocity->x;
201555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            	position->x += velocity->x;
202555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            }
203555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            position->y += velocity->y;
204555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            if ((position->y < 0) || (position->y >= (viewport.h - sprite_h))) {
205555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            	velocity->y = -velocity->y;
206555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            	position->y += velocity->y;
207555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            }
208555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
209555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
210555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
211555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        /* Countdown sprite-move iterations and disable color changes at iteration end - used for visual tests. */
212555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (iterations > 0) {
213555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            iterations--;
214555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            if (iterations == 0) {
215555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                cycle_alpha = SDL_FALSE;
216555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                cycle_color = SDL_FALSE;
217555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            }
218555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
219555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
220555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
221555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Draw sprites */
222555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    for (i = 0; i < num_sprites; ++i) {
223555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        position = &positions[i];
224555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
225555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        /* Blit the sprite onto the screen */
226555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_RenderCopy(renderer, sprite, NULL, position);
227555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
228555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
229555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Update the screen! */
230555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_RenderPresent(renderer);
231555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
232555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
233555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotint
234555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotmain(int argc, char *argv[])
235555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
236555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int i, done;
237555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Event event;
238555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    Uint32 then, now, frames;
239555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot	Uint64 seed;
240555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    const char *icon = "icon.bmp";
241555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
242555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Initialize parameters */
243555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    num_sprites = NUM_SPRITES;
244555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
245555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Initialize test framework */
246555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO);
247555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (!state) {
248555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return 1;
249555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
250555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
251555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    for (i = 1; i < argc;) {
252555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        int consumed;
253555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
254555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        consumed = SDLTest_CommonArg(state, i);
255555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (consumed == 0) {
256555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            consumed = -1;
257555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            if (SDL_strcasecmp(argv[i], "--blend") == 0) {
258555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                if (argv[i + 1]) {
259555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    if (SDL_strcasecmp(argv[i + 1], "none") == 0) {
260555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        blendMode = SDL_BLENDMODE_NONE;
261555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        consumed = 2;
262555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
263555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        blendMode = SDL_BLENDMODE_BLEND;
264555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        consumed = 2;
265555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    } else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
266555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        blendMode = SDL_BLENDMODE_ADD;
267555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        consumed = 2;
268555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    } else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
269555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        blendMode = SDL_BLENDMODE_MOD;
270555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                        consumed = 2;
271555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    }
272555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                }
273555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            } else if (SDL_strcasecmp(argv[i], "--iterations") == 0) {
274555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                if (argv[i + 1]) {
275555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    iterations = SDL_atoi(argv[i + 1]);
276555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    if (iterations < -1) iterations = -1;
277555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    consumed = 2;
278555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                }
279555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            } else if (SDL_strcasecmp(argv[i], "--cyclecolor") == 0) {
280555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                cycle_color = SDL_TRUE;
281555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                consumed = 1;
282555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            } else if (SDL_strcasecmp(argv[i], "--cyclealpha") == 0) {
283555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                cycle_alpha = SDL_TRUE;
284555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                consumed = 1;
285555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            } else if (SDL_isdigit(*argv[i])) {
286555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                num_sprites = SDL_atoi(argv[i]);
287555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                consumed = 1;
288555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            } else if (argv[i][0] != '-') {
289555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                icon = argv[i];
290555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                consumed = 1;
291555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            }
292555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
293555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if (consumed < 0) {
294555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDL_Log("Usage: %s %s [--blend none|blend|add|mod] [--cyclecolor] [--cyclealpha] [--iterations N] [num_sprites] [icon.bmp]\n",
295555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                    argv[0], SDLTest_CommonUsage(state));
296555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            quit(1);
297555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
298555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        i += consumed;
299555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
300555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (!SDLTest_CommonInit(state)) {
301555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        quit(2);
302555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
303555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
304555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Create the windows, initialize the renderers, and load the textures */
305555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    sprites =
306555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        (SDL_Texture **) SDL_malloc(state->num_windows * sizeof(*sprites));
307555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (!sprites) {
308555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Out of memory!\n");
309555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        quit(2);
310555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
311555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    for (i = 0; i < state->num_windows; ++i) {
312555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_Renderer *renderer = state->renderers[i];
313555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
314555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_RenderClear(renderer);
315555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
316555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (LoadSprite(icon) < 0) {
317555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        quit(2);
318555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
319555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
320555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Allocate memory for the sprite info */
321555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    positions = (SDL_Rect *) SDL_malloc(num_sprites * sizeof(SDL_Rect));
322555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    velocities = (SDL_Rect *) SDL_malloc(num_sprites * sizeof(SDL_Rect));
323555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (!positions || !velocities) {
324555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Out of memory!\n");
325555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        quit(2);
326555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
327555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
328555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Position sprites and set their velocities using the fuzzer */
329555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (iterations >= 0) {
330555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        /* Deterministic seed - used for visual tests */
331555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        seed = (Uint64)iterations;
332555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    } else {
333555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        /* Pseudo-random seed generated from the time */
334555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        seed = (Uint64)time(NULL);
335555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
336555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDLTest_FuzzerInit(seed);
337555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    for (i = 0; i < num_sprites; ++i) {
338555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        positions[i].x = SDLTest_RandomIntegerInRange(0, state->window_w - sprite_w);
339555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        positions[i].y = SDLTest_RandomIntegerInRange(0, state->window_h - sprite_h);
340555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        positions[i].w = sprite_w;
341555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        positions[i].h = sprite_h;
342555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        velocities[i].x = 0;
343555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        velocities[i].y = 0;
344555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        while (!velocities[i].x && !velocities[i].y) {
345555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            velocities[i].x = SDLTest_RandomIntegerInRange(-MAX_SPEED, MAX_SPEED);
346555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            velocities[i].y = SDLTest_RandomIntegerInRange(-MAX_SPEED, MAX_SPEED);
347555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
348555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
349555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
350555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Main render loop */
351555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    frames = 0;
352555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    then = SDL_GetTicks();
353555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    done = 0;
354555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    while (!done) {
355555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        /* Check for events */
356555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        ++frames;
357555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        while (SDL_PollEvent(&event)) {
358555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            SDLTest_CommonEvent(state, &event, &done);
359555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
360555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        for (i = 0; i < state->num_windows; ++i) {
361555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            if (state->windows[i] == NULL)
362555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                continue;
363555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            MoveSprites(state->renderers[i], sprites[i]);
364555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
365555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
366555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
367555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Print out some timing information */
368555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    now = SDL_GetTicks();
369555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (now > then) {
370555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        double fps = ((double) frames * 1000) / (now - then);
371555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_Log("%2.2f frames per second\n", fps);
372555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
373555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    quit(0);
374555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    return 0;
375555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
376555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
377555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* vi: set ts=4 sw=4 expandtab: */
378