32087


最終的にSDL2_ttfを使用してOpenGLのテクスチャとして読み込ませたいと考えてます。  
まずSDL2_ttf単体でフォントの読み込みのテストを行いました。

下記のコードは正常に実行できますが、毎回フォントデータを読み込みに行ってしまうため速度が出ません。

[code]

    #include <SDL.h>
    #include <SDL_ttf.h>
    #include <iostream>
    
    using namespace std;
    
    int main( int argc, char* argv[] ){
        SDL_Init( SDL_INIT_EVERYTHING );
        TTF_Init();
        while( true ){
            SDL_RWops *rwops = SDL_RWFromFile( "font.ttf", "rb" );
            TTF_Font *font = TTF_OpenFontRW( rwops, 0, 14 );
            SDL_Surface *texture = TTF_RenderUTF8_Blended( font, "test", [](){
                SDL_Color c= { 255,255,255,255 };
                return c;
            }());
            cout << TTF_GetError() << endl;
            TTF_CloseFont( font );
            SDL_RWclose( rwops );
            SDL_Delay( 100 );
        }
        TTF_Quit();
        SDL_Quit();
        return 0;
    }
    
[/code]

そこでrwopsに読み込む処理をループの外に置いたところ、TTF_RenderUTF8_Blendedでブレークし、以下のエラーが出力されました。

> 0x71002A85 (SDL2_ttf.dll) で例外がスローされました (SDL_Test.exe 内): 0xC0000005:  
>  場所 0x00000000 の読み取り中にアクセス違反が発生しました

TTF_GetError()からは"Couldn't load font file"と出力されました。

[code]

    #include <SDL.h>
    #include <SDL_ttf.h>
    #include <iostream>
    
    using namespace std;
    
    int main( int argc, char* argv[] ){
        SDL_Init( SDL_INIT_EVERYTHING );
        TTF_Init();
        SDL_RWops *rwops = SDL_RWFromFile( "font.ttf", "rb" );
        while( true ){
            TTF_Font *font = TTF_OpenFontRW( rwops, 0, 14 );
            cout << TTF_GetError() << endl;
            SDL_Surface *texture = TTF_RenderUTF8_Blended( font, "test", [](){
                SDL_Color c= { 255,255,255,255 };
                return c;
            }());
            TTF_CloseFont( font );
            SDL_Delay( 100 );
        }
        SDL_RWclose( rwops );
        TTF_Quit();
        SDL_Quit();
        return 0;
    }
    
[/code]

おそらくどこかでrwopsがクリアされたと考えていますが何処だかわからず・・・  
分かる方いたらご教授お願いします。

開発環境はVisualStudio2015です。  
フォントデータは読み込めるディレクトリに配置しています。

SDL2リファレンス  
<http://sdl2referencejp.osdn.jp/index.html>


CC BY-SA 3.0
2017-01-23T07:37:46.087
32076
2017-01-23T12:25:36.270
20354
question
c++
SDL2_ttfを使用したフォントの読み込みで失敗


オフィシャルではありませんが，githubにあるSDL_ttfのミラーリポジトリを見てみると，`TTF_CloseFont`が内部で`SDL_RWclose`を呼び出しているようです．  
<https://github.com/ErintLabs/SDL_ttf/blob/a9fbd1912c9a8015ce4bcc2a4ac93be745c563a2/SDL_ttf.c#L933>

質問とは関係ないですが，`font`も外に出してしまうのはどうでしょうか？  
いちいち何度も開いては閉じるのは効率が悪そうです．

[code]

    #include <SDL.h>
    #include <SDL_ttf.h>
    #include <iostream>
    
    using namespace std;
    
    int main( int argc, char* argv[] ){
        SDL_Init( SDL_INIT_EVERYTHING );
        TTF_Init();
        SDL_RWops *rwops = SDL_RWFromFile( "font.ttf", "rb" );
        TTF_Font *font = TTF_OpenFontRW( rwops, 0, 14 );
        while( true ){
            cout << TTF_GetError() << endl;
            SDL_Surface *texture = TTF_RenderUTF8_Blended( font, "test", [](){
                SDL_Color c= { 255,255,255,255 };
                return c;
            }());
    
            SDL_Delay( 100 );
        }
        TTF_CloseFont( font );
        //SDL_RWclose( rwops );
        TTF_Quit();
        SDL_Quit();
        return 0;
    }
    
[/code]


CC BY-SA 3.0
2017-01-23T12:25:36.270
32087
2017-01-23T12:25:36.270
4548
32076
answer