2
Copyright (C) 1997-2024 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
12
/* Simple program: Move N sprites around on the screen as fast as possible */
14
#include <SDL3/SDL_test_common.h>
15
#include <SDL3/SDL_main.h>
18
#ifdef SDL_PLATFORM_EMSCRIPTEN
19
#include <emscripten/emscripten.h>
24
static SDLTest_CommonState *state;
29
SDL_Renderer *renderer;
30
SDL_Texture *background;
32
SDL_FRect sprite_rect;
36
static DrawState *drawstates;
39
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
43
SDLTest_CommonQuit(state);
44
/* Let 'main()' return normally */
50
static void Draw(DrawState *s)
54
SDL_FPoint *center = NULL;
55
SDL_FPoint origin = { 0.0f, 0.0f };
57
SDL_GetRenderViewport(s->renderer, &viewport);
59
target = SDL_CreateTexture(s->renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, viewport.w, viewport.h);
60
SDL_SetRenderTarget(s->renderer, target);
62
/* Draw the background */
63
SDL_RenderTexture(s->renderer, s->background, NULL, NULL);
65
/* Scale and draw the sprite */
66
s->sprite_rect.w += s->scale_direction;
67
s->sprite_rect.h += s->scale_direction;
68
if (s->scale_direction > 0) {
70
if (s->sprite_rect.w >= viewport.w || s->sprite_rect.h >= viewport.h) {
71
s->scale_direction = -1;
74
if (s->sprite_rect.w <= 1 || s->sprite_rect.h <= 1) {
75
s->scale_direction = 1;
78
s->sprite_rect.x = (float)((viewport.w - s->sprite_rect.w) / 2);
79
s->sprite_rect.y = (float)((viewport.h - s->sprite_rect.h) / 2);
81
SDL_RenderTextureRotated(s->renderer, s->sprite, NULL, &s->sprite_rect, (double)s->sprite_rect.w, center, SDL_FLIP_NONE);
83
SDL_SetRenderTarget(s->renderer, NULL);
84
SDL_RenderTexture(s->renderer, target, NULL, NULL);
85
SDL_DestroyTexture(target);
87
/* Update the screen! */
88
SDL_RenderPresent(s->renderer);
97
/* Check for events */
99
while (SDL_PollEvent(&event)) {
100
SDLTest_CommonEvent(state, &event, &done);
102
for (i = 0; i < state->num_windows; ++i) {
103
if (state->windows[i] == NULL) {
106
Draw(&drawstates[i]);
108
#ifdef SDL_PLATFORM_EMSCRIPTEN
110
emscripten_cancel_main_loop();
115
int main(int argc, char *argv[])
121
/* Initialize test framework */
122
state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO);
127
/* Enable standard application logging */
128
SDL_SetLogPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
130
if (!SDLTest_CommonDefaultArgs(state, argc, argv) || !SDLTest_CommonInit(state)) {
131
SDLTest_CommonQuit(state);
135
drawstates = SDL_stack_alloc(DrawState, state->num_windows);
136
for (i = 0; i < state->num_windows; ++i) {
137
DrawState *drawstate = &drawstates[i];
139
drawstate->window = state->windows[i];
140
drawstate->renderer = state->renderers[i];
141
drawstate->sprite = LoadTexture(drawstate->renderer, "icon.bmp", SDL_TRUE, NULL, NULL);
142
drawstate->background = LoadTexture(drawstate->renderer, "sample.bmp", SDL_FALSE, NULL, NULL);
143
if (!drawstate->sprite || !drawstate->background) {
146
SDL_GetTextureSize(drawstate->sprite, &drawstate->sprite_rect.w, &drawstate->sprite_rect.h);
147
drawstate->scale_direction = 1;
150
/* Main render loop */
152
then = SDL_GetTicks();
155
#ifdef SDL_PLATFORM_EMSCRIPTEN
156
emscripten_set_main_loop(loop, 0, 1);
163
/* Print out some timing information */
164
now = SDL_GetTicks();
166
double fps = ((double)frames * 1000) / (now - then);
167
SDL_Log("%2.2f frames per second\n", fps);
170
SDL_stack_free(drawstates);