test/testnative.c
author Sam Lantinga <slouken@libsdl.org>
Wed, 09 Dec 2009 15:56:56 +0000
changeset 3536 0267b8b1595c
parent 3060 4cf533f434d8
child 3596 f638ded38b8a
permissions -rw-r--r--
Added interfaces for batch drawing of points, lines and rects:
SDL_DrawPoints()
SDL_BlendPoints()
SDL_BlendLines()
SDL_DrawLines()
SDL_FillRects()
SDL_BlendRects()
SDL_RenderPoints()
SDL_RenderLines()
SDL_RenderRects()
Renamed SDL_RenderFill() to SDL_RenderRect()
     1 /* Simple program:  Create a native window and attach an SDL renderer */
     2 
     3 #include "testnative.h"
     4 
     5 #define WINDOW_W    640
     6 #define WINDOW_H    480
     7 #define NUM_SPRITES 100
     8 #define MAX_SPEED 	1
     9 
    10 static NativeWindowFactory *factories[] = {
    11 #ifdef TEST_NATIVE_WIN32
    12     &Win32WindowFactory,
    13 #endif
    14 #ifdef TEST_NATIVE_X11
    15     &X11WindowFactory,
    16 #endif
    17 #ifdef TEST_NATIVE_COCOA
    18     &CocoaWindowFactory,
    19 #endif
    20     NULL
    21 };
    22 static NativeWindowFactory *factory = NULL;
    23 static void *native_window;
    24 static SDL_Rect *positions, *velocities;
    25 
    26 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
    27 static void
    28 quit(int rc)
    29 {
    30     SDL_VideoQuit();
    31     if (native_window) {
    32         factory->DestroyNativeWindow(native_window);
    33     }
    34     exit(rc);
    35 }
    36 
    37 SDL_TextureID
    38 LoadSprite(SDL_WindowID window, char *file)
    39 {
    40     SDL_Surface *temp;
    41     SDL_TextureID sprite;
    42 
    43     /* Load the sprite image */
    44     temp = SDL_LoadBMP(file);
    45     if (temp == NULL) {
    46         fprintf(stderr, "Couldn't load %s: %s", file, SDL_GetError());
    47         return 0;
    48     }
    49 
    50     /* Set transparent pixel as the pixel at (0,0) */
    51     if (temp->format->palette) {
    52         SDL_SetColorKey(temp, SDL_SRCCOLORKEY, *(Uint8 *) temp->pixels);
    53     }
    54 
    55     /* Create textures from the image */
    56     SDL_SelectRenderer(window);
    57     sprite = SDL_CreateTextureFromSurface(0, temp);
    58     if (!sprite) {
    59         fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError());
    60         SDL_FreeSurface(temp);
    61         return 0;
    62     }
    63     SDL_FreeSurface(temp);
    64 
    65     /* We're ready to roll. :) */
    66     return sprite;
    67 }
    68 
    69 void
    70 MoveSprites(SDL_WindowID window, SDL_TextureID sprite)
    71 {
    72     int i, n;
    73     int window_w, window_h;
    74     int sprite_w, sprite_h;
    75     SDL_Rect *position, *velocity;
    76 
    77     SDL_SelectRenderer(window);
    78 
    79     /* Query the sizes */
    80     SDL_GetWindowSize(window, &window_w, &window_h);
    81     SDL_QueryTexture(sprite, NULL, NULL, &sprite_w, &sprite_h);
    82 
    83     /* Move the sprite, bounce at the wall, and draw */
    84     n = 0;
    85     SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
    86     SDL_RenderRect(NULL);
    87     for (i = 0; i < NUM_SPRITES; ++i) {
    88         position = &positions[i];
    89         velocity = &velocities[i];
    90         position->x += velocity->x;
    91         if ((position->x < 0) || (position->x >= (window_w - sprite_w))) {
    92             velocity->x = -velocity->x;
    93             position->x += velocity->x;
    94         }
    95         position->y += velocity->y;
    96         if ((position->y < 0) || (position->y >= (window_h - sprite_h))) {
    97             velocity->y = -velocity->y;
    98             position->y += velocity->y;
    99         }
   100 
   101         /* Blit the sprite onto the screen */
   102         SDL_RenderCopy(sprite, NULL, position);
   103     }
   104 
   105     /* Update the screen! */
   106     SDL_RenderPresent();
   107 }
   108 
   109 int
   110 main(int argc, char *argv[])
   111 {
   112     int i, done;
   113     const char *driver;
   114     SDL_WindowID window;
   115     SDL_TextureID sprite;
   116     int window_w, window_h;
   117     int sprite_w, sprite_h;
   118     SDL_Event event;
   119 
   120     if (SDL_VideoInit(NULL, 0) < 0) {
   121         fprintf(stderr, "Couldn't initialize SDL video: %s\n",
   122                 SDL_GetError());
   123         exit(1);
   124     }
   125     driver = SDL_GetCurrentVideoDriver();
   126 
   127     /* Find a native window driver and create a native window */
   128     for (i = 0; factories[i]; ++i) {
   129         if (SDL_strcmp(driver, factories[i]->tag) == 0) {
   130             factory = factories[i];
   131             break;
   132         }
   133     }
   134     if (!factory) {
   135         fprintf(stderr, "Couldn't find native window code for %s driver\n",
   136                 driver);
   137         quit(2);
   138     }
   139     printf("Creating native window for %s driver\n", driver);
   140     native_window = factory->CreateNativeWindow(WINDOW_W, WINDOW_H);
   141     if (!native_window) {
   142         fprintf(stderr, "Couldn't create native window\n");
   143         quit(3);
   144     }
   145     window = SDL_CreateWindowFrom(native_window);
   146     if (!window) {
   147         fprintf(stderr, "Couldn't create SDL window: %s\n", SDL_GetError());
   148         quit(4);
   149     }
   150     SDL_SetWindowTitle(window, "SDL Native Window Test");
   151 
   152     /* Create the renderer */
   153     if (SDL_CreateRenderer(window, -1, 0) < 0) {
   154         fprintf(stderr, "Couldn't create renderer: %s\n", SDL_GetError());
   155         quit(5);
   156     }
   157 
   158     /* Clear the window, load the sprite and go! */
   159     SDL_SelectRenderer(window);
   160     SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
   161     SDL_RenderRect(NULL);
   162 
   163     sprite = LoadSprite(window, "icon.bmp");
   164     if (!sprite) {
   165         quit(6);
   166     }
   167 
   168     /* Allocate memory for the sprite info */
   169     SDL_GetWindowSize(window, &window_w, &window_h);
   170     SDL_QueryTexture(sprite, NULL, NULL, &sprite_w, &sprite_h);
   171     positions = (SDL_Rect *) SDL_malloc(NUM_SPRITES * sizeof(SDL_Rect));
   172     velocities = (SDL_Rect *) SDL_malloc(NUM_SPRITES * sizeof(SDL_Rect));
   173     if (!positions || !velocities) {
   174         fprintf(stderr, "Out of memory!\n");
   175         quit(2);
   176     }
   177     srand(time(NULL));
   178     for (i = 0; i < NUM_SPRITES; ++i) {
   179         positions[i].x = rand() % (window_w - sprite_w);
   180         positions[i].y = rand() % (window_h - sprite_h);
   181         positions[i].w = sprite_w;
   182         positions[i].h = sprite_h;
   183         velocities[i].x = 0;
   184         velocities[i].y = 0;
   185         while (!velocities[i].x && !velocities[i].y) {
   186             velocities[i].x = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
   187             velocities[i].y = (rand() % (MAX_SPEED * 2 + 1)) - MAX_SPEED;
   188         }
   189     }
   190 
   191     /* Main render loop */
   192     done = 0;
   193     while (!done) {
   194         /* Check for events */
   195         while (SDL_PollEvent(&event)) {
   196             switch (event.type) {
   197             case SDL_WINDOWEVENT:
   198                 switch (event.window.event) {
   199                 case SDL_WINDOWEVENT_EXPOSED:
   200                     SDL_SelectRenderer(event.window.windowID);
   201                     SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
   202                     SDL_RenderRect(NULL);
   203                     break;
   204                 }
   205                 break;
   206             case SDL_QUIT:
   207                 done = 1;
   208                 break;
   209             default:
   210                 break;
   211             }
   212         }
   213         MoveSprites(window, sprite);
   214     }
   215 
   216     quit(0);
   217 }
   218 
   219 /* vi: set ts=4 sw=4 expandtab: */