SDL_Renderer * SDL_CreateSoftwareRenderer(SDL_Surface *surface);
| SDL_Surface * | surface | レンダリングを行うサーフェイス |
次の2つのAPIもSDL_Rendererを生成できる: SDL_CreateRenderer()とSDL_CreateWindowAndRenderer(). これらの関数でもソフトウェアレンダラーを生成できるが, SDL_Surfaceではなく, 最終的にSDL_Windowで使うことを想定している.
この関数を呼べるのはメインスレッドのみである.
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
SDL_Window *window;
SDL_Renderer *renderer;
int done;
void DrawChessBoard(SDL_Renderer *renderer)
{
int row = 0, column = 0, x = 0;
SDL_FRect rect;
SDL_Rect darea;
/* 描画するサーフェイスのサイズを得る */
SDL_GetRenderViewport(renderer, &darea);
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(renderer);
for (; row < 8; row++) {
column = row % 2;
x = column;
for (; column < 4 + (row % 2); column++) {
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0xFF);
rect.w = (float)darea.w / 8;
rect.h = (float)darea.h / 8;
rect.x = x * rect.w;
rect.y = row * rect.h;
x = x + 2;
SDL_RenderFillRect(renderer, &rect);
}
}
SDL_RenderPresent(renderer);
}
void loop()
{
SDL_Event e;
while (SDL_PollEvent(&e)) {
if (e.type == SDL_EVENT_QUIT) {
done = 1;
return;
}
if ((e.type == SDL_EVENT_KEY_DOWN) && (e.key.key == SDLK_ESCAPE)) {
done = 1;
return;
}
}
DrawChessBoard(renderer);
/* レンダリングサーフェイスの処理が完了したならば,
ウィンドウを描いた画像で更新する */
SDL_UpdateWindowSurface(window);
}
int main(int argc, char *argv[])
{
SDL_Surface *surface;
/* SDLを初期化する */
if (!SDL_Init(SDL_INIT_VIDEO)) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_Initに失敗した : %s\n", SDL_GetError());
return 1;
}
/* 指定のサーフェイスのウィンドウとレンダラを生成する */
window = SDL_CreateWindow("チェス盤", 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;
}
/* レンダリングサーフェイスに画像を描画する */
done = 0;
while (!done) {
loop();
}
SDL_Quit();
return 0;
}