libpng for Windows CE

libpng最新版(1.2.33)をWindows CEでビルドしてみた。移植済み(libpng for WindowsCE)のも公開されているがベースがlibpng 1.2.3とちょっと古い。
ソース自体はかなり移植性が高く作られており(元々クロスプラットフォームなんだから当たり前だ)、ほとんど修正することなくWindows CE環境でビルドできた。
PNG_USER_CONFIGを定義しておくと、ユーザー定義のpngusr.hを読み込んでくれるようになってるところがポイント。このお陰で元のソースを修正することなく、最小限のファイルの追加で済んだ。


手順はこんな感じ

  • 適当なプロジェクト(static library)を作成し、必要なソースファイルを追加(png.c, pngset.c, pngget.c, pngread.c, pngpread.c, pngrtran.c, pngrutil.c, pngerror.c, pngmem.c, pngrio.c, pngwio.c, pngtrans.c, pngwrite.c, pngwtran.c, pngwutil.c)
  • プリプロセッサPNG_NO_MMX_CODE, PNG_SETJMP_NOT_SUPPORTED, PNG_USER_CONFIG, PNG_ABORT=wce_abort の定義を追加する
  • pngusr.hファイルを新規作成し、以下の内容を追加する。

void wce_abort(void);

  • pngusr.cファイルを新規作成し、以下の内容を追加する。プロジェクトに追加する。

#include

void wce_abort(void)
{
    RaiseException(STATUS_INVALID_PARAMETER, EXCEPTION_NONCONTINUABLE_EXCEPTION, 0, NULL);
}


Windows CE用のCRTではabortが提供されていないので、RaiseExceptionで代替してみた。元々エラーの場合にabort()とかlongjmp()で抜けるっていう仕様もかなりアレな実装だと思うが…。もうちょっとマトモな実装にはならんもんかのう。
pngtest.cもビルドしてみて、pngtest.exeでのテストはとりあえずPASSしてる模様。実際に描画しての確認はまた今度…


あ、zlibを使ってるので、こっちも別途用意しておく必要がある。(⇒zlibce