FD_DEVICEMETRICS
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| flRealizedType | DWORD | 4 | +0 | +0 | アクセラレータフラグのセットです。この値には、次の値の組み合わせを指定できます。 FDM_TYPE_BM_SIDE_CONST横書きおよび縦書き用のアクセラレータです。このフラグが設定されている場合、フォントはすべてのビットマップについて一定の高さを持ちます。横書きの場合は cy の寸法が一定であることを意味し、縦書きの場合は cx の寸法が一定であることを意味します。このアクセラレータはアウトラインには使用されません。 FDM_TYPE_CHAR_INC_EQUAL_BM_BASE横書きおよび縦書き用のアクセラレータです。横書きの場合、このフラグが設定されていると、各グリフの送り幅はグリフビットマップの cx の寸法と等しくなります。縦書きの場合、このフラグが設定されていると、各グリフの送り幅はグリフビットマップの cy の寸法と等しくなります。このアクセラレータはアウトラインには使用されません。 FDM_TYPE_CONST_BEARINGS設定されている場合、すべてのグリフで a スペースおよび c スペースが一定です。 FDM_TYPE_MAXEXT_EQUAL_BM_SIDEこのフラグは、FDM_TYPE_BM_SIDE_CONST も設定されている場合にのみ設定できます。設定されている場合、フォントの高さ (横書きおよび縦書きについて前述のとおり) は、最大アセンダーと最大ディセンダーの合計に等しくなります。このアクセラレータはアウトラインには使用されません。 FDM_TYPE_ZERO_BEARINGS設定されている場合、すべてのグリフで a スペースおよび c スペースが 0 です。 |
| pteBase | POINTE | 8 | +4 | +4 | フォントのベースラインに沿った表記空間 (notional space) の単位ベクトルを、デバイス空間に変換して正規化した値を格納する POINTE 構造体を指定します。詳細については、GDI Data Types の POINTE を参照してください。 |
| pteSide | POINTE | 8 | +12 | +12 | フォントのベースラインに垂直で、アセンダー方向を向く表記空間の単位ベクトルを、デバイス空間に変換して正規化した値を格納する POINTE 構造体を指定します。表記空間では、ベースライン方向とアセンダー方向は直交していなければなりませんが、デバイス空間では、表記空間からデバイス空間への変換によっては pteBase と pteSide が直交している必要はありません。 |
| lD | INT | 4 | +20 | +20 | フォントが固定ピッチ (等幅) フォントである場合の送り幅を指定します。フォントが可変ピッチフォントである場合、このメンバーは 0 に設定する必要があります。 |
| fxMaxAscender | INT | 4 | +24 | +24 | このフォントインスタンスについて、pteSide に沿って測定されたヒント処理済みの最大アセンダー高さを指定します。GDI Data Types の FIX データ型を参照してください。 |
| fxMaxDescender | INT | 4 | +28 | +28 | このフォントインスタンスについて、pteSide に沿って測定されたヒント処理済みの最大ディセンダー高さを指定します。GDI Data Types の FIX データ型を参照してください。 |
| ptlUnderline1 | POINTL | 8 | +32 | +32 | このフォントインスタンスについて、グリフの文字原点を基準としたヒント処理済みの下線位置を格納する POINTL 構造体を指定します。 |
| ptlStrikeOut | POINTL | 8 | +40 | +40 | このフォントインスタンスについて、グリフの文字原点を基準としたヒント処理済みの取り消し線位置を格納する POINTL 構造体を指定します。 |
| ptlULThickness | POINTL | 8 | +48 | +48 | このフォントインスタンスについて、ヒント処理済みの下線の太さを格納する POINTL 構造体を指定します。このベクトルは、下線の描画に使用される矩形の辺を定義します。底辺はベースラインによって暗黙的に定義されます。 |
| ptlSOThickness | POINTL | 8 | +56 | +56 | このフォントインスタンスについて、ヒント処理済みの取り消し線の太さを格納する POINTL 構造体を指定します。このベクトルは、取り消し線の描画に使用される矩形の辺を定義します。底辺はベースラインによって暗黙的に定義されます。 |
| cxMax | DWORD | 4 | +64 | +64 | このフォントインスタンスについて、ヒント処理済みのグリフビットマップの最大幅をピクセル単位で指定します。アウトラインには使用されません。 |
| cyMax | DWORD | 4 | +68 | +68 | このフォントインスタンスについて、ヒント処理済みのグリフビットマップの最大高さをピクセル単位で指定します。アウトラインには使用されません。 |
| cjGlyphMax | DWORD | 4 | +72 | +72 | このフォントインスタンスについて、ヒント処理済みのグリフの最大サイズをバイト単位で指定します。この値は、そのフォントのいずれかのグリフを格納するために必要な GLYPHBITS 構造体の最大サイズです。 |
| fdxQuantized | FD_XFORM | 16 | +76 | +76 | FD_XFORM 構造体を指定します。フォントドライバーは、フォントの実現時に実際に使用されるフォント変換をここに設定します。これは、FONTOBJ_pxoGetXform によって定義される、GDI が要求した変換とは異なる場合があります。 |
| lNonLinearExtLeading | INT | 4 | +92 | +92 | 28.4 デバイス単位での非線形の外部レディングです。 |
| lNonLinearIntLeading | INT | 4 | +96 | +96 | 28.4 デバイス単位での非線形の内部レディングです。 |
| lNonLinearMaxCharWidth | INT | 4 | +100 | +100 | 28.4 デバイス単位での非線形の最大文字送り量です。 |
| lNonLinearAvgCharWidth | INT | 4 | +104 | +104 | 28.4 デバイス単位での非線形の平均文字幅です。 |
| lMinA | INT | 4 | +108 | +108 | このフォントの実現における最大の負の A スペースであり、絶対値で指定されます。 |
| lMinC | INT | 4 | +112 | +112 | このフォントの実現における最大の負の C スペースであり、絶対値で指定されます。 |
| lMinD | INT | 4 | +116 | +116 | このフォントの実現における 0 以外で最小の文字幅です。 |
| alReserved | INT | 4 | +120 | +120 | 予約済みであり、フォントプロバイダーは無視する必要があります。 |
公式ドキュメント
FD_DEVICEMETRICS 構造体は、ドライバーが提供する DrvQueryFontData 関数の iMode パラメーターが QFD_MAXEXTENTS である場合に、デバイス固有のフォント情報を GDI に提供するために使用されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// POINTE (x64 8 / x86 8 バイト)
typedef struct POINTE {
FLOAT x;
FLOAT y;
} POINTE;
// POINTL (x64 8 / x86 8 バイト)
typedef struct POINTL {
INT x;
INT y;
} POINTL;
// FD_XFORM (x64 16 / x86 16 バイト)
typedef struct FD_XFORM {
FLOAT eXX;
FLOAT eXY;
FLOAT eYX;
FLOAT eYY;
} FD_XFORM;
// FD_DEVICEMETRICS (x64 124 / x86 124 バイト)
typedef struct FD_DEVICEMETRICS {
DWORD flRealizedType;
POINTE pteBase;
POINTE pteSide;
INT lD;
INT fxMaxAscender;
INT fxMaxDescender;
POINTL ptlUnderline1;
POINTL ptlStrikeOut;
POINTL ptlULThickness;
POINTL ptlSOThickness;
DWORD cxMax;
DWORD cyMax;
DWORD cjGlyphMax;
FD_XFORM fdxQuantized;
INT lNonLinearExtLeading;
INT lNonLinearIntLeading;
INT lNonLinearMaxCharWidth;
INT lNonLinearAvgCharWidth;
INT lMinA;
INT lMinC;
INT lMinD;
INT alReserved[1];
} FD_DEVICEMETRICS;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct POINTE
{
public float x;
public float y;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct POINTL
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FD_XFORM
{
public float eXX;
public float eXY;
public float eYX;
public float eYY;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FD_DEVICEMETRICS
{
public uint flRealizedType;
public POINTE pteBase;
public POINTE pteSide;
public int lD;
public int fxMaxAscender;
public int fxMaxDescender;
public POINTL ptlUnderline1;
public POINTL ptlStrikeOut;
public POINTL ptlULThickness;
public POINTL ptlSOThickness;
public uint cxMax;
public uint cyMax;
public uint cjGlyphMax;
public FD_XFORM fdxQuantized;
public int lNonLinearExtLeading;
public int lNonLinearIntLeading;
public int lNonLinearMaxCharWidth;
public int lNonLinearAvgCharWidth;
public int lMinA;
public int lMinC;
public int lMinD;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public int[] alReserved;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure POINTE
Public x As Single
Public y As Single
End Structure
<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 FD_XFORM
Public eXX As Single
Public eXY As Single
Public eYX As Single
Public eYY As Single
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure FD_DEVICEMETRICS
Public flRealizedType As UInteger
Public pteBase As POINTE
Public pteSide As POINTE
Public lD As Integer
Public fxMaxAscender As Integer
Public fxMaxDescender As Integer
Public ptlUnderline1 As POINTL
Public ptlStrikeOut As POINTL
Public ptlULThickness As POINTL
Public ptlSOThickness As POINTL
Public cxMax As UInteger
Public cyMax As UInteger
Public cjGlyphMax As UInteger
Public fdxQuantized As FD_XFORM
Public lNonLinearExtLeading As Integer
Public lNonLinearIntLeading As Integer
Public lNonLinearMaxCharWidth As Integer
Public lNonLinearAvgCharWidth As Integer
Public lMinA As Integer
Public lMinC As Integer
Public lMinD As Integer
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=1)> Public alReserved() As Integer
End Structureimport ctypes
from ctypes import wintypes
class POINTE(ctypes.Structure):
_fields_ = [
("x", ctypes.c_float),
("y", ctypes.c_float),
]
class POINTL(ctypes.Structure):
_fields_ = [
("x", ctypes.c_int),
("y", ctypes.c_int),
]
class FD_XFORM(ctypes.Structure):
_fields_ = [
("eXX", ctypes.c_float),
("eXY", ctypes.c_float),
("eYX", ctypes.c_float),
("eYY", ctypes.c_float),
]
class FD_DEVICEMETRICS(ctypes.Structure):
_fields_ = [
("flRealizedType", wintypes.DWORD),
("pteBase", POINTE),
("pteSide", POINTE),
("lD", ctypes.c_int),
("fxMaxAscender", ctypes.c_int),
("fxMaxDescender", ctypes.c_int),
("ptlUnderline1", POINTL),
("ptlStrikeOut", POINTL),
("ptlULThickness", POINTL),
("ptlSOThickness", POINTL),
("cxMax", wintypes.DWORD),
("cyMax", wintypes.DWORD),
("cjGlyphMax", wintypes.DWORD),
("fdxQuantized", FD_XFORM),
("lNonLinearExtLeading", ctypes.c_int),
("lNonLinearIntLeading", ctypes.c_int),
("lNonLinearMaxCharWidth", ctypes.c_int),
("lNonLinearAvgCharWidth", ctypes.c_int),
("lMinA", ctypes.c_int),
("lMinC", ctypes.c_int),
("lMinD", ctypes.c_int),
("alReserved", ctypes.c_int * 1),
]#[repr(C)]
pub struct POINTE {
pub x: f32,
pub y: f32,
}
#[repr(C)]
pub struct POINTL {
pub x: i32,
pub y: i32,
}
#[repr(C)]
pub struct FD_XFORM {
pub eXX: f32,
pub eXY: f32,
pub eYX: f32,
pub eYY: f32,
}
#[repr(C)]
pub struct FD_DEVICEMETRICS {
pub flRealizedType: u32,
pub pteBase: POINTE,
pub pteSide: POINTE,
pub lD: i32,
pub fxMaxAscender: i32,
pub fxMaxDescender: i32,
pub ptlUnderline1: POINTL,
pub ptlStrikeOut: POINTL,
pub ptlULThickness: POINTL,
pub ptlSOThickness: POINTL,
pub cxMax: u32,
pub cyMax: u32,
pub cjGlyphMax: u32,
pub fdxQuantized: FD_XFORM,
pub lNonLinearExtLeading: i32,
pub lNonLinearIntLeading: i32,
pub lNonLinearMaxCharWidth: i32,
pub lNonLinearAvgCharWidth: i32,
pub lMinA: i32,
pub lMinC: i32,
pub lMinD: i32,
pub alReserved: [i32; 1],
}import "golang.org/x/sys/windows"
type POINTE struct {
x float32
y float32
}
type POINTL struct {
x int32
y int32
}
type FD_XFORM struct {
eXX float32
eXY float32
eYX float32
eYY float32
}
type FD_DEVICEMETRICS struct {
flRealizedType uint32
pteBase POINTE
pteSide POINTE
lD int32
fxMaxAscender int32
fxMaxDescender int32
ptlUnderline1 POINTL
ptlStrikeOut POINTL
ptlULThickness POINTL
ptlSOThickness POINTL
cxMax uint32
cyMax uint32
cjGlyphMax uint32
fdxQuantized FD_XFORM
lNonLinearExtLeading int32
lNonLinearIntLeading int32
lNonLinearMaxCharWidth int32
lNonLinearAvgCharWidth int32
lMinA int32
lMinC int32
lMinD int32
alReserved [1]int32
}type
POINTE = record
x: Single;
y: Single;
end;
POINTL = record
x: Integer;
y: Integer;
end;
FD_XFORM = record
eXX: Single;
eXY: Single;
eYX: Single;
eYY: Single;
end;
FD_DEVICEMETRICS = record
flRealizedType: DWORD;
pteBase: POINTE;
pteSide: POINTE;
lD: Integer;
fxMaxAscender: Integer;
fxMaxDescender: Integer;
ptlUnderline1: POINTL;
ptlStrikeOut: POINTL;
ptlULThickness: POINTL;
ptlSOThickness: POINTL;
cxMax: DWORD;
cyMax: DWORD;
cjGlyphMax: DWORD;
fdxQuantized: FD_XFORM;
lNonLinearExtLeading: Integer;
lNonLinearIntLeading: Integer;
lNonLinearMaxCharWidth: Integer;
lNonLinearAvgCharWidth: Integer;
lMinA: Integer;
lMinC: Integer;
lMinD: Integer;
alReserved: array[0..0] of Integer;
end;const POINTE = extern struct {
x: f32,
y: f32,
};
const POINTL = extern struct {
x: i32,
y: i32,
};
const FD_XFORM = extern struct {
eXX: f32,
eXY: f32,
eYX: f32,
eYY: f32,
};
const FD_DEVICEMETRICS = extern struct {
flRealizedType: u32,
pteBase: POINTE,
pteSide: POINTE,
lD: i32,
fxMaxAscender: i32,
fxMaxDescender: i32,
ptlUnderline1: POINTL,
ptlStrikeOut: POINTL,
ptlULThickness: POINTL,
ptlSOThickness: POINTL,
cxMax: u32,
cyMax: u32,
cjGlyphMax: u32,
fdxQuantized: FD_XFORM,
lNonLinearExtLeading: i32,
lNonLinearIntLeading: i32,
lNonLinearMaxCharWidth: i32,
lNonLinearAvgCharWidth: i32,
lMinA: i32,
lMinC: i32,
lMinD: i32,
alReserved: [1]i32,
};type
POINTE {.bycopy.} = object
x: float32
y: float32
POINTL {.bycopy.} = object
x: int32
y: int32
FD_XFORM {.bycopy.} = object
eXX: float32
eXY: float32
eYX: float32
eYY: float32
FD_DEVICEMETRICS {.bycopy.} = object
flRealizedType: uint32
pteBase: POINTE
pteSide: POINTE
lD: int32
fxMaxAscender: int32
fxMaxDescender: int32
ptlUnderline1: POINTL
ptlStrikeOut: POINTL
ptlULThickness: POINTL
ptlSOThickness: POINTL
cxMax: uint32
cyMax: uint32
cjGlyphMax: uint32
fdxQuantized: FD_XFORM
lNonLinearExtLeading: int32
lNonLinearIntLeading: int32
lNonLinearMaxCharWidth: int32
lNonLinearAvgCharWidth: int32
lMinA: int32
lMinC: int32
lMinD: int32
alReserved: array[1, int32]struct POINTE
{
float x;
float y;
}
struct POINTL
{
int x;
int y;
}
struct FD_XFORM
{
float eXX;
float eXY;
float eYX;
float eYY;
}
struct FD_DEVICEMETRICS
{
uint flRealizedType;
POINTE pteBase;
POINTE pteSide;
int lD;
int fxMaxAscender;
int fxMaxDescender;
POINTL ptlUnderline1;
POINTL ptlStrikeOut;
POINTL ptlULThickness;
POINTL ptlSOThickness;
uint cxMax;
uint cyMax;
uint cjGlyphMax;
FD_XFORM fdxQuantized;
int lNonLinearExtLeading;
int lNonLinearIntLeading;
int lNonLinearMaxCharWidth;
int lNonLinearAvgCharWidth;
int lMinA;
int lMinC;
int lMinD;
int[1] alReserved;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; FD_DEVICEMETRICS サイズ: 124 バイト(x64)
dim st, 31 ; 4byte整数×31(構造体サイズ 124 / 4 切り上げ)
; flRealizedType : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; pteBase : POINTE (+4, 8byte) varptr(st)+4 を基点に操作(8byte:入れ子/配列)
; pteSide : POINTE (+12, 8byte) varptr(st)+12 を基点に操作(8byte:入れ子/配列)
; lD : INT (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; fxMaxAscender : INT (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; fxMaxDescender : INT (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; ptlUnderline1 : POINTL (+32, 8byte) varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; ptlStrikeOut : POINTL (+40, 8byte) varptr(st)+40 を基点に操作(8byte:入れ子/配列)
; ptlULThickness : POINTL (+48, 8byte) varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; ptlSOThickness : POINTL (+56, 8byte) varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; cxMax : DWORD (+64, 4byte) st.16 = 値 / 値 = st.16 (lpoke/lpeek も可)
; cyMax : DWORD (+68, 4byte) st.17 = 値 / 値 = st.17 (lpoke/lpeek も可)
; cjGlyphMax : DWORD (+72, 4byte) st.18 = 値 / 値 = st.18 (lpoke/lpeek も可)
; fdxQuantized : FD_XFORM (+76, 16byte) varptr(st)+76 を基点に操作(16byte:入れ子/配列)
; lNonLinearExtLeading : INT (+92, 4byte) st.23 = 値 / 値 = st.23 (lpoke/lpeek も可)
; lNonLinearIntLeading : INT (+96, 4byte) st.24 = 値 / 値 = st.24 (lpoke/lpeek も可)
; lNonLinearMaxCharWidth : INT (+100, 4byte) st.25 = 値 / 値 = st.25 (lpoke/lpeek も可)
; lNonLinearAvgCharWidth : INT (+104, 4byte) st.26 = 値 / 値 = st.26 (lpoke/lpeek も可)
; lMinA : INT (+108, 4byte) st.27 = 値 / 値 = st.27 (lpoke/lpeek も可)
; lMinC : INT (+112, 4byte) st.28 = 値 / 値 = st.28 (lpoke/lpeek も可)
; lMinD : INT (+116, 4byte) st.29 = 値 / 値 = st.29 (lpoke/lpeek も可)
; alReserved : INT (+120, 4byte) varptr(st)+120 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global POINTE
#field float x
#field float y
#endstruct
#defstruct global POINTL
#field int x
#field int y
#endstruct
#defstruct global FD_XFORM
#field float eXX
#field float eXY
#field float eYX
#field float eYY
#endstruct
#defstruct global FD_DEVICEMETRICS
#field int flRealizedType
#field POINTE pteBase
#field POINTE pteSide
#field int lD
#field int fxMaxAscender
#field int fxMaxDescender
#field POINTL ptlUnderline1
#field POINTL ptlStrikeOut
#field POINTL ptlULThickness
#field POINTL ptlSOThickness
#field int cxMax
#field int cyMax
#field int cjGlyphMax
#field FD_XFORM fdxQuantized
#field int lNonLinearExtLeading
#field int lNonLinearIntLeading
#field int lNonLinearMaxCharWidth
#field int lNonLinearAvgCharWidth
#field int lMinA
#field int lMinC
#field int lMinD
#field int alReserved 1
#endstruct
stdim st, FD_DEVICEMETRICS ; NSTRUCT 変数を確保
st->flRealizedType = 100
mes "flRealizedType=" + st->flRealizedType