Win32 API 日本語リファレンス
ホームGraphics.Gdi › CreateFontPackage

CreateFontPackage

関数
TrueTypeフォントのサブセット化フォントパッケージを作成する。
DLLFONTSUB.dll呼出規約cdecl対応OSWindows XP 以降

シグネチャ

// FONTSUB.dll
#include <windows.h>

DWORD CreateFontPackage(
    const BYTE* puchSrcBuffer,
    DWORD ulSrcBufferSize,
    BYTE** ppuchFontPackageBuffer,
    DWORD* pulFontPackageBufferSize,
    DWORD* pulBytesWritten,
    WORD usFlag,
    WORD usTTCIndex,
    WORD usSubsetFormat,
    WORD usSubsetLanguage,
    CREATE_FONT_PACKAGE_SUBSET_PLATFORM usSubsetPlatform,
    CREATE_FONT_PACKAGE_SUBSET_ENCODING usSubsetEncoding,
    const WORD* pusSubsetKeepList,
    WORD usSubsetListCount,
    CFP_ALLOCPROC lpfnAllocate,
    CFP_REALLOCPROC lpfnReAllocate,
    CFP_FREEPROC lpfnFree,
    void* lpvReserved
);

パラメーター

名前方向説明
puchSrcBufferBYTE*inサブセット化の対象となるフォントを記述した、ソースの TTF または TTC データを格納するバッファーを指します。
ulSrcBufferSizeDWORDin*puchSrcBuffer のサイズをバイト単位で指定します。
ppuchFontPackageBufferBYTE**inoutunsigned char* 型の変数を指します。CreateFontPackage 関数は、lpfnAllocate および lpfnReAllocate を使用してバッファー **puchFontPackageBuffer を割り当てます。正常に復帰した場合、このバッファーにはサブセットフォントまたはフォントパッケージが格納されます。最終的にバッファーを解放する責任はアプリケーションにあります。
pulFontPackageBufferSizeDWORD*inoutunsigned long を指します。正常に復帰した場合、バッファー **puchFontPackageBuffer に割り当てられたサイズが格納されます。
pulBytesWrittenDWORD*inoutunsigned long を指します。正常に復帰した場合、バッファー **puchFontPackageBuffer で実際に使用されたバイト数が格納されます。
usFlagWORDin

このフォントをサブセット化するか、圧縮するか、またはその両方を行うか、フォントが TTF か TTC か、および *pusSubsetKeepList が文字コードを表すかグリフインデックスを表すかを指定します。次のフラグを任意に組み合わせて指定できます。

Value Meaning
TTFCFP_FLAGS_SUBSET
設定すると、サブセット化を要求します。
TTFCFP_FLAGS_COMPRESS
設定すると、圧縮を要求します。現在出荷されているバージョンのこの関数は圧縮を行いません。このフラグはこの機能の将来の実装を見込んだものですが、現在は無視されます。
TTFCFP_FLAGS_TTC
設定すると、puchSrcBuffer 内のフォントが TTC であることを指定します。設定しない場合は TTF でなければなりません。
TTFCFP_FLAGS_GLYPHLIST
設定すると、*pusSubsetKeepList がグリフインデックスのリストであることを指定します。設定しない場合は文字コードのリストでなければなりません。
usTTCIndexWORDin0 から始まる TTC インデックス。usFlagsTTFCFP_FLAGS_TTC が設定されている場合にのみ使用されます。
usSubsetFormatWORDin

作成するファイルの形式。次のいずれかの値を選択します。これらは組み合わせることはできません。

Value Meaning
TTFCFP_SUBSET
後でマージできない、スタンドアロンのサブセットフォントを作成します。
TTFCFP_SUBSET1
後でマージできるサブセットフォントパッケージを作成します。
TTFCFP_DELTA
以前のサブセットフォントとマージできるデルタフォントパッケージを作成します。
usSubsetLanguageWORDinName テーブル内で保持する言語。0 に設定すると、すべての言語が保持されます。初回のサブセット化でのみ使用されます。すなわち、usSubsetFormatTTFCFP_SUBSET または TTFCFP_SUBSET1 のいずれかであり、かつ usFlagsTTFCFP_FLAGS_SUBSET フラグが設定されている場合にのみ使用されます。
usSubsetPlatformCREATE_FONT_PACKAGE_SUBSET_PLATFORMin

usSubsetEncoding と組み合わせて、使用する CMAP を指定します。*pusSubsetKeepList が文字のリストである場合、すなわち usFlagsTTFCFP_FLAGS_GLYPHLIST が設定されていない場合にのみ使用されます。その場合、この CMAP サブテーブルが pusSubsetKeepList に適用され、出力フォントまたはフォントパッケージに保持するグリフのリストが作成されます。

使用する場合は、次のいずれかの値でなければなりません。これらは組み合わせることはできません。

Value Meaning
TTFCFP_UNICODE_PLATFORMID
TTFCFP_APPLE_PLATFORMID
TTFCFP_ISO_PLATFORMID
TTFCFP_MS_PLATFORMID
usSubsetEncodingCREATE_FONT_PACKAGE_SUBSET_ENCODINGin

usSubsetPlatform と組み合わせて、使用する CMAP を指定します。*pusSubsetKeepList が文字のリストである場合、すなわち usFlagsTTFCFP_FLAGS_GLYPHLIST が設定されていない場合にのみ使用されます。

使用する場合は、次のいずれかの値でなければなりません。これらは組み合わせることはできません。

Value Meaning
TTFCFP_STD_MAC_CHAR_SET
usSubsetPlatform == TTFCFP_APPLE_PLATFORMID の場合にのみ使用できます。
TTFCFP_SYMBOL_CHAR_SET
usSubsetPlatform == TTFSUB_MS_PLATFORMID の場合にのみ使用できます。
TTFCFP_UNICODE_CHAR_SET
usSubsetPlatform == TTFSUB_MS_PLATFORMID の場合にのみ使用できます。
TTFCFP_DONT_CARE
pusSubsetKeepListWORD*in出力フォントまたはフォントパッケージに保持すべき文字コードまたはグリフインデックスのリストを構成する整数の配列を指します。このリストに文字コードが含まれる場合(すなわち usFlagsTTFCFP_FLAGS_GLYPHLIST が設定されていない場合)、このリストは usSubsetPlatform および usSubsetEncoding で指定された Platform-Encoding CMAP に応じて、Unicode または他の種類のエンコーディングのいずれかになります。
usSubsetListCountWORDinリスト *pusSubsetKeepList 内の要素数。
lpfnAllocateCFP_ALLOCPROCinpuchFontPackageBuffer および一時バッファー用の初期メモリを割り当てるコールバック関数。
lpfnReAllocateCFP_REALLOCPROCinpuchFontPackageBuffer および一時バッファー用のメモリを再割り当てするコールバック関数。
lpfnFreeCFP_FREEPROCinlpfnAllocate および lpfnReAllocate によって割り当てられたメモリを解放するコールバック関数。
lpvReservedvoid*inoutNULL に設定する必要があります。

戻り値の型: DWORD

公式ドキュメント

CreateFontPackage 関数は、指定された TrueType フォントのサブセット版を作成します。通常は、これをプリンターに渡すために使用します。

戻り値

関数が成功した場合は 0 を返します。

それ以外の場合は 0 以外の値を返します。発生し得るエラーの戻り値については、Font-Package Function Error Messages を参照してください。

解説(Remarks)

usSubsetFormatTTFCFP_SUBSET の値を指定すると、フォントパッケージではなく、直接動作可能なフォントを作成できます。これは後でのマージを許可しませんが、マージが不要な場合は、下流の処理における 1 つのステップを省略できます。フォントパッケージは、使用する前に動作可能なフォントへ変換し直す必要があるためです。

usSubsetFormatTTFCFP_SUBSET1 の値を指定すると、後でのマージを可能にするフォントパッケージを作成できます。たとえば、アプリケーションが大規模な印刷ジョブの開始時にこの関数を呼び出す場合を考えてみましょう。印刷ジョブの途中で、アプリケーションは構築したサブセットに含まれていないグリフが必要であることに気付きます。その場合、アプリケーションは CreateFontPackage を再度呼び出し、今度は usSubsetFormatTTFCFP_DELTA の値を指定できます。プリンターは MergeFontPackage を使用して、これらの追加グリフをマージできます。

CMAP は文字エンコーディングからグリフへのマッピングを行います。*pusSubsetKeepList が文字値のリストである場合、アプリケーションは usSubsetPlatform および usSubsetEncoding パラメーターを使用して、使用する CMAP の種類を指定し、文字値をグリフにマッピングできるようにします。

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

各言語での呼び出し定義

// FONTSUB.dll
#include <windows.h>

DWORD CreateFontPackage(
    const BYTE* puchSrcBuffer,
    DWORD ulSrcBufferSize,
    BYTE** ppuchFontPackageBuffer,
    DWORD* pulFontPackageBufferSize,
    DWORD* pulBytesWritten,
    WORD usFlag,
    WORD usTTCIndex,
    WORD usSubsetFormat,
    WORD usSubsetLanguage,
    CREATE_FONT_PACKAGE_SUBSET_PLATFORM usSubsetPlatform,
    CREATE_FONT_PACKAGE_SUBSET_ENCODING usSubsetEncoding,
    const WORD* pusSubsetKeepList,
    WORD usSubsetListCount,
    CFP_ALLOCPROC lpfnAllocate,
    CFP_REALLOCPROC lpfnReAllocate,
    CFP_FREEPROC lpfnFree,
    void* lpvReserved
);
[DllImport("FONTSUB.dll", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
static extern uint CreateFontPackage(
    IntPtr puchSrcBuffer,   // BYTE*
    uint ulSrcBufferSize,   // DWORD
    IntPtr ppuchFontPackageBuffer,   // BYTE** in/out
    ref uint pulFontPackageBufferSize,   // DWORD* in/out
    ref uint pulBytesWritten,   // DWORD* in/out
    ushort usFlag,   // WORD
    ushort usTTCIndex,   // WORD
    ushort usSubsetFormat,   // WORD
    ushort usSubsetLanguage,   // WORD
    short usSubsetPlatform,   // CREATE_FONT_PACKAGE_SUBSET_PLATFORM
    short usSubsetEncoding,   // CREATE_FONT_PACKAGE_SUBSET_ENCODING
    ref ushort pusSubsetKeepList,   // WORD*
    ushort usSubsetListCount,   // WORD
    IntPtr lpfnAllocate,   // CFP_ALLOCPROC
    IntPtr lpfnReAllocate,   // CFP_REALLOCPROC
    IntPtr lpfnFree,   // CFP_FREEPROC
    IntPtr lpvReserved   // void* in/out
);
<DllImport("FONTSUB.dll", ExactSpelling:=True, CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function CreateFontPackage(
    puchSrcBuffer As IntPtr,   ' BYTE*
    ulSrcBufferSize As UInteger,   ' DWORD
    ppuchFontPackageBuffer As IntPtr,   ' BYTE** in/out
    ByRef pulFontPackageBufferSize As UInteger,   ' DWORD* in/out
    ByRef pulBytesWritten As UInteger,   ' DWORD* in/out
    usFlag As UShort,   ' WORD
    usTTCIndex As UShort,   ' WORD
    usSubsetFormat As UShort,   ' WORD
    usSubsetLanguage As UShort,   ' WORD
    usSubsetPlatform As Short,   ' CREATE_FONT_PACKAGE_SUBSET_PLATFORM
    usSubsetEncoding As Short,   ' CREATE_FONT_PACKAGE_SUBSET_ENCODING
    ByRef pusSubsetKeepList As UShort,   ' WORD*
    usSubsetListCount As UShort,   ' WORD
    lpfnAllocate As IntPtr,   ' CFP_ALLOCPROC
    lpfnReAllocate As IntPtr,   ' CFP_REALLOCPROC
    lpfnFree As IntPtr,   ' CFP_FREEPROC
    lpvReserved As IntPtr   ' void* in/out
) As UInteger
End Function
' puchSrcBuffer : BYTE*
' ulSrcBufferSize : DWORD
' ppuchFontPackageBuffer : BYTE** in/out
' pulFontPackageBufferSize : DWORD* in/out
' pulBytesWritten : DWORD* in/out
' usFlag : WORD
' usTTCIndex : WORD
' usSubsetFormat : WORD
' usSubsetLanguage : WORD
' usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM
' usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING
' pusSubsetKeepList : WORD*
' usSubsetListCount : WORD
' lpfnAllocate : CFP_ALLOCPROC
' lpfnReAllocate : CFP_REALLOCPROC
' lpfnFree : CFP_FREEPROC
' lpvReserved : void* in/out
Declare PtrSafe Function CreateFontPackage Lib "fontsub" ( _
    ByVal puchSrcBuffer As LongPtr, _
    ByVal ulSrcBufferSize As Long, _
    ByVal ppuchFontPackageBuffer As LongPtr, _
    ByRef pulFontPackageBufferSize As Long, _
    ByRef pulBytesWritten As Long, _
    ByVal usFlag As Integer, _
    ByVal usTTCIndex As Integer, _
    ByVal usSubsetFormat As Integer, _
    ByVal usSubsetLanguage As Integer, _
    ByVal usSubsetPlatform As Integer, _
    ByVal usSubsetEncoding As Integer, _
    ByRef pusSubsetKeepList As Integer, _
    ByVal usSubsetListCount As Integer, _
    ByVal lpfnAllocate As LongPtr, _
    ByVal lpfnReAllocate As LongPtr, _
    ByVal lpfnFree As LongPtr, _
    ByVal lpvReserved As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CreateFontPackage = ctypes.cdll.fontsub.CreateFontPackage
CreateFontPackage.restype = wintypes.DWORD
CreateFontPackage.argtypes = [
    ctypes.POINTER(ctypes.c_ubyte),  # puchSrcBuffer : BYTE*
    wintypes.DWORD,  # ulSrcBufferSize : DWORD
    ctypes.c_void_p,  # ppuchFontPackageBuffer : BYTE** in/out
    ctypes.POINTER(wintypes.DWORD),  # pulFontPackageBufferSize : DWORD* in/out
    ctypes.POINTER(wintypes.DWORD),  # pulBytesWritten : DWORD* in/out
    ctypes.c_ushort,  # usFlag : WORD
    ctypes.c_ushort,  # usTTCIndex : WORD
    ctypes.c_ushort,  # usSubsetFormat : WORD
    ctypes.c_ushort,  # usSubsetLanguage : WORD
    ctypes.c_short,  # usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM
    ctypes.c_short,  # usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING
    ctypes.POINTER(ctypes.c_ushort),  # pusSubsetKeepList : WORD*
    ctypes.c_ushort,  # usSubsetListCount : WORD
    ctypes.c_void_p,  # lpfnAllocate : CFP_ALLOCPROC
    ctypes.c_void_p,  # lpfnReAllocate : CFP_REALLOCPROC
    ctypes.c_void_p,  # lpfnFree : CFP_FREEPROC
    ctypes.POINTER(None),  # lpvReserved : void* in/out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('FONTSUB.dll')
CreateFontPackage = Fiddle::Function.new(
  lib['CreateFontPackage'],
  [
    Fiddle::TYPE_VOIDP,  # puchSrcBuffer : BYTE*
    -Fiddle::TYPE_INT,  # ulSrcBufferSize : DWORD
    Fiddle::TYPE_VOIDP,  # ppuchFontPackageBuffer : BYTE** in/out
    Fiddle::TYPE_VOIDP,  # pulFontPackageBufferSize : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # pulBytesWritten : DWORD* in/out
    -Fiddle::TYPE_SHORT,  # usFlag : WORD
    -Fiddle::TYPE_SHORT,  # usTTCIndex : WORD
    -Fiddle::TYPE_SHORT,  # usSubsetFormat : WORD
    -Fiddle::TYPE_SHORT,  # usSubsetLanguage : WORD
    Fiddle::TYPE_SHORT,  # usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM
    Fiddle::TYPE_SHORT,  # usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING
    Fiddle::TYPE_VOIDP,  # pusSubsetKeepList : WORD*
    -Fiddle::TYPE_SHORT,  # usSubsetListCount : WORD
    Fiddle::TYPE_VOIDP,  # lpfnAllocate : CFP_ALLOCPROC
    Fiddle::TYPE_VOIDP,  # lpfnReAllocate : CFP_REALLOCPROC
    Fiddle::TYPE_VOIDP,  # lpfnFree : CFP_FREEPROC
    Fiddle::TYPE_VOIDP,  # lpvReserved : void* in/out
  ],
  -Fiddle::TYPE_INT, Fiddle::Function::CDECL)
#[link(name = "fontsub")]
extern "C" {
    fn CreateFontPackage(
        puchSrcBuffer: *const u8,  // BYTE*
        ulSrcBufferSize: u32,  // DWORD
        ppuchFontPackageBuffer: *mut *mut u8,  // BYTE** in/out
        pulFontPackageBufferSize: *mut u32,  // DWORD* in/out
        pulBytesWritten: *mut u32,  // DWORD* in/out
        usFlag: u16,  // WORD
        usTTCIndex: u16,  // WORD
        usSubsetFormat: u16,  // WORD
        usSubsetLanguage: u16,  // WORD
        usSubsetPlatform: i16,  // CREATE_FONT_PACKAGE_SUBSET_PLATFORM
        usSubsetEncoding: i16,  // CREATE_FONT_PACKAGE_SUBSET_ENCODING
        pusSubsetKeepList: *const u16,  // WORD*
        usSubsetListCount: u16,  // WORD
        lpfnAllocate: *const core::ffi::c_void,  // CFP_ALLOCPROC
        lpfnReAllocate: *const core::ffi::c_void,  // CFP_REALLOCPROC
        lpfnFree: *const core::ffi::c_void,  // CFP_FREEPROC
        lpvReserved: *mut ()  // void* in/out
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("FONTSUB.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint CreateFontPackage(IntPtr puchSrcBuffer, uint ulSrcBufferSize, IntPtr ppuchFontPackageBuffer, ref uint pulFontPackageBufferSize, ref uint pulBytesWritten, ushort usFlag, ushort usTTCIndex, ushort usSubsetFormat, ushort usSubsetLanguage, short usSubsetPlatform, short usSubsetEncoding, ref ushort pusSubsetKeepList, ushort usSubsetListCount, IntPtr lpfnAllocate, IntPtr lpfnReAllocate, IntPtr lpfnFree, IntPtr lpvReserved);
"@
$api = Add-Type -MemberDefinition $sig -Name 'FONTSUB_CreateFontPackage' -Namespace Win32 -PassThru
# $api::CreateFontPackage(puchSrcBuffer, ulSrcBufferSize, ppuchFontPackageBuffer, pulFontPackageBufferSize, pulBytesWritten, usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, pusSubsetKeepList, usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
#uselib "FONTSUB.dll"
#func global CreateFontPackage "CreateFontPackage" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; CreateFontPackage varptr(puchSrcBuffer), ulSrcBufferSize, varptr(ppuchFontPackageBuffer), varptr(pulFontPackageBufferSize), varptr(pulBytesWritten), usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, varptr(pusSubsetKeepList), usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved   ; 戻り値は stat
; puchSrcBuffer : BYTE* -> "sptr"
; ulSrcBufferSize : DWORD -> "sptr"
; ppuchFontPackageBuffer : BYTE** in/out -> "sptr"
; pulFontPackageBufferSize : DWORD* in/out -> "sptr"
; pulBytesWritten : DWORD* in/out -> "sptr"
; usFlag : WORD -> "sptr"
; usTTCIndex : WORD -> "sptr"
; usSubsetFormat : WORD -> "sptr"
; usSubsetLanguage : WORD -> "sptr"
; usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM -> "sptr"
; usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING -> "sptr"
; pusSubsetKeepList : WORD* -> "sptr"
; usSubsetListCount : WORD -> "sptr"
; lpfnAllocate : CFP_ALLOCPROC -> "sptr"
; lpfnReAllocate : CFP_REALLOCPROC -> "sptr"
; lpfnFree : CFP_FREEPROC -> "sptr"
; lpvReserved : void* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "FONTSUB.dll"
#cfunc global CreateFontPackage "CreateFontPackage" var, int, var, var, var, int, int, int, int, int, int, var, int, sptr, sptr, sptr, sptr
; res = CreateFontPackage(puchSrcBuffer, ulSrcBufferSize, ppuchFontPackageBuffer, pulFontPackageBufferSize, pulBytesWritten, usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, pusSubsetKeepList, usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
; puchSrcBuffer : BYTE* -> "var"
; ulSrcBufferSize : DWORD -> "int"
; ppuchFontPackageBuffer : BYTE** in/out -> "var"
; pulFontPackageBufferSize : DWORD* in/out -> "var"
; pulBytesWritten : DWORD* in/out -> "var"
; usFlag : WORD -> "int"
; usTTCIndex : WORD -> "int"
; usSubsetFormat : WORD -> "int"
; usSubsetLanguage : WORD -> "int"
; usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM -> "int"
; usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING -> "int"
; pusSubsetKeepList : WORD* -> "var"
; usSubsetListCount : WORD -> "int"
; lpfnAllocate : CFP_ALLOCPROC -> "sptr"
; lpfnReAllocate : CFP_REALLOCPROC -> "sptr"
; lpfnFree : CFP_FREEPROC -> "sptr"
; lpvReserved : void* in/out -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; DWORD CreateFontPackage(BYTE* puchSrcBuffer, DWORD ulSrcBufferSize, BYTE** ppuchFontPackageBuffer, DWORD* pulFontPackageBufferSize, DWORD* pulBytesWritten, WORD usFlag, WORD usTTCIndex, WORD usSubsetFormat, WORD usSubsetLanguage, CREATE_FONT_PACKAGE_SUBSET_PLATFORM usSubsetPlatform, CREATE_FONT_PACKAGE_SUBSET_ENCODING usSubsetEncoding, WORD* pusSubsetKeepList, WORD usSubsetListCount, CFP_ALLOCPROC lpfnAllocate, CFP_REALLOCPROC lpfnReAllocate, CFP_FREEPROC lpfnFree, void* lpvReserved)
#uselib "FONTSUB.dll"
#cfunc global CreateFontPackage "CreateFontPackage" var, int, var, var, var, int, int, int, int, int, int, var, int, intptr, intptr, intptr, intptr
; res = CreateFontPackage(puchSrcBuffer, ulSrcBufferSize, ppuchFontPackageBuffer, pulFontPackageBufferSize, pulBytesWritten, usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, pusSubsetKeepList, usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
; puchSrcBuffer : BYTE* -> "var"
; ulSrcBufferSize : DWORD -> "int"
; ppuchFontPackageBuffer : BYTE** in/out -> "var"
; pulFontPackageBufferSize : DWORD* in/out -> "var"
; pulBytesWritten : DWORD* in/out -> "var"
; usFlag : WORD -> "int"
; usTTCIndex : WORD -> "int"
; usSubsetFormat : WORD -> "int"
; usSubsetLanguage : WORD -> "int"
; usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM -> "int"
; usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING -> "int"
; pusSubsetKeepList : WORD* -> "var"
; usSubsetListCount : WORD -> "int"
; lpfnAllocate : CFP_ALLOCPROC -> "intptr"
; lpfnReAllocate : CFP_REALLOCPROC -> "intptr"
; lpfnFree : CFP_FREEPROC -> "intptr"
; lpvReserved : void* in/out -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	fontsub = windows.NewLazySystemDLL("FONTSUB.dll")
	procCreateFontPackage = fontsub.NewProc("CreateFontPackage")
)

// puchSrcBuffer (BYTE*), ulSrcBufferSize (DWORD), ppuchFontPackageBuffer (BYTE** in/out), pulFontPackageBufferSize (DWORD* in/out), pulBytesWritten (DWORD* in/out), usFlag (WORD), usTTCIndex (WORD), usSubsetFormat (WORD), usSubsetLanguage (WORD), usSubsetPlatform (CREATE_FONT_PACKAGE_SUBSET_PLATFORM), usSubsetEncoding (CREATE_FONT_PACKAGE_SUBSET_ENCODING), pusSubsetKeepList (WORD*), usSubsetListCount (WORD), lpfnAllocate (CFP_ALLOCPROC), lpfnReAllocate (CFP_REALLOCPROC), lpfnFree (CFP_FREEPROC), lpvReserved (void* in/out)
r1, _, err := procCreateFontPackage.Call(
	uintptr(puchSrcBuffer),
	uintptr(ulSrcBufferSize),
	uintptr(ppuchFontPackageBuffer),
	uintptr(pulFontPackageBufferSize),
	uintptr(pulBytesWritten),
	uintptr(usFlag),
	uintptr(usTTCIndex),
	uintptr(usSubsetFormat),
	uintptr(usSubsetLanguage),
	uintptr(usSubsetPlatform),
	uintptr(usSubsetEncoding),
	uintptr(pusSubsetKeepList),
	uintptr(usSubsetListCount),
	uintptr(lpfnAllocate),
	uintptr(lpfnReAllocate),
	uintptr(lpfnFree),
	uintptr(lpvReserved),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function CreateFontPackage(
  puchSrcBuffer: Pointer;   // BYTE*
  ulSrcBufferSize: DWORD;   // DWORD
  ppuchFontPackageBuffer: Pointer;   // BYTE** in/out
  pulFontPackageBufferSize: Pointer;   // DWORD* in/out
  pulBytesWritten: Pointer;   // DWORD* in/out
  usFlag: Word;   // WORD
  usTTCIndex: Word;   // WORD
  usSubsetFormat: Word;   // WORD
  usSubsetLanguage: Word;   // WORD
  usSubsetPlatform: Smallint;   // CREATE_FONT_PACKAGE_SUBSET_PLATFORM
  usSubsetEncoding: Smallint;   // CREATE_FONT_PACKAGE_SUBSET_ENCODING
  pusSubsetKeepList: Pointer;   // WORD*
  usSubsetListCount: Word;   // WORD
  lpfnAllocate: Pointer;   // CFP_ALLOCPROC
  lpfnReAllocate: Pointer;   // CFP_REALLOCPROC
  lpfnFree: Pointer;   // CFP_FREEPROC
  lpvReserved: Pointer   // void* in/out
): DWORD; cdecl;
  external 'FONTSUB.dll' name 'CreateFontPackage';
result := DllCall("FONTSUB\CreateFontPackage"
    , "Ptr", puchSrcBuffer   ; BYTE*
    , "UInt", ulSrcBufferSize   ; DWORD
    , "Ptr", ppuchFontPackageBuffer   ; BYTE** in/out
    , "Ptr", pulFontPackageBufferSize   ; DWORD* in/out
    , "Ptr", pulBytesWritten   ; DWORD* in/out
    , "UShort", usFlag   ; WORD
    , "UShort", usTTCIndex   ; WORD
    , "UShort", usSubsetFormat   ; WORD
    , "UShort", usSubsetLanguage   ; WORD
    , "Short", usSubsetPlatform   ; CREATE_FONT_PACKAGE_SUBSET_PLATFORM
    , "Short", usSubsetEncoding   ; CREATE_FONT_PACKAGE_SUBSET_ENCODING
    , "Ptr", pusSubsetKeepList   ; WORD*
    , "UShort", usSubsetListCount   ; WORD
    , "Ptr", lpfnAllocate   ; CFP_ALLOCPROC
    , "Ptr", lpfnReAllocate   ; CFP_REALLOCPROC
    , "Ptr", lpfnFree   ; CFP_FREEPROC
    , "Ptr", lpvReserved   ; void* in/out
    , "Cdecl UInt")   ; return: DWORD
●CreateFontPackage(puchSrcBuffer, ulSrcBufferSize, ppuchFontPackageBuffer, pulFontPackageBufferSize, pulBytesWritten, usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, pusSubsetKeepList, usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved) = DLL("FONTSUB.dll", "dword CreateFontPackage(void*, dword, void*, void*, void*, int, int, int, int, int, int, void*, int, void*, void*, void*, void*)")
# 呼び出し: CreateFontPackage(puchSrcBuffer, ulSrcBufferSize, ppuchFontPackageBuffer, pulFontPackageBufferSize, pulBytesWritten, usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, pusSubsetKeepList, usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
# puchSrcBuffer : BYTE* -> "void*"
# ulSrcBufferSize : DWORD -> "dword"
# ppuchFontPackageBuffer : BYTE** in/out -> "void*"
# pulFontPackageBufferSize : DWORD* in/out -> "void*"
# pulBytesWritten : DWORD* in/out -> "void*"
# usFlag : WORD -> "int"
# usTTCIndex : WORD -> "int"
# usSubsetFormat : WORD -> "int"
# usSubsetLanguage : WORD -> "int"
# usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM -> "int"
# usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING -> "int"
# pusSubsetKeepList : WORD* -> "void*"
# usSubsetListCount : WORD -> "int"
# lpfnAllocate : CFP_ALLOCPROC -> "void*"
# lpfnReAllocate : CFP_REALLOCPROC -> "void*"
# lpfnFree : CFP_FREEPROC -> "void*"
# lpvReserved : void* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※cdecl関数。DLL()宣言はstdcall前提。cdeclは EXEC_PTR(`cdecl`,…) を使用。
const std = @import("std");

extern "fontsub" fn CreateFontPackage(
    puchSrcBuffer: [*c]u8, // BYTE*
    ulSrcBufferSize: u32, // DWORD
    ppuchFontPackageBuffer: [*c][*c]u8, // BYTE** in/out
    pulFontPackageBufferSize: [*c]u32, // DWORD* in/out
    pulBytesWritten: [*c]u32, // DWORD* in/out
    usFlag: u16, // WORD
    usTTCIndex: u16, // WORD
    usSubsetFormat: u16, // WORD
    usSubsetLanguage: u16, // WORD
    usSubsetPlatform: i16, // CREATE_FONT_PACKAGE_SUBSET_PLATFORM
    usSubsetEncoding: i16, // CREATE_FONT_PACKAGE_SUBSET_ENCODING
    pusSubsetKeepList: [*c]u16, // WORD*
    usSubsetListCount: u16, // WORD
    lpfnAllocate: ?*anyopaque, // CFP_ALLOCPROC
    lpfnReAllocate: ?*anyopaque, // CFP_REALLOCPROC
    lpfnFree: ?*anyopaque, // CFP_FREEPROC
    lpvReserved: ?*anyopaque // void* in/out
) callconv(.c) u32;
proc CreateFontPackage(
    puchSrcBuffer: ptr uint8,  # BYTE*
    ulSrcBufferSize: uint32,  # DWORD
    ppuchFontPackageBuffer: ptr uint8,  # BYTE** in/out
    pulFontPackageBufferSize: ptr uint32,  # DWORD* in/out
    pulBytesWritten: ptr uint32,  # DWORD* in/out
    usFlag: uint16,  # WORD
    usTTCIndex: uint16,  # WORD
    usSubsetFormat: uint16,  # WORD
    usSubsetLanguage: uint16,  # WORD
    usSubsetPlatform: int16,  # CREATE_FONT_PACKAGE_SUBSET_PLATFORM
    usSubsetEncoding: int16,  # CREATE_FONT_PACKAGE_SUBSET_ENCODING
    pusSubsetKeepList: ptr uint16,  # WORD*
    usSubsetListCount: uint16,  # WORD
    lpfnAllocate: pointer,  # CFP_ALLOCPROC
    lpfnReAllocate: pointer,  # CFP_REALLOCPROC
    lpfnFree: pointer,  # CFP_FREEPROC
    lpvReserved: pointer  # void* in/out
): uint32 {.importc: "CreateFontPackage", cdecl, dynlib: "FONTSUB.dll".}
pragma(lib, "fontsub");
extern(C)
uint CreateFontPackage(
    ubyte* puchSrcBuffer,   // BYTE*
    uint ulSrcBufferSize,   // DWORD
    ubyte** ppuchFontPackageBuffer,   // BYTE** in/out
    uint* pulFontPackageBufferSize,   // DWORD* in/out
    uint* pulBytesWritten,   // DWORD* in/out
    ushort usFlag,   // WORD
    ushort usTTCIndex,   // WORD
    ushort usSubsetFormat,   // WORD
    ushort usSubsetLanguage,   // WORD
    short usSubsetPlatform,   // CREATE_FONT_PACKAGE_SUBSET_PLATFORM
    short usSubsetEncoding,   // CREATE_FONT_PACKAGE_SUBSET_ENCODING
    ushort* pusSubsetKeepList,   // WORD*
    ushort usSubsetListCount,   // WORD
    void* lpfnAllocate,   // CFP_ALLOCPROC
    void* lpfnReAllocate,   // CFP_REALLOCPROC
    void* lpfnFree,   // CFP_FREEPROC
    void* lpvReserved   // void* in/out
);
ccall((:CreateFontPackage, "FONTSUB.dll"), UInt32,
      (Ptr{UInt8}, UInt32, Ptr{UInt8}, Ptr{UInt32}, Ptr{UInt32}, UInt16, UInt16, UInt16, UInt16, Int16, Int16, Ptr{UInt16}, UInt16, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{Cvoid}),
      puchSrcBuffer, ulSrcBufferSize, ppuchFontPackageBuffer, pulFontPackageBufferSize, pulBytesWritten, usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, pusSubsetKeepList, usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
# puchSrcBuffer : BYTE* -> Ptr{UInt8}
# ulSrcBufferSize : DWORD -> UInt32
# ppuchFontPackageBuffer : BYTE** in/out -> Ptr{UInt8}
# pulFontPackageBufferSize : DWORD* in/out -> Ptr{UInt32}
# pulBytesWritten : DWORD* in/out -> Ptr{UInt32}
# usFlag : WORD -> UInt16
# usTTCIndex : WORD -> UInt16
# usSubsetFormat : WORD -> UInt16
# usSubsetLanguage : WORD -> UInt16
# usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM -> Int16
# usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING -> Int16
# pusSubsetKeepList : WORD* -> Ptr{UInt16}
# usSubsetListCount : WORD -> UInt16
# lpfnAllocate : CFP_ALLOCPROC -> Ptr{Cvoid}
# lpfnReAllocate : CFP_REALLOCPROC -> Ptr{Cvoid}
# lpfnFree : CFP_FREEPROC -> Ptr{Cvoid}
# lpvReserved : void* in/out -> Ptr{Cvoid}
local ffi = require("ffi")
ffi.cdef[[
uint32_t CreateFontPackage(
    uint8_t* puchSrcBuffer,
    uint32_t ulSrcBufferSize,
    uint8_t** ppuchFontPackageBuffer,
    uint32_t* pulFontPackageBufferSize,
    uint32_t* pulBytesWritten,
    uint16_t usFlag,
    uint16_t usTTCIndex,
    uint16_t usSubsetFormat,
    uint16_t usSubsetLanguage,
    int16_t usSubsetPlatform,
    int16_t usSubsetEncoding,
    uint16_t* pusSubsetKeepList,
    uint16_t usSubsetListCount,
    void* lpfnAllocate,
    void* lpfnReAllocate,
    void* lpfnFree,
    void* lpvReserved);
]]
local fontsub = ffi.load("fontsub")
-- fontsub.CreateFontPackage(puchSrcBuffer, ulSrcBufferSize, ppuchFontPackageBuffer, pulFontPackageBufferSize, pulBytesWritten, usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, pusSubsetKeepList, usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
-- puchSrcBuffer : BYTE*
-- ulSrcBufferSize : DWORD
-- ppuchFontPackageBuffer : BYTE** in/out
-- pulFontPackageBufferSize : DWORD* in/out
-- pulBytesWritten : DWORD* in/out
-- usFlag : WORD
-- usTTCIndex : WORD
-- usSubsetFormat : WORD
-- usSubsetLanguage : WORD
-- usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM
-- usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING
-- pusSubsetKeepList : WORD*
-- usSubsetListCount : WORD
-- lpfnAllocate : CFP_ALLOCPROC
-- lpfnReAllocate : CFP_REALLOCPROC
-- lpfnFree : CFP_FREEPROC
-- lpvReserved : void* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('FONTSUB.dll');
const CreateFontPackage = lib.func('__cdecl', 'CreateFontPackage', 'uint32_t', ['uint8_t *', 'uint32_t', 'uint8_t *', 'uint32_t *', 'uint32_t *', 'uint16_t', 'uint16_t', 'uint16_t', 'uint16_t', 'int16_t', 'int16_t', 'uint16_t *', 'uint16_t', 'void *', 'void *', 'void *', 'void *']);
// CreateFontPackage(puchSrcBuffer, ulSrcBufferSize, ppuchFontPackageBuffer, pulFontPackageBufferSize, pulBytesWritten, usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, pusSubsetKeepList, usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
// puchSrcBuffer : BYTE* -> 'uint8_t *'
// ulSrcBufferSize : DWORD -> 'uint32_t'
// ppuchFontPackageBuffer : BYTE** in/out -> 'uint8_t *'
// pulFontPackageBufferSize : DWORD* in/out -> 'uint32_t *'
// pulBytesWritten : DWORD* in/out -> 'uint32_t *'
// usFlag : WORD -> 'uint16_t'
// usTTCIndex : WORD -> 'uint16_t'
// usSubsetFormat : WORD -> 'uint16_t'
// usSubsetLanguage : WORD -> 'uint16_t'
// usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM -> 'int16_t'
// usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING -> 'int16_t'
// pusSubsetKeepList : WORD* -> 'uint16_t *'
// usSubsetListCount : WORD -> 'uint16_t'
// lpfnAllocate : CFP_ALLOCPROC -> 'void *'
// lpfnReAllocate : CFP_REALLOCPROC -> 'void *'
// lpfnFree : CFP_FREEPROC -> 'void *'
// lpvReserved : void* in/out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
// コールバック(関数ポインタ)は koffi.proto/koffi.register で型を定義して渡す(素の void* では JS 関数を渡せない)。
const lib = Deno.dlopen("FONTSUB.dll", {
  CreateFontPackage: { parameters: ["pointer", "u32", "pointer", "pointer", "pointer", "u16", "u16", "u16", "u16", "i16", "i16", "pointer", "u16", "pointer", "pointer", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.CreateFontPackage(puchSrcBuffer, ulSrcBufferSize, ppuchFontPackageBuffer, pulFontPackageBufferSize, pulBytesWritten, usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, pusSubsetKeepList, usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved)
// puchSrcBuffer : BYTE* -> "pointer"
// ulSrcBufferSize : DWORD -> "u32"
// ppuchFontPackageBuffer : BYTE** in/out -> "pointer"
// pulFontPackageBufferSize : DWORD* in/out -> "pointer"
// pulBytesWritten : DWORD* in/out -> "pointer"
// usFlag : WORD -> "u16"
// usTTCIndex : WORD -> "u16"
// usSubsetFormat : WORD -> "u16"
// usSubsetLanguage : WORD -> "u16"
// usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM -> "i16"
// usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING -> "i16"
// pusSubsetKeepList : WORD* -> "pointer"
// usSubsetListCount : WORD -> "u16"
// lpfnAllocate : CFP_ALLOCPROC -> "pointer"
// lpfnReAllocate : CFP_REALLOCPROC -> "pointer"
// lpfnFree : CFP_FREEPROC -> "pointer"
// lpvReserved : void* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t CreateFontPackage(
    uint8_t* puchSrcBuffer,
    uint32_t ulSrcBufferSize,
    uint8_t** ppuchFontPackageBuffer,
    uint32_t* pulFontPackageBufferSize,
    uint32_t* pulBytesWritten,
    uint16_t usFlag,
    uint16_t usTTCIndex,
    uint16_t usSubsetFormat,
    uint16_t usSubsetLanguage,
    int16_t usSubsetPlatform,
    int16_t usSubsetEncoding,
    uint16_t* pusSubsetKeepList,
    uint16_t usSubsetListCount,
    void* lpfnAllocate,
    void* lpfnReAllocate,
    void* lpfnFree,
    void* lpvReserved);
C, "FONTSUB.dll");
// $ffi->CreateFontPackage(puchSrcBuffer, ulSrcBufferSize, ppuchFontPackageBuffer, pulFontPackageBufferSize, pulBytesWritten, usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, pusSubsetKeepList, usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved);
// puchSrcBuffer : BYTE*
// ulSrcBufferSize : DWORD
// ppuchFontPackageBuffer : BYTE** in/out
// pulFontPackageBufferSize : DWORD* in/out
// pulBytesWritten : DWORD* in/out
// usFlag : WORD
// usTTCIndex : WORD
// usSubsetFormat : WORD
// usSubsetLanguage : WORD
// usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM
// usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING
// pusSubsetKeepList : WORD*
// usSubsetListCount : WORD
// lpfnAllocate : CFP_ALLOCPROC
// lpfnReAllocate : CFP_REALLOCPROC
// lpfnFree : CFP_FREEPROC
// lpvReserved : void* in/out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Fontsub extends Library {
    Fontsub INSTANCE = Native.load("fontsub", Fontsub.class);
    int CreateFontPackage(
        byte[] puchSrcBuffer,   // BYTE*
        int ulSrcBufferSize,   // DWORD
        Pointer ppuchFontPackageBuffer,   // BYTE** in/out
        IntByReference pulFontPackageBufferSize,   // DWORD* in/out
        IntByReference pulBytesWritten,   // DWORD* in/out
        short usFlag,   // WORD
        short usTTCIndex,   // WORD
        short usSubsetFormat,   // WORD
        short usSubsetLanguage,   // WORD
        short usSubsetPlatform,   // CREATE_FONT_PACKAGE_SUBSET_PLATFORM
        short usSubsetEncoding,   // CREATE_FONT_PACKAGE_SUBSET_ENCODING
        ShortByReference pusSubsetKeepList,   // WORD*
        short usSubsetListCount,   // WORD
        Callback lpfnAllocate,   // CFP_ALLOCPROC
        Callback lpfnReAllocate,   // CFP_REALLOCPROC
        Callback lpfnFree,   // CFP_FREEPROC
        Pointer lpvReserved   // void* in/out
    );
}
@[Link("fontsub")]
lib LibFONTSUB
  fun CreateFontPackage = CreateFontPackage(
    puchSrcBuffer : UInt8*,   # BYTE*
    ulSrcBufferSize : UInt32,   # DWORD
    ppuchFontPackageBuffer : UInt8**,   # BYTE** in/out
    pulFontPackageBufferSize : UInt32*,   # DWORD* in/out
    pulBytesWritten : UInt32*,   # DWORD* in/out
    usFlag : UInt16,   # WORD
    usTTCIndex : UInt16,   # WORD
    usSubsetFormat : UInt16,   # WORD
    usSubsetLanguage : UInt16,   # WORD
    usSubsetPlatform : Int16,   # CREATE_FONT_PACKAGE_SUBSET_PLATFORM
    usSubsetEncoding : Int16,   # CREATE_FONT_PACKAGE_SUBSET_ENCODING
    pusSubsetKeepList : UInt16*,   # WORD*
    usSubsetListCount : UInt16,   # WORD
    lpfnAllocate : Void*,   # CFP_ALLOCPROC
    lpfnReAllocate : Void*,   # CFP_REALLOCPROC
    lpfnFree : Void*,   # CFP_FREEPROC
    lpvReserved : Void*   # void* in/out
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef CreateFontPackageNative = Uint32 Function(Pointer<Uint8>, Uint32, Pointer<Uint8>, Pointer<Uint32>, Pointer<Uint32>, Uint16, Uint16, Uint16, Uint16, Int16, Int16, Pointer<Uint16>, Uint16, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
typedef CreateFontPackageDart = int Function(Pointer<Uint8>, int, Pointer<Uint8>, Pointer<Uint32>, Pointer<Uint32>, int, int, int, int, int, int, Pointer<Uint16>, int, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
final CreateFontPackage = DynamicLibrary.open('FONTSUB.dll')
    .lookupFunction<CreateFontPackageNative, CreateFontPackageDart>('CreateFontPackage');
// puchSrcBuffer : BYTE* -> Pointer<Uint8>
// ulSrcBufferSize : DWORD -> Uint32
// ppuchFontPackageBuffer : BYTE** in/out -> Pointer<Uint8>
// pulFontPackageBufferSize : DWORD* in/out -> Pointer<Uint32>
// pulBytesWritten : DWORD* in/out -> Pointer<Uint32>
// usFlag : WORD -> Uint16
// usTTCIndex : WORD -> Uint16
// usSubsetFormat : WORD -> Uint16
// usSubsetLanguage : WORD -> Uint16
// usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM -> Int16
// usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING -> Int16
// pusSubsetKeepList : WORD* -> Pointer<Uint16>
// usSubsetListCount : WORD -> Uint16
// lpfnAllocate : CFP_ALLOCPROC -> Pointer<Void>
// lpfnReAllocate : CFP_REALLOCPROC -> Pointer<Void>
// lpfnFree : CFP_FREEPROC -> Pointer<Void>
// lpvReserved : void* in/out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CreateFontPackage(
  puchSrcBuffer: Pointer;   // BYTE*
  ulSrcBufferSize: DWORD;   // DWORD
  ppuchFontPackageBuffer: Pointer;   // BYTE** in/out
  pulFontPackageBufferSize: Pointer;   // DWORD* in/out
  pulBytesWritten: Pointer;   // DWORD* in/out
  usFlag: Word;   // WORD
  usTTCIndex: Word;   // WORD
  usSubsetFormat: Word;   // WORD
  usSubsetLanguage: Word;   // WORD
  usSubsetPlatform: Smallint;   // CREATE_FONT_PACKAGE_SUBSET_PLATFORM
  usSubsetEncoding: Smallint;   // CREATE_FONT_PACKAGE_SUBSET_ENCODING
  pusSubsetKeepList: Pointer;   // WORD*
  usSubsetListCount: Word;   // WORD
  lpfnAllocate: Pointer;   // CFP_ALLOCPROC
  lpfnReAllocate: Pointer;   // CFP_REALLOCPROC
  lpfnFree: Pointer;   // CFP_FREEPROC
  lpvReserved: Pointer   // void* in/out
): DWORD; cdecl;
  external 'FONTSUB.dll' name 'CreateFontPackage';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import ccall safe "CreateFontPackage"
  c_CreateFontPackage :: Ptr Word8 -> Word32 -> Ptr Word8 -> Ptr Word32 -> Ptr Word32 -> Word16 -> Word16 -> Word16 -> Word16 -> Int16 -> Int16 -> Ptr Word16 -> Word16 -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> IO Word32
-- puchSrcBuffer : BYTE* -> Ptr Word8
-- ulSrcBufferSize : DWORD -> Word32
-- ppuchFontPackageBuffer : BYTE** in/out -> Ptr Word8
-- pulFontPackageBufferSize : DWORD* in/out -> Ptr Word32
-- pulBytesWritten : DWORD* in/out -> Ptr Word32
-- usFlag : WORD -> Word16
-- usTTCIndex : WORD -> Word16
-- usSubsetFormat : WORD -> Word16
-- usSubsetLanguage : WORD -> Word16
-- usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM -> Int16
-- usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING -> Int16
-- pusSubsetKeepList : WORD* -> Ptr Word16
-- usSubsetListCount : WORD -> Word16
-- lpfnAllocate : CFP_ALLOCPROC -> Ptr ()
-- lpfnReAllocate : CFP_REALLOCPROC -> Ptr ()
-- lpfnFree : CFP_FREEPROC -> Ptr ()
-- lpvReserved : void* in/out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let createfontpackage =
  foreign "CreateFontPackage"
    ((ptr uint8_t) @-> uint32_t @-> (ptr uint8_t) @-> (ptr uint32_t) @-> (ptr uint32_t) @-> uint16_t @-> uint16_t @-> uint16_t @-> uint16_t @-> int16_t @-> int16_t @-> (ptr uint16_t) @-> uint16_t @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> returning uint32_t)
(* puchSrcBuffer : BYTE* -> (ptr uint8_t) *)
(* ulSrcBufferSize : DWORD -> uint32_t *)
(* ppuchFontPackageBuffer : BYTE** in/out -> (ptr uint8_t) *)
(* pulFontPackageBufferSize : DWORD* in/out -> (ptr uint32_t) *)
(* pulBytesWritten : DWORD* in/out -> (ptr uint32_t) *)
(* usFlag : WORD -> uint16_t *)
(* usTTCIndex : WORD -> uint16_t *)
(* usSubsetFormat : WORD -> uint16_t *)
(* usSubsetLanguage : WORD -> uint16_t *)
(* usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM -> int16_t *)
(* usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING -> int16_t *)
(* pusSubsetKeepList : WORD* -> (ptr uint16_t) *)
(* usSubsetListCount : WORD -> uint16_t *)
(* lpfnAllocate : CFP_ALLOCPROC -> (ptr void) *)
(* lpfnReAllocate : CFP_REALLOCPROC -> (ptr void) *)
(* lpfnFree : CFP_FREEPROC -> (ptr void) *)
(* lpvReserved : void* in/out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library fontsub (t "FONTSUB.dll"))
(cffi:use-foreign-library fontsub)

(cffi:defcfun ("CreateFontPackage" create-font-package :convention :cdecl) :uint32
  (puch-src-buffer :pointer)   ; BYTE*
  (ul-src-buffer-size :uint32)   ; DWORD
  (ppuch-font-package-buffer :pointer)   ; BYTE** in/out
  (pul-font-package-buffer-size :pointer)   ; DWORD* in/out
  (pul-bytes-written :pointer)   ; DWORD* in/out
  (us-flag :uint16)   ; WORD
  (us-ttcindex :uint16)   ; WORD
  (us-subset-format :uint16)   ; WORD
  (us-subset-language :uint16)   ; WORD
  (us-subset-platform :int16)   ; CREATE_FONT_PACKAGE_SUBSET_PLATFORM
  (us-subset-encoding :int16)   ; CREATE_FONT_PACKAGE_SUBSET_ENCODING
  (pus-subset-keep-list :pointer)   ; WORD*
  (us-subset-list-count :uint16)   ; WORD
  (lpfn-allocate :pointer)   ; CFP_ALLOCPROC
  (lpfn-re-allocate :pointer)   ; CFP_REALLOCPROC
  (lpfn-free :pointer)   ; CFP_FREEPROC
  (lpv-reserved :pointer))   ; void* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CreateFontPackage = Win32::API::More->new('FONTSUB',
    'DWORD CreateFontPackage(LPVOID puchSrcBuffer, DWORD ulSrcBufferSize, LPVOID ppuchFontPackageBuffer, LPVOID pulFontPackageBufferSize, LPVOID pulBytesWritten, WORD usFlag, WORD usTTCIndex, WORD usSubsetFormat, WORD usSubsetLanguage, short usSubsetPlatform, short usSubsetEncoding, LPVOID pusSubsetKeepList, WORD usSubsetListCount, LPVOID lpfnAllocate, LPVOID lpfnReAllocate, LPVOID lpfnFree, LPVOID lpvReserved)');
# my $ret = $CreateFontPackage->Call($puchSrcBuffer, $ulSrcBufferSize, $ppuchFontPackageBuffer, $pulFontPackageBufferSize, $pulBytesWritten, $usFlag, $usTTCIndex, $usSubsetFormat, $usSubsetLanguage, $usSubsetPlatform, $usSubsetEncoding, $pusSubsetKeepList, $usSubsetListCount, $lpfnAllocate, $lpfnReAllocate, $lpfnFree, $lpvReserved);
# puchSrcBuffer : BYTE* -> LPVOID
# ulSrcBufferSize : DWORD -> DWORD
# ppuchFontPackageBuffer : BYTE** in/out -> LPVOID
# pulFontPackageBufferSize : DWORD* in/out -> LPVOID
# pulBytesWritten : DWORD* in/out -> LPVOID
# usFlag : WORD -> WORD
# usTTCIndex : WORD -> WORD
# usSubsetFormat : WORD -> WORD
# usSubsetLanguage : WORD -> WORD
# usSubsetPlatform : CREATE_FONT_PACKAGE_SUBSET_PLATFORM -> short
# usSubsetEncoding : CREATE_FONT_PACKAGE_SUBSET_ENCODING -> short
# pusSubsetKeepList : WORD* -> LPVOID
# usSubsetListCount : WORD -> WORD
# lpfnAllocate : CFP_ALLOCPROC -> LPVOID
# lpfnReAllocate : CFP_REALLOCPROC -> LPVOID
# lpfnFree : CFP_FREEPROC -> LPVOID
# lpvReserved : void* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# コールバック(関数ポインタ)は Perl sub を直接渡せません。Win32::API::Callback を使用してください。

関連項目

公式の関連項目
使用する型