The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.

This commit is contained in:
Sam Lantinga 2011-02-01 19:19:43 -08:00
parent 52cf8a6451
commit df94d4c6a4
15 changed files with 617 additions and 690 deletions

View file

@ -6,8 +6,8 @@
#include "common.h"
#define NUM_SPRITES 100
#define MAX_SPEED 1
#define NUM_SPRITES 100
#define MAX_SPEED 1
static CommonState *state;
static int num_sprites;
@ -76,12 +76,12 @@ LoadSprite(char *file)
/* Create textures from the image */
for (i = 0; i < state->num_windows; ++i) {
SDL_SelectRenderer(state->windows[i]);
sprites[i] = SDL_CreateTextureFromSurface(0, temp);
SDL_Renderer *renderer = state->renderers[i];
sprites[i] = SDL_CreateTextureFromSurface(renderer, 0, temp);
if (!sprites[i]) {
SDL_SetColorKey(temp, 0, 0);
sprites[i] = SDL_CreateTextureFromSurface(0, temp);
}
SDL_SetColorKey(temp, 0, 0);
sprites[i] = SDL_CreateTextureFromSurface(renderer, 0, temp);
}
if (!sprites[i]) {
fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError());
SDL_FreeSurface(temp);
@ -96,15 +96,13 @@ LoadSprite(char *file)
}
void
MoveSprites(SDL_Window * window, SDL_Texture * sprite)
MoveSprites(SDL_Window * window, SDL_Renderer * renderer, SDL_Texture * sprite)
{
int i, n;
int window_w, window_h;
SDL_Rect temp;
SDL_Rect *position, *velocity;
SDL_SelectRenderer(window);
/* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h);
@ -136,55 +134,55 @@ MoveSprites(SDL_Window * window, SDL_Texture * sprite)
}
/* Draw a gray background */
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear();
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
/* Test points */
SDL_SetRenderDrawColor(0xFF, 0x00, 0x00, 0xFF);
SDL_RenderDrawPoint(0, 0);
SDL_RenderDrawPoint(window_w-1, 0);
SDL_RenderDrawPoint(0, window_h-1);
SDL_RenderDrawPoint(window_w-1, window_h-1);
SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF);
SDL_RenderDrawPoint(renderer, 0, 0);
SDL_RenderDrawPoint(renderer, window_w-1, 0);
SDL_RenderDrawPoint(renderer, 0, window_h-1);
SDL_RenderDrawPoint(renderer, window_w-1, window_h-1);
/* Test horizontal and vertical lines */
SDL_SetRenderDrawColor(0x00, 0xFF, 0x00, 0xFF);
SDL_RenderDrawLine(1, 0, window_w-2, 0);
SDL_RenderDrawLine(1, window_h-1, window_w-2, window_h-1);
SDL_RenderDrawLine(0, 1, 0, window_h-2);
SDL_RenderDrawLine(window_w-1, 1, window_w-1, window_h-2);
SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF);
SDL_RenderDrawLine(renderer, 1, 0, window_w-2, 0);
SDL_RenderDrawLine(renderer, 1, window_h-1, window_w-2, window_h-1);
SDL_RenderDrawLine(renderer, 0, 1, 0, window_h-2);
SDL_RenderDrawLine(renderer, window_w-1, 1, window_w-1, window_h-2);
/* Test fill and copy */
SDL_SetRenderDrawColor(0xFF, 0xFF, 0xFF, 0xFF);
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
temp.x = 1;
temp.y = 1;
temp.w = sprite_w;
temp.h = sprite_h;
SDL_RenderFillRect(&temp);
SDL_RenderCopy(sprite, NULL, &temp);
SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp);
temp.x = window_w-sprite_w-1;
temp.y = 1;
temp.w = sprite_w;
temp.h = sprite_h;
SDL_RenderFillRect(&temp);
SDL_RenderCopy(sprite, NULL, &temp);
SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp);
temp.x = 1;
temp.y = window_h-sprite_h-1;
temp.w = sprite_w;
temp.h = sprite_h;
SDL_RenderFillRect(&temp);
SDL_RenderCopy(sprite, NULL, &temp);
SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp);
temp.x = window_w-sprite_w-1;
temp.y = window_h-sprite_h-1;
temp.w = sprite_w;
temp.h = sprite_h;
SDL_RenderFillRect(&temp);
SDL_RenderCopy(sprite, NULL, &temp);
SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp);
/* Test diagonal lines */
SDL_SetRenderDrawColor(0x00, 0xFF, 0x00, 0xFF);
SDL_RenderDrawLine(sprite_w, sprite_h,
SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF);
SDL_RenderDrawLine(renderer, sprite_w, sprite_h,
window_w-sprite_w-2, window_h-sprite_h-2);
SDL_RenderDrawLine(window_w-sprite_w-2, sprite_h,
SDL_RenderDrawLine(renderer, window_w-sprite_w-2, sprite_h,
sprite_w, window_h-sprite_h-2);
/* Move the sprite, bounce at the wall, and draw */
@ -204,11 +202,11 @@ MoveSprites(SDL_Window * window, SDL_Texture * sprite)
}
/* Blit the sprite onto the screen */
SDL_RenderCopy(sprite, NULL, position);
SDL_RenderCopy(renderer, sprite, NULL, position);
}
/* Update the screen! */
SDL_RenderPresent();
SDL_RenderPresent(renderer);
}
int
@ -276,9 +274,9 @@ main(int argc, char *argv[])
quit(2);
}
for (i = 0; i < state->num_windows; ++i) {
SDL_SelectRenderer(state->windows[i]);
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear();
SDL_Renderer *renderer = state->renderers[i];
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
}
if (LoadSprite("icon.bmp") < 0) {
quit(2);
@ -314,22 +312,9 @@ main(int argc, char *argv[])
++frames;
while (SDL_PollEvent(&event)) {
CommonEvent(state, &event, &done);
switch (event.type) {
case SDL_WINDOWEVENT:
switch (event.window.event) {
case SDL_WINDOWEVENT_EXPOSED:
SDL_SelectRenderer(SDL_GetWindowFromID(event.window.windowID));
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear();
break;
}
break;
default:
break;
}
}
for (i = 0; i < state->num_windows; ++i) {
MoveSprites(state->windows[i], sprites[i]);
MoveSprites(state->windows[i], state->renderers[i], sprites[i]);
}
}
@ -340,7 +325,7 @@ main(int argc, char *argv[])
printf("%2.2f frames per second\n", fps);
}
quit(0);
return 0;
return 0;
}
/* vi: set ts=4 sw=4 expandtab: */