testnative.c File Reference
`#include <stdio.h>`
`#include <stdlib.h>`
`#include <time.h>`
`#include "testnative.h"`
Include dependency graph for testnative.c:

Go to the source code of this file.

## Macros

#define | WINDOW_W 640
#define | WINDOW_H 480
#define | NUM_SPRITES 100
#define | MAX_SPEED 1

## Functions

static void | quit (int rc)
SDL_Texture * | LoadSprite (SDL_Renderer *renderer, char *file)
void | MoveSprites (SDL_Renderer *renderer, SDL_Texture *sprite)
int | main (int argc, char *argv[])

## Variables

static NativeWindowFactory * | factories []
static NativeWindowFactory * | factory = NULL
static void * | native_window
static SDL_Rect * | positions
static SDL_Rect * | velocities

## Macro Definition Documentation

## MAX_SPEED

#define MAX_SPEED 1

Definition at line 23 of file testnative.c.

## NUM_SPRITES

#define NUM_SPRITES 100

Definition at line 22 of file testnative.c.

## WINDOW_H

#define WINDOW_H 480

Definition at line 21 of file testnative.c.

## WINDOW_W

#define WINDOW_W 640

Definition at line 20 of file testnative.c.

## Function Documentation

## LoadSprite()

SDL_Texture* LoadSprite | ( | SDL_Renderer * | renderer,
|  | char * | file
| ) |  |

Definition at line 53 of file testnative.c.

{
SDL_Surface *temp;
SDL_Texture *sprite;
/* Load the sprite image */
temp = SDL_LoadBMP(file);
if (temp == NULL) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "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, 1, *(Uint8 *) temp->pixels);
}
/* Create textures from the image */
sprite = SDL_CreateTextureFromSurface(renderer, temp);
if (!sprite) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create texture: %s\n", SDL_GetError());
SDL_FreeSurface(temp);
return 0;
}
SDL_FreeSurface(temp);
/* We're ready to roll. :) */
return sprite;
}

References SDL_Surface::format, NULL, SDL_PixelFormat::palette, SDL_Surface::pixels, renderer, SDL_CreateTextureFromSurface, SDL_FreeSurface, SDL_GetError, SDL_LoadBMP, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_SetColorKey, and sprite.

Referenced by main().

## main()

int main | ( | int | argc,
|  | char * | argv[]
| ) |  |

Definition at line 123 of file testnative.c.

{
int i, done;
const char *driver;
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *sprite;
int window_w, window_h;
int sprite_w, sprite_h;
SDL_Event event;
/* Enable standard application logging */
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
if (SDL_VideoInit(NULL) < 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "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) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't find native window code for %s driver\n",
driver);
quit(2);
}
SDL_Log("Creating native window for %s driver\n", driver);
native_window = factory->CreateNativeWindow(WINDOW_W, WINDOW_H);
if (!native_window) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create native window\n");
quit(3);
}
window = SDL_CreateWindowFrom(native_window);
if (!window) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create SDL window: %s\n", SDL_GetError());
quit(4);
}
SDL_SetWindowTitle(window, "SDL Native Window Test");
/* Create the renderer */
renderer = SDL_CreateRenderer(window, -1, 0);
if (!renderer) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create renderer: %s\n", SDL_GetError());
quit(5);
}
/* Clear the window, load the sprite and go! */
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
sprite = LoadSprite(renderer, "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) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "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_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
break;
}
break;
case SDL_QUIT:
done = 1;
break;
default:
break;
}
}
MoveSprites(renderer, sprite);
}
quit(0);
return 0; /* to prevent compiler warning */
}

References NativeWindowFactory::CreateNativeWindow, done, factories, factory, SDL_Rect::h, i, LoadSprite(), MAX_SPEED, MoveSprites(), NULL, NUM_SPRITES, positions, quit(), renderer, SDL_CreateRenderer, SDL_CreateWindowFrom, SDL_GetCurrentVideoDriver, SDL_GetError, SDL_GetWindowSize, SDL_Log, SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, SDL_LogError, SDL_LogSetPriority, SDL_malloc, SDL_PollEvent, SDL_QueryTexture, SDL_QUIT, SDL_RenderClear, SDL_SetRenderDrawColor, SDL_SetWindowTitle, SDL_strcmp, SDL_VideoInit, SDL_WINDOWEVENT, SDL_WINDOWEVENT_EXPOSED, sprite, sprite_h, sprite_w, velocities, SDL_Rect::w, WINDOW_H, window_h, WINDOW_W, window_w, SDL_Rect::x, and SDL_Rect::y.

## MoveSprites()

void MoveSprites | ( | SDL_Renderer * | renderer,
|  | SDL_Texture * | sprite
| ) |  |

Definition at line 84 of file testnative.c.

{
int sprite_w, sprite_h;
int i;
SDL_Rect viewport;
SDL_Rect *position, *velocity;
/* Query the sizes */
SDL_RenderGetViewport(renderer, &viewport);
SDL_QueryTexture(sprite, NULL, NULL, &sprite_w, &sprite_h);
/* Draw a gray background */
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer);
/* 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 >= (viewport.w - sprite_w))) {
velocity->x = -velocity->x;
position->x += velocity->x;
}
position->y += velocity->y;
if ((position->y < 0) || (position->y >= (viewport.h - sprite_h))) {
velocity->y = -velocity->y;
position->y += velocity->y;
}
/* Blit the sprite onto the screen */
SDL_RenderCopy(renderer, sprite, NULL, position);
}
/* Update the screen! */
SDL_RenderPresent(renderer);
}

References SDL_Rect::h, i, NULL, NUM_SPRITES, positions, renderer, SDL_QueryTexture, SDL_RenderClear, SDL_RenderCopy, SDL_RenderGetViewport, SDL_RenderPresent, SDL_SetRenderDrawColor, sprite, sprite_h, sprite_w, velocities, viewport, SDL_Rect::w, SDL_Rect::x, and SDL_Rect::y.

Referenced by main().

## quit()

static void quit | ( | int | rc | ) |

static

Definition at line 43 of file testnative.c.

{
SDL_VideoQuit();
if (native_window) {
factory->DestroyNativeWindow(native_window);
}
exit(rc);
}

References NativeWindowFactory::DestroyNativeWindow, factory, and SDL_VideoQuit.

Referenced by main().

## Variable Documentation

## factories

NativeWindowFactory* factories[]

static

Initial value:
= {
NULL
}

Definition at line 25 of file testnative.c.

Referenced by main().

## factory

NativeWindowFactory* factory = NULL

static

Definition at line 37 of file testnative.c.

Referenced by main(), and quit().

## native_window

void* native_window

static

Definition at line 38 of file testnative.c.

## positions

SDL_Rect* positions

static

Definition at line 39 of file testnative.c.

Referenced by main(), and MoveSprites().

## velocities

SDL_Rect * velocities

static

Definition at line 39 of file testnative.c.

Referenced by main(), and MoveSprites().

native_window
EGLConfig void * native_window
Definition: eglext.h:790
SDL_GetError
#define SDL_GetError
Definition: SDL_dynapi_overrides.h:113
quit
static void quit(int rc)
Definition: testnative.c:43
SDL_RenderPresent
#define SDL_RenderPresent
Definition: SDL_dynapi_overrides.h:346
WINDOW_H
#define WINDOW_H
Definition: testnative.c:21
SDL_Surface
A collection of pixels used in software blitting.
Definition: SDL_surface.h:70
NativeWindowFactory::DestroyNativeWindow
void(* DestroyNativeWindow)(void *window)
Definition: testnative.h:26
time
EGLSurface EGLnsecsANDROID time
Definition: eglext.h:518
sprite
static SDL_Texture * sprite
Definition: testspriteminimal.c:29
SDL_PollEvent
#define SDL_PollEvent
Definition: SDL_dynapi_overrides.h:122
SDL_LOG_CATEGORY_APPLICATION
@ SDL_LOG_CATEGORY_APPLICATION
Definition: SDL_log.h:66
window_w
int window_w
Definition: testoverlay2.c:143
NULL
#define NULL
Definition: begin_code.h:167
SDL_Surface::pixels
void * pixels
Definition: SDL_surface.h:76
SDL_CreateWindowFrom
#define SDL_CreateWindowFrom
Definition: SDL_dynapi_overrides.h:515
viewport
SDL_Rect viewport
Definition: testviewport.c:28
SDL_Rect::x
int x
Definition: SDL_rect.h:79
SDL_LogError
#define SDL_LogError
Definition: SDL_dynapi_overrides.h:36
SDL_Rect::w
int w
Definition: SDL_rect.h:80
SDL_Window
The type used to identify a window.
Definition: SDL_sysvideo.h:73
NativeWindowFactory::CreateNativeWindow
void *(* CreateNativeWindow)(int w, int h)
Definition: testnative.h:25
factory
static NativeWindowFactory * factory
Definition: testnative.c:37
SDL_GetWindowSize
#define SDL_GetWindowSize
Definition: SDL_dynapi_overrides.h:527
SDL_CreateTextureFromSurface
#define SDL_CreateTextureFromSurface
Definition: SDL_dynapi_overrides.h:307
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2649
SDL_Renderer
Definition: SDL_sysrender.h:122
done
int done
Definition: checkkeys.c:28
sprite_w
static int sprite_w
Definition: testsprite2.c:38
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
SDL_RenderCopy
#define SDL_RenderCopy
Definition: SDL_dynapi_overrides.h:343
window_h
int window_h
Definition: testoverlay2.c:144
window
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_Log
#define SDL_Log
Definition: SDL_dynapi_overrides.h:31
SDL_Rect::y
int y
Definition: SDL_rect.h:79
SDL_Rect::h
int h
Definition: SDL_rect.h:80
velocities
static SDL_Rect * velocities
Definition: testnative.c:39
SDL_RenderGetViewport
#define SDL_RenderGetViewport
Definition: SDL_dynapi_overrides.h:325
SDL_QueryTexture
#define SDL_QueryTexture
Definition: SDL_dynapi_overrides.h:308
SDL_QUIT
@ SDL_QUIT
Definition: SDL_events.h:60
sprite_h
static int sprite_h
Definition: testsprite2.c:38
SDL_WINDOWEVENT_EXPOSED
@ SDL_WINDOWEVENT_EXPOSED
Definition: SDL_video.h:151
SDL_FreeSurface
#define SDL_FreeSurface
Definition: SDL_dynapi_overrides.h:446
SDL_PixelFormat::palette
SDL_Palette * palette
Definition: SDL_pixels.h:318
SDL_SetColorKey
#define SDL_SetColorKey
Definition: SDL_dynapi_overrides.h:453
SDL_VideoInit
#define SDL_VideoInit
Definition: SDL_dynapi_overrides.h:498
MAX_SPEED
#define MAX_SPEED
Definition: testnative.c:23
NUM_SPRITES
#define NUM_SPRITES
Definition: testnative.c:22
SDL_SetWindowTitle
#define SDL_SetWindowTitle
Definition: SDL_dynapi_overrides.h:519
SDL_LoadBMP
#define SDL_LoadBMP(file)
Definition: SDL_surface.h:201
y
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
SDL_LOG_PRIORITY_INFO
@ SDL_LOG_PRIORITY_INFO
Definition: SDL_log.h:106
renderer
static SDL_Renderer * renderer
Definition: testaudiocapture.c:21
SDL_GetCurrentVideoDriver
#define SDL_GetCurrentVideoDriver
Definition: SDL_dynapi_overrides.h:500
SDL_LogSetPriority
#define SDL_LogSetPriority
Definition: SDL_dynapi_overrides.h:236
SDL_Rect
A rectangle, with the origin at the upper left (integer).
Definition: SDL_rect.h:77
SDL_Texture
Definition: SDL_sysrender.h:43
SDL_RenderClear
#define SDL_RenderClear
Definition: SDL_dynapi_overrides.h:334
SDL_SetRenderDrawColor
#define SDL_SetRenderDrawColor
Definition: SDL_dynapi_overrides.h:330
MoveSprites
void MoveSprites(SDL_Renderer *renderer, SDL_Texture *sprite)
Definition: testnative.c:84
SDL_VideoQuit
#define SDL_VideoQuit
Definition: SDL_dynapi_overrides.h:499
positions
static SDL_Rect * positions
Definition: testnative.c:39
SDL_Event
General event structure.
Definition: SDL_events.h:557
SDL_WINDOWEVENT
@ SDL_WINDOWEVENT
Definition: SDL_events.h:92
WINDOW_W
#define WINDOW_W
Definition: testnative.c:20
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374
SDL_CreateRenderer
#define SDL_CreateRenderer
Definition: SDL_dynapi_overrides.h:301
SDL_strcmp
#define SDL_strcmp
Definition: SDL_dynapi_overrides.h:417
SDL_Surface::format
SDL_PixelFormat * format
Definition: SDL_surface.h:73
LoadSprite
SDL_Texture * LoadSprite(SDL_Renderer *renderer, char *file)
Definition: testnative.c:53
factories
static NativeWindowFactory * factories[]
Definition: testnative.c:25
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:179