ホーム › Devices.Display › FD_DEVICEMETRICS
FD_DEVICEMETRICS
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| flRealizedType | DWORD | 4 | +0 | +0 | 実現されたフォントの種別を示すフラグ。 |
| pteBase | POINTE | 8 | +4 | +4 | ベースライン方向の単位ベクトル(POINTE)。 |
| pteSide | POINTE | 8 | +12 | +12 | サイド(縦方向)の単位ベクトル。 |
| lD | INT | 4 | +20 | +20 | フォントのデバイス単位スケール値。 |
| fxMaxAscender | INT | 4 | +24 | +24 | 最大アセンダー高(固定小数点)。 |
| fxMaxDescender | INT | 4 | +28 | +28 | 最大ディセンダー深(固定小数点)。 |
| ptlUnderline1 | POINTL | 8 | +32 | +32 | 下線位置を表す点(POINTL)。 |
| ptlStrikeOut | POINTL | 8 | +40 | +40 | 取り消し線位置を表す点。 |
| ptlULThickness | POINTL | 8 | +48 | +48 | 下線の太さベクトル。 |
| ptlSOThickness | POINTL | 8 | +56 | +56 | 取り消し線の太さベクトル。 |
| cxMax | DWORD | 4 | +64 | +64 | 最大グリフ幅(ピクセル)。 |
| cyMax | DWORD | 4 | +68 | +68 | 最大グリフ高(ピクセル)。 |
| cjGlyphMax | DWORD | 4 | +72 | +72 | 1グリフビットマップの最大バイトサイズ。 |
| fdxQuantized | FD_XFORM | 16 | +76 | +76 | 量子化された変換行列(FD_XFORM)。 |
| lNonLinearExtLeading | INT | 4 | +92 | +92 | 非線形外部レディング(行外間隔)。 |
| lNonLinearIntLeading | INT | 4 | +96 | +96 | 非線形内部レディング(行内間隔)。 |
| lNonLinearMaxCharWidth | INT | 4 | +100 | +100 | 非線形の最大文字幅。 |
| lNonLinearAvgCharWidth | INT | 4 | +104 | +104 | 非線形の平均文字幅。 |
| lMinA | INT | 4 | +108 | +108 | 最小Aスペース(左サイドベアリング)。 |
| lMinC | INT | 4 | +112 | +112 | 最小Cスペース(右サイドベアリング)。 |
| lMinD | INT | 4 | +116 | +116 | 最小D(文字送り)値。 |
| alReserved | INT | 4 | +120 | +120 | 将来の拡張用に予約された配列。 |
各言語での定義
#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