SDL 2.0
testrendertarget.c File Reference
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "SDL_test_common.h"
+ Include dependency graph for testrendertarget.c:

Go to the source code of this file.

Data Structures

struct  DrawState
 

Functions

static void quit (int rc)
 
SDL_TextureLoadTexture (SDL_Renderer *renderer, char *file, SDL_bool transparent)
 
SDL_bool DrawComposite (DrawState *s)
 
SDL_bool Draw (DrawState *s)
 
void loop ()
 
int main (int argc, char *argv[])
 

Variables

static SDLTest_CommonStatestate
 
DrawStatedrawstates
 
int done
 
SDL_bool test_composite = SDL_FALSE
 

Function Documentation

◆ Draw()

SDL_bool Draw ( DrawState s)

Definition at line 182 of file testrendertarget.c.

183{
186
187 SDL_RenderGetViewport(s->renderer, &viewport);
188
190 if (!target) {
191 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create render target texture: %s\n", SDL_GetError());
192 return SDL_FALSE;
193 }
194 SDL_SetRenderTarget(s->renderer, target);
195
196 /* Draw the background */
197 SDL_RenderCopy(s->renderer, s->background, NULL, NULL);
198
199 /* Scale and draw the sprite */
200 s->sprite_rect.w += s->scale_direction;
201 s->sprite_rect.h += s->scale_direction;
202 if (s->scale_direction > 0) {
203 if (s->sprite_rect.w >= viewport.w || s->sprite_rect.h >= viewport.h) {
204 s->scale_direction = -1;
205 }
206 } else {
207 if (s->sprite_rect.w <= 1 || s->sprite_rect.h <= 1) {
208 s->scale_direction = 1;
209 }
210 }
211 s->sprite_rect.x = (viewport.w - s->sprite_rect.w) / 2;
212 s->sprite_rect.y = (viewport.h - s->sprite_rect.h) / 2;
213
214 SDL_RenderCopy(s->renderer, s->sprite, NULL, &s->sprite_rect);
215
216 SDL_SetRenderTarget(s->renderer, NULL);
217 SDL_RenderCopy(s->renderer, target, NULL, NULL);
219
220 /* Update the screen! */
221 SDL_RenderPresent(s->renderer);
222 return SDL_TRUE;
223}
#define SDL_RenderPresent
#define SDL_RenderGetViewport
#define SDL_GetError
#define SDL_DestroyTexture
#define SDL_CreateTexture
#define SDL_SetRenderTarget
#define SDL_LogError
#define SDL_RenderCopy
@ SDL_LOG_CATEGORY_APPLICATION
Definition: SDL_log.h:66
GLdouble s
Definition: SDL_opengl.h:2063
GLenum target
@ SDL_PIXELFORMAT_ARGB8888
Definition: SDL_pixels.h:248
@ SDL_TEXTUREACCESS_TARGET
Definition: SDL_render.h:95
@ SDL_TRUE
Definition: SDL_stdinc.h:164
@ SDL_FALSE
Definition: SDL_stdinc.h:163
#define NULL
Definition: begin_code.h:167
A rectangle, with the origin at the upper left (integer).
Definition: SDL_rect.h:78
int h
Definition: SDL_rect.h:80
int w
Definition: SDL_rect.h:80
SDL_Rect viewport
Definition: testviewport.c:28

References SDL_Rect::h, NULL, SDL_CreateTexture, SDL_DestroyTexture, SDL_FALSE, SDL_GetError, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_PIXELFORMAT_ARGB8888, SDL_RenderCopy, SDL_RenderGetViewport, SDL_RenderPresent, SDL_SetRenderTarget, SDL_TEXTUREACCESS_TARGET, SDL_TRUE, viewport, and SDL_Rect::w.

Referenced by loop().

◆ DrawComposite()

SDL_bool DrawComposite ( DrawState s)

Definition at line 99 of file testrendertarget.c.

100{
103
104 static SDL_bool blend_tested = SDL_FALSE;
105 if (!blend_tested) {
106 SDL_Texture *A, *B;
107 Uint32 P;
108
111
114
115 SDL_SetRenderTarget(s->renderer, A);
116 SDL_SetRenderDrawColor(s->renderer, 0x00, 0x00, 0x00, 0x80);
117 SDL_RenderFillRect(s->renderer, NULL);
118
119 SDL_SetRenderTarget(s->renderer, B);
120 SDL_SetRenderDrawColor(s->renderer, 0x00, 0x00, 0x00, 0x00);
121 SDL_RenderFillRect(s->renderer, NULL);
122 SDL_RenderCopy(s->renderer, A, NULL, NULL);
123 SDL_RenderReadPixels(s->renderer, NULL, SDL_PIXELFORMAT_ARGB8888, &P, sizeof(P));
124
125 SDL_Log("Blended pixel: 0x%8.8X\n", P);
126
129 blend_tested = SDL_TRUE;
130 }
131
132 SDL_RenderGetViewport(s->renderer, &viewport);
133
136 SDL_SetRenderTarget(s->renderer, target);
137
138 /* Draw the background.
139 This is solid black so when the sprite is copied to it, any per-pixel alpha will be blended through.
140 */
141 SDL_SetRenderDrawColor(s->renderer, 0x00, 0x00, 0x00, 0x00);
142 SDL_RenderFillRect(s->renderer, NULL);
143
144 /* Scale and draw the sprite */
145 s->sprite_rect.w += s->scale_direction;
146 s->sprite_rect.h += s->scale_direction;
147 if (s->scale_direction > 0) {
148 if (s->sprite_rect.w >= viewport.w || s->sprite_rect.h >= viewport.h) {
149 s->scale_direction = -1;
150 }
151 } else {
152 if (s->sprite_rect.w <= 1 || s->sprite_rect.h <= 1) {
153 s->scale_direction = 1;
154 }
155 }
156 s->sprite_rect.x = (viewport.w - s->sprite_rect.w) / 2;
157 s->sprite_rect.y = (viewport.h - s->sprite_rect.h) / 2;
158
159 SDL_RenderCopy(s->renderer, s->sprite, NULL, &s->sprite_rect);
160
161 SDL_SetRenderTarget(s->renderer, NULL);
162 SDL_RenderCopy(s->renderer, s->background, NULL, NULL);
163
165 SDL_SetRenderDrawColor(s->renderer, 0xff, 0x00, 0x00, 0x80);
166 R.x = 0;
167 R.y = 0;
168 R.w = 100;
169 R.h = 100;
170 SDL_RenderFillRect(s->renderer, &R);
172
173 SDL_RenderCopy(s->renderer, target, NULL, NULL);
175
176 /* Update the screen! */
177 SDL_RenderPresent(s->renderer);
178 return SDL_TRUE;
179}
@ SDL_BLENDMODE_NONE
Definition: SDL_blendmode.h:42
@ SDL_BLENDMODE_BLEND
Definition: SDL_blendmode.h:44
#define SDL_RenderFillRect
#define SDL_SetRenderDrawColor
#define SDL_SetRenderDrawBlendMode
#define SDL_SetTextureBlendMode
#define SDL_Log
#define SDL_RenderReadPixels
SDL_bool
Definition: SDL_stdinc.h:162
uint32_t Uint32
Definition: SDL_stdinc.h:203
int y
Definition: SDL_rect.h:79
int x
Definition: SDL_rect.h:79

References SDL_Rect::h, NULL, SDL_BLENDMODE_BLEND, SDL_BLENDMODE_NONE, SDL_CreateTexture, SDL_DestroyTexture, SDL_FALSE, SDL_Log, SDL_PIXELFORMAT_ARGB8888, SDL_RenderCopy, SDL_RenderFillRect, SDL_RenderGetViewport, SDL_RenderPresent, SDL_RenderReadPixels, SDL_SetRenderDrawBlendMode, SDL_SetRenderDrawColor, SDL_SetRenderTarget, SDL_SetTextureBlendMode, SDL_TEXTUREACCESS_TARGET, SDL_TRUE, viewport, SDL_Rect::w, SDL_Rect::x, and SDL_Rect::y.

Referenced by loop().

◆ LoadTexture()

SDL_Texture * LoadTexture ( SDL_Renderer renderer,
char *  file,
SDL_bool  transparent 
)

Definition at line 49 of file testrendertarget.c.

50{
51 SDL_Surface *temp;
53
54 /* Load the sprite image */
55 temp = SDL_LoadBMP(file);
56 if (temp == NULL) {
57 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s", file, SDL_GetError());
58 return NULL;
59 }
60
61 /* Set transparent pixel as the pixel at (0,0) */
62 if (transparent) {
63 if (temp->format->palette) {
64 SDL_SetColorKey(temp, SDL_TRUE, *(Uint8 *) temp->pixels);
65 } else {
66 switch (temp->format->BitsPerPixel) {
67 case 15:
69 (*(Uint16 *) temp->pixels) & 0x00007FFF);
70 break;
71 case 16:
72 SDL_SetColorKey(temp, SDL_TRUE, *(Uint16 *) temp->pixels);
73 break;
74 case 24:
76 (*(Uint32 *) temp->pixels) & 0x00FFFFFF);
77 break;
78 case 32:
79 SDL_SetColorKey(temp, SDL_TRUE, *(Uint32 *) temp->pixels);
80 break;
81 }
82 }
83 }
84
85 /* Create textures from the image */
87 if (!texture) {
88 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create texture: %s\n", SDL_GetError());
89 SDL_FreeSurface(temp);
90 return NULL;
91 }
92 SDL_FreeSurface(temp);
93
94 /* We're ready to roll. :) */
95 return texture;
96}
#define SDL_SetColorKey
#define SDL_CreateTextureFromSurface
#define SDL_FreeSurface
GLenum GLenum GLuint texture
uint16_t Uint16
Definition: SDL_stdinc.h:191
uint8_t Uint8
Definition: SDL_stdinc.h:179
#define SDL_LoadBMP(file)
Definition: SDL_surface.h:201
Uint8 BitsPerPixel
Definition: SDL_pixels.h:319
SDL_Palette * palette
Definition: SDL_pixels.h:318
A collection of pixels used in software blitting.
Definition: SDL_surface.h:71
SDL_PixelFormat * format
Definition: SDL_surface.h:73
void * pixels
Definition: SDL_surface.h:76
static SDL_Renderer * renderer

References SDL_PixelFormat::BitsPerPixel, SDL_Surface::format, NULL, SDL_PixelFormat::palette, SDL_Surface::pixels, renderer, SDL_CreateTextureFromSurface, SDL_FreeSurface, SDL_GetError, SDL_LoadBMP, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_SetColorKey, and SDL_TRUE.

Referenced by main().

◆ loop()

void loop ( void  )

Definition at line 226 of file testrendertarget.c.

227{
228 int i;
230
231 /* Check for events */
232 while (SDL_PollEvent(&event)) {
234 }
235 for (i = 0; i < state->num_windows; ++i) {
236 if (state->windows[i] == NULL)
237 continue;
238 if (test_composite) {
239 if (!DrawComposite(&drawstates[i])) done = 1;
240 } else {
241 if (!Draw(&drawstates[i])) done = 1;
242 }
243 }
244#ifdef __EMSCRIPTEN__
245 if (done) {
246 emscripten_cancel_main_loop();
247 }
248#endif
249}
#define SDL_PollEvent
struct _cl_event * event
void SDLTest_CommonEvent(SDLTest_CommonState *state, SDL_Event *event, int *done)
Common event handler for test windows.
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_Window ** windows
SDL_bool DrawComposite(DrawState *s)
DrawState * drawstates
int done
SDL_bool test_composite
SDL_bool Draw(DrawState *s)
static SDLTest_CommonState * state
General event structure.
Definition: SDL_events.h:558

References done, Draw(), DrawComposite(), drawstates, i, NULL, SDLTest_CommonState::num_windows, SDL_PollEvent, SDLTest_CommonEvent(), state, test_composite, and SDLTest_CommonState::windows.

Referenced by main().

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 252 of file testrendertarget.c.

253{
254 int i;
255 int frames;
256 Uint32 then, now;
257
258 /* Enable standard application logging */
260
261 /* Initialize test framework */
263 if (!state) {
264 return 1;
265 }
266 for (i = 1; i < argc;) {
267 int consumed;
268
269 consumed = SDLTest_CommonArg(state, i);
270 if (consumed == 0) {
271 consumed = -1;
272 if (SDL_strcasecmp(argv[i], "--composite") == 0) {
274 consumed = 1;
275 }
276 }
277 if (consumed < 0) {
278 static const char *options[] = { "[--composite]", NULL };
279 SDLTest_CommonLogUsage(state, argv[0], options);
280 quit(1);
281 }
282 i += consumed;
283 }
285 quit(2);
286 }
287
289 for (i = 0; i < state->num_windows; ++i) {
290 DrawState *drawstate = &drawstates[i];
291
292 drawstate->window = state->windows[i];
293 drawstate->renderer = state->renderers[i];
294 if (test_composite) {
295 drawstate->sprite = LoadTexture(drawstate->renderer, "icon-alpha.bmp", SDL_TRUE);
296 } else {
297 drawstate->sprite = LoadTexture(drawstate->renderer, "icon.bmp", SDL_TRUE);
298 }
299 drawstate->background = LoadTexture(drawstate->renderer, "sample.bmp", SDL_FALSE);
300 if (!drawstate->sprite || !drawstate->background) {
301 quit(2);
302 }
303 SDL_QueryTexture(drawstate->sprite, NULL, NULL,
304 &drawstate->sprite_rect.w, &drawstate->sprite_rect.h);
305 drawstate->scale_direction = 1;
306 }
307
308 /* Main render loop */
309 frames = 0;
310 then = SDL_GetTicks();
311 done = 0;
312
313#ifdef __EMSCRIPTEN__
314 emscripten_set_main_loop(loop, 0, 1);
315#else
316 while (!done) {
317 ++frames;
318 loop();
319 }
320#endif
321
322 /* Print out some timing information */
323 now = SDL_GetTicks();
324 if (now > then) {
325 double fps = ((double) frames * 1000) / (now - then);
326 SDL_Log("%2.2f frames per second\n", fps);
327 }
328
330
331 quit(0);
332 return 0;
333}
#define SDL_INIT_VIDEO
Definition: SDL.h:79
#define SDL_QueryTexture
#define SDL_strcasecmp
#define SDL_LogSetPriority
@ SDL_LOG_PRIORITY_INFO
Definition: SDL_log.h:106
#define SDL_stack_alloc(type, count)
Definition: SDL_stdinc.h:354
#define SDL_stack_free(data)
Definition: SDL_stdinc.h:355
SDLTest_CommonState * SDLTest_CommonCreateState(char **argv, Uint32 flags)
Parse command line parameters and create common state.
int SDLTest_CommonArg(SDLTest_CommonState *state, int index)
Process one common argument.
SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state)
Open test window.
void SDLTest_CommonLogUsage(SDLTest_CommonState *state, const char *argv0, const char **options)
Logs command line usage info.
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
SDL_Window * window
SDL_Texture * sprite
SDL_Texture * background
SDL_Renderer * renderer
SDL_Rect sprite_rect
SDL_Renderer ** renderers
static void quit(int rc)
SDL_Texture * LoadTexture(SDL_Renderer *renderer, char *file, SDL_bool transparent)
void loop()
static Uint32 frames
Definition: testsprite2.c:40

References DrawState::background, done, drawstates, frames, SDL_Rect::h, i, LoadTexture(), loop(), NULL, SDLTest_CommonState::num_windows, quit(), DrawState::renderer, SDLTest_CommonState::renderers, DrawState::scale_direction, SDL_FALSE, SDL_GetTicks(), SDL_INIT_VIDEO, SDL_Log, SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, SDL_LogSetPriority, SDL_QueryTexture, SDL_stack_alloc, SDL_stack_free, SDL_strcasecmp, SDL_TRUE, SDLTest_CommonArg(), SDLTest_CommonCreateState(), SDLTest_CommonInit(), SDLTest_CommonLogUsage(), DrawState::sprite, DrawState::sprite_rect, state, test_composite, SDL_Rect::w, DrawState::window, and SDLTest_CommonState::windows.

◆ quit()

static void quit ( int  rc)
static

Definition at line 42 of file testrendertarget.c.

43{
45 exit(rc);
46}
void SDLTest_CommonQuit(SDLTest_CommonState *state)
Close test window.

References SDLTest_CommonQuit(), and state.

Referenced by main().

Variable Documentation

◆ done

int done

Definition at line 37 of file testrendertarget.c.

Referenced by loop(), and main().

◆ drawstates

DrawState* drawstates

Definition at line 36 of file testrendertarget.c.

Referenced by loop(), and main().

◆ state

SDLTest_CommonState* state
static

Definition at line 25 of file testrendertarget.c.

Referenced by loop(), main(), and quit().

◆ test_composite

SDL_bool test_composite = SDL_FALSE

Definition at line 38 of file testrendertarget.c.

Referenced by loop(), and main().