diff test/testnative.c @ 3057:089a77aebb7d

Added test program for SDL_CreateWindowFrom() Make sure OpenGL library is loaded before working with OpenGL windows, even those created with SDL_CreateWindowFrom()
author Sam Lantinga <slouken@libsdl.org>
date Mon, 09 Feb 2009 05:32:12 +0000
parents
children 4cf533f434d8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/testnative.c	Mon Feb 09 05:32:12 2009 +0000
@@ -0,0 +1,219 @@
+/* Simple program:  Create a native window and attach an SDL renderer */
+
+#include "testnative.h"
+
+#define WINDOW_W    640
+#define WINDOW_H    480
+#define NUM_SPRITES 100
+#define MAX_SPEED 	1
+
+static NativeWindowFactory *factories[] = {
+#ifdef TEST_NATIVE_WIN32
+    &Win32WindowFactory,
+#endif
+#ifdef TEST_NATIVE_X11
+    &X11WindowFactory,
+#endif
+#ifdef TEST_NATIVE_COCOA
+    &CocoaWindowFactory,
+#endif
+    NULL
+};
+static NativeWindowFactory *factory = NULL;
+static void *native_window;
+static SDL_Rect *positions, *velocities;
+
+/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
+static void
+quit(int rc)
+{
+    SDL_VideoQuit();
+    if (native_window) {
+        factory->DestroyWindow(native_window);
+    }
+    exit(rc);
+}
+
+SDL_TextureID
+LoadSprite(SDL_WindowID window, char *file)
+{
+    SDL_Surface *temp;
+    SDL_TextureID sprite;
+
+    /* Load the sprite image */
+    temp = SDL_LoadBMP(file);
+    if (temp == NULL) {
+        fprintf(stderr, "Couldn't load %s: %s", file, SDL_GetError());
+        return 0;
+    }
+
+    /* Set transparent pixel as the pixel at (0,0) */
+    if (temp->format->palette) {
+        SDL_SetColorKey(temp, SDL_SRCCOLORKEY, *(Uint8 *) temp->pixels);
+    }
+
+    /* Create textures from the image */
+    SDL_SelectRenderer(window);
+    sprite = SDL_CreateTextureFromSurface(0, temp);
+    if (!sprite) {
+        fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError());
+        SDL_FreeSurface(temp);
+        return 0;
+    }
+    SDL_FreeSurface(temp);
+
+    /* We're ready to roll. :) */
+    return sprite;
+}
+
+void
+MoveSprites(SDL_WindowID window, SDL_TextureID sprite)
+{
+    int i, n;
+    int window_w, window_h;
+    int sprite_w, sprite_h;
+    SDL_Rect *position, *velocity;
+
+    SDL_SelectRenderer(window);
+
+    /* Query the sizes */
+    SDL_GetWindowSize(window, &window_w, &window_h);
+    SDL_QueryTexture(sprite, NULL, NULL, &sprite_w, &sprite_h);
+
+    /* Move the sprite, bounce at the wall, and draw */
+    n = 0;
+    SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
+    SDL_RenderFill(NULL);
+    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[])
+{
+    int i, done;
+    const char *driver;
+    SDL_WindowID window;
+    SDL_TextureID sprite;
+    int window_w, window_h;
+    int sprite_w, sprite_h;
+    SDL_Event event;
+
+    if (SDL_VideoInit(NULL, 0) < 0) {
+        fprintf(stderr, "Couldn't initialize SDL video: %s\n",
+                SDL_GetError());
+        exit(1);
+    }
+    driver = SDL_GetCurrentVideoDriver();
+
+    /* Find a native window driver and create a native window */
+    for (i = 0; factories[i]; ++i) {
+        if (SDL_strcmp(driver, factories[i]->tag) == 0) {
+            factory = factories[i];
+            break;
+        }
+    }
+    if (!factory) {
+        fprintf(stderr, "Couldn't find native window code for %s driver\n",
+                driver);
+        quit(2);
+    }
+    printf("Creating native window for %s driver\n", driver);
+    native_window = factory->CreateWindow(WINDOW_W, WINDOW_H);
+    if (!native_window) {
+        fprintf(stderr, "Couldn't create native window\n");
+        quit(3);
+    }
+    window = SDL_CreateWindowFrom(native_window);
+    if (!window) {
+        fprintf(stderr, "Couldn't create SDL window: %s\n", SDL_GetError());
+        quit(4);
+    }
+    SDL_SetWindowTitle(window, "SDL Native Window Test");
+
+    /* Create the renderer */
+    if (SDL_CreateRenderer(window, -1, 0) < 0) {
+        fprintf(stderr, "Couldn't create renderer: %s\n", SDL_GetError());
+        quit(5);
+    }
+
+    /* Clear the window, load the sprite and go! */
+    SDL_SelectRenderer(window);
+    SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
+    SDL_RenderFill(NULL);
+
+    sprite = LoadSprite(window, "icon.bmp");
+    if (!sprite) {
+        quit(6);
+    }
+
+    /* Allocate memory for the sprite info */
+    SDL_GetWindowSize(window, &window_w, &window_h);
+    SDL_QueryTexture(sprite, NULL, NULL, &sprite_w, &sprite_h);
+    positions = (SDL_Rect *) SDL_malloc(NUM_SPRITES * sizeof(SDL_Rect));
+    velocities = (SDL_Rect *) SDL_malloc(NUM_SPRITES * sizeof(SDL_Rect));
+    if (!positions || !velocities) {
+        fprintf(stderr, "Out of memory!\n");
+        quit(2);
+    }
+    srand(time(NULL));
+    for (i = 0; i < NUM_SPRITES; ++i) {
+        positions[i].x = rand() % (window_w - sprite_w);
+        positions[i].y = rand() % (window_h - 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)) {
+            switch (event.type) {
+            case SDL_WINDOWEVENT:
+                switch (event.window.event) {
+                case SDL_WINDOWEVENT_EXPOSED:
+                    SDL_SelectRenderer(event.window.windowID);
+                    SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
+                    SDL_RenderFill(NULL);
+                    break;
+                }
+                break;
+            case SDL_QUIT:
+                done = 1;
+                break;
+            default:
+                break;
+            }
+        }
+        MoveSprites(window, sprite);
+    }
+
+    quit(0);
+}
+
+/* vi: set ts=4 sw=4 expandtab: */