文字列を描画したサーフェスの作成と破棄

2021年9月25日

SDL_ttfで文字列を描画したサーフェスの作成( 文字列からサーフェスの作成 )と破棄をするには、下記の関数を使用します。

TTF_RenderUTF8_Solid関数

文字列を描画したサーフェスを作成します。

宣言

SDL_Surface* TTF_RenderUTF8_Solid( TTF_Font* font, const char* text, SDL_Color fg );

引数

fontフォントのアドレスです。
textサーフェスに描画する文字列です。
fg文字の色です。

戻り値

作成に成功すると「( 文字列を描画した )サーフェスのアドレス」を返し、失敗すると「NULL」を返します。

TTF_RenderUTF8_Shaded関数

網掛けをかけて( 背景を塗りつぶして )文字列を描画したサーフェスを作成します。

宣言

SDL_Surface* TTF_RenderUTF8_Shaded( TTF_Font* font, const char* text, SDL_Color fg, SDL_Color bg );

引数

fontフォントのアドレスです。
textサーフェスに描画する文字列です。
fg文字の色です。
bg網掛けの色です。

戻り値

作成に成功すると「サーフェスのアドレス」を返し、失敗すると「NULL」を返します。

TTF_RenderUTF8_Blended関数

アンチエイリアスをかけて文字列を描画したサーフェスを作成します。

宣言

SDL_Surface* TTF_RenderUTF8_Blended( TTF_Font* font, const char* text, SDL_Color fg );

引数

fontフォントのアドレスです。
textサーフェスに描画する文字列です。
fg文字の色です。

戻り値

作成に成功すると「サーフェスのアドレス」を返し、失敗すると「NULL」を返します。

SDL_FreeSurface関数

サーフェスを破棄します。

宣言

void SDL_FreeSurface( SDL_Surface* surface );

引数

surfaceサーフェスのアドレスです。

サンプルプログラム

#include <SDL_ttf.h>

int main( int argc, char* argv[] )
{
    if ( TTF_Init() == -1 ) 
    {
        SDL_Log( u8"SDL_ttfの初期化処理に失敗しました。エラーメッセージ: %s", TTF_GetError() );
        return -1;
    }

    auto font = TTF_OpenFont( u8"arial.ttf", 16 );

    if ( font == nullptr ) 
    {
        SDL_Log( u8"フォントの読み込みに失敗しました。エラーメッセージ: %s", TTF_GetError() );
        TTF_Quit();
        return -1;
    }

    auto string_color   = SDL_Color();
    string_color.r      = 0;
    string_color.g      = 0;
    string_color.b      = 255;
    string_color.a      = 255;

    auto shaded_color   = SDL_Color();
    shaded_color.r      = 100;
    shaded_color.g      = 100;
    shaded_color.b      = 100;
    shaded_color.a      = 255;

    auto string_surface                 = TTF_RenderUTF8_Solid  ( font, u8"string"              , string_color );
    auto shaded_string_surface          = TTF_RenderUTF8_Shaded ( font, u8"shaded string"       , string_color, shaded_color );
    auto anti_aliased_string_surface    = TTF_RenderUTF8_Blended( font, u8"anti aliased string" , string_color );

    if ( string_surface == nullptr ) 
    {
        SDL_Log( u8"文字列を描画したサーフェスの作成に失敗しました。エラーメッセージ: %s", TTF_GetError() );
        goto FAILED_TO_CREATE_SURFACE;
    }

    if ( shaded_string_surface == nullptr ) 
    {
        SDL_Log( u8"網掛けをかけて文字列を描画したサーフェスの作成に失敗しましたエラーメッセージ: %s", TTF_GetError() );
        goto FAILED_TO_CREATE_SURFACE;
    }

    if ( anti_aliased_string_surface == nullptr ) 
    {
        SDL_Log( u8"アンチエイリアスをかけて文字列を描画したサーフェスの作成に失敗しました。エラーメッセージ: %s", TTF_GetError() );
        goto FAILED_TO_CREATE_SURFACE;
    }

    // 文字列を描画したサーフェスを使用する処理

FAILED_TO_CREATE_SURFACE:

    if ( string_surface                 != nullptr ) SDL_FreeSurface( string_surface );
    if ( shaded_string_surface          != nullptr ) SDL_FreeSurface( shaded_string_surface );
    if ( anti_aliased_string_surface    != nullptr ) SDL_FreeSurface( anti_aliased_string_surface );

    TTF_CloseFont( font );
    TTF_Quit();

    return 0;
}

参考ページ