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;
#endif
#define SDL_CurrentDisplay (_this->displays[_this->current_display])
#define SDL_CurrentRenderer (SDL_CurrentDisplay.current_renderer)
extern SDL_VideoDevice *SDL_GetVideoDevice();
extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
......
......@@ -754,9 +754,11 @@ SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
SDL_Window *windows;
if (!_this) {
SDL_UninitializedVideo();
/* Initialize the video system if needed */
if (SDL_VideoInit(NULL, 0) < 0) {
return 0;
}
}
if (flags & SDL_WINDOW_OPENGL) {
if (!_this->GL_CreateContext) {
SDL_SetError("No OpenGL support in video driver");
......@@ -926,6 +928,7 @@ SDL_GetWindowFromID(SDL_WindowID windowID)
SDL_UninitializedVideo();
return NULL;
}
if (windowID) {
for (i = 0; i < _this->num_displays; ++i) {
SDL_VideoDisplay *display = &_this->displays[i];
for (j = 0; j < display->num_windows; ++j) {
......@@ -935,6 +938,18 @@ SDL_GetWindowFromID(SDL_WindowID windowID)
}
}
}
} 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;
}
}
}
/* Couldn't find the window with the requested ID */
SDL_SetError("Invalid window ID");
return NULL;
}
......@@ -951,6 +966,23 @@ SDL_GetDisplayFromWindow(SDL_Window * window)
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
SDL_GetWindowFlags(SDL_WindowID windowID)
{
......@@ -1506,31 +1538,29 @@ SDL_SelectRenderer(SDL_WindowID windowID)
return -1;
}
renderer = window->renderer;
if (!renderer) {
SDL_SetError("Renderer hasn't been created yet");
return -1;
}
if (renderer) {
if (renderer->ActivateRenderer) {
if (renderer->ActivateRenderer(renderer) < 0) {
return -1;
}
}
SDL_CurrentDisplay.current_renderer = renderer;
} else {
if (SDL_CreateRenderer(windowID, -1, 0) < 0) {
return -1;
}
}
return 0;
}
int
SDL_GetRendererInfo(SDL_RendererInfo * info)
{
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
if (!SDL_CurrentDisplay.current_renderer) {
SDL_SetError("There is no current renderer");
SDL_Renderer *renderer = SDL_GetCurrentRenderer();
if (!renderer) {
return -1;
}
*info = SDL_CurrentDisplay.current_renderer->info;
*info = renderer->info;
return 0;
}
......@@ -1541,11 +1571,7 @@ SDL_CreateTexture(Uint32 format, int access, int w, int h)
SDL_Renderer *renderer;
SDL_Texture *texture;
if (!_this) {
SDL_UninitializedVideo();
return 0;
}
renderer = SDL_CurrentDisplay.current_renderer;
renderer = SDL_GetCurrentRenderer();
if (!renderer) {
return 0;
}
......@@ -1599,9 +1625,8 @@ SDL_CreateTextureFromSurface(Uint32 format, SDL_Surface * surface)
}
fmt = surface->format;
renderer = SDL_CurrentDisplay.current_renderer;
renderer = SDL_GetCurrentRenderer();
if (!renderer) {
SDL_SetError("No current renderer available");
return 0;
}
......@@ -2234,11 +2259,7 @@ SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{
SDL_Renderer *renderer;
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
renderer = SDL_GetCurrentRenderer();
if (!renderer) {
return -1;
}
......@@ -2258,11 +2279,7 @@ SDL_GetRenderDrawColor(Uint8 * r, Uint8 * g, Uint8 * b, Uint8 * a)
{
SDL_Renderer *renderer;
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
renderer = SDL_GetCurrentRenderer();
if (!renderer) {
return -1;
}
......@@ -2286,11 +2303,7 @@ SDL_SetRenderDrawBlendMode(int blendMode)
{
SDL_Renderer *renderer;
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
renderer = SDL_GetCurrentRenderer();
if (!renderer) {
return -1;
}
......@@ -2307,11 +2320,7 @@ SDL_GetRenderDrawBlendMode(int *blendMode)
{
SDL_Renderer *renderer;
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
renderer = SDL_GetCurrentRenderer();
if (!renderer) {
return -1;
}
......@@ -2325,11 +2334,7 @@ SDL_RenderPoint(int x, int y)
SDL_Renderer *renderer;
SDL_Window *window;
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
renderer = SDL_GetCurrentRenderer();
if (!renderer) {
return -1;
}
......@@ -2355,11 +2360,7 @@ SDL_RenderLine(int x1, int y1, int x2, int y2)
return SDL_RenderPoint(x1, y1);
}
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
renderer = SDL_GetCurrentRenderer();
if (!renderer) {
return -1;
}
......@@ -2386,11 +2387,7 @@ SDL_RenderFill(const SDL_Rect * rect)
SDL_Window *window;
SDL_Rect real_rect;
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
renderer = SDL_GetCurrentRenderer();
if (!renderer) {
return -1;
}
......@@ -2422,9 +2419,8 @@ SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect * srcrect,
SDL_Rect real_srcrect;
SDL_Rect real_dstrect;
renderer = SDL_CurrentDisplay.current_renderer;
renderer = SDL_GetCurrentRenderer();
if (!renderer) {
SDL_SetError("No current renderer available");
return -1;
}
if (!texture) {
......@@ -2483,11 +2479,7 @@ SDL_RenderPresent(void)
{
SDL_Renderer *renderer;
if (!_this) {
SDL_UninitializedVideo();
return;
}
renderer = SDL_CurrentDisplay.current_renderer;
renderer = SDL_GetCurrentRenderer();
if (!renderer || !renderer->RenderPresent) {
return;
}
......
......@@ -7,7 +7,7 @@ EXE = @EXE@
CFLAGS = @CFLAGS@
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)
......@@ -107,6 +107,9 @@ testplatform$(EXE): $(srcdir)/testplatform.c
testsem$(EXE): $(srcdir)/testsem.c
$(CC) -o $@ $? $(CFLAGS) $(LIBS)
testspriteminimal$(EXE): $(srcdir)/testspriteminimal.c
$(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@
testsprite$(EXE): $(srcdir)/testsprite.c
$(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