フォント文字の高さについての検証

フォントサイズ
フォントサイズを指定する際は、基本的に「px」か「pt と DPI」で指定する場合が多いです。

しかし、画面上やイメージにグリフを描画するためには、px 単位での値が必要となるため、pt 単位の場合は px に変換します。

px = pt * DPI / 72

フォントのグリフは「1 em」という単位を基準としているので、1 em に対して、指定した px を割り当てる形となります。

unitsPerEM が 2048 なら、「1 em = 2048 = N px」となります。
文字の高さ
フォントサイズに 13 px を指定したとしても、実際に描画される文字の高さが 13 px になるとは限りません。

「IPA P ゴシック」でサイズを 13 px に指定して、"漢g" というテキストを描画してみると、

ヒンティング「なし」時 : 14 px
ヒンティング「標準」時 : 13 px

となりました。

フォントによっては、1 em と文字の高さが一致しない場合もありますし、ヒンティングの有無によって、高さが変化する場合もあります。

なお、「ヒンティング」とは、アウトライングリフを小さい解像度で描画する際に、見た目が良くなるように最適化する処理のことです。
フォントの値を見てみる
「IPA P ゴシック」のフォントの各値を見てみると、以下のようになっています。

head.unitsPerEm : 2048
OS/2.sTypoAscender: 1802
OS/2.sTypoDescender: -246
OS/2.usWinAscent: 1802
OS/2.usWinDescent: 401
hhea.ascender: 1802
hhea.descender: -246

グリフの高さは「ascender - descender」で求められるので、「1802 - -246 = 2048」です。
unitsPerEm と同じですね。

基本的に、「ascender - descender = unitsPerEm」であるフォントが多いです。

ちなみに、「usWinAscent、usWinAscent」は Windows API で使われます。

「1 em = 13 px」なら、計算上では文字の高さは 13 px となりますが、実際に描画してみると 14 px になる場合があります。
結論
結論から言うと、フォント内の値だけでは、実際に描画した時の文字の高さを正確に計算することはできません。

そのため、正確な文字の高さを知りたい場合は、アウトライングリフをビットマップの形にして、そこから高さを取得する必要があります。

もしくは、ヒンティングによる 1 px 程度の誤差をあらかじめ想定して、「ascender - descender」の高さに 1 px を加えておくかです。