目次 - SDL 3.0 API(機能別) - 2Dレンダリング - SDL_CreateSoftwareRenderer

SDL_CreateSoftwareRenderer

サーフェイスの2Dソフトウェアレンダリングコンテキストを作成する

ヘッダ

SDL3/SDL_render.h

構文

SDL_Renderer * SDL_CreateSoftwareRenderer(SDL_Surface *surface);

引数

SDL_Surface *surfaceレンダリングを行うサーフェイス

戻り値

(SDL_Renderer *) 成功のときレンダリングコンテキスト, 失敗のときNULLを戻す. SDL_GetError()を呼んで詳細を知ることができる.

詳細

次の2つのAPIもSDL_Rendererを生成できる: SDL_CreateRenderer()SDL_CreateWindowAndRenderer(). これらの関数でもソフトウェアレンダラーを生成できるが, SDL_Surfaceではなく, 最終的にSDL_Windowで使うことを想定している.

スレッドセーフ

この関数を呼べるのはメインスレッドのみである.

バージョン

SDL 3.2.0以降

サンプルコード

#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;
}

関連項目

SDL Wikiへのリンク

SDL_CreateSoftwareRenderer - SDL Wiki