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

SDL_CreateSoftwareRenderer

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

構文

SDL_Renderer* SDL_CreateSoftwareRenderer(SDL_Surface* surface)

引数

surfaceレンダリングが行われるSDL_Surface

戻り値

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

サンプルコード

#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で使うことを想定している.

バージョン

SDL 2.0.0以降

関連項目(関数)

SDL_CreateRenderer
SDL_CreateWindowAndRenderer
SDL_DestroyRenderer

SDL Wikiへのリンク

SDL_CreateSoftwareRenderer - SDL Wiki