CreateFontPackage
関数シグネチャ
// 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
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| puchSrcBuffer | BYTE* | in | サブセット化の対象となるフォントを記述した、ソースの TTF または TTC データを格納するバッファーを指します。 | ||||||||||
| ulSrcBufferSize | DWORD | in | *puchSrcBuffer のサイズをバイト単位で指定します。 | ||||||||||
| ppuchFontPackageBuffer | BYTE** | inout | unsigned char* 型の変数を指します。CreateFontPackage 関数は、lpfnAllocate および lpfnReAllocate を使用してバッファー **puchFontPackageBuffer を割り当てます。正常に復帰した場合、このバッファーにはサブセットフォントまたはフォントパッケージが格納されます。最終的にバッファーを解放する責任はアプリケーションにあります。 | ||||||||||
| pulFontPackageBufferSize | DWORD* | inout | unsigned long を指します。正常に復帰した場合、バッファー **puchFontPackageBuffer に割り当てられたサイズが格納されます。 | ||||||||||
| pulBytesWritten | DWORD* | inout | unsigned long を指します。正常に復帰した場合、バッファー **puchFontPackageBuffer で実際に使用されたバイト数が格納されます。 | ||||||||||
| usFlag | WORD | in | このフォントをサブセット化するか、圧縮するか、またはその両方を行うか、フォントが TTF か TTC か、および *pusSubsetKeepList が文字コードを表すかグリフインデックスを表すかを指定します。次のフラグを任意に組み合わせて指定できます。 | ||||||||||
| usTTCIndex | WORD | in | 0 から始まる TTC インデックス。usFlags に TTFCFP_FLAGS_TTC が設定されている場合にのみ使用されます。 | ||||||||||
| usSubsetFormat | WORD | in | 作成するファイルの形式。次のいずれかの値を選択します。これらは組み合わせることはできません。
| ||||||||||
| usSubsetLanguage | WORD | in | Name テーブル内で保持する言語。0 に設定すると、すべての言語が保持されます。初回のサブセット化でのみ使用されます。すなわち、usSubsetFormat が TTFCFP_SUBSET または TTFCFP_SUBSET1 のいずれかであり、かつ usFlags に TTFCFP_FLAGS_SUBSET フラグが設定されている場合にのみ使用されます。 | ||||||||||
| usSubsetPlatform | CREATE_FONT_PACKAGE_SUBSET_PLATFORM | in | usSubsetEncoding と組み合わせて、使用する CMAP を指定します。*pusSubsetKeepList が文字のリストである場合、すなわち usFlags に TTFCFP_FLAGS_GLYPHLIST が設定されていない場合にのみ使用されます。その場合、この CMAP サブテーブルが pusSubsetKeepList に適用され、出力フォントまたはフォントパッケージに保持するグリフのリストが作成されます。 使用する場合は、次のいずれかの値でなければなりません。これらは組み合わせることはできません。
| ||||||||||
| usSubsetEncoding | CREATE_FONT_PACKAGE_SUBSET_ENCODING | in | usSubsetPlatform と組み合わせて、使用する CMAP を指定します。*pusSubsetKeepList が文字のリストである場合、すなわち usFlags に TTFCFP_FLAGS_GLYPHLIST が設定されていない場合にのみ使用されます。 使用する場合は、次のいずれかの値でなければなりません。これらは組み合わせることはできません。
| ||||||||||
| pusSubsetKeepList | WORD* | in | 出力フォントまたはフォントパッケージに保持すべき文字コードまたはグリフインデックスのリストを構成する整数の配列を指します。このリストに文字コードが含まれる場合(すなわち usFlags に TTFCFP_FLAGS_GLYPHLIST が設定されていない場合)、このリストは usSubsetPlatform および usSubsetEncoding で指定された Platform-Encoding CMAP に応じて、Unicode または他の種類のエンコーディングのいずれかになります。 | ||||||||||
| usSubsetListCount | WORD | in | リスト *pusSubsetKeepList 内の要素数。 | ||||||||||
| lpfnAllocate | CFP_ALLOCPROC | in | puchFontPackageBuffer および一時バッファー用の初期メモリを割り当てるコールバック関数。 | ||||||||||
| lpfnReAllocate | CFP_REALLOCPROC | in | puchFontPackageBuffer および一時バッファー用のメモリを再割り当てするコールバック関数。 | ||||||||||
| lpfnFree | CFP_FREEPROC | in | lpfnAllocate および lpfnReAllocate によって割り当てられたメモリを解放するコールバック関数。 | ||||||||||
| lpvReserved | void* | inout | NULL に設定する必要があります。 |
戻り値の型: DWORD
公式ドキュメント
CreateFontPackage 関数は、指定された TrueType フォントのサブセット版を作成します。通常は、これをプリンターに渡すために使用します。
戻り値
関数が成功した場合は 0 を返します。
それ以外の場合は 0 以外の値を返します。発生し得るエラーの戻り値については、Font-Package Function Error Messages を参照してください。
解説(Remarks)
usSubsetFormat に TTFCFP_SUBSET の値を指定すると、フォントパッケージではなく、直接動作可能なフォントを作成できます。これは後でのマージを許可しませんが、マージが不要な場合は、下流の処理における 1 つのステップを省略できます。フォントパッケージは、使用する前に動作可能なフォントへ変換し直す必要があるためです。
usSubsetFormat に TTFCFP_SUBSET1 の値を指定すると、後でのマージを可能にするフォントパッケージを作成できます。たとえば、アプリケーションが大規模な印刷ジョブの開始時にこの関数を呼び出す場合を考えてみましょう。印刷ジョブの途中で、アプリケーションは構築したサブセットに含まれていないグリフが必要であることに気付きます。その場合、アプリケーションは CreateFontPackage を再度呼び出し、今度は usSubsetFormat に TTFCFP_DELTA の値を指定できます。プリンターは MergeFontPackage を使用して、これらの追加グリフをマージできます。
CMAP は文字エンコーディングからグリフへのマッピングを行います。*pusSubsetKeepList が文字値のリストである場合、アプリケーションは usSubsetPlatform および usSubsetEncoding パラメーターを使用して、使用する CMAP の種類を指定し、文字値をグリフにマッピングできるようにします。
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 方式にも切替可。#uselib "FONTSUB.dll" #cfunc global CreateFontPackage "CreateFontPackage" sptr, int, sptr, sptr, sptr, int, int, int, int, int, int, sptr, int, sptr, sptr, sptr, sptr ; res = CreateFontPackage(varptr(puchSrcBuffer), ulSrcBufferSize, varptr(ppuchFontPackageBuffer), varptr(pulFontPackageBufferSize), varptr(pulBytesWritten), usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, varptr(pusSubsetKeepList), usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved) ; puchSrcBuffer : BYTE* -> "sptr" ; ulSrcBufferSize : DWORD -> "int" ; ppuchFontPackageBuffer : BYTE** in/out -> "sptr" ; pulFontPackageBufferSize : DWORD* in/out -> "sptr" ; pulBytesWritten : DWORD* in/out -> "sptr" ; 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* -> "sptr" ; usSubsetListCount : WORD -> "int" ; lpfnAllocate : CFP_ALLOCPROC -> "sptr" ; lpfnReAllocate : CFP_REALLOCPROC -> "sptr" ; lpfnFree : CFP_FREEPROC -> "sptr" ; lpvReserved : void* in/out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは 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 方式にも切替可。; 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" intptr, int, intptr, intptr, intptr, int, int, int, int, int, int, intptr, int, intptr, intptr, intptr, intptr ; res = CreateFontPackage(varptr(puchSrcBuffer), ulSrcBufferSize, varptr(ppuchFontPackageBuffer), varptr(pulFontPackageBufferSize), varptr(pulBytesWritten), usFlag, usTTCIndex, usSubsetFormat, usSubsetLanguage, usSubsetPlatform, usSubsetEncoding, varptr(pusSubsetKeepList), usSubsetListCount, lpfnAllocate, lpfnReAllocate, lpfnFree, lpvReserved) ; puchSrcBuffer : BYTE* -> "intptr" ; ulSrcBufferSize : DWORD -> "int" ; ppuchFontPackageBuffer : BYTE** in/out -> "intptr" ; pulFontPackageBufferSize : DWORD* in/out -> "intptr" ; pulBytesWritten : DWORD* in/out -> "intptr" ; 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* -> "intptr" ; usSubsetListCount : WORD -> "int" ; lpfnAllocate : CFP_ALLOCPROC -> "intptr" ; lpfnReAllocate : CFP_REALLOCPROC -> "intptr" ; lpfnFree : CFP_FREEPROC -> "intptr" ; lpvReserved : void* in/out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは 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 // DWORDfunction 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 を使用してください。関連項目
- f MergeFontPackage — サブセットフォントパッケージを統合して完全なフォントを再構成する。