Commit 6d92d750 authored by Sam Lantinga's avatar Sam Lantinga

Automatically initialize the video system and create a renderer to simplify use.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%404141
parent 47997f87
...@@ -396,6 +396,7 @@ extern VideoBootStrap PND_bootstrap; ...@@ -396,6 +396,7 @@ extern VideoBootStrap PND_bootstrap;
#endif #endif
#define SDL_CurrentDisplay (_this->displays[_this->current_display]) #define SDL_CurrentDisplay (_this->displays[_this->current_display])
#define SDL_CurrentRenderer (SDL_CurrentDisplay.current_renderer)
extern SDL_VideoDevice *SDL_GetVideoDevice(); extern SDL_VideoDevice *SDL_GetVideoDevice();
extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode); extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
......
...@@ -754,8 +754,10 @@ SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags) ...@@ -754,8 +754,10 @@ SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
SDL_Window *windows; SDL_Window *windows;
if (!_this) { if (!_this) {
SDL_UninitializedVideo(); /* Initialize the video system if needed */
return 0; if (SDL_VideoInit(NULL, 0) < 0) {
return 0;
}
} }
if (flags & SDL_WINDOW_OPENGL) { if (flags & SDL_WINDOW_OPENGL) {
if (!_this->GL_CreateContext) { if (!_this->GL_CreateContext) {
...@@ -926,15 +928,28 @@ SDL_GetWindowFromID(SDL_WindowID windowID) ...@@ -926,15 +928,28 @@ SDL_GetWindowFromID(SDL_WindowID windowID)
SDL_UninitializedVideo(); SDL_UninitializedVideo();
return NULL; return NULL;
} }
for (i = 0; i < _this->num_displays; ++i) { if (windowID) {
SDL_VideoDisplay *display = &_this->displays[i]; for (i = 0; i < _this->num_displays; ++i) {
for (j = 0; j < display->num_windows; ++j) { SDL_VideoDisplay *display = &_this->displays[i];
SDL_Window *window = &display->windows[j]; for (j = 0; j < display->num_windows; ++j) {
if (window->id == windowID) { SDL_Window *window = &display->windows[j];
if (window->id == windowID) {
return window;
}
}
}
} else {
/* Just return the first active window */
for (i = 0; i < _this->num_displays; ++i) {
SDL_VideoDisplay *display = &_this->displays[i];
for (j = 0; j < display->num_windows; ++j) {
SDL_Window *window = &display->windows[j];
return window; return window;
} }
} }
} }
/* Couldn't find the window with the requested ID */
SDL_SetError("Invalid window ID");
return NULL; return NULL;
} }
...@@ -951,6 +966,23 @@ SDL_GetDisplayFromWindow(SDL_Window * window) ...@@ -951,6 +966,23 @@ SDL_GetDisplayFromWindow(SDL_Window * window)
return &_this->displays[window->display]; return &_this->displays[window->display];
} }
static __inline__ SDL_Renderer *
SDL_GetCurrentRenderer()
{
SDL_Renderer *renderer;
if (!_this) {
SDL_UninitializedVideo();
return NULL;
}
if (!SDL_CurrentRenderer) {
if (SDL_CreateRenderer(0, -1, 0) < 0) {
return NULL;
}
}
return SDL_CurrentRenderer;
}
Uint32 Uint32
SDL_GetWindowFlags(SDL_WindowID windowID) SDL_GetWindowFlags(SDL_WindowID windowID)
{ {
...@@ -1506,31 +1538,29 @@ SDL_SelectRenderer(SDL_WindowID windowID) ...@@ -1506,31 +1538,29 @@ SDL_SelectRenderer(SDL_WindowID windowID)
return -1; return -1;
} }
renderer = window->renderer; renderer = window->renderer;
if (!renderer) { if (renderer) {
SDL_SetError("Renderer hasn't been created yet"); if (renderer->ActivateRenderer) {
return -1; if (renderer->ActivateRenderer(renderer) < 0) {
} return -1;
if (renderer->ActivateRenderer) { }
if (renderer->ActivateRenderer(renderer) < 0) { }
SDL_CurrentDisplay.current_renderer = renderer;
} else {
if (SDL_CreateRenderer(windowID, -1, 0) < 0) {
return -1; return -1;
} }
} }
SDL_CurrentDisplay.current_renderer = renderer;
return 0; return 0;
} }
int int
SDL_GetRendererInfo(SDL_RendererInfo * info) SDL_GetRendererInfo(SDL_RendererInfo * info)
{ {
if (!_this) { SDL_Renderer *renderer = SDL_GetCurrentRenderer();
SDL_UninitializedVideo(); if (!renderer) {
return -1;
}
if (!SDL_CurrentDisplay.current_renderer) {
SDL_SetError("There is no current renderer");
return -1; return -1;
} }
*info = SDL_CurrentDisplay.current_renderer->info; *info = renderer->info;
return 0; return 0;
} }
...@@ -1541,11 +1571,7 @@ SDL_CreateTexture(Uint32 format, int access, int w, int h) ...@@ -1541,11 +1571,7 @@ SDL_CreateTexture(Uint32 format, int access, int w, int h)
SDL_Renderer *renderer; SDL_Renderer *renderer;
SDL_Texture *texture; SDL_Texture *texture;
if (!_this) { renderer = SDL_GetCurrentRenderer();
SDL_UninitializedVideo();
return 0;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) { if (!renderer) {
return 0; return 0;
} }
...@@ -1599,9 +1625,8 @@ SDL_CreateTextureFromSurface(Uint32 format, SDL_Surface * surface) ...@@ -1599,9 +1625,8 @@ SDL_CreateTextureFromSurface(Uint32 format, SDL_Surface * surface)
} }
fmt = surface->format; fmt = surface->format;
renderer = SDL_CurrentDisplay.current_renderer; renderer = SDL_GetCurrentRenderer();
if (!renderer) { if (!renderer) {
SDL_SetError("No current renderer available");
return 0; return 0;
} }
...@@ -2234,11 +2259,7 @@ SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a) ...@@ -2234,11 +2259,7 @@ SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{ {
SDL_Renderer *renderer; SDL_Renderer *renderer;
if (!_this) { renderer = SDL_GetCurrentRenderer();
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) { if (!renderer) {
return -1; return -1;
} }
...@@ -2258,11 +2279,7 @@ SDL_GetRenderDrawColor(Uint8 * r, Uint8 * g, Uint8 * b, Uint8 * a) ...@@ -2258,11 +2279,7 @@ SDL_GetRenderDrawColor(Uint8 * r, Uint8 * g, Uint8 * b, Uint8 * a)
{ {
SDL_Renderer *renderer; SDL_Renderer *renderer;
if (!_this) { renderer = SDL_GetCurrentRenderer();
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) { if (!renderer) {
return -1; return -1;
} }
...@@ -2286,11 +2303,7 @@ SDL_SetRenderDrawBlendMode(int blendMode) ...@@ -2286,11 +2303,7 @@ SDL_SetRenderDrawBlendMode(int blendMode)
{ {
SDL_Renderer *renderer; SDL_Renderer *renderer;
if (!_this) { renderer = SDL_GetCurrentRenderer();
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) { if (!renderer) {
return -1; return -1;
} }
...@@ -2307,11 +2320,7 @@ SDL_GetRenderDrawBlendMode(int *blendMode) ...@@ -2307,11 +2320,7 @@ SDL_GetRenderDrawBlendMode(int *blendMode)
{ {
SDL_Renderer *renderer; SDL_Renderer *renderer;
if (!_this) { renderer = SDL_GetCurrentRenderer();
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) { if (!renderer) {
return -1; return -1;
} }
...@@ -2325,11 +2334,7 @@ SDL_RenderPoint(int x, int y) ...@@ -2325,11 +2334,7 @@ SDL_RenderPoint(int x, int y)
SDL_Renderer *renderer; SDL_Renderer *renderer;
SDL_Window *window; SDL_Window *window;
if (!_this) { renderer = SDL_GetCurrentRenderer();
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) { if (!renderer) {
return -1; return -1;
} }
...@@ -2355,11 +2360,7 @@ SDL_RenderLine(int x1, int y1, int x2, int y2) ...@@ -2355,11 +2360,7 @@ SDL_RenderLine(int x1, int y1, int x2, int y2)
return SDL_RenderPoint(x1, y1); return SDL_RenderPoint(x1, y1);
} }
if (!_this) { renderer = SDL_GetCurrentRenderer();
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) { if (!renderer) {
return -1; return -1;
} }
...@@ -2386,11 +2387,7 @@ SDL_RenderFill(const SDL_Rect * rect) ...@@ -2386,11 +2387,7 @@ SDL_RenderFill(const SDL_Rect * rect)
SDL_Window *window; SDL_Window *window;
SDL_Rect real_rect; SDL_Rect real_rect;
if (!_this) { renderer = SDL_GetCurrentRenderer();
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) { if (!renderer) {
return -1; return -1;
} }
...@@ -2422,9 +2419,8 @@ SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect * srcrect, ...@@ -2422,9 +2419,8 @@ SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect * srcrect,
SDL_Rect real_srcrect; SDL_Rect real_srcrect;
SDL_Rect real_dstrect; SDL_Rect real_dstrect;
renderer = SDL_CurrentDisplay.current_renderer; renderer = SDL_GetCurrentRenderer();
if (!renderer) { if (!renderer) {
SDL_SetError("No current renderer available");
return -1; return -1;
} }
if (!texture) { if (!texture) {
...@@ -2483,11 +2479,7 @@ SDL_RenderPresent(void) ...@@ -2483,11 +2479,7 @@ SDL_RenderPresent(void)
{ {
SDL_Renderer *renderer; SDL_Renderer *renderer;
if (!_this) { renderer = SDL_GetCurrentRenderer();
SDL_UninitializedVideo();
return;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer || !renderer->RenderPresent) { if (!renderer || !renderer->RenderPresent) {
return; return;
} }
......
...@@ -7,7 +7,7 @@ EXE = @EXE@ ...@@ -7,7 +7,7 @@ EXE = @EXE@
CFLAGS = @CFLAGS@ CFLAGS = @CFLAGS@
LIBS = @LIBS@ LIBS = @LIBS@
TARGETS = checkkeys$(EXE) graywin$(EXE) loopwave$(EXE) testresample$(EXE) testaudioinfo$(EXE) testmultiaudio$(EXE) testpower$(EXE) testalpha$(EXE) testbitmap$(EXE) testblitspeed$(EXE) testcursor$(EXE) testintersections$(EXE) testdraw2$(EXE) testdyngl$(EXE) testdyngles$(EXE) testerror$(EXE) testfile$(EXE) testgamma$(EXE) testgl$(EXE) testgl2$(EXE) testgles$(EXE) testhread$(EXE) testiconv$(EXE) testjoystick$(EXE) testkeys$(EXE) testlock$(EXE) testoverlay2$(EXE) testoverlay$(EXE) testpalette$(EXE) testplatform$(EXE) testsem$(EXE) testsprite$(EXE) testsprite2$(EXE) testtimer$(EXE) testver$(EXE) testvidinfo$(EXE) testwin$(EXE) testwm$(EXE) testwm2$(EXE) threadwin$(EXE) torturethread$(EXE) testloadso$(EXE) testhaptic$(EXE) testmmousetablet$(EXE) testatomic$(EXE) testime$(EXE) TARGETS = checkkeys$(EXE) graywin$(EXE) loopwave$(EXE) testalpha$(EXE) testatomic$(EXE) testaudioinfo$(EXE) testbitmap$(EXE) testblitspeed$(EXE) testcursor$(EXE) testdraw2$(EXE) testdyngles$(EXE) testdyngl$(EXE) testerror$(EXE) testfile$(EXE) testgamma$(EXE) testgl2$(EXE) testgles$(EXE) testgl$(EXE) testhaptic$(EXE) testhread$(EXE) testiconv$(EXE) testime$(EXE) testintersections$(EXE) testjoystick$(EXE) testkeys$(EXE) testloadso$(EXE) testlock$(EXE) testmmousetablet$(EXE) testmultiaudio$(EXE) testoverlay2$(EXE) testoverlay$(EXE) testpalette$(EXE) testplatform$(EXE) testpower$(EXE) testresample$(EXE) testsem$(EXE) testsprite2$(EXE) testsprite$(EXE) testspriteminimal$(EXE) testtimer$(EXE) testver$(EXE) testvidinfo$(EXE) testwin$(EXE) testwm2$(EXE) testwm$(EXE) threadwin$(EXE) torturethread$(EXE)
all: Makefile $(TARGETS) all: Makefile $(TARGETS)
...@@ -107,6 +107,9 @@ testplatform$(EXE): $(srcdir)/testplatform.c ...@@ -107,6 +107,9 @@ testplatform$(EXE): $(srcdir)/testplatform.c
testsem$(EXE): $(srcdir)/testsem.c testsem$(EXE): $(srcdir)/testsem.c
$(CC) -o $@ $? $(CFLAGS) $(LIBS) $(CC) -o $@ $? $(CFLAGS) $(LIBS)
testspriteminimal$(EXE): $(srcdir)/testspriteminimal.c
$(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@
testsprite$(EXE): $(srcdir)/testsprite.c testsprite$(EXE): $(srcdir)/testsprite.c
$(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@ $(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@
......
/* Simple program: Move N sprites around on the screen as fast as possible */
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "SDL_events.h"
#include "SDL_video.h"
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480
#define NUM_SPRITES 100
#define MAX_SPEED 1
static SDL_TextureID sprite;
static SDL_Rect positions[NUM_SPRITES];
static SDL_Rect velocities[NUM_SPRITES];
static int sprite_w, sprite_h;
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
static void
quit(int rc)
{
exit(rc);
}
int
LoadSprite(char *file)
{
SDL_Surface *temp;
/* Load the sprite image */
temp = SDL_LoadBMP(file);
if (temp == NULL) {
fprintf(stderr, "Couldn't load %s: %s", file, SDL_GetError());
return (-1);
}
sprite_w = temp->w;
sprite_h = temp->h;
/* Set transparent pixel as the pixel at (0,0) */
if (temp->format->palette) {
SDL_SetColorKey(temp, SDL_TRUE, *(Uint8 *) temp->pixels);
} else {
switch (temp->format->BitsPerPixel) {
case 15:
SDL_SetColorKey(temp, SDL_TRUE,
(*(Uint16 *) temp->pixels) & 0x00007FFF);
break;
case 16:
SDL_SetColorKey(temp, SDL_TRUE, *(Uint16 *) temp->pixels);
break;
case 24:
SDL_SetColorKey(temp, SDL_TRUE,
(*(Uint32 *) temp->pixels) & 0x00FFFFFF);
break;
case 32:
SDL_SetColorKey(temp, SDL_TRUE, *(Uint32 *) temp->pixels);
break;
}
}
/* Create textures from the image */
sprite = SDL_CreateTextureFromSurface(0, temp);
if (!sprite) {
SDL_SetColorKey(temp, 0, 0);
sprite = SDL_CreateTextureFromSurface(0, temp);
}
if (!sprite) {
fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError());
SDL_FreeSurface(temp);
return (-1);
}
SDL_FreeSurface(temp);
/* We're ready to roll. :) */
return (0);
}
void
MoveSprites(SDL_WindowID window, SDL_TextureID sprite)
{
int i;
int window_w = WINDOW_WIDTH;
int window_h = WINDOW_HEIGHT;
SDL_Rect *position, *velocity;
/* Draw a gray background */
SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderFill(NULL);
/* Move the sprite, bounce at the wall, and draw */
for (i = 0; i < NUM_SPRITES; ++i) {
position = &positions[i];
velocity = &velocities[i];
position->x += velocity->x;
if ((position->x < 0) || (position->x >= (window_w - sprite_w))) {
velocity->x = -velocity->x;
position->x += velocity->x;
}
position->y += velocity->y;
if ((position->y < 0) || (position->y >= (window_h - sprite_h))) {
velocity->y = -velocity->y;
position->y += velocity->y;
}
/* Blit the sprite onto the screen */
SDL_RenderCopy(sprite, NULL, position);
}
/* Update the screen! */
SDL_RenderPresent();
}
int
main(int argc, char *argv[])
{
SDL_WindowID window;
int i, done;
SDL_Event event;
window = SDL_CreateWindow("Happy Smileys",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
WINDOW_WIDTH, WINDOW_HEIGHT,
SDL_WINDOW_SHOWN);
if (!window) {
quit(2);
}
if (LoadSprite("icon.bmp") < 0) {
quit(2);
}
/* Initialize the sprite positions */
srand(time(NULL));
for (i = 0; i < NUM_SPRITES; ++i) {
positions[i].x = rand() % (WINDOW_WIDTH - sprite_w);
positions[i].y = rand() % (WINDOW_HEIGHT - sprite_h);
positions[i].w = sprite_w;
positions[i].h = sprite_h;
velocities[i].x = 0;
velocities[i].y = 0;
while (!velocities[i].x && !velocities[i].y) {
velocities[i].x = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
velocities[i].y = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
}
}
/* Main render loop */
done = 0;
while (!done) {
/* Check for events */
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT || event.type == SDL_KEYDOWN) {
done = 1;
}
}
MoveSprites(window, sprite);
}
quit(0);
}
/* vi: set ts=4 sw=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment