DirectWriteの機能を使用して、
フォントファイル(ttf形式など)からフォントを読み込んで描画を行うクラスです。
DirectXなどで利用することができます。
- フォントファイルの読み込み
- カスタムフォントコレクションの作成
- フォント名の取得
- フォントスタイル、サイズ、色の設定
- 文字列の描画
こちらのブログでも機能紹介、トラブルシューティング、メモを載せています。 https://islingtonsystem.hatenablog.jp/entry/DirectWrite_CustomFont_DirectX
開発環境ではDirectX11を使用してテストを行いました。
DirectX12でも利用可能とは思いますが、動作は未確認です。
また、D3DXMathや一部古い機能を使っています。
DirectWriteCustomFont.h
のFontList::Fontpath
にフォントファイルのパスを書いてください。D3D11CreateDevice
もしくはD3D11CreateDeviceAndSwapChain
関数の第4引数を以下に変更してください。
D3D11_CREATE_DEVICE_BGRA_SUPPORT
詳細はこちら。 Direct2DとDirect3Dの共用に必要なので、Direct2D単体で使用する場合は必要ありません。
DirectWriteCustomFont
クラスのインスタンスを作成します。Init
メソッドを使用して初期化処理を行います (重要!)FontData
クラスを宣言してフォント設定を保存します。- 必要に応じてフォントの設定を行います(例: フォント名、スタイル、サイズ)。
- 変更を行った場合、
SetFont
メソッドでフォント設定を反映します。 DrawString
メソッドを使用してテキストを描画します。
FontData
クラスのfont
で指定するフォント名は、フォントファイルの名前ではなくフォント名です。
GetFontName
で取得すると、ミスが無く指定できるのでおすすめです。
サンプルクラスはこちらに載っています。
// DirectWriteCustomFontクラスの生成
Write = new DirectWriteCustomFont(&data);
// 初期化(SwapChainの取得は適宜お願いします)
Write->Init(Renderer::GetSwapChain());
// フォントデータを改変
data.fontSize = 60;
data.fontWeight = DWRITE_FONT_WEIGHT_ULTRA_BLACK;
data.Color = D2D1::ColorF(D2D1::ColorF::Red);
data.font = L"サンプル.ttf";
// フォントをセット
Write->SetFont(data);
// 描画
Write->DrawString("テスト", D3DXVECTOR2(90, 90), D2D1_DRAW_TEXT_OPTIONS_NONE);
ヘッダーファイル内にもコメントで説明書きがあるので、困った際にはお読みください。
メソッド | 役割 |
---|---|
Init |
クラスの初期化を行います。 |
SetFont |
設定したフォントデータを反映します。 |
DrawString |
文字列の描画を行います。 |
GetFontName |
指定した番号のフォント名を返します。 |
GetFontNameNum |
読み込んだフォントの最大数を返します。 |
GetFontFamilyName |
フォント名を読み込み直します。 |
GetAllFontFamilyName |
全てのフォント名を読み込み直します。 |
FontLoader |
指定されたパスのフォントを読み込み直します。 |
- 全体の初期設定に使用します。
呼び出しと同時にFontList::FontPass
で指定されたフォントも読み込まれます。
IDXGISwapChain* swapChain
: Direct2Dの初期設定時、バックバッファの取得で使用します。
- 指定したフォントデータを使用してフォント設定を適用します。
FontData data
: フォントの名前、サイズ、スタイルなどを指定したものです。
- 指定した文字列を、指定された位置に描画します。
string str
: 描画するテキスト。D3DXVECTOR2 pos
: 描画ポジション。先頭文字の開始位置を指定します。D2D1_DRAW_TEXT_OPTIONS options
: テキストの整形を指定します。bool shadow
: 影の描画を指定します。
// 描画
Write->DrawString("テスト", D3DXVECTOR2(90, 90), D2D1_DRAW_TEXT_OPTIONS_NONE);
- 読み込んだフォントファイルから、フォント名を返します。
- フォント設定時のフォント名の記載ミスが起きないため、おすすめです。
int num
:FontList::Fontpath
で指定したフォントファイルの順番を指定。
wstring
: 指定されたフォントファイルのフォント名。
// フォントを変更
data.font = Write->GetFontName(3);
- 読み込んだフォントファイルの数を返します。
int
: 読み込んだフォントファイルの数。
- フォントファイルの名前を読み込み直します。
- ロケール名を指定できるので、日本語版フォントを読み込みたい場合などに使用してください。
IDWriteFontCollection* customFontCollection
: フォントファミリー名を読み込み直すフォントコレクション。const WCHAR* locale
: ロケール名。デフォルトでは"en-us"
が選択されています。
// 日本語のフォント名を取得
result = GetFontFamilyName(fontCollection.Get(), L"ja-JP");
- 全てのフォント名を読み込み直します。
英語や日本語のフォント名が全て読み込まれるので、
順番がフォントファイルの順番と異なることになります(GetFontName
の使用が難しくなります)。
正直、あまりおすすめはしません。
IDWriteFontCollection* customFontCollection
: フォントファミリー名を読み込み直すフォントコレクションを指定します。
- フォントファイルを読み込み直します。
FontList::FontPass
にパスを追加した際などにお使いください。