Win32 API 日本語リファレンス
ホームDevices.Display › IFIMETRICS

IFIMETRICS

構造体
サイズx64: 184 バイト / x86: 184 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
cjThisDWORD4+0+0この構造体のサイズをバイト単位で指定します。指定するサイズには、この構造体の末尾に付加される Unicode 文字列と、省略可能な IFIEXTRA 構造体のバイト単位のサイズが含まれます。
cjIfiExtraDWORD4+4+4この IFIMETRICS 構造体に続く IFIEXTRA 構造体のサイズをバイト単位で指定します。値が 0 の場合は、IFIEXTRA 構造体が存在しないことを示します。
dpwszFamilyNameINT4+8+8フォントのファミリ名 (たとえば "Times Roman") を格納した null 終端の Unicode 文字列へのオフセットをバイト単位で指定します。通常、この文字列は IFIMETRICS 構造体の直後に配置されます。この文字列は、Win32 の LOGFONT 構造体の lfFaceName メンバーに記録される名前と同じでなければなりません。
dpwszStyleNameINT4+12+12フォントのスタイル (たとえば "Bold") を記述した null 終端の Unicode 文字列へのオフセットをバイト単位で指定します。
dpwszFaceNameINT4+16+16フォントの一意で完全な名前を表す null 終端の Unicode 文字列へのオフセットをバイト単位で指定します。この名前にはフォントのファミリ名とサブファミリ名が含まれます (たとえば "Times New Roman Bold")。
dpwszUniqueNameINT4+20+20フォントの一意な識別子を表す null 終端の Unicode 文字列へのオフセットをバイト単位で指定します (たとえば "Monotype:Times New Roman:1990")。
dpFontSimINT4+24+24

この IFIMETRICS 構造体の先頭から、フォントがサポートするシミュレーションを記述する FONTSIM 構造体までのオフセットをバイト単位で指定します。ドライバーは、フォントが bold、italic、または bold italic のシミュレーションをサポートする場合にのみ、このメンバーに 0 以外の値を設定してください。それ以外の場合は 0 を設定します。

フォントが設計上イタリックである場合、ドライバーは italic シミュレーションのサポートを示すべきではありませんが、bold italic シミュレーションのサポートを示すことはできます。同様に、フォントが設計上ボールドである場合、ドライバーは bold シミュレーションのサポートを示すべきではありませんが、bold italic シミュレーションのサポートを示すことはできます。フォントが設計上ボールドかつイタリックである場合は、いずれのシミュレーションもサポートすべきではありません。

FONTSIM 構造体内のオフセットは、FONTSIM 構造体の先頭からの相対値です。

lEmbedIdINT4+28+28フォントの Embedding ID を指定します。この値は TrueType 固有であり、それ以外のフォントプロバイダーは 0 を設定してください。
lItalicAngleINT4+32+32フォントのイタリック角度を指定します。この値は TrueType 固有であり、それ以外のフォントプロバイダーは 0 を設定してください。
lCharBiasINT4+36+36文字バイアスを指定します。この値は TrueType 固有であり、それ以外のフォントプロバイダーは 0 を設定してください。
dpCharSetsINT4+40+40

この IFIMETRICS 構造体の先頭から、このフォントがサポートするすべての Windows 文字セットの一覧を格納した配列までのオフセットを指定します。この配列のサイズは 16 バイトで、常に DEFAULT_CHARSET で終端されます。配列の最初の値は、そのフォントで最も適切かつ完全にカバーされている Windows 文字セットを示す必要があります。この値は jWinCharSet にも格納してください。たとえば、US ANSI とキリル文字セットもサポートする日本語フォントの場合、jWinCharSet には SHIFTJIS_CHARSET を設定し、dpCharSets が示す配列には SHIFTJIS_CHARSETANSI_CHARSETRUSSIAN_CHARSETDEFAULT_CHARSET を格納します。

このフォントが複数の Windows 文字セットをサポートしない場合、dpCharSets には 0 を設定してください。

jWinCharSetBYTE1+44+44

このフォントが最も適切にサポートする文字セットを示します。フォントが単一の Windows 文字セットのみをサポートする場合、ドライバーは対応する値を jWinCharSet に格納してください。ドライバーはこのフィールドに DEFAULT_CHARSET を格納すべきではありません。

指定できる値の一覧については、LOGFONT 構造体lfCharSet フィールドを参照してください。

jWinPitchAndFamilyBYTE1+45+45

フォントのピッチを指定します。下位 2 ビットがフォントのピッチを指定し、次のいずれかの値になります。

意味
FIXED_PITCH 固定ピッチフォントの場合
VARIABLE_PITCH 可変ピッチフォントの場合

このメンバーのビット 4 から 7 はフォントファミリを指定し、次のいずれかの値になります。

意味
FF_DECORATIVE Old English などの装飾的なフォント。
FF_DONTCARE 指定なし、または不明。
FF_MODERN セリフの有無にかかわらず、ストローク幅が一定 (固定ピッチ) のフォント。固定ピッチフォントは通常、Pica、Elite、Courier のようなモダン系です。
FF_ROMAN ストローク幅が可変 (プロポーショナル) で、セリフのあるフォント。Times Roman、Palatino、Century Schoolbook など。
FF_SCRIPT 手書き風に見えるように設計されたフォント。Script や Cursive など。
FF_SWISS ストローク幅が可変 (プロポーショナル) で、セリフのないフォント。Helvetica や Swiss など。
usWinWeightWORD2+46+46フォントの太さを 0 から 1000 の範囲で指定します (たとえば 400 が標準、700 がボールド)。この値は、Win32 の LOGFONT 構造体の lfWeight メンバーとしてアプリケーションに提供されます。
flInfoDWORD4+48+48

フォントに関する追加情報を指定します。このフィールドには次のフラグ値の組み合わせを指定できます。

FM_INFO_1BPP

グリフビットマップの色深度が 1 ピクセルあたり 1 ビットであることを示します。Windows NT の最初のバージョンである Windows NT 3.1 では、このフラグを設定しなければなりません。

FM_INFO_4BPP

グリフビットマップの色深度が 1 ピクセルあたり 4 ビットであることを示します。フォントが 16 階調のグレーによるアンチエイリアス処理されたグリフビットマップをサポートする場合、ドライバーはこのフラグを設定してください。

FM_INFO_8BPP

グリフビットマップの色深度が 1 ピクセルあたり 8 ビットであることを示します。現在のバージョンの GDI はカラーフォントをサポートしていないため、この設定を無視します。

FM_INFO_16BPP

グリフビットマップの色深度が 1 ピクセルあたり 16 ビットであることを示します。現在のバージョンの GDI はカラーフォントをサポートしていないため、この設定を無視します。

FM_INFO_24BPP

グリフビットマップの色深度が 1 ピクセルあたり 24 ビットであることを示します。現在のバージョンの GDI はカラーフォントをサポートしていないため、この設定を無視します。

FM_INFO_32BPP

グリフビットマップの色深度が 1 ピクセルあたり 32 ビットであることを示します。現在のバージョンの GDI はカラーフォントをサポートしていないため、この設定を無視します。

FM_INFO_90DEGREE_ROTATIONS

元の名目上の形状を 90 度回転した状態でフォントを実体化できることを示します。GDI は、フォントの作成時にドライバーへ渡す名目座標からデバイス座標への変換に回転を含めることで、フォントの回転を要求します。このメンバーは、FM_INFO_ARB_XFORMS フラグが設定されていない場合にのみ意味を持ちます。

FM_INFO_ANISOTROPIC_SCALING_ONLY

フォントが任意の異方性スケーリングのみをサポートすることを示します。つまり、変換は対角行列に正の実数を乗じたものと等価です。このフラグが設定されている場合、FM_INFO_ARB_XFORMS フラグと FM_INFO_ISOTROPIC_SCALING_ONLY フラグは設定できません。FM_INFO_90DEGREE_ROTATIONS フラグも設定されている場合、フォントは単純な異方性スケーリングの後に 90 度の倍数の回転を行う変換をサポートします。

FM_INFO_ARB_XFORMS

フォントが 2 次元線形変換の連続的な範囲で実体化できることを示します。

FM_INFO_CONSTANT_WIDTH

このフォントのすべてのグリフが、あらゆる実体化において同じ文字送り幅を持つことを示します。このフラグが設定されている場合、FM_INFO_OPTICALLY_FIXED_PITCH フラグも設定しなければなりません。

FM_INFO_DBCS_FIXED_PITCH

このフォントの 2 バイト文字が固定ピッチであることを示します。1 バイト文字については何も意味しません。このフラグは、シフト JIS などの 2 バイト文字セット (DBCS) をサポートするフォントでのみ意味を持ちます。DBCS をサポートしないフォントは、このフラグを設定すべきではありません。

FM_INFO_DO_NOT_ENUMERATE

このフォントが Win32 の EnumFontFamiliesExEnumFontFamiliesEnumFonts ルーチンによって列挙されないことを示します。さらに、Win32 アプリケーションが GetTextFace を呼び出したときに返される文字列は、文字列 dpwszUniqueName から取得されます。このフラグにより、フォントプロバイダーは 1 つのフォントに複数の IFIMETRICS 構造体を関連付けることができます。

FM_INFO_DSIG

フォントが Unicode 標準に準拠していることを示します。

FM_INFO_FAMILY_EQUIV

IFIMETRICS の dpwszFamilyName オフセットが、実際には同等のファミリ名またはエイリアスの一覧へのオフセットであることを示します。最初の名前が基本名 (実際の名前) であり、それ以降の名前は同等名またはエイリアスです。一覧内の各名前は null 終端され、一覧全体は 2 つの 0 で終端されます。

<base name> <0> <alias 1> <0>...<alias n>
<0> <0>

基本名はマッピングにのみ使用され、列挙されることはありません。

FM_INFO_IGNORE_TC_RA_ABLE

このフォントでは TC_RA_ABLE フラグが無視されることを示します。

FM_INFO_INTEGER_WIDTH

すべてのグリフが小数部を持たない送り幅を持つことを示します。ビットマップフォントは通常、このフラグを設定します。

FM_INFO_INTEGRAL_SCALING

フォントを x 方向と y 方向の両方で整数倍にスケーリングできることを示します。このフラグが設定されている場合、ドライバーは名目座標からデバイス座標への変換が x 方向と y 方向に整数倍でスケーリングされた場合でも、グリフを描画できなければなりません。GDI は、フォントの作成時にドライバーへ渡す名目座標からデバイス座標への変換に軸方向のスケーリングを含めることで、フォントの整数倍スケーリングを要求します。このフラグは、FM_INFO_ARB_XFORMS フラグが設定されていない場合にのみ意味を持ちます。

FM_INFO_ISOTROPIC_SCALING_ONLY

フォントが任意の等方性スケーリングのみをサポートすることを示します。つまり、変換は単位行列に正の実数を乗じたものと等価です。このフラグが設定されている場合、FM_INFO_ARB_XFORMS フラグと FM_INFO_ANISOTROPIC_SCALING_ONLY フラグのいずれも設定できません。FM_INFO_90DEGREE_ROTATIONS フラグが設定されている場合、フォントは等方性スケーリングの後に 90 度の倍数の回転を行う変換と等価な変換をサポートします。

FM_INFO_OPTICALLY_FIXED_PITCH

このフォントが組版上は固定ピッチとみなされることを示します。これはフォントの視覚的な性質であり、フォントのすべてのグリフが同じ文字送り幅を持つことを必ずしも意味しません。

FM_INFO_NONNEGATIVE_AC

このフォントのすべてのグリフが、非負の a スペーシングおよび c スペーシングを持つことを示します。つまり、グリフのブラックボックスが、文字原点と文字連結点で区切られた領域の外にはみ出すことはありません。

FM_INFO_NOT_CONTIGUOUS

サポートされる文字セットが連続していないことを示します。

FM_INFO_RETURNS_BITMAPS

フォントに有効なデジタル署名が含まれていることを示します。

FM_INFO_RETURNS_OUTLINES

ドライバーがサポートする任意のグリフについて、GDI がそのグリフのアウトラインを記述する PATHOBJ 構造体を要求できることを示します。可能であれば、GDI のパス塗りつぶし規則に従ってアウトラインを塗りつぶしたときに得られるビットマップは、ドライバーが返すビットマップと同一になるべきです。FM_INFO_RETURNS_OUTLINES フラグと FM_INFO_RETURNS_STOKES フラグを同時に設定することはできません。

FM_INFO_RETURNS_STROKES

ドライバーがサポートする任意のグリフについて、GDI がそのグリフのスプラインを記述する PATHOBJ 構造体を要求できることを示します。このパスは塗りつぶすことはできませんが、ストロークを描くことでグリフを表現できます。FM_INFO_RETURNS_OUTLINES フラグと FM_INFO_RETURNS_STOKES フラグを同時に設定することはできません。

FM_INFO_RIGHT_HANDED

フォントのアセント方向が、ベースライン方向から反時計回りに 90 度の方向であることを示します。アセント方向は高さを測る方向であり、常にベースライン方向に対して垂直です。

FM_INFO_TECH_BITMAP

フォントがビットマップフォントであることを示します。

FM_INFO_TECH_CFF

フォントが Compact Font Format (CFF) テーブルを含む Pscript OpenType フォントであることを示します。

FM_INFO_TECH_MM

これが Multiple Master (MM) フォントであることを示します。

FM_INFO_TECH_OUTLINE_NOT_TRUETYPE

フォントがアウトラインパスを使用するスケーラブルなフォント技術に基づいているものの、TrueType に基づくものではないことを示します。このフラグは、このフォントに対して返されるパスを塗りつぶすべきか、ストロークすべきかは指定しません。利用側は、この情報について FM_INFO_RETURNS_STROKES フラグと FM_INFO_RETURNS_OUTLINES フラグを調べてください。

FM_INFO_TECH_STROKE

フォントがストロークベースのフォント技術に基づいていることを示します。このフラグは、このフォントに対して返されるパスを塗りつぶすべきか、ストロークすべきかは指定しません。利用側は、この情報について FM_INFO_RETURNS_STROKES フラグと FM_INFO_RETURNS_OUTLINES フラグを調べてください。

FM_INFO_TECH_TRUETYPE

フォントが TrueType フォントであることを示します。

FM_INFO_TECH_TYPE1

このフォントが PostScript のスクリーンフォント (Type1 または OpenType PostScript) であることを示します。

fsSelectionWORD2+52+52

次のフラグの組み合わせを指定します。

意味
FM_SEL_BOLD フォントの文字がボールドの場合に設定されます。
FM_SEL_ITALIC フォントの文字がイタリックの場合に設定されます。
FM_SEL_NEGATIVE フォントの文字の前景色と背景色が反転している場合に設定されます。
FM_SEL_OUTLINED フォントの文字が中空 (アウトライン) の場合に設定されます。
FM_SEL_REGULAR フォントの文字が標準の太さの場合に設定されます。
FM_SEL_STRIKEOUT フォントの文字が既定で取り消し線付きの場合に設定されます。設定されていない場合、取り消し線はシミュレートする必要があります。
FM_SEL_UNDERSCORE フォントのすべての文字が既定で下線付きの場合に設定されます。設定されていない場合、下線はシミュレートする必要があります。
fsTypeWORD2+54+54

これは TrueType 固有のビットフィールドで、フォントの埋め込みやフォントのライセンス許諾など、フォントの特定の属性を示します。埋め込み可能なフォントはドキュメント内に格納できます。埋め込みフォントを含むドキュメントを、そのフォントがインストールされていないシステム (リモートシステム) で開いた場合、埋め込みに対応したアプリケーションによって、そのシステム上で一時的に (場合によっては恒久的に) 埋め込みフォントを読み込むことができます。埋め込みのライセンス許諾はフォントベンダーによって付与されます。設定できるフラグは次のとおりです。

意味
FM_EDITABLE_EMBED フォントを埋め込み、他のシステムに一時的に読み込むことができる場合に設定されます。Editable フォントを含むドキュメントは、読み取りと書き込みのために開くことができます。
FM_READONLY_EMBED 読み取り/書き込みでの埋め込みが許可されず、"プレビューと印刷" のカプセル化のみが許可される場合に設定されます。このビットが設定されている場合、フォントを埋め込み、リモートシステム上に一時的に読み込むことができます。"プレビューと印刷" 用フォントを含むドキュメントは "読み取り専用" で開かなければならず、ドキュメントに編集を加えることはできません。
FM_TYPE_LICENSED
FM_NO_EMBEDDING
フォントが Restricted License フォントである場合に設定されます。このビットのみが設定されている場合、このフォントは正当な所有者の許可を事前に得ることなく、いかなる方法でも改変、埋め込み、交換を行ってはなりません。Restricted License の埋め込みを有効にするには、それが選択されている唯一の埋め込みレベルでなければなりません。

FM_READONLY_EMBED ビットが設定されているフォントは、ドキュメント内に埋め込むことはできるものの、リモートシステム上には一時的にのみインストールしなければならないことを示します。FM_READONLY_EMBED フォントを含むドキュメントは、必ず "読み取り専用" で開かなければなりません。つまり、アプリケーションはユーザーにドキュメントの表示や印刷を許可できますが、編集を許可することはできません。

FM_EDITABLE_EMBED ビットが設定されているフォントは、ドキュメント内に埋め込むことはできるものの、リモートシステム上には一時的にのみインストールしなければならないことを示します。FM_READONLY_EMBED フォントとは異なり、Editable フォントを含むドキュメントは "読み取り/書き込み" で開くことができ、編集が許可され、変更を保存できます。

fsType のビットが 1 つも設定されていないフォントは、アプリケーションによってリモートシステムに埋め込み、恒久的にインストールできることを示します。リモートシステムのユーザーは、そのフォントについて元の購入者と同一の権利、義務、ライセンスを取得し、元の購入者と同じエンドユーザー使用許諾契約、著作権、意匠特許、商標の対象となります。

Font Embedding DLL を使用する場合であれ、その他の手段による場合であれ、フォント埋め込みのサポートを実装するアプリケーションは、埋め込みが許可されていないフォントを埋め込んではなりません。さらに、埋め込みフォントを一時的に使用するために読み込むアプリケーションは、その埋め込みフォントを含むドキュメントを閉じるときに、フォントを必ず削除しなければなりません。

複数の埋め込みビットが設定されている場合は、付与されたライセンスのうち最も制限の緩いものが優先されます。たとえば、ビット 1 とビット 3 が設定されている場合、ビット 3 がビット 1 より優先され、フォントは Editable の権利で埋め込むことができます。互換性のため、Editable の埋め込み権を付与するほとんどのベンダーは Preview & Print ビット (0x000C) も設定します。これにより、Preview & Print の埋め込みのみをサポートするアプリケーションが、フォントの埋め込みが許可されていることを検出できます。

fwdUnitsPerEmSHORT2+56+56フォントの em の高さを指定します。
fwdLowestPPEmSHORT2+58+58フォントが読み取り可能な最小サイズをピクセル単位で指定します。この値はビットマップフォントでは無視されます。
fwdWinAscenderSHORT2+60+60フォントの Windows アセンダー値を指定します。
fwdWinDescenderSHORT2+62+62フォントの Windows ディセンダー値を指定します。
fwdMacAscenderSHORT2+64+64フォントの Macintosh アセンダー値を指定します。
fwdMacDescenderSHORT2+66+66フォントの Macintosh ディセンダー値を指定します。この値は通常 0 未満です。これは、Macintosh 文字セットで最も低いディセンダーの、ベースラインからの符号付き変位を表します。
fwdMacLineGapSHORT2+68+68フォントの Macintosh 行間 (ラインギャップ) を指定します。推奨される Macintosh の行間隔は fwdMacLineGap + fwdMacAscenderfwdMacDescender に等しくなります。
fwdTypoAscenderSHORT2+70+70フォントの組版上のアセンダー値を指定します。
fwdTypoDescenderSHORT2+72+72フォントの組版上のディセンダー値を指定します。この値は、最も低いディセンダーのベースラインからの符号付き変位を指定します。
fwdTypoLineGapSHORT2+74+74フォントの組版上の行間 (ラインギャップ) を指定します。
fwdAveCharWidthSHORT2+76+76ラテン文字アルファベットの小文字 'a' から 'z' までの 26 文字と空白文字の幅の相加平均を指定します。26 文字の小文字のいずれかが存在しない場合、このメンバーにはフォント内のすべてのグリフの加重平均を設定してください。
fwdMaxCharIncSHORT2+78+78フォント内のすべてのグリフのうち、最大の文字送り幅を指定します。
fwdCapHeightSHORT2+80+80大文字 'H' の上端を表す光学的なラインの高さを、フォント単位 (FUnits) で指定します。これは大文字 'H' の実測の高さと同じであるとは限りません。この情報が存在しない場合、fwdCapHeight には 0 を設定します。0 は未定義であることを示します。
fwdXHeightSHORT2+82+82小文字 'x' の高さを表す光学的なラインの高さを、フォント単位で指定します。これは小文字 'x' の実測の高さと同じであるとは限りません。値が 0 の場合、このメンバーは未定義であることを示します。
fwdSubscriptXSizeSHORT2+84+84下付き文字フォントの推奨される文字幅 (ベースライン方向のサイズ) を指定します。
fwdSubscriptYSizeSHORT2+86+86下付き文字フォントの推奨される文字の高さ (アセンダー方向のサイズ) を指定します。
fwdSubscriptXOffsetSHORT2+88+88下付き文字の、ベースライン方向における推奨されるオフセットを指定します。このオフセットは、基準となる文字の文字原点を基準とします。
fwdSubscriptYOffsetSHORT2+90+90下付き文字の、ベースライン方向における推奨されるオフセットを指定します。このオフセットは、基準となる文字の文字原点から測ります。
fwdSuperscriptXSizeSHORT2+92+92上付き文字フォントの推奨される文字幅 (ベースライン方向のサイズ) を指定します。
fwdSuperscriptYSizeSHORT2+94+94上付き文字フォントの推奨される文字の高さ (アセンダー方向のサイズ) を指定します。
fwdSuperscriptXOffsetSHORT2+96+96上付き文字の、ベースライン方向における推奨されるオフセットを指定します。このオフセットは、基準となる文字の文字原点から測ります。
fwdSuperscriptYOffsetSHORT2+98+98上付き文字の、ベースライン方向における推奨されるオフセットを指定します。このオフセットは、基準となる文字の文字原点から測ります。
fwdUnderscoreSizeSHORT2+100+100下線バーの推奨される幅を、フォント単位で指定します。
fwdUnderscorePositionSHORT2+102+102ベースラインから下線バーの中央までの推奨される変位を、フォント単位で指定します。
fwdStrikeoutSizeSHORT2+104+104取り消し線バーの推奨される幅を、フォント座標で指定します。
fwdStrikeoutPositionSHORT2+106+106ベースラインから取り消し線バーの中央までの推奨される変位を指定します。
chFirstCharBYTE1+108+108jWinCharSet で指定されたコードページでサポートされる最小の文字を指定します。このフィールドは Windows 3.1 との互換性のために提供されています。
chLastCharBYTE1+109+109jWinCharSet で指定されたコードページでサポートされる最大の文字を指定します。このフィールドは Windows 3.1 との互換性のために提供されています。
chDefaultCharBYTE1+110+110jWinCharSet で指定されたコードページの既定の文字を指定します。このフィールドは Windows 3.1 との互換性のために提供されています。
chBreakCharBYTE1+111+111jWinCharSet で指定されたコードページのブレーク文字を指定します。このフィールドは Windows 3.1 との互換性のために提供されています。
wcFirstCharWCHAR2+112+112サポートされる文字のうち、最も小さい Unicode 文字コードを持つ文字を指定します。
wcLastCharWCHAR2+114+114サポートされる文字のうち、最も大きい Unicode 文字コードを持つ文字を指定します。
wcDefaultCharWCHAR2+116+116アプリケーションがフォントでサポートされていない文字を要求した場合に、代替として使用される文字を指定します。
wcBreakCharWCHAR2+118+118空白文字またはそれに相当する文字のコードポイントを指定します。
ptlBaselinePOINTL8+120+120このフォントが意図する書字方向を格納した POINTL 構造体を指定します。たとえば、一般的なラテン文字フォントでは (1,0) という値を指定します。
ptlAspectPOINTL8+128+128ビットマップフォントが設計された際のピクセル中心のアスペクト比を格納した POINTL 構造体を指定します。この値はビットマップフォントでのみ使用されます。
ptlCaretPOINTL8+136+136フォントのアセンダー方向を格納した POINTL 構造体を指定します。たとえば、イタリックでないラテン文字フォントの値は (0,1) であり、イタリックのラテン文字フォントでは (2,5) のような値を指定することがあります。
rclFontBoxRECTL16+144+144デザイン空間におけるフォント内のすべてのグリフの境界ボックスを記述する RECTL 構造体を指定します。
achVendIdBYTE4+160+160フォントベンダーを表す 4 文字の識別子を指定します。識別子は Microsoft TrueType 仕様に記載されています。
cKerningPairsDWORD4+164+164このフォントに関連付けられたカーニングペアの数を指定します。
ulPanoseCultureDWORD4+168+168PANOSE 番号の解釈方法を指定します。ラテン文字ベースのフォントでは、この番号を FM_PANOSE_CULTURE_LATIN に設定してください。PANOSE 構造体については、Microsoft Windows SDK のドキュメントを参照してください。
panosePANOSE10+172+172特定の書体の視覚的特徴を記述するために使用される 10 バイトの配列です。これらの特徴は、名前は異なるものの外観が類似する他のフォントとそのフォントを関連付けるために使用されます。PANOSE 構造体については、Windows SDK のドキュメントを参照してください。

公式ドキュメント

IFIMETRICS 構造体は、GDI が使用できる特定の書体に関する情報を定義します。

解説(Remarks)

書体に関する追加情報は、必要に応じて IFIEXTRA 構造体で指定できます。

ドライバーの DrvQueryFont ルーチンは、IFIMETRICS 構造体に値を設定して GDI に返します。

IFIMETRICS 構造体は、GDI が解釈できる書体のすべての情報を定義します。ほとんどのメンバーは FWORD 値であり、これはデザイン空間における符号付き 16 ビットの量です。フォントがラスターフォントの場合、デザイン空間とデバイス空間は同一であり、1 フォント単位はピクセル間の距離に相当します。

フォント空間 (名目空間) の座標系では、y 座標は上方向に増加し、x 座標は右方向に増加します。

IFIMETRICS 構造体の Align メンバーにより、この構造体は x32 マシンよりも x64 マシンで大きくなります。このことは、この構造体に従って書式化されたバイナリのフォント形式ファイルに影響します。Windows Server 2003 SP1 以降、固定サイズの構造体 PRINTIFI32 が Prntfont.h に追加されました。PRINTIFI32 構造体は、Align メンバーを含まない点を除いて IFIMETRICS 構造体と同一です。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// POINTL  (x64 8 / x86 8 バイト)
typedef struct POINTL {
    INT x;
    INT y;
} POINTL;

// RECTL  (x64 16 / x86 16 バイト)
typedef struct RECTL {
    INT left;
    INT top;
    INT right;
    INT bottom;
} RECTL;

// PANOSE  (x64 10 / x86 10 バイト)
typedef struct PANOSE {
    PAN_FAMILY_TYPE bFamilyType;
    PAN_SERIF_STYLE bSerifStyle;
    PAN_WEIGHT bWeight;
    PAN_PROPORTION bProportion;
    PAN_CONTRAST bContrast;
    PAN_STROKE_VARIATION bStrokeVariation;
    PAN_ARM_STYLE bArmStyle;
    PAN_LETT_FORM bLetterform;
    PAN_MIDLINE bMidline;
    PAN_XHEIGHT bXHeight;
} PANOSE;

// IFIMETRICS  (x64 184 / x86 184 バイト)
typedef struct IFIMETRICS {
    DWORD cjThis;
    DWORD cjIfiExtra;
    INT dpwszFamilyName;
    INT dpwszStyleName;
    INT dpwszFaceName;
    INT dpwszUniqueName;
    INT dpFontSim;
    INT lEmbedId;
    INT lItalicAngle;
    INT lCharBias;
    INT dpCharSets;
    BYTE jWinCharSet;
    BYTE jWinPitchAndFamily;
    WORD usWinWeight;
    DWORD flInfo;
    WORD fsSelection;
    WORD fsType;
    SHORT fwdUnitsPerEm;
    SHORT fwdLowestPPEm;
    SHORT fwdWinAscender;
    SHORT fwdWinDescender;
    SHORT fwdMacAscender;
    SHORT fwdMacDescender;
    SHORT fwdMacLineGap;
    SHORT fwdTypoAscender;
    SHORT fwdTypoDescender;
    SHORT fwdTypoLineGap;
    SHORT fwdAveCharWidth;
    SHORT fwdMaxCharInc;
    SHORT fwdCapHeight;
    SHORT fwdXHeight;
    SHORT fwdSubscriptXSize;
    SHORT fwdSubscriptYSize;
    SHORT fwdSubscriptXOffset;
    SHORT fwdSubscriptYOffset;
    SHORT fwdSuperscriptXSize;
    SHORT fwdSuperscriptYSize;
    SHORT fwdSuperscriptXOffset;
    SHORT fwdSuperscriptYOffset;
    SHORT fwdUnderscoreSize;
    SHORT fwdUnderscorePosition;
    SHORT fwdStrikeoutSize;
    SHORT fwdStrikeoutPosition;
    BYTE chFirstChar;
    BYTE chLastChar;
    BYTE chDefaultChar;
    BYTE chBreakChar;
    WCHAR wcFirstChar;
    WCHAR wcLastChar;
    WCHAR wcDefaultChar;
    WCHAR wcBreakChar;
    POINTL ptlBaseline;
    POINTL ptlAspect;
    POINTL ptlCaret;
    RECTL rclFontBox;
    BYTE achVendId[4];
    DWORD cKerningPairs;
    DWORD ulPanoseCulture;
    PANOSE panose;
} IFIMETRICS;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct POINTL
{
    public int x;
    public int y;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RECTL
{
    public int left;
    public int top;
    public int right;
    public int bottom;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct PANOSE
{
    public byte bFamilyType;
    public byte bSerifStyle;
    public byte bWeight;
    public byte bProportion;
    public byte bContrast;
    public byte bStrokeVariation;
    public byte bArmStyle;
    public byte bLetterform;
    public byte bMidline;
    public byte bXHeight;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IFIMETRICS
{
    public uint cjThis;
    public uint cjIfiExtra;
    public int dpwszFamilyName;
    public int dpwszStyleName;
    public int dpwszFaceName;
    public int dpwszUniqueName;
    public int dpFontSim;
    public int lEmbedId;
    public int lItalicAngle;
    public int lCharBias;
    public int dpCharSets;
    public byte jWinCharSet;
    public byte jWinPitchAndFamily;
    public ushort usWinWeight;
    public uint flInfo;
    public ushort fsSelection;
    public ushort fsType;
    public short fwdUnitsPerEm;
    public short fwdLowestPPEm;
    public short fwdWinAscender;
    public short fwdWinDescender;
    public short fwdMacAscender;
    public short fwdMacDescender;
    public short fwdMacLineGap;
    public short fwdTypoAscender;
    public short fwdTypoDescender;
    public short fwdTypoLineGap;
    public short fwdAveCharWidth;
    public short fwdMaxCharInc;
    public short fwdCapHeight;
    public short fwdXHeight;
    public short fwdSubscriptXSize;
    public short fwdSubscriptYSize;
    public short fwdSubscriptXOffset;
    public short fwdSubscriptYOffset;
    public short fwdSuperscriptXSize;
    public short fwdSuperscriptYSize;
    public short fwdSuperscriptXOffset;
    public short fwdSuperscriptYOffset;
    public short fwdUnderscoreSize;
    public short fwdUnderscorePosition;
    public short fwdStrikeoutSize;
    public short fwdStrikeoutPosition;
    public byte chFirstChar;
    public byte chLastChar;
    public byte chDefaultChar;
    public byte chBreakChar;
    public char wcFirstChar;
    public char wcLastChar;
    public char wcDefaultChar;
    public char wcBreakChar;
    public POINTL ptlBaseline;
    public POINTL ptlAspect;
    public POINTL ptlCaret;
    public RECTL rclFontBox;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] achVendId;
    public uint cKerningPairs;
    public uint ulPanoseCulture;
    public PANOSE panose;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure POINTL
    Public x As Integer
    Public y As Integer
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RECTL
    Public left As Integer
    Public top As Integer
    Public right As Integer
    Public bottom As Integer
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure PANOSE
    Public bFamilyType As Byte
    Public bSerifStyle As Byte
    Public bWeight As Byte
    Public bProportion As Byte
    Public bContrast As Byte
    Public bStrokeVariation As Byte
    Public bArmStyle As Byte
    Public bLetterform As Byte
    Public bMidline As Byte
    Public bXHeight As Byte
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IFIMETRICS
    Public cjThis As UInteger
    Public cjIfiExtra As UInteger
    Public dpwszFamilyName As Integer
    Public dpwszStyleName As Integer
    Public dpwszFaceName As Integer
    Public dpwszUniqueName As Integer
    Public dpFontSim As Integer
    Public lEmbedId As Integer
    Public lItalicAngle As Integer
    Public lCharBias As Integer
    Public dpCharSets As Integer
    Public jWinCharSet As Byte
    Public jWinPitchAndFamily As Byte
    Public usWinWeight As UShort
    Public flInfo As UInteger
    Public fsSelection As UShort
    Public fsType As UShort
    Public fwdUnitsPerEm As Short
    Public fwdLowestPPEm As Short
    Public fwdWinAscender As Short
    Public fwdWinDescender As Short
    Public fwdMacAscender As Short
    Public fwdMacDescender As Short
    Public fwdMacLineGap As Short
    Public fwdTypoAscender As Short
    Public fwdTypoDescender As Short
    Public fwdTypoLineGap As Short
    Public fwdAveCharWidth As Short
    Public fwdMaxCharInc As Short
    Public fwdCapHeight As Short
    Public fwdXHeight As Short
    Public fwdSubscriptXSize As Short
    Public fwdSubscriptYSize As Short
    Public fwdSubscriptXOffset As Short
    Public fwdSubscriptYOffset As Short
    Public fwdSuperscriptXSize As Short
    Public fwdSuperscriptYSize As Short
    Public fwdSuperscriptXOffset As Short
    Public fwdSuperscriptYOffset As Short
    Public fwdUnderscoreSize As Short
    Public fwdUnderscorePosition As Short
    Public fwdStrikeoutSize As Short
    Public fwdStrikeoutPosition As Short
    Public chFirstChar As Byte
    Public chLastChar As Byte
    Public chDefaultChar As Byte
    Public chBreakChar As Byte
    Public wcFirstChar As Char
    Public wcLastChar As Char
    Public wcDefaultChar As Char
    Public wcBreakChar As Char
    Public ptlBaseline As POINTL
    Public ptlAspect As POINTL
    Public ptlCaret As POINTL
    Public rclFontBox As RECTL
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Public achVendId() As Byte
    Public cKerningPairs As UInteger
    Public ulPanoseCulture As UInteger
    Public panose As PANOSE
End Structure
import ctypes
from ctypes import wintypes

class POINTL(ctypes.Structure):
    _fields_ = [
        ("x", ctypes.c_int),
        ("y", ctypes.c_int),
    ]

class RECTL(ctypes.Structure):
    _fields_ = [
        ("left", ctypes.c_int),
        ("top", ctypes.c_int),
        ("right", ctypes.c_int),
        ("bottom", ctypes.c_int),
    ]

class PANOSE(ctypes.Structure):
    _fields_ = [
        ("bFamilyType", ctypes.c_ubyte),
        ("bSerifStyle", ctypes.c_ubyte),
        ("bWeight", ctypes.c_ubyte),
        ("bProportion", ctypes.c_ubyte),
        ("bContrast", ctypes.c_ubyte),
        ("bStrokeVariation", ctypes.c_ubyte),
        ("bArmStyle", ctypes.c_ubyte),
        ("bLetterform", ctypes.c_ubyte),
        ("bMidline", ctypes.c_ubyte),
        ("bXHeight", ctypes.c_ubyte),
    ]

class IFIMETRICS(ctypes.Structure):
    _fields_ = [
        ("cjThis", wintypes.DWORD),
        ("cjIfiExtra", wintypes.DWORD),
        ("dpwszFamilyName", ctypes.c_int),
        ("dpwszStyleName", ctypes.c_int),
        ("dpwszFaceName", ctypes.c_int),
        ("dpwszUniqueName", ctypes.c_int),
        ("dpFontSim", ctypes.c_int),
        ("lEmbedId", ctypes.c_int),
        ("lItalicAngle", ctypes.c_int),
        ("lCharBias", ctypes.c_int),
        ("dpCharSets", ctypes.c_int),
        ("jWinCharSet", ctypes.c_ubyte),
        ("jWinPitchAndFamily", ctypes.c_ubyte),
        ("usWinWeight", ctypes.c_ushort),
        ("flInfo", wintypes.DWORD),
        ("fsSelection", ctypes.c_ushort),
        ("fsType", ctypes.c_ushort),
        ("fwdUnitsPerEm", ctypes.c_short),
        ("fwdLowestPPEm", ctypes.c_short),
        ("fwdWinAscender", ctypes.c_short),
        ("fwdWinDescender", ctypes.c_short),
        ("fwdMacAscender", ctypes.c_short),
        ("fwdMacDescender", ctypes.c_short),
        ("fwdMacLineGap", ctypes.c_short),
        ("fwdTypoAscender", ctypes.c_short),
        ("fwdTypoDescender", ctypes.c_short),
        ("fwdTypoLineGap", ctypes.c_short),
        ("fwdAveCharWidth", ctypes.c_short),
        ("fwdMaxCharInc", ctypes.c_short),
        ("fwdCapHeight", ctypes.c_short),
        ("fwdXHeight", ctypes.c_short),
        ("fwdSubscriptXSize", ctypes.c_short),
        ("fwdSubscriptYSize", ctypes.c_short),
        ("fwdSubscriptXOffset", ctypes.c_short),
        ("fwdSubscriptYOffset", ctypes.c_short),
        ("fwdSuperscriptXSize", ctypes.c_short),
        ("fwdSuperscriptYSize", ctypes.c_short),
        ("fwdSuperscriptXOffset", ctypes.c_short),
        ("fwdSuperscriptYOffset", ctypes.c_short),
        ("fwdUnderscoreSize", ctypes.c_short),
        ("fwdUnderscorePosition", ctypes.c_short),
        ("fwdStrikeoutSize", ctypes.c_short),
        ("fwdStrikeoutPosition", ctypes.c_short),
        ("chFirstChar", ctypes.c_ubyte),
        ("chLastChar", ctypes.c_ubyte),
        ("chDefaultChar", ctypes.c_ubyte),
        ("chBreakChar", ctypes.c_ubyte),
        ("wcFirstChar", ctypes.c_wchar),
        ("wcLastChar", ctypes.c_wchar),
        ("wcDefaultChar", ctypes.c_wchar),
        ("wcBreakChar", ctypes.c_wchar),
        ("ptlBaseline", POINTL),
        ("ptlAspect", POINTL),
        ("ptlCaret", POINTL),
        ("rclFontBox", RECTL),
        ("achVendId", ctypes.c_ubyte * 4),
        ("cKerningPairs", wintypes.DWORD),
        ("ulPanoseCulture", wintypes.DWORD),
        ("panose", PANOSE),
    ]
#[repr(C)]
pub struct POINTL {
    pub x: i32,
    pub y: i32,
}

#[repr(C)]
pub struct RECTL {
    pub left: i32,
    pub top: i32,
    pub right: i32,
    pub bottom: i32,
}

#[repr(C)]
pub struct PANOSE {
    pub bFamilyType: u8,
    pub bSerifStyle: u8,
    pub bWeight: u8,
    pub bProportion: u8,
    pub bContrast: u8,
    pub bStrokeVariation: u8,
    pub bArmStyle: u8,
    pub bLetterform: u8,
    pub bMidline: u8,
    pub bXHeight: u8,
}

#[repr(C)]
pub struct IFIMETRICS {
    pub cjThis: u32,
    pub cjIfiExtra: u32,
    pub dpwszFamilyName: i32,
    pub dpwszStyleName: i32,
    pub dpwszFaceName: i32,
    pub dpwszUniqueName: i32,
    pub dpFontSim: i32,
    pub lEmbedId: i32,
    pub lItalicAngle: i32,
    pub lCharBias: i32,
    pub dpCharSets: i32,
    pub jWinCharSet: u8,
    pub jWinPitchAndFamily: u8,
    pub usWinWeight: u16,
    pub flInfo: u32,
    pub fsSelection: u16,
    pub fsType: u16,
    pub fwdUnitsPerEm: i16,
    pub fwdLowestPPEm: i16,
    pub fwdWinAscender: i16,
    pub fwdWinDescender: i16,
    pub fwdMacAscender: i16,
    pub fwdMacDescender: i16,
    pub fwdMacLineGap: i16,
    pub fwdTypoAscender: i16,
    pub fwdTypoDescender: i16,
    pub fwdTypoLineGap: i16,
    pub fwdAveCharWidth: i16,
    pub fwdMaxCharInc: i16,
    pub fwdCapHeight: i16,
    pub fwdXHeight: i16,
    pub fwdSubscriptXSize: i16,
    pub fwdSubscriptYSize: i16,
    pub fwdSubscriptXOffset: i16,
    pub fwdSubscriptYOffset: i16,
    pub fwdSuperscriptXSize: i16,
    pub fwdSuperscriptYSize: i16,
    pub fwdSuperscriptXOffset: i16,
    pub fwdSuperscriptYOffset: i16,
    pub fwdUnderscoreSize: i16,
    pub fwdUnderscorePosition: i16,
    pub fwdStrikeoutSize: i16,
    pub fwdStrikeoutPosition: i16,
    pub chFirstChar: u8,
    pub chLastChar: u8,
    pub chDefaultChar: u8,
    pub chBreakChar: u8,
    pub wcFirstChar: u16,
    pub wcLastChar: u16,
    pub wcDefaultChar: u16,
    pub wcBreakChar: u16,
    pub ptlBaseline: POINTL,
    pub ptlAspect: POINTL,
    pub ptlCaret: POINTL,
    pub rclFontBox: RECTL,
    pub achVendId: [u8; 4],
    pub cKerningPairs: u32,
    pub ulPanoseCulture: u32,
    pub panose: PANOSE,
}
import "golang.org/x/sys/windows"

type POINTL struct {
	x int32
	y int32
}

type RECTL struct {
	left int32
	top int32
	right int32
	bottom int32
}

type PANOSE struct {
	bFamilyType byte
	bSerifStyle byte
	bWeight byte
	bProportion byte
	bContrast byte
	bStrokeVariation byte
	bArmStyle byte
	bLetterform byte
	bMidline byte
	bXHeight byte
}

type IFIMETRICS struct {
	cjThis uint32
	cjIfiExtra uint32
	dpwszFamilyName int32
	dpwszStyleName int32
	dpwszFaceName int32
	dpwszUniqueName int32
	dpFontSim int32
	lEmbedId int32
	lItalicAngle int32
	lCharBias int32
	dpCharSets int32
	jWinCharSet byte
	jWinPitchAndFamily byte
	usWinWeight uint16
	flInfo uint32
	fsSelection uint16
	fsType uint16
	fwdUnitsPerEm int16
	fwdLowestPPEm int16
	fwdWinAscender int16
	fwdWinDescender int16
	fwdMacAscender int16
	fwdMacDescender int16
	fwdMacLineGap int16
	fwdTypoAscender int16
	fwdTypoDescender int16
	fwdTypoLineGap int16
	fwdAveCharWidth int16
	fwdMaxCharInc int16
	fwdCapHeight int16
	fwdXHeight int16
	fwdSubscriptXSize int16
	fwdSubscriptYSize int16
	fwdSubscriptXOffset int16
	fwdSubscriptYOffset int16
	fwdSuperscriptXSize int16
	fwdSuperscriptYSize int16
	fwdSuperscriptXOffset int16
	fwdSuperscriptYOffset int16
	fwdUnderscoreSize int16
	fwdUnderscorePosition int16
	fwdStrikeoutSize int16
	fwdStrikeoutPosition int16
	chFirstChar byte
	chLastChar byte
	chDefaultChar byte
	chBreakChar byte
	wcFirstChar uint16
	wcLastChar uint16
	wcDefaultChar uint16
	wcBreakChar uint16
	ptlBaseline POINTL
	ptlAspect POINTL
	ptlCaret POINTL
	rclFontBox RECTL
	achVendId [4]byte
	cKerningPairs uint32
	ulPanoseCulture uint32
	panose PANOSE
}
type
  POINTL = record
    x: Integer;
    y: Integer;
  end;

  RECTL = record
    left: Integer;
    top: Integer;
    right: Integer;
    bottom: Integer;
  end;

  PANOSE = record
    bFamilyType: Byte;
    bSerifStyle: Byte;
    bWeight: Byte;
    bProportion: Byte;
    bContrast: Byte;
    bStrokeVariation: Byte;
    bArmStyle: Byte;
    bLetterform: Byte;
    bMidline: Byte;
    bXHeight: Byte;
  end;

  IFIMETRICS = record
    cjThis: DWORD;
    cjIfiExtra: DWORD;
    dpwszFamilyName: Integer;
    dpwszStyleName: Integer;
    dpwszFaceName: Integer;
    dpwszUniqueName: Integer;
    dpFontSim: Integer;
    lEmbedId: Integer;
    lItalicAngle: Integer;
    lCharBias: Integer;
    dpCharSets: Integer;
    jWinCharSet: Byte;
    jWinPitchAndFamily: Byte;
    usWinWeight: Word;
    flInfo: DWORD;
    fsSelection: Word;
    fsType: Word;
    fwdUnitsPerEm: Smallint;
    fwdLowestPPEm: Smallint;
    fwdWinAscender: Smallint;
    fwdWinDescender: Smallint;
    fwdMacAscender: Smallint;
    fwdMacDescender: Smallint;
    fwdMacLineGap: Smallint;
    fwdTypoAscender: Smallint;
    fwdTypoDescender: Smallint;
    fwdTypoLineGap: Smallint;
    fwdAveCharWidth: Smallint;
    fwdMaxCharInc: Smallint;
    fwdCapHeight: Smallint;
    fwdXHeight: Smallint;
    fwdSubscriptXSize: Smallint;
    fwdSubscriptYSize: Smallint;
    fwdSubscriptXOffset: Smallint;
    fwdSubscriptYOffset: Smallint;
    fwdSuperscriptXSize: Smallint;
    fwdSuperscriptYSize: Smallint;
    fwdSuperscriptXOffset: Smallint;
    fwdSuperscriptYOffset: Smallint;
    fwdUnderscoreSize: Smallint;
    fwdUnderscorePosition: Smallint;
    fwdStrikeoutSize: Smallint;
    fwdStrikeoutPosition: Smallint;
    chFirstChar: Byte;
    chLastChar: Byte;
    chDefaultChar: Byte;
    chBreakChar: Byte;
    wcFirstChar: WideChar;
    wcLastChar: WideChar;
    wcDefaultChar: WideChar;
    wcBreakChar: WideChar;
    ptlBaseline: POINTL;
    ptlAspect: POINTL;
    ptlCaret: POINTL;
    rclFontBox: RECTL;
    achVendId: array[0..3] of Byte;
    cKerningPairs: DWORD;
    ulPanoseCulture: DWORD;
    panose: PANOSE;
  end;
const POINTL = extern struct {
    x: i32,
    y: i32,
};

const RECTL = extern struct {
    left: i32,
    top: i32,
    right: i32,
    bottom: i32,
};

const PANOSE = extern struct {
    bFamilyType: u8,
    bSerifStyle: u8,
    bWeight: u8,
    bProportion: u8,
    bContrast: u8,
    bStrokeVariation: u8,
    bArmStyle: u8,
    bLetterform: u8,
    bMidline: u8,
    bXHeight: u8,
};

const IFIMETRICS = extern struct {
    cjThis: u32,
    cjIfiExtra: u32,
    dpwszFamilyName: i32,
    dpwszStyleName: i32,
    dpwszFaceName: i32,
    dpwszUniqueName: i32,
    dpFontSim: i32,
    lEmbedId: i32,
    lItalicAngle: i32,
    lCharBias: i32,
    dpCharSets: i32,
    jWinCharSet: u8,
    jWinPitchAndFamily: u8,
    usWinWeight: u16,
    flInfo: u32,
    fsSelection: u16,
    fsType: u16,
    fwdUnitsPerEm: i16,
    fwdLowestPPEm: i16,
    fwdWinAscender: i16,
    fwdWinDescender: i16,
    fwdMacAscender: i16,
    fwdMacDescender: i16,
    fwdMacLineGap: i16,
    fwdTypoAscender: i16,
    fwdTypoDescender: i16,
    fwdTypoLineGap: i16,
    fwdAveCharWidth: i16,
    fwdMaxCharInc: i16,
    fwdCapHeight: i16,
    fwdXHeight: i16,
    fwdSubscriptXSize: i16,
    fwdSubscriptYSize: i16,
    fwdSubscriptXOffset: i16,
    fwdSubscriptYOffset: i16,
    fwdSuperscriptXSize: i16,
    fwdSuperscriptYSize: i16,
    fwdSuperscriptXOffset: i16,
    fwdSuperscriptYOffset: i16,
    fwdUnderscoreSize: i16,
    fwdUnderscorePosition: i16,
    fwdStrikeoutSize: i16,
    fwdStrikeoutPosition: i16,
    chFirstChar: u8,
    chLastChar: u8,
    chDefaultChar: u8,
    chBreakChar: u8,
    wcFirstChar: u16,
    wcLastChar: u16,
    wcDefaultChar: u16,
    wcBreakChar: u16,
    ptlBaseline: POINTL,
    ptlAspect: POINTL,
    ptlCaret: POINTL,
    rclFontBox: RECTL,
    achVendId: [4]u8,
    cKerningPairs: u32,
    ulPanoseCulture: u32,
    panose: PANOSE,
};
type
  POINTL {.bycopy.} = object
    x: int32
    y: int32

  RECTL {.bycopy.} = object
    left: int32
    top: int32
    right: int32
    bottom: int32

  PANOSE {.bycopy.} = object
    bFamilyType: uint8
    bSerifStyle: uint8
    bWeight: uint8
    bProportion: uint8
    bContrast: uint8
    bStrokeVariation: uint8
    bArmStyle: uint8
    bLetterform: uint8
    bMidline: uint8
    bXHeight: uint8

  IFIMETRICS {.bycopy.} = object
    cjThis: uint32
    cjIfiExtra: uint32
    dpwszFamilyName: int32
    dpwszStyleName: int32
    dpwszFaceName: int32
    dpwszUniqueName: int32
    dpFontSim: int32
    lEmbedId: int32
    lItalicAngle: int32
    lCharBias: int32
    dpCharSets: int32
    jWinCharSet: uint8
    jWinPitchAndFamily: uint8
    usWinWeight: uint16
    flInfo: uint32
    fsSelection: uint16
    fsType: uint16
    fwdUnitsPerEm: int16
    fwdLowestPPEm: int16
    fwdWinAscender: int16
    fwdWinDescender: int16
    fwdMacAscender: int16
    fwdMacDescender: int16
    fwdMacLineGap: int16
    fwdTypoAscender: int16
    fwdTypoDescender: int16
    fwdTypoLineGap: int16
    fwdAveCharWidth: int16
    fwdMaxCharInc: int16
    fwdCapHeight: int16
    fwdXHeight: int16
    fwdSubscriptXSize: int16
    fwdSubscriptYSize: int16
    fwdSubscriptXOffset: int16
    fwdSubscriptYOffset: int16
    fwdSuperscriptXSize: int16
    fwdSuperscriptYSize: int16
    fwdSuperscriptXOffset: int16
    fwdSuperscriptYOffset: int16
    fwdUnderscoreSize: int16
    fwdUnderscorePosition: int16
    fwdStrikeoutSize: int16
    fwdStrikeoutPosition: int16
    chFirstChar: uint8
    chLastChar: uint8
    chDefaultChar: uint8
    chBreakChar: uint8
    wcFirstChar: uint16
    wcLastChar: uint16
    wcDefaultChar: uint16
    wcBreakChar: uint16
    ptlBaseline: POINTL
    ptlAspect: POINTL
    ptlCaret: POINTL
    rclFontBox: RECTL
    achVendId: array[4, uint8]
    cKerningPairs: uint32
    ulPanoseCulture: uint32
    panose: PANOSE
struct POINTL
{
    int x;
    int y;
}

struct RECTL
{
    int left;
    int top;
    int right;
    int bottom;
}

struct PANOSE
{
    ubyte bFamilyType;
    ubyte bSerifStyle;
    ubyte bWeight;
    ubyte bProportion;
    ubyte bContrast;
    ubyte bStrokeVariation;
    ubyte bArmStyle;
    ubyte bLetterform;
    ubyte bMidline;
    ubyte bXHeight;
}

struct IFIMETRICS
{
    uint cjThis;
    uint cjIfiExtra;
    int dpwszFamilyName;
    int dpwszStyleName;
    int dpwszFaceName;
    int dpwszUniqueName;
    int dpFontSim;
    int lEmbedId;
    int lItalicAngle;
    int lCharBias;
    int dpCharSets;
    ubyte jWinCharSet;
    ubyte jWinPitchAndFamily;
    ushort usWinWeight;
    uint flInfo;
    ushort fsSelection;
    ushort fsType;
    short fwdUnitsPerEm;
    short fwdLowestPPEm;
    short fwdWinAscender;
    short fwdWinDescender;
    short fwdMacAscender;
    short fwdMacDescender;
    short fwdMacLineGap;
    short fwdTypoAscender;
    short fwdTypoDescender;
    short fwdTypoLineGap;
    short fwdAveCharWidth;
    short fwdMaxCharInc;
    short fwdCapHeight;
    short fwdXHeight;
    short fwdSubscriptXSize;
    short fwdSubscriptYSize;
    short fwdSubscriptXOffset;
    short fwdSubscriptYOffset;
    short fwdSuperscriptXSize;
    short fwdSuperscriptYSize;
    short fwdSuperscriptXOffset;
    short fwdSuperscriptYOffset;
    short fwdUnderscoreSize;
    short fwdUnderscorePosition;
    short fwdStrikeoutSize;
    short fwdStrikeoutPosition;
    ubyte chFirstChar;
    ubyte chLastChar;
    ubyte chDefaultChar;
    ubyte chBreakChar;
    wchar wcFirstChar;
    wchar wcLastChar;
    wchar wcDefaultChar;
    wchar wcBreakChar;
    POINTL ptlBaseline;
    POINTL ptlAspect;
    POINTL ptlCaret;
    RECTL rclFontBox;
    ubyte[4] achVendId;
    uint cKerningPairs;
    uint ulPanoseCulture;
    PANOSE panose;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IFIMETRICS サイズ: 184 バイト(x64)
dim st, 46    ; 4byte整数×46(構造体サイズ 184 / 4 切り上げ)
; cjThis : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; cjIfiExtra : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dpwszFamilyName : INT (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; dpwszStyleName : INT (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; dpwszFaceName : INT (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; dpwszUniqueName : INT (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; dpFontSim : INT (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; lEmbedId : INT (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; lItalicAngle : INT (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; lCharBias : INT (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; dpCharSets : INT (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; jWinCharSet : BYTE (+44, 1byte)  poke st,44,値  /  値 = peek(st,44)
; jWinPitchAndFamily : BYTE (+45, 1byte)  poke st,45,値  /  値 = peek(st,45)
; usWinWeight : WORD (+46, 2byte)  wpoke st,46,値  /  値 = wpeek(st,46)
; flInfo : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; fsSelection : WORD (+52, 2byte)  wpoke st,52,値  /  値 = wpeek(st,52)
; fsType : WORD (+54, 2byte)  wpoke st,54,値  /  値 = wpeek(st,54)
; fwdUnitsPerEm : SHORT (+56, 2byte)  wpoke st,56,値  /  値 = wpeek(st,56)
; fwdLowestPPEm : SHORT (+58, 2byte)  wpoke st,58,値  /  値 = wpeek(st,58)
; fwdWinAscender : SHORT (+60, 2byte)  wpoke st,60,値  /  値 = wpeek(st,60)
; fwdWinDescender : SHORT (+62, 2byte)  wpoke st,62,値  /  値 = wpeek(st,62)
; fwdMacAscender : SHORT (+64, 2byte)  wpoke st,64,値  /  値 = wpeek(st,64)
; fwdMacDescender : SHORT (+66, 2byte)  wpoke st,66,値  /  値 = wpeek(st,66)
; fwdMacLineGap : SHORT (+68, 2byte)  wpoke st,68,値  /  値 = wpeek(st,68)
; fwdTypoAscender : SHORT (+70, 2byte)  wpoke st,70,値  /  値 = wpeek(st,70)
; fwdTypoDescender : SHORT (+72, 2byte)  wpoke st,72,値  /  値 = wpeek(st,72)
; fwdTypoLineGap : SHORT (+74, 2byte)  wpoke st,74,値  /  値 = wpeek(st,74)
; fwdAveCharWidth : SHORT (+76, 2byte)  wpoke st,76,値  /  値 = wpeek(st,76)
; fwdMaxCharInc : SHORT (+78, 2byte)  wpoke st,78,値  /  値 = wpeek(st,78)
; fwdCapHeight : SHORT (+80, 2byte)  wpoke st,80,値  /  値 = wpeek(st,80)
; fwdXHeight : SHORT (+82, 2byte)  wpoke st,82,値  /  値 = wpeek(st,82)
; fwdSubscriptXSize : SHORT (+84, 2byte)  wpoke st,84,値  /  値 = wpeek(st,84)
; fwdSubscriptYSize : SHORT (+86, 2byte)  wpoke st,86,値  /  値 = wpeek(st,86)
; fwdSubscriptXOffset : SHORT (+88, 2byte)  wpoke st,88,値  /  値 = wpeek(st,88)
; fwdSubscriptYOffset : SHORT (+90, 2byte)  wpoke st,90,値  /  値 = wpeek(st,90)
; fwdSuperscriptXSize : SHORT (+92, 2byte)  wpoke st,92,値  /  値 = wpeek(st,92)
; fwdSuperscriptYSize : SHORT (+94, 2byte)  wpoke st,94,値  /  値 = wpeek(st,94)
; fwdSuperscriptXOffset : SHORT (+96, 2byte)  wpoke st,96,値  /  値 = wpeek(st,96)
; fwdSuperscriptYOffset : SHORT (+98, 2byte)  wpoke st,98,値  /  値 = wpeek(st,98)
; fwdUnderscoreSize : SHORT (+100, 2byte)  wpoke st,100,値  /  値 = wpeek(st,100)
; fwdUnderscorePosition : SHORT (+102, 2byte)  wpoke st,102,値  /  値 = wpeek(st,102)
; fwdStrikeoutSize : SHORT (+104, 2byte)  wpoke st,104,値  /  値 = wpeek(st,104)
; fwdStrikeoutPosition : SHORT (+106, 2byte)  wpoke st,106,値  /  値 = wpeek(st,106)
; chFirstChar : BYTE (+108, 1byte)  poke st,108,値  /  値 = peek(st,108)
; chLastChar : BYTE (+109, 1byte)  poke st,109,値  /  値 = peek(st,109)
; chDefaultChar : BYTE (+110, 1byte)  poke st,110,値  /  値 = peek(st,110)
; chBreakChar : BYTE (+111, 1byte)  poke st,111,値  /  値 = peek(st,111)
; wcFirstChar : WCHAR (+112, 2byte)  wpoke st,112,値  /  値 = wpeek(st,112)
; wcLastChar : WCHAR (+114, 2byte)  wpoke st,114,値  /  値 = wpeek(st,114)
; wcDefaultChar : WCHAR (+116, 2byte)  wpoke st,116,値  /  値 = wpeek(st,116)
; wcBreakChar : WCHAR (+118, 2byte)  wpoke st,118,値  /  値 = wpeek(st,118)
; ptlBaseline : POINTL (+120, 8byte)  varptr(st)+120 を基点に操作(8byte:入れ子/配列)
; ptlAspect : POINTL (+128, 8byte)  varptr(st)+128 を基点に操作(8byte:入れ子/配列)
; ptlCaret : POINTL (+136, 8byte)  varptr(st)+136 を基点に操作(8byte:入れ子/配列)
; rclFontBox : RECTL (+144, 16byte)  varptr(st)+144 を基点に操作(16byte:入れ子/配列)
; achVendId : BYTE (+160, 4byte)  varptr(st)+160 を基点に操作(4byte:入れ子/配列)
; cKerningPairs : DWORD (+164, 4byte)  st.41 = 値  /  値 = st.41   (lpoke/lpeek も可)
; ulPanoseCulture : DWORD (+168, 4byte)  st.42 = 値  /  値 = st.42   (lpoke/lpeek も可)
; panose : PANOSE (+172, 10byte)  varptr(st)+172 を基点に操作(10byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global POINTL
    #field int x
    #field int y
#endstruct

#defstruct global RECTL
    #field int left
    #field int top
    #field int right
    #field int bottom
#endstruct

#defstruct global PANOSE
    #field byte bFamilyType
    #field byte bSerifStyle
    #field byte bWeight
    #field byte bProportion
    #field byte bContrast
    #field byte bStrokeVariation
    #field byte bArmStyle
    #field byte bLetterform
    #field byte bMidline
    #field byte bXHeight
#endstruct

#defstruct global IFIMETRICS
    #field int cjThis
    #field int cjIfiExtra
    #field int dpwszFamilyName
    #field int dpwszStyleName
    #field int dpwszFaceName
    #field int dpwszUniqueName
    #field int dpFontSim
    #field int lEmbedId
    #field int lItalicAngle
    #field int lCharBias
    #field int dpCharSets
    #field byte jWinCharSet
    #field byte jWinPitchAndFamily
    #field short usWinWeight
    #field int flInfo
    #field short fsSelection
    #field short fsType
    #field short fwdUnitsPerEm
    #field short fwdLowestPPEm
    #field short fwdWinAscender
    #field short fwdWinDescender
    #field short fwdMacAscender
    #field short fwdMacDescender
    #field short fwdMacLineGap
    #field short fwdTypoAscender
    #field short fwdTypoDescender
    #field short fwdTypoLineGap
    #field short fwdAveCharWidth
    #field short fwdMaxCharInc
    #field short fwdCapHeight
    #field short fwdXHeight
    #field short fwdSubscriptXSize
    #field short fwdSubscriptYSize
    #field short fwdSubscriptXOffset
    #field short fwdSubscriptYOffset
    #field short fwdSuperscriptXSize
    #field short fwdSuperscriptYSize
    #field short fwdSuperscriptXOffset
    #field short fwdSuperscriptYOffset
    #field short fwdUnderscoreSize
    #field short fwdUnderscorePosition
    #field short fwdStrikeoutSize
    #field short fwdStrikeoutPosition
    #field byte chFirstChar
    #field byte chLastChar
    #field byte chDefaultChar
    #field byte chBreakChar
    #field short wcFirstChar
    #field short wcLastChar
    #field short wcDefaultChar
    #field short wcBreakChar
    #field POINTL ptlBaseline
    #field POINTL ptlAspect
    #field POINTL ptlCaret
    #field RECTL rclFontBox
    #field byte achVendId 4
    #field int cKerningPairs
    #field int ulPanoseCulture
    #field PANOSE panose
#endstruct

stdim st, IFIMETRICS        ; NSTRUCT 変数を確保
st->cjThis = 100
mes "cjThis=" + st->cjThis