SDL2でBMP画像とPNG画像を描画します。PNG画像の描画にはSDL2だけではなく、SDL_imageが必要になります。
Table of Contents
1 描画処理
SDL_Surface構造体からSDL_Texture構造体を作成します。SDL_Texture構造体は同一スレッドで扱う必要がありますが、SDL_Surface構造体は別のスレッドで作成し、レンダリングスレッドでSDL_Texture構造体を作成すると良いと思います。
文字列表示でも同様ですが、最初に画像データからSDL_Surface構造体を作成し、SDL_Surface構造体からSDL_Texture構造体を作成します。SDL_Texture構造体をSDL_Renderer構造体に渡し、描画処理が実行されます。
2 SDL_LoadBMP
SDL_LoadBMPでBMP画像からSDL_Surface構造体を作成できます。
SDL_Surface* SDL_LoadBMP(const char* file)
SDL_RWops構造体をSDL_LoadBMP_RWもあります。
SDL_Surface* SDL_LoadBMP_RW(SDL_RWops* src, int freesrc)
2.1 SDL_RWops構造体
ファイルストリームを扱う構造体です。open系関数等の差異を吸収します。Androidの場合はassetsディレクトリ配下のファイルにアクセスできます。
SDL_RWFromFileとSDL_RWFromFPでファイルストリームにアクセスできます。
SDL_RWops* SDL_RWFromFile(const char* file, const char* mode)
SDL_RWops* SDL_RWFromFP(void* fp, SDL_bool autoclose)
SDL_RWFromConstMemとSDL_RWFromMemでメモリをストリームのアクセス対象にできます。これらは、画像ファイル等をひとつの大きなリソースファイルにまとめて各ファイルをメモリに展開してから使用する場合に有用です。
ただし、SDL_RWopsを使用している間、memの領域は確保されていなければなりません(newした領域の場合、deleteしてはならない)。
SDL_RWops* SDL_RWFromConstMem(const void* mem, int size)
SDL_RWops* SDL_RWFromMem(void* mem, int size)
3 IMG_LoadPNG_RW
IMG_LoadPNG_RWでPNG画像からSDL_Surface構造体を作成できます。これはPNG画像をサポートしたSDL_imageライブラリが必要になります(SDL_image内部ではlibpngを使用しています)。
SDL_Surface *IMG_LoadPNG_RW(SDL_RWops *src)
4 サンプルプログラム
以下のクラス関係を持つサンプルプログラムです。pキーを押すとPNG画像を、bキーを押すとBMP画像を表示します。
使用したPNG画像は以下の通りです。
使用したBMP画像は以下の通りです。
https://dl-web.dropbox.com/s/w2dr5je3o9lytip/a.bmp
実行すると以下のようになります。BMP画像は透過情報が保持されていないため、PNG画像と重なり方が異なります。
サンプルプログラムは以下のものになります。