SDL2のBMP画像とPNG画像の描画処理

 SDL2でBMP画像とPNG画像を描画します。PNG画像の描画にはSDL2だけではなく、SDL_imageが必要になります。

 

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_RWFromFileSDL_RWFromFPでファイルストリームにアクセスできます。

SDL_RWops* SDL_RWFromFile(const char* file,
                          const char* mode)
SDL_RWops* SDL_RWFromFP(void*    fp,
                        SDL_bool autoclose)

SDL_RWFromConstMemSDL_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画像を表示します。


https://dl-web.dropbox.com/s/fplr1u34mqj0239/ClassDiagram.png


使用したPNG画像は以下の通りです。


https://dl-web.dropbox.com/s/lej4ien8vej4rme/a.png


使用したBMP画像は以下の通りです。


https://dl-web.dropbox.com/s/w2dr5je3o9lytip/a.bmp


実行すると以下のようになります。BMP画像は透過情報が保持されていないため、PNG画像と重なり方が異なります。


https://dl-web.dropbox.com/s/xqhf8wf7it6hacw/SampleProgram.png


サンプルプログラムは以下のものになります。

ダウンロード
SDL2でBMP画像とPNG画像を描画するサンプルプログラム
src.tgz.tar.gz
GNU tar 4.8 KB