DXライブラリには普通に使えるのにドキュメントに載ってない関数が多い気がする

恐らく、初心者向けを謳っているので小難しいものは隠したかったのかも知れないのですが。

まるぺけつくろーどっとコムには「高速フォント描画」っていう記事があって、そいつはD3DXFontだと拡張性に乏しかったり、描画命令を送るたびにフォント作ってたりあれなのでこっちで描画するフォントを作ってしまいましょう、というもの。

その5 高速フォント表示

Direct3D向けの話だったのですが、DxLibにもソフトイメージという形でドット単位でデータを書いて、それをグラフィックハンドルに変換できるとのことだったのでやってみました。

最初はドキュメントにある関数だけでやってみようかなと思ったんですが、DxLibのヘッダを見てみるともっと低レベルに処理できそうだったのでいろいろやってみたところ、メモリ上の先頭ポインタ取得して書き込めそうだったのでやってみることに。

…積みました。思ってる通りの操作にならない。

とかなんとかやってたらそもそもソフトイメージに描画した文字列を転送する関数がありました。

これを導入してやって成功。アンチエイリアスは?とか思って探したらフラグ設定できたんですね…。

1文字のテクスチャを生成する場合は、

const int font_size = 32;
const std::string s = "あ";

// フォントハンドル生成
const int FontHandle = CreateFontToHandle( "Arial", font_size, -1, DX_FONTTYPE_ANTIALIASING );

// ソフトイメージ生成
const int SoftImage = MakeARGB8ColorSoftImage( font_size, font_size );

// フォントハンドルを指定してソフトイメージに文字列を描画
BltStringSoftImageToHandle( 0, 0, s.c_str(), SoftImage, -1, FontHandle );

// ソフトイメージからグラフィックハンドルを取得
const int GraphHandle = CreateGraphFromSoftImage( SoftImage );

// ソフトイメージとフォントハンドルは削除して
// グラフィックハンドルのみが残る
DeleteSoftImage( SoftImage );
DeleteFontToHandle( FontHandle );

// 後はグラフィックハンドルを使って描画するだけ
DrawGraph( 0, 0, GraphHandle, TRUE );

// 不必要になれば削除
DeleteGraph( GraphHandle );

といった感じ。ソフトイメージから描画するためにグラフィックハンドルを練成します。

ソフトイメージはグラフィックハンドルを作った後は削除していいようです。

この中で公式ドキュメントには解説が載ってないのは BltStringSoftImageToHandle 関数です。

こういった感じで「便利なんだけど公式ドキュメントに解説がない関数」がDxLibには幾らかあります。

ウィンドウハンドルを直接取得できる関数があったりもするんですが。

DxLibで詰まった時は、ヘッダを見てみると、何かしらの解決の糸口が見えてきそうですね。