0
0

FreeTypeSharpを使った文字列描画(byte配列で読み込む)

Last updated at Posted at 2024-05-25

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. 続き

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0