目次 - 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_CreateWindowRenderer
SDL_DestroyRenderer

## SDL Wikiへのリンク

SDL_CreateSoftwareRenderer - SDL Wiki