赤と青の交換関数

やあ子供たち元気にしてたかな。今日は赤と青を交換する話だよ。Win32GDIのビットマップ画像データをOpenGLのテクスチャ画像として渡したりする際にビットマップイメージデータの並びがBGRBGRとなっていたりするので、青の値と赤の値とを入れ替える必要が発生するわけだが、そんなときにお役立ちなのが今回の関数だ。
実はGL_BGR_EXTというものもあるみたいなんだけどどうもうまく行かないのでこんなものを用意するはめになっているよ。(その意味では誰かGL_BGRやGL_BGR_EXTの使い方を知っている人がいたら教えてもらいたいな)

void pocSwapColorRandB( const int w, const int h, const int depth, char* buf )
{
  // ビットマップイメージ buf のRとBの値を入れ替えます。
  // bufがデパディングされていることが前提です。
  size_t sz = h * w * depth;
  for( int i=0; i<sz; i+=depth ){
    swap( buf[i], buf[i+2] );
  }// i
  return;
}

これはターゲット画像の幅と高さ、ビット深さとバッファ(ビットマップイメージ実体)を与えると、その中のB値とR値とを入れ替えてくれるよ。気をつけなきゃいけないのは与えるビットマップイメージは必ずデパディング処理がされていることが必要だということだ。
こうしておくことで少なくともこのアホらしくも重要な処理をパッケージ化できるし、そのコメントを見ることにより、デパディング処理のし忘れも防がれるという効果もあるんだ。
こういうちょっとした処理をバグのないテスト済みの小さな抽象化部品として持っておくことは実はとても強力なことなんだよ。わかるかな。
今日のとこはこの辺で。じゃ!