1. 前回の内容
2. 目標
フォントをファイル指定するのではなく、byte配列で指定する。
これによってファイルの暗号化に対応でき、利用可能なフォントを増やすことができる。
3. ソース
4. 変更点
4.1.ImageFont
バイト配列を受け取るSetFont(byte[])メソッドを追加
内部でFT.FT_New_Memory_Face(FT_LibraryRec_, byte, IntPtr, IntPtr, FT_FaceRec_**)メソッドを呼び出している。
FT.FT_New_Memory_Faceメソッドの第二引数がフォントデータのbyte配列の先頭アドレスになる。
当然アンマネージドメモリで取得する必要があります。
そのため、Marshall.AllocHGlobal(int)メソッドでメモリを確保、配列のコピーを行っています。
また、確保したメモリを開放するためにIDisposableインターフェイスを実装しています。
ImageFont
public unsafe class ImageFont : IDisposable
{
private IntPtr _FontMemory = IntPtr.Zero;
// (......省略)
public void SetFont(byte[] data)
{
FT_FaceRec_* face;
_FontMemory = Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, _FontMemory, data.Length);
var error = FT.FT_New_Memory_Face(FTL_Library.Native, (byte*)_FontMemory, (IntPtr)data.Length, IntPtr.Zero, &face);
if (error != FT_Error.FT_Err_Ok) throw new FreeTypeException(error);
SetFont(face);
}
// (......省略)
public void Dispose()
{
if (_FontMemory != IntPtr.Zero)
{
Marshal.FreeHGlobal(_FontMemory);
_FontMemory = IntPtr.Zero;
}
}
}
4.2. その他のクラス
ImageFontを作成するTextTextureFactoryクラスにてbyte配列に対応したLoadFontメソッドを追加
5. おわりに
今回の対応で一般的なフリーフォントの利用条件をクリアできたと思う。
そのため、文字列の描画に関しては一旦完成とする。
6. 続き