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

GLYPHDATA

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

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

フィールド

フィールドサイズx64x86説明
gdfGLYPHDEF8/4+0+0GLYPHDEF 共用体を指定します。この共用体は、グリフのデータがビットマップ形式かアウトライン形式かに応じて、それぞれ GLYPHBITS 構造体または PATHOBJ 構造体へのポインターを格納します。
hgDWORD4+8+4グリフのハンドルです。
fxDINT4+12+8文字送り量 D = A + B + C を格納する FIX 値を指定します。文字送り量は、プリベアリング (左サイドベアリング量、A)、グリフの幅 (B)、および右サイドベアリング量の幅 (C) の合計を表します。2 つのサイドベアリング量は、グリフのすぐ左側と右側にある (通常は) 空白の領域を表します。fxD に格納される値は、D とベースラインに沿った単位ベクトル (デバイス座標) との内積であり、D をベースラインへ射影した値になります。
fxAINT4+16+12プリベアリング、すなわち左サイドベアリング量 A を格納する FIX 値を指定します。fxA に格納される値は、A とベースラインに沿った単位ベクトル (デバイス座標) との内積であり、A をベースラインへ射影した値になります。
fxABINT4+20+16文字の前進端 A + B を格納する FIX 値を指定します。fxAB に格納される値は、A + B とベースラインに沿った単位ベクトル (デバイス座標) との内積であり、A + B をベースラインへ射影した値になります。
fxInkTopINT4+24+20ベースラインとインクボックスの上端との距離を、アセント方向の単位ベクトル (デバイス座標) に沿って測った FIX 値を指定します。
fxInkBottomINT4+28+24ベースラインとインクボックスの下端との距離を、アセント方向の単位ベクトル (デバイス座標) に沿って測った FIX 値を指定します。
rclInkRECTL16+32+28グリフが収まるインクボックスを記述する RECTL 構造体を指定します。インクボックスの各辺は x 軸および y 軸に平行です。
ptqDPOINTQF16+48+48文字送りベクトル D = A + B + C を格納する POINTQF 構造体を指定します。ptqD の上位 WORD は 28.4 形式のデバイス座標です。このメンバーの下位 WORD は追加の精度を提供します。POINTQF 構造体の説明については、GDI Data Types を参照してください。

公式ドキュメント

GLYPHDATA 構造体は、個々のグリフに関する情報を格納します。

解説(Remarks)

GLYPHDATA のメンバーの説明で述べた A、B、C の各量は、名目空間 (notional space) における値を 28.4 形式のデバイス座標へ単純に変換したものです。A は左サイドベアリング量、すなわちグリフの左側にある空白の幅、B はグリフの幅、C は右サイドベアリング量、すなわちグリフの右側にある空白の幅です。グリフによっては A や C が負の値になることがあり、その場合はグリフが通常よりも左側または右側へ張り出していることを示します。

FIX データ型の説明については、GDI Data Types を参照してください。

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

各言語での定義

#include <windows.h>

// GLYPHDEF  (x64 8 / x86 4 バイト)
typedef struct GLYPHDEF {
    GLYPHBITS* pgb;
    PATHOBJ* ppo;
} GLYPHDEF;

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

// POINTQF  (x64 16 / x86 16 バイト)
typedef struct POINTQF {
    LONGLONG x;
    LONGLONG y;
} POINTQF;

// GLYPHDATA  (x64 64 / x86 64 バイト)
typedef struct GLYPHDATA {
    GLYPHDEF gdf;
    DWORD hg;
    INT fxD;
    INT fxA;
    INT fxAB;
    INT fxInkTop;
    INT fxInkBottom;
    RECTL rclInk;
    POINTQF ptqD;
} GLYPHDATA;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct GLYPHDEF
{
    public IntPtr pgb;
    public IntPtr ppo;
}

[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 POINTQF
{
    public long x;
    public long y;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct GLYPHDATA
{
    public GLYPHDEF gdf;
    public uint hg;
    public int fxD;
    public int fxA;
    public int fxAB;
    public int fxInkTop;
    public int fxInkBottom;
    public RECTL rclInk;
    public POINTQF ptqD;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure GLYPHDEF
    Public pgb As IntPtr
    Public ppo As IntPtr
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 POINTQF
    Public x As Long
    Public y As Long
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure GLYPHDATA
    Public gdf As GLYPHDEF
    Public hg As UInteger
    Public fxD As Integer
    Public fxA As Integer
    Public fxAB As Integer
    Public fxInkTop As Integer
    Public fxInkBottom As Integer
    Public rclInk As RECTL
    Public ptqD As POINTQF
End Structure
import ctypes
from ctypes import wintypes

class GLYPHDEF(ctypes.Structure):
    _fields_ = [
        ("pgb", ctypes.c_void_p),
        ("ppo", ctypes.c_void_p),
    ]

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

class POINTQF(ctypes.Structure):
    _fields_ = [
        ("x", ctypes.c_longlong),
        ("y", ctypes.c_longlong),
    ]

class GLYPHDATA(ctypes.Structure):
    _fields_ = [
        ("gdf", GLYPHDEF),
        ("hg", wintypes.DWORD),
        ("fxD", ctypes.c_int),
        ("fxA", ctypes.c_int),
        ("fxAB", ctypes.c_int),
        ("fxInkTop", ctypes.c_int),
        ("fxInkBottom", ctypes.c_int),
        ("rclInk", RECTL),
        ("ptqD", POINTQF),
    ]
#[repr(C)]
pub struct GLYPHDEF {
    pub pgb: *mut core::ffi::c_void,
    pub ppo: *mut core::ffi::c_void,
}

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

#[repr(C)]
pub struct POINTQF {
    pub x: i64,
    pub y: i64,
}

#[repr(C)]
pub struct GLYPHDATA {
    pub gdf: GLYPHDEF,
    pub hg: u32,
    pub fxD: i32,
    pub fxA: i32,
    pub fxAB: i32,
    pub fxInkTop: i32,
    pub fxInkBottom: i32,
    pub rclInk: RECTL,
    pub ptqD: POINTQF,
}
import "golang.org/x/sys/windows"

type GLYPHDEF struct {
	pgb uintptr
	ppo uintptr
}

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

type POINTQF struct {
	x int64
	y int64
}

type GLYPHDATA struct {
	gdf GLYPHDEF
	hg uint32
	fxD int32
	fxA int32
	fxAB int32
	fxInkTop int32
	fxInkBottom int32
	rclInk RECTL
	ptqD POINTQF
}
type
  GLYPHDEF = record
    pgb: Pointer;
    ppo: Pointer;
  end;

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

  POINTQF = record
    x: Int64;
    y: Int64;
  end;

  GLYPHDATA = record
    gdf: GLYPHDEF;
    hg: DWORD;
    fxD: Integer;
    fxA: Integer;
    fxAB: Integer;
    fxInkTop: Integer;
    fxInkBottom: Integer;
    rclInk: RECTL;
    ptqD: POINTQF;
  end;
const GLYPHDEF = extern struct {
    pgb: ?*anyopaque,
    ppo: ?*anyopaque,
};

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

const POINTQF = extern struct {
    x: i64,
    y: i64,
};

const GLYPHDATA = extern struct {
    gdf: GLYPHDEF,
    hg: u32,
    fxD: i32,
    fxA: i32,
    fxAB: i32,
    fxInkTop: i32,
    fxInkBottom: i32,
    rclInk: RECTL,
    ptqD: POINTQF,
};
type
  GLYPHDEF {.bycopy.} = object
    pgb: pointer
    ppo: pointer

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

  POINTQF {.bycopy.} = object
    x: int64
    y: int64

  GLYPHDATA {.bycopy.} = object
    gdf: GLYPHDEF
    hg: uint32
    fxD: int32
    fxA: int32
    fxAB: int32
    fxInkTop: int32
    fxInkBottom: int32
    rclInk: RECTL
    ptqD: POINTQF
struct GLYPHDEF
{
    void* pgb;
    void* ppo;
}

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

struct POINTQF
{
    long x;
    long y;
}

struct GLYPHDATA
{
    GLYPHDEF gdf;
    uint hg;
    int fxD;
    int fxA;
    int fxAB;
    int fxInkTop;
    int fxInkBottom;
    RECTL rclInk;
    POINTQF ptqD;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; GLYPHDATA サイズ: 64 バイト(x86)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; gdf : GLYPHDEF (+0, 4byte)  varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; hg : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; fxD : INT (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; fxA : INT (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; fxAB : INT (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; fxInkTop : INT (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; fxInkBottom : INT (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; rclInk : RECTL (+28, 16byte)  varptr(st)+28 を基点に操作(16byte:入れ子/配列)
; ptqD : POINTQF (+48, 16byte)  varptr(st)+48 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; GLYPHDATA サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; gdf : GLYPHDEF (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; hg : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; fxD : INT (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; fxA : INT (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; fxAB : INT (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; fxInkTop : INT (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; fxInkBottom : INT (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; rclInk : RECTL (+32, 16byte)  varptr(st)+32 を基点に操作(16byte:入れ子/配列)
; ptqD : POINTQF (+48, 16byte)  varptr(st)+48 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global RECTL
    #field int left
    #field int top
    #field int right
    #field int bottom
#endstruct

#defstruct global POINTQF
    #field int64 x
    #field int64 y
#endstruct

#defstruct global GLYPHDATA
    #field byte gdf 8
    #field int hg
    #field int fxD
    #field int fxA
    #field int fxAB
    #field int fxInkTop
    #field int fxInkBottom
    #field RECTL rclInk
    #field POINTQF ptqD
#endstruct

stdim st, GLYPHDATA        ; NSTRUCT 変数を確保
st->hg = 100
mes "hg=" + st->hg
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。