SDL_Renderer* SDL_CreateSoftwareRenderer(SDL_Surface* surface)
surface | レンダリングが行われるSDL_Surface |
#include "SDL.h"
SDL_Window *window;
SDL_Renderer *renderer;
int done;
void
DrawChessBoard(SDL_Renderer * renderer)
{
int row = 0,column = 0,x = 0;
SDL_Rect rect, darea;
/* 描画するサーフェイスのサイズを得る */
SDL_RenderGetViewport(renderer, &darea);
for ( ; row < 8; row++) {
column = row%2;
x = column;
for ( ; column < 4+(row%2); column++) {
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0xFF);
rect.w = darea.w/8;
rect.h = darea.h/8;
rect.x = x * rect.w;
rect.y = row * rect.h;
x = x + 2;
SDL_RenderFillRect(renderer, &rect);
}
}
}
void
loop()
{
SDL_Event e;
while (SDL_PollEvent(&e)) {
if (e.type == SDL_QUIT) {
done = 1;
return;
}
if ((e.type == SDL_KEYDOWN) && (e.key.keysym.sym == SDLK_ESCAPE)) {
done = 1;
return;
}
}
DrawChessBoard(renderer);
/* レンダリングサーフェイスの処理が完了したならば,
ウィンドウを描いた画像で更新する */
SDL_UpdateWindowSurface(window);
}
int
main(int argc, char *argv[])
{
SDL_Surface *surface;
/* 通常のアプリケーションログを有効にする */
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
/* SDLを初期化する */
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_Initに失敗した : %s¥n", SDL_GetError());
return 1;
}
/* 指定のサーフェイスのウィンドウとレンダラーを生成する */
window = SDL_CreateWindow("チェス盤", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
if (!window) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "ウィンドウの生成に失敗した : %s¥n",SDL_GetError());
return 1;
}
surface = SDL_GetWindowSurface(window);
renderer = SDL_CreateSoftwareRenderer(surface);
if (!renderer) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "サーフェイスのレンダラーの生成に失敗した : %s¥n",SDL_GetError());
return 1;
}
/* レンダリングサーフェイスを指定の色で消去する */
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(renderer);
/* レンダリングサーフェイスに画像を描画する */
done = 0;
while (!done) {
loop();
}
SDL_Quit();
return 0;
}
次の2つのAPIもSDL_Rendererを生成できる. SDL_CreateRenderer()とSDL_CreateWindowAndRenderer()
これらの関数でもソフトウェアレンダラーを生成できるが, SDL_Surfaceではなく, 最終的にSDL_Windowで使うことを想定している.