SDL関係の導入について

しばらくはOpenGL関連の話を書いてみようと思うのですが、今日はちょっと横道に入ってSDLの話です。
OpenGLを単体で使おうとすると、いろいろと泥臭いAPIを使わざるを得ません。それに昨日の記事で WinMain() を書きたくないと言いましたが、Windows上でプログラミングをするとなるとどうしてもウィンドウの作成などの初期化処理やWinMain()エントリポイントは避けられません。そこでそういうOS依存のコード部分を吸収してくれて、しかも泥臭いAPI呼び出しをスマートにまとめてくれるライブラリを使うと幸せになれます。そういうライブラリとしてSDLGLUTといったものが存在します。
というわけで、自分はSDLを通してOpenGLを使うことにしました。SDLでコードを書くときはたとえWindowsアプリケーションであっても、エントリポイントを単なる int main(int argc, char *argv[]) として書くことができます。なぜそんなことでができるのかというと、実はSDL.dllの中にWinMain()が存在して、そこからアプリケーションのmain()を呼ぶという仕掛けになっているのです。OSごとに異なるSDLライブラリが用意されているので、アプリケーション内部はOSに依存しないコーディングが可能というわけです。
さて、SDLにはそういった特徴がある以前に、普通に関数ライブラリとしてさまざまな機能を提供してくれるのですが、物足りない点もいくつかあります。特に、画像はbmp、音声はwavしかサポートされていないというのが不満です。そこでそれを補うための補助ライブラリとして、SDL_image、SDL_mixerを使います。
で、ここからが今日の本題です。

SDL_imageはフォーマットとして「BMP,PNM,XPM,LBM,PCX,GIF,JPEG,PNG,TGA」を読み込めます。

というすばらしい売り文句なのですが、大嘘です。
なんとJPEGPNGは読み込めません。同様に、

SDL_mixerはフォーマットとして「MOD,MIDI,MP3,Ogg Vorbis」を読み込めます。

らしいのですが、MP3とOgg Vorbisは読み込めません。
もちろんサポートしているというのがまったくの大嘘というわけではなく、入手したそのままでは利用できないというだけです。これらのフォーマットを利用するには、いくつかの手順を踏む必要があります。
まず、なぜこれらのフォーマットが使えないのかというと、SDL_imageとSDL_mixerはPNGやMP3を読み込むのに他のライブラリを利用するのですが、それが同梱されていないのです。別に自分でコンパイルするわけじゃないんだからそんなもん同梱しなくてもいいよ、と思うかもしれませんが、なんと配布されているSDL_imageやSDL_mixerのコンパイル済みバイナリはそれらの必要ライブラリをリンクしていないのです。
つまり、PNGやらOggVorbisやらを使いたいなら自分でライブラリをリンクしてコンパイルしてね、ってわけです。具体的な手順は以下のようになります。
SDL_imageの場合

SDL_mixerの場合



(;^ω^)うわっ、めんどくせ・・・


ネットで検索すると、どこもかしこも「SDL_image(mixer)を使ったら○○ファイルが読み込めま〜す」とだけ書かれていて、こんな面倒なことをしたという体験談があまり見当たらないのですが、皆さん自前でコンパイルなさっているのでしょうか?まじで?やっぱみんなgcc使ってんの?これは自分の予想ですが、もしかしたら過去のバージョンではリンク済みのバイナリが同梱されていたのかもしれません。
ところで、全部DLLにするとフォルダ内がごちゃごちゃするので、個別フォーマットのライブラリをSDL_image、SDL_mixerにスタティックリンク(内部結合)したいのです。その方法(本当にその方法なのかよくわからないけど)がMinGWならここに詳しく載っているのですが、VCではよくわからない・・・。
しかたがないので、人様がコンパイルしてくださったものを流用することにしましたw
SDL_mixerはYaneSDK.NETABA Gamesに同梱されているものはOggVorbisを使えるようです(mp3は使えません)。SDL_imageはjpegやlibpngを内部リンクしたものが見つからないので、お持ちの方はライセンス的に問題がなければぜひ譲ってくださいw

ライセンスについて

SDLは基本的にGNU LGPLというライセンス形態です。
LGPLGPLを甘くしたもので、自分の作ったソフトにダイナミックリンクさせる場合は、自分のソフトのソース公開を拒否できます(スタティックリンクさせるときは拒否できません。またLGPLでもリバースエンジニアリングは拒否できないようです)。その上で上記のほかのライブラリのライセンスも調べてみました。

ざっと調べたところたぶんこんな感じです。英字ページを読むのが大変だったので間違ってるかもしれませんが。フリーやOpenSourceというのは特に使用側に制約をつけないライセンスと考えていいのかな?
よって今回の場合、smpegをSDL_mixerにスタティックリンクして再配布する場合に、SDL_mixerのソースコードを公開する義務が生まれるわけですね。まあSDL_mixerはもともとそのつもりで作られているので関係ないですが。
そして、SDLSDL_image、SDL_mixerのdllをゲームに同梱して配布する場合は、それらのライブラリのソースコードを公開する必要があると。まあ実際ソースを同梱する必要はなくて、「ここでソースを入手できますよ」とreadmeにでも書いておけばOKのようです。