FreeTypeをコンパイル
概要
PDFで日本語フォントを埋め込みたい!というところに端を発して、フォントファイルの操作をするべくFreeTypeをコンパイルできるような環境を構築してみようという作業です。
2022年8月現在 Windows10 の Visual Studio 2019を使っての作業です。
FreeTypeに必要なアプリlibpngとzlibのビルド方法
FreeTypeは現在 Version1.12.1 で カラー絵文字の操作を含めるなら libpng ライブラリが必要とのこと。さらにはzlibも必要なんだって。道のり長くなっていくなぁ。zlibの最新版を最初はダウンロードしたんだけど、カスタムビルドステップの
- Win32
- cd ..\..\masmx86
- bld_ml32.bat
- x64
- cd ..\..\masmx64
- bld_ml64.bat
を実行する部分があって、そのファイルが同梱されていない。なので、GitHubにある1.2.8をDownloadしました。大丈夫かな。
ソリューション全体がzlib - 1.2.8とかいうフォルダにあるのを単純にzlibという名前に変更して、これからlibpngのライブラリをしたりする作業用のディレクトリにおいてVisual Studioで、ビルドします。zlibとする名前の変更と同じフォルダにおくという作業によって、のちの作業となるlibpngソリューションの中のzlibvcプロジェクトのパスが解決され、作業がしやすくなります。
ではzlibをビルドしましょう。まずは起動するファイルを探します。
zlib\contrib\vstudio\vc11
にある
zlibvc.sln
を起動します。そうすると最初の一回目は、変換処理を促されるので、言われるがまま変換します。次にソリューションをビルド(Ctrl+Shift+B)してみるとエラーがごっそり。
プロジェクトの設定を変更します。Debug Release の2つの構成の プラットフォーム Win32 と x64 の全部で4つ構成それぞれでzlibソリューションの中の5つプロジェクトプロパティ。全20通り対してに、[リンカー]-[詳細設定]の[安全な例外ハンドラーを含むイメージ] に いいえ (/SAFESEH:NO)を設定します。
[C/C++]-[全般の] 警告をエラーにするがいいえになっていることも確かめます。
inffas8864.c の 引数の指定の仕方を以下のようにします。
<Syntaxhighlight2 lang="cpp"> … void inflate_fast(z_streamp strm, unsigned start) //z_streamp strm; //unsigned start; { … </Syntaxhighlight2>
c言語の記述方法になっているので、引数の型を関数名の横のカッコ無いで設定してc++言語向けにする。いらなくなったところをコメント化しています。
zlibvcプロジェクトを展開したところにあるファイルzlibvc.defの中身を以下のように書き換えます。
<Syntaxhighlight2 lang="cpp"> …
- VERSION 1.2.8
VERSION 1.28 { … </Syntaxhighlight2>
VERSIONの指定方法が間違えているようです。
これでソリューション全体のビルドができるようになったハズです。
そしたら libpngも入手してzlibを配置したフォルダと同じところにlibpng1637のようなフォルダも配置します。
libpngをビルドするための作業をします。まずは起動するファイルを探します。
lpng1637\projects\vstudio
にある
vstudio.sln
を起動します。そうすると最初の一回目は、変換処理を促されるので、言われるがまま変換します。次にソリューションをビルド(Ctrl+Shift+B)してみるとエラーがごっそり。
プロジェクトの設定を変更します。Debug DebugLibrary Release ReleaseLibrary の4つの構成の プラットフォーム Win32の全部で4つ構成それぞれで、libpngソリューションの中の5つプロジェクトプロパティ。全20通り対してに、[C/C++]-[全般の] 警告をエラーにするがいいえになっていることも確かめます。
これでソリューション全体のビルドができるようになったハズです。
FreeTypeのプロジェクト設定
次にFreeTypeをlibpngありの設定にします。
include\freetype\config\ftoption.hを以下の通りに変更します。 <Syntaxhighlight2 lang="cpp" line=255>
/*************************************************************************/ /* */ /* PNG bitmap support. */ /* */ /* FreeType now handles loading color bitmap glyphs in the PNG format. */ /* This requires help from the external libpng library. Uncompressed */ /* color bitmaps do not need any external libraries and will be */ /* supported regardless of this configuration. */ /* */ /* Define this macro if you want to enable this `feature'. */ /* */ /* If you use a build system like cmake or the `configure' script, */ /* options set by those programs have precendence, overwriting the */ /* value here with the configured one. */ /* */
- define FT_CONFIG_OPTION_USE_PNG
</Syntaxhighlight2>
まずはincludeファイルでlibpngの動作を有効にする宣言がある箇所があるので、そこのコメント化されている部分を外します。
次に、以下のファイルにアクセスできるようにします。
lpng\png.h lpng\pngconf.h lpng\pnglibconf.h zlib\zconf.h zlib\zlib.h lpng\Release Library\libpng.lib lpng\Debug Library\libpng.lib lpng\Release Library\zlib.lib lpng\Debug Library\zlib.lib
FreeTypeのプロジェクトの設定にライブラリの絶対パスを設定したり、優先度を低めにして、ヘッダファイルの絶対パスを通したりします。コピーして放り込んだり、いろいろな人のやり方があると思うので、ここは流儀が分かれます。デメリットは関係ないインクルードファイルまで参照できるようにしてしまうことです。でもこれはFreeType自体のプログラムを追加編集しないという今回のケースでは小さな問題であるはずです。
自分のやり方ですけど。
1.プロジェクトのインクルード設定を変更します。
インクルードパスはFreeTypeのプロジェクトの構成プロパティ画面のVC++ディレクトリに設定します。一つ一つ設定するのは大変なので、ダイアログ上部の構成選択リストで[全て]を選択し、プラットフォームも[全て]のを選択します。この状態で[VC++ディレクトリ]の項目の中の[外部インクルードディレクトリ]の編集を行います。項目を選択してテキストカーソルをあてるダイレクト編集は、間違いの元なので、項目の一番右あたりにカーソルをもっていったときに表示される[▼]ボタンを押して、表示される項目の[編集]を選択して表示される専用ダイアログから編集しましょう。
$(WindowsSDK_IncludePath)の次の行に
C:\...\...\...\...\lpng C:\...\...\...\...\zlib
のように絶対パスを追加します。それぞれのプロジェクトのルートの下にヘッダファイルがありますので、階層は深くないです。ルートフォルダの名前にはデフォルトではバージョン番号がついていましたが、自分は消したので上記の例のような名前になります。絶対パスではなく、相対パスでもいいのですが、FreeTypeのプロジェクトが更新されると階層構造にも変更が発生し、汎用性がないので、同じ作業ディレクトリを使うという信念に基づくなら絶対パスがいいかなと思って、絶対パスを使います。include文は外部ディレクトリの参照使用 #include "..\..\png.h" みたいなものも警告にする昨今です。何が正しいのかわからない。..\ とかダメなんだってさ。
とにもかくにも、これですべてのヘッダファイルは見つかるようになったわけです。よきよき。
次にライブラリです。
インクルード設定をしたプロジェクトのプロパティ構成画面と同じところで今度はは構成の選択を[Debug]にします。さっきは全てを選択していました。*.libファイルはDebug版とRelease版とで分かれているからです。x64とWin32(x86)とで同じlibを使うのでプラットフォームは全てのままでよいでしょう。libpngやzlibには32ビット版しかないので、これをダイナミックリンクで使うときには64bit版でも32bitプログラムとして動作しちゃうわけですね。libをくっつけてスタティックリンクで出力したら64bit版のFreeTypeができるのかな。
この状態で項目の[リンカー]-[入力]の[追加の依存ファイル]の項目にさっきとおなじように編集して
構成のDebugに対しては
C:\…\…\…\…\lpng\projects\vstudio\Debug Library\libpng16.lib C:\…\…\…\…\lpng\projects\vstudio\Debug Library\zlib.lib
構成のRelease対しては
C:\…\…\…\…\lpng\projects\vstudio\Release Library\libpng16.lib C:\…\…\…\…\lpng\projects\vstudio\Relsese Library\zlib.lib
を絶対パスで追加しちゃいましょう。
これで、FreeTypeのスタティックライブラリ libとダイナミックリンクライブラリ dll とが生成されました。ここからは実際にFreeTypeを使ったプログラミングで遊べます。