ScriptPlaceOpenType
関数シグネチャ
// USP10.dll
#include <windows.h>
HRESULT ScriptPlaceOpenType(
HDC hdc, // optional
void** psc,
SCRIPT_ANALYSIS* psa,
DWORD tagScript,
DWORD tagLangSys,
INT* rcRangeChars, // optional
TEXTRANGE_PROPERTIES** rpRangeProperties, // optional
INT cRanges,
LPCWSTR pwcChars,
WORD* pwLogClust,
SCRIPT_CHARPROP* pCharProps,
INT cChars,
const WORD* pwGlyphs,
const SCRIPT_GLYPHPROP* pGlyphProps,
INT cGlyphs,
INT* piAdvance,
GOFFSET* pGoffset,
ABC* pABC // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| hdc | HDC | inoptional | デバイスコンテキストのハンドル。詳細については、Caching を参照してください。 |
| psc | void** | inout | スクリプトキャッシュを識別する SCRIPT_CACHE 構造体へのポインター。 |
| psa | SCRIPT_ANALYSIS* | inout | 以前の ScriptItemizeOpenType 呼び出しから取得した SCRIPT_ANALYSIS 構造体へのポインター。この構造体は、生成されるグリフのリスト、それに関連付けられた幅、および x・y の配置オフセットを制御するシェーピングエンジンを識別します。 また、アプリケーションはこのパラメーターに NULL を設定して、フィルタリングされていない結果を受け取ることもできます。 |
| tagScript | DWORD | in | 使用する文字体系の OpenType スクリプトタグを格納した OPENTYPE_TAG 構造体。 |
| tagLangSys | DWORD | in | 文字体系の OpenType 言語タグを格納した OPENTYPE_TAG 構造体。 |
| rcRangeChars | INT* | inoptional | 各範囲に含まれる文字数の配列。要素数は cRanges パラメーターで示されます。値の合計は cChars の値と等しくなる必要があります。 |
| rpRangeProperties | TEXTRANGE_PROPERTIES** | inoptional | 各範囲のプロパティを定義する TEXTRANGE_PROPERTIES 構造体の配列。要素数は cRanges パラメーターで定義されます。 |
| cRanges | INT | in | OpenType 機能範囲の数。 |
| pwcChars | LPCWSTR | in | ランを構成する Unicode 文字の配列へのポインター。要素数は cRanges パラメーターで定義されます。 |
| pwLogClust | WORD* | in | 論理クラスター情報の配列へのポインター。配列の各要素は、pwcChars で定義される配列内の文字に対応します。各要素の値は、ラン内の最初のグリフから、対応する文字を含むクラスターの最初のグリフまでのオフセットです。SCRIPT_ANALYSIS 構造体の fRTL メンバーが TRUE に設定されている場合、pwLogClust の要素は配列を読み進めるにつれて減少することに注意してください。 |
| pCharProps | SCRIPT_CHARPROP* | in | Unicode ラン内の文字プロパティ値の配列へのポインター。 |
| cChars | INT | in | Unicode ラン内の文字数。 |
| pwGlyphs | WORD* | in | 以前の ScriptShapeOpenType 関数の呼び出しから取得したグリフバッファーへのポインター。 |
| pGlyphProps | SCRIPT_GLYPHPROP* | in | 取得する各グリフの属性の配列へのポインター。値の数は cGlyphs の値と等しくなります。グリフごとに 1 つのグリフプロパティが存在するため、このパラメーターの要素数は cGlyphs で示されます。 |
| cGlyphs | INT | in | グリフ配列バッファー内のグリフ数。 |
| piAdvance | INT* | out | この関数が advance width(送り幅)情報を取得する、cGlyphs で示される長さの配列へのポインター。 |
| pGoffset | GOFFSET* | out | この関数が結合グリフの x・y オフセットを取得する GOFFSET 構造体の配列へのポインター。この配列の長さは cGlyphs で示される値である必要があります。 |
| pABC | ABC* | outoptional | この関数が run 全体の ABC width(ABC 幅)を取得する ABC 構造体へのポインター。 |
戻り値の型: HRESULT
公式ドキュメント
ScriptShapeOpenType の出力に基づき、OpenType 情報を用いて Unicode ラン(run)のグリフと視覚的な属性を生成します。
戻り値
成功した場合は 0 を返します。失敗した場合は 0 以外の HRESULT 値を返します。すべてのエラーケースにおいて、出力値は未定義です。アプリケーションは SUCCEEDED および FAILED マクロを使用して戻り値をテストできます。
cGlyphs で示される出力バッファーの長さが小さすぎる場合、この関数は E_OUTOFMEMORY を返します。アプリケーションは、より大きなバッファーで再度呼び出すことを試みることができます。
psc パラメーターで指定されたスクリプトキャッシュにグリフを配置するための十分な情報が含まれておらず、かつ hdc パラメーターが NULL として渡されたために関数が配置処理を完了できない場合、この関数は E_PENDING を返します。アプリケーションは、ランに対して正しいデバイスコンテキストを設定し、hdc に適切な値を指定したうえで、他のすべてのパラメーターを同じにしてこの関数を再度呼び出す必要があります。
解説(Remarks)
この関数は、古い ScriptPlace 関数よりも推奨されます。ScriptPlaceOpenType の利点には次のようなものがあります。
- パラメーターがフォントレイアウトテーブル内の OpenType タグに直接対応します。
- パラメーターによって各文字に適用される機能が定義されます。入力は複数の範囲に分割され、各範囲には OpenType プロパティが関連付けられます。
psa パラメーターで示される SCRIPT_ANALYSIS 構造体の fLogicalOrder メンバーが設定されていない限り、すべての配列は視覚順(visual order)で並びます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// USP10.dll
#include <windows.h>
HRESULT ScriptPlaceOpenType(
HDC hdc, // optional
void** psc,
SCRIPT_ANALYSIS* psa,
DWORD tagScript,
DWORD tagLangSys,
INT* rcRangeChars, // optional
TEXTRANGE_PROPERTIES** rpRangeProperties, // optional
INT cRanges,
LPCWSTR pwcChars,
WORD* pwLogClust,
SCRIPT_CHARPROP* pCharProps,
INT cChars,
const WORD* pwGlyphs,
const SCRIPT_GLYPHPROP* pGlyphProps,
INT cGlyphs,
INT* piAdvance,
GOFFSET* pGoffset,
ABC* pABC // optional
);[DllImport("USP10.dll", ExactSpelling = true)]
static extern int ScriptPlaceOpenType(
IntPtr hdc, // HDC optional
IntPtr psc, // void** in/out
IntPtr psa, // SCRIPT_ANALYSIS* in/out
uint tagScript, // DWORD
uint tagLangSys, // DWORD
IntPtr rcRangeChars, // INT* optional
IntPtr rpRangeProperties, // TEXTRANGE_PROPERTIES** optional
int cRanges, // INT
[MarshalAs(UnmanagedType.LPWStr)] string pwcChars, // LPCWSTR
ref ushort pwLogClust, // WORD*
IntPtr pCharProps, // SCRIPT_CHARPROP*
int cChars, // INT
ref ushort pwGlyphs, // WORD*
IntPtr pGlyphProps, // SCRIPT_GLYPHPROP*
int cGlyphs, // INT
out int piAdvance, // INT* out
IntPtr pGoffset, // GOFFSET* out
IntPtr pABC // ABC* optional, out
);<DllImport("USP10.dll", ExactSpelling:=True)>
Public Shared Function ScriptPlaceOpenType(
hdc As IntPtr, ' HDC optional
psc As IntPtr, ' void** in/out
psa As IntPtr, ' SCRIPT_ANALYSIS* in/out
tagScript As UInteger, ' DWORD
tagLangSys As UInteger, ' DWORD
rcRangeChars As IntPtr, ' INT* optional
rpRangeProperties As IntPtr, ' TEXTRANGE_PROPERTIES** optional
cRanges As Integer, ' INT
<MarshalAs(UnmanagedType.LPWStr)> pwcChars As String, ' LPCWSTR
ByRef pwLogClust As UShort, ' WORD*
pCharProps As IntPtr, ' SCRIPT_CHARPROP*
cChars As Integer, ' INT
ByRef pwGlyphs As UShort, ' WORD*
pGlyphProps As IntPtr, ' SCRIPT_GLYPHPROP*
cGlyphs As Integer, ' INT
<Out> ByRef piAdvance As Integer, ' INT* out
pGoffset As IntPtr, ' GOFFSET* out
pABC As IntPtr ' ABC* optional, out
) As Integer
End Function' hdc : HDC optional
' psc : void** in/out
' psa : SCRIPT_ANALYSIS* in/out
' tagScript : DWORD
' tagLangSys : DWORD
' rcRangeChars : INT* optional
' rpRangeProperties : TEXTRANGE_PROPERTIES** optional
' cRanges : INT
' pwcChars : LPCWSTR
' pwLogClust : WORD*
' pCharProps : SCRIPT_CHARPROP*
' cChars : INT
' pwGlyphs : WORD*
' pGlyphProps : SCRIPT_GLYPHPROP*
' cGlyphs : INT
' piAdvance : INT* out
' pGoffset : GOFFSET* out
' pABC : ABC* optional, out
Declare PtrSafe Function ScriptPlaceOpenType Lib "usp10" ( _
ByVal hdc As LongPtr, _
ByVal psc As LongPtr, _
ByVal psa As LongPtr, _
ByVal tagScript As Long, _
ByVal tagLangSys As Long, _
ByVal rcRangeChars As LongPtr, _
ByVal rpRangeProperties As LongPtr, _
ByVal cRanges As Long, _
ByVal pwcChars As LongPtr, _
ByRef pwLogClust As Integer, _
ByVal pCharProps As LongPtr, _
ByVal cChars As Long, _
ByRef pwGlyphs As Integer, _
ByVal pGlyphProps As LongPtr, _
ByVal cGlyphs As Long, _
ByRef piAdvance As Long, _
ByVal pGoffset As LongPtr, _
ByVal pABC As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
ScriptPlaceOpenType = ctypes.windll.usp10.ScriptPlaceOpenType
ScriptPlaceOpenType.restype = ctypes.c_int
ScriptPlaceOpenType.argtypes = [
wintypes.HANDLE, # hdc : HDC optional
ctypes.c_void_p, # psc : void** in/out
ctypes.c_void_p, # psa : SCRIPT_ANALYSIS* in/out
wintypes.DWORD, # tagScript : DWORD
wintypes.DWORD, # tagLangSys : DWORD
ctypes.POINTER(ctypes.c_int), # rcRangeChars : INT* optional
ctypes.c_void_p, # rpRangeProperties : TEXTRANGE_PROPERTIES** optional
ctypes.c_int, # cRanges : INT
wintypes.LPCWSTR, # pwcChars : LPCWSTR
ctypes.POINTER(ctypes.c_ushort), # pwLogClust : WORD*
ctypes.c_void_p, # pCharProps : SCRIPT_CHARPROP*
ctypes.c_int, # cChars : INT
ctypes.POINTER(ctypes.c_ushort), # pwGlyphs : WORD*
ctypes.c_void_p, # pGlyphProps : SCRIPT_GLYPHPROP*
ctypes.c_int, # cGlyphs : INT
ctypes.POINTER(ctypes.c_int), # piAdvance : INT* out
ctypes.c_void_p, # pGoffset : GOFFSET* out
ctypes.c_void_p, # pABC : ABC* optional, out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('USP10.dll')
ScriptPlaceOpenType = Fiddle::Function.new(
lib['ScriptPlaceOpenType'],
[
Fiddle::TYPE_VOIDP, # hdc : HDC optional
Fiddle::TYPE_VOIDP, # psc : void** in/out
Fiddle::TYPE_VOIDP, # psa : SCRIPT_ANALYSIS* in/out
-Fiddle::TYPE_INT, # tagScript : DWORD
-Fiddle::TYPE_INT, # tagLangSys : DWORD
Fiddle::TYPE_VOIDP, # rcRangeChars : INT* optional
Fiddle::TYPE_VOIDP, # rpRangeProperties : TEXTRANGE_PROPERTIES** optional
Fiddle::TYPE_INT, # cRanges : INT
Fiddle::TYPE_VOIDP, # pwcChars : LPCWSTR
Fiddle::TYPE_VOIDP, # pwLogClust : WORD*
Fiddle::TYPE_VOIDP, # pCharProps : SCRIPT_CHARPROP*
Fiddle::TYPE_INT, # cChars : INT
Fiddle::TYPE_VOIDP, # pwGlyphs : WORD*
Fiddle::TYPE_VOIDP, # pGlyphProps : SCRIPT_GLYPHPROP*
Fiddle::TYPE_INT, # cGlyphs : INT
Fiddle::TYPE_VOIDP, # piAdvance : INT* out
Fiddle::TYPE_VOIDP, # pGoffset : GOFFSET* out
Fiddle::TYPE_VOIDP, # pABC : ABC* optional, out
],
Fiddle::TYPE_INT)#[link(name = "usp10")]
extern "system" {
fn ScriptPlaceOpenType(
hdc: *mut core::ffi::c_void, // HDC optional
psc: *mut *mut (), // void** in/out
psa: *mut SCRIPT_ANALYSIS, // SCRIPT_ANALYSIS* in/out
tagScript: u32, // DWORD
tagLangSys: u32, // DWORD
rcRangeChars: *mut i32, // INT* optional
rpRangeProperties: *mut *mut TEXTRANGE_PROPERTIES, // TEXTRANGE_PROPERTIES** optional
cRanges: i32, // INT
pwcChars: *const u16, // LPCWSTR
pwLogClust: *mut u16, // WORD*
pCharProps: *mut SCRIPT_CHARPROP, // SCRIPT_CHARPROP*
cChars: i32, // INT
pwGlyphs: *const u16, // WORD*
pGlyphProps: *const SCRIPT_GLYPHPROP, // SCRIPT_GLYPHPROP*
cGlyphs: i32, // INT
piAdvance: *mut i32, // INT* out
pGoffset: *mut GOFFSET, // GOFFSET* out
pABC: *mut ABC // ABC* optional, out
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("USP10.dll")]
public static extern int ScriptPlaceOpenType(IntPtr hdc, IntPtr psc, IntPtr psa, uint tagScript, uint tagLangSys, IntPtr rcRangeChars, IntPtr rpRangeProperties, int cRanges, [MarshalAs(UnmanagedType.LPWStr)] string pwcChars, ref ushort pwLogClust, IntPtr pCharProps, int cChars, ref ushort pwGlyphs, IntPtr pGlyphProps, int cGlyphs, out int piAdvance, IntPtr pGoffset, IntPtr pABC);
"@
$api = Add-Type -MemberDefinition $sig -Name 'USP10_ScriptPlaceOpenType' -Namespace Win32 -PassThru
# $api::ScriptPlaceOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, pwLogClust, pCharProps, cChars, pwGlyphs, pGlyphProps, cGlyphs, piAdvance, pGoffset, pABC)#uselib "USP10.dll"
#func global ScriptPlaceOpenType "ScriptPlaceOpenType" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; ScriptPlaceOpenType hdc, psc, varptr(psa), tagScript, tagLangSys, varptr(rcRangeChars), varptr(rpRangeProperties), cRanges, pwcChars, varptr(pwLogClust), varptr(pCharProps), cChars, varptr(pwGlyphs), varptr(pGlyphProps), cGlyphs, varptr(piAdvance), varptr(pGoffset), varptr(pABC) ; 戻り値は stat
; hdc : HDC optional -> "sptr"
; psc : void** in/out -> "sptr"
; psa : SCRIPT_ANALYSIS* in/out -> "sptr"
; tagScript : DWORD -> "sptr"
; tagLangSys : DWORD -> "sptr"
; rcRangeChars : INT* optional -> "sptr"
; rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> "sptr"
; cRanges : INT -> "sptr"
; pwcChars : LPCWSTR -> "sptr"
; pwLogClust : WORD* -> "sptr"
; pCharProps : SCRIPT_CHARPROP* -> "sptr"
; cChars : INT -> "sptr"
; pwGlyphs : WORD* -> "sptr"
; pGlyphProps : SCRIPT_GLYPHPROP* -> "sptr"
; cGlyphs : INT -> "sptr"
; piAdvance : INT* out -> "sptr"
; pGoffset : GOFFSET* out -> "sptr"
; pABC : ABC* optional, out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "USP10.dll" #cfunc global ScriptPlaceOpenType "ScriptPlaceOpenType" sptr, sptr, var, int, int, var, var, int, wstr, var, var, int, var, var, int, var, var, var ; res = ScriptPlaceOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, pwLogClust, pCharProps, cChars, pwGlyphs, pGlyphProps, cGlyphs, piAdvance, pGoffset, pABC) ; hdc : HDC optional -> "sptr" ; psc : void** in/out -> "sptr" ; psa : SCRIPT_ANALYSIS* in/out -> "var" ; tagScript : DWORD -> "int" ; tagLangSys : DWORD -> "int" ; rcRangeChars : INT* optional -> "var" ; rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> "var" ; cRanges : INT -> "int" ; pwcChars : LPCWSTR -> "wstr" ; pwLogClust : WORD* -> "var" ; pCharProps : SCRIPT_CHARPROP* -> "var" ; cChars : INT -> "int" ; pwGlyphs : WORD* -> "var" ; pGlyphProps : SCRIPT_GLYPHPROP* -> "var" ; cGlyphs : INT -> "int" ; piAdvance : INT* out -> "var" ; pGoffset : GOFFSET* out -> "var" ; pABC : ABC* optional, out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "USP10.dll" #cfunc global ScriptPlaceOpenType "ScriptPlaceOpenType" sptr, sptr, sptr, int, int, sptr, sptr, int, wstr, sptr, sptr, int, sptr, sptr, int, sptr, sptr, sptr ; res = ScriptPlaceOpenType(hdc, psc, varptr(psa), tagScript, tagLangSys, varptr(rcRangeChars), varptr(rpRangeProperties), cRanges, pwcChars, varptr(pwLogClust), varptr(pCharProps), cChars, varptr(pwGlyphs), varptr(pGlyphProps), cGlyphs, varptr(piAdvance), varptr(pGoffset), varptr(pABC)) ; hdc : HDC optional -> "sptr" ; psc : void** in/out -> "sptr" ; psa : SCRIPT_ANALYSIS* in/out -> "sptr" ; tagScript : DWORD -> "int" ; tagLangSys : DWORD -> "int" ; rcRangeChars : INT* optional -> "sptr" ; rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> "sptr" ; cRanges : INT -> "int" ; pwcChars : LPCWSTR -> "wstr" ; pwLogClust : WORD* -> "sptr" ; pCharProps : SCRIPT_CHARPROP* -> "sptr" ; cChars : INT -> "int" ; pwGlyphs : WORD* -> "sptr" ; pGlyphProps : SCRIPT_GLYPHPROP* -> "sptr" ; cGlyphs : INT -> "int" ; piAdvance : INT* out -> "sptr" ; pGoffset : GOFFSET* out -> "sptr" ; pABC : ABC* optional, out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; HRESULT ScriptPlaceOpenType(HDC hdc, void** psc, SCRIPT_ANALYSIS* psa, DWORD tagScript, DWORD tagLangSys, INT* rcRangeChars, TEXTRANGE_PROPERTIES** rpRangeProperties, INT cRanges, LPCWSTR pwcChars, WORD* pwLogClust, SCRIPT_CHARPROP* pCharProps, INT cChars, WORD* pwGlyphs, SCRIPT_GLYPHPROP* pGlyphProps, INT cGlyphs, INT* piAdvance, GOFFSET* pGoffset, ABC* pABC) #uselib "USP10.dll" #cfunc global ScriptPlaceOpenType "ScriptPlaceOpenType" intptr, intptr, var, int, int, var, var, int, wstr, var, var, int, var, var, int, var, var, var ; res = ScriptPlaceOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, pwLogClust, pCharProps, cChars, pwGlyphs, pGlyphProps, cGlyphs, piAdvance, pGoffset, pABC) ; hdc : HDC optional -> "intptr" ; psc : void** in/out -> "intptr" ; psa : SCRIPT_ANALYSIS* in/out -> "var" ; tagScript : DWORD -> "int" ; tagLangSys : DWORD -> "int" ; rcRangeChars : INT* optional -> "var" ; rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> "var" ; cRanges : INT -> "int" ; pwcChars : LPCWSTR -> "wstr" ; pwLogClust : WORD* -> "var" ; pCharProps : SCRIPT_CHARPROP* -> "var" ; cChars : INT -> "int" ; pwGlyphs : WORD* -> "var" ; pGlyphProps : SCRIPT_GLYPHPROP* -> "var" ; cGlyphs : INT -> "int" ; piAdvance : INT* out -> "var" ; pGoffset : GOFFSET* out -> "var" ; pABC : ABC* optional, out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; HRESULT ScriptPlaceOpenType(HDC hdc, void** psc, SCRIPT_ANALYSIS* psa, DWORD tagScript, DWORD tagLangSys, INT* rcRangeChars, TEXTRANGE_PROPERTIES** rpRangeProperties, INT cRanges, LPCWSTR pwcChars, WORD* pwLogClust, SCRIPT_CHARPROP* pCharProps, INT cChars, WORD* pwGlyphs, SCRIPT_GLYPHPROP* pGlyphProps, INT cGlyphs, INT* piAdvance, GOFFSET* pGoffset, ABC* pABC) #uselib "USP10.dll" #cfunc global ScriptPlaceOpenType "ScriptPlaceOpenType" intptr, intptr, intptr, int, int, intptr, intptr, int, wstr, intptr, intptr, int, intptr, intptr, int, intptr, intptr, intptr ; res = ScriptPlaceOpenType(hdc, psc, varptr(psa), tagScript, tagLangSys, varptr(rcRangeChars), varptr(rpRangeProperties), cRanges, pwcChars, varptr(pwLogClust), varptr(pCharProps), cChars, varptr(pwGlyphs), varptr(pGlyphProps), cGlyphs, varptr(piAdvance), varptr(pGoffset), varptr(pABC)) ; hdc : HDC optional -> "intptr" ; psc : void** in/out -> "intptr" ; psa : SCRIPT_ANALYSIS* in/out -> "intptr" ; tagScript : DWORD -> "int" ; tagLangSys : DWORD -> "int" ; rcRangeChars : INT* optional -> "intptr" ; rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> "intptr" ; cRanges : INT -> "int" ; pwcChars : LPCWSTR -> "wstr" ; pwLogClust : WORD* -> "intptr" ; pCharProps : SCRIPT_CHARPROP* -> "intptr" ; cChars : INT -> "int" ; pwGlyphs : WORD* -> "intptr" ; pGlyphProps : SCRIPT_GLYPHPROP* -> "intptr" ; cGlyphs : INT -> "int" ; piAdvance : INT* out -> "intptr" ; pGoffset : GOFFSET* out -> "intptr" ; pABC : ABC* optional, out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
usp10 = windows.NewLazySystemDLL("USP10.dll")
procScriptPlaceOpenType = usp10.NewProc("ScriptPlaceOpenType")
)
// hdc (HDC optional), psc (void** in/out), psa (SCRIPT_ANALYSIS* in/out), tagScript (DWORD), tagLangSys (DWORD), rcRangeChars (INT* optional), rpRangeProperties (TEXTRANGE_PROPERTIES** optional), cRanges (INT), pwcChars (LPCWSTR), pwLogClust (WORD*), pCharProps (SCRIPT_CHARPROP*), cChars (INT), pwGlyphs (WORD*), pGlyphProps (SCRIPT_GLYPHPROP*), cGlyphs (INT), piAdvance (INT* out), pGoffset (GOFFSET* out), pABC (ABC* optional, out)
r1, _, err := procScriptPlaceOpenType.Call(
uintptr(hdc),
uintptr(psc),
uintptr(psa),
uintptr(tagScript),
uintptr(tagLangSys),
uintptr(rcRangeChars),
uintptr(rpRangeProperties),
uintptr(cRanges),
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwcChars))),
uintptr(pwLogClust),
uintptr(pCharProps),
uintptr(cChars),
uintptr(pwGlyphs),
uintptr(pGlyphProps),
uintptr(cGlyphs),
uintptr(piAdvance),
uintptr(pGoffset),
uintptr(pABC),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // HRESULTfunction ScriptPlaceOpenType(
hdc: THandle; // HDC optional
psc: Pointer; // void** in/out
psa: Pointer; // SCRIPT_ANALYSIS* in/out
tagScript: DWORD; // DWORD
tagLangSys: DWORD; // DWORD
rcRangeChars: Pointer; // INT* optional
rpRangeProperties: Pointer; // TEXTRANGE_PROPERTIES** optional
cRanges: Integer; // INT
pwcChars: PWideChar; // LPCWSTR
pwLogClust: Pointer; // WORD*
pCharProps: Pointer; // SCRIPT_CHARPROP*
cChars: Integer; // INT
pwGlyphs: Pointer; // WORD*
pGlyphProps: Pointer; // SCRIPT_GLYPHPROP*
cGlyphs: Integer; // INT
piAdvance: Pointer; // INT* out
pGoffset: Pointer; // GOFFSET* out
pABC: Pointer // ABC* optional, out
): Integer; stdcall;
external 'USP10.dll' name 'ScriptPlaceOpenType';result := DllCall("USP10\ScriptPlaceOpenType"
, "Ptr", hdc ; HDC optional
, "Ptr", psc ; void** in/out
, "Ptr", psa ; SCRIPT_ANALYSIS* in/out
, "UInt", tagScript ; DWORD
, "UInt", tagLangSys ; DWORD
, "Ptr", rcRangeChars ; INT* optional
, "Ptr", rpRangeProperties ; TEXTRANGE_PROPERTIES** optional
, "Int", cRanges ; INT
, "WStr", pwcChars ; LPCWSTR
, "Ptr", pwLogClust ; WORD*
, "Ptr", pCharProps ; SCRIPT_CHARPROP*
, "Int", cChars ; INT
, "Ptr", pwGlyphs ; WORD*
, "Ptr", pGlyphProps ; SCRIPT_GLYPHPROP*
, "Int", cGlyphs ; INT
, "Ptr", piAdvance ; INT* out
, "Ptr", pGoffset ; GOFFSET* out
, "Ptr", pABC ; ABC* optional, out
, "Int") ; return: HRESULT●ScriptPlaceOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, pwLogClust, pCharProps, cChars, pwGlyphs, pGlyphProps, cGlyphs, piAdvance, pGoffset, pABC) = DLL("USP10.dll", "int ScriptPlaceOpenType(void*, void*, void*, dword, dword, void*, void*, int, char*, void*, void*, int, void*, void*, int, void*, void*, void*)")
# 呼び出し: ScriptPlaceOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, pwLogClust, pCharProps, cChars, pwGlyphs, pGlyphProps, cGlyphs, piAdvance, pGoffset, pABC)
# hdc : HDC optional -> "void*"
# psc : void** in/out -> "void*"
# psa : SCRIPT_ANALYSIS* in/out -> "void*"
# tagScript : DWORD -> "dword"
# tagLangSys : DWORD -> "dword"
# rcRangeChars : INT* optional -> "void*"
# rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> "void*"
# cRanges : INT -> "int"
# pwcChars : LPCWSTR -> "char*"
# pwLogClust : WORD* -> "void*"
# pCharProps : SCRIPT_CHARPROP* -> "void*"
# cChars : INT -> "int"
# pwGlyphs : WORD* -> "void*"
# pGlyphProps : SCRIPT_GLYPHPROP* -> "void*"
# cGlyphs : INT -> "int"
# piAdvance : INT* out -> "void*"
# pGoffset : GOFFSET* out -> "void*"
# pABC : ABC* optional, out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "usp10" fn ScriptPlaceOpenType(
hdc: ?*anyopaque, // HDC optional
psc: ?*anyopaque, // void** in/out
psa: [*c]SCRIPT_ANALYSIS, // SCRIPT_ANALYSIS* in/out
tagScript: u32, // DWORD
tagLangSys: u32, // DWORD
rcRangeChars: [*c]i32, // INT* optional
rpRangeProperties: [*c][*c]TEXTRANGE_PROPERTIES, // TEXTRANGE_PROPERTIES** optional
cRanges: i32, // INT
pwcChars: [*c]const u16, // LPCWSTR
pwLogClust: [*c]u16, // WORD*
pCharProps: [*c]SCRIPT_CHARPROP, // SCRIPT_CHARPROP*
cChars: i32, // INT
pwGlyphs: [*c]u16, // WORD*
pGlyphProps: [*c]SCRIPT_GLYPHPROP, // SCRIPT_GLYPHPROP*
cGlyphs: i32, // INT
piAdvance: [*c]i32, // INT* out
pGoffset: [*c]GOFFSET, // GOFFSET* out
pABC: [*c]ABC // ABC* optional, out
) callconv(std.os.windows.WINAPI) i32;proc ScriptPlaceOpenType(
hdc: pointer, # HDC optional
psc: pointer, # void** in/out
psa: ptr SCRIPT_ANALYSIS, # SCRIPT_ANALYSIS* in/out
tagScript: uint32, # DWORD
tagLangSys: uint32, # DWORD
rcRangeChars: ptr int32, # INT* optional
rpRangeProperties: ptr TEXTRANGE_PROPERTIES, # TEXTRANGE_PROPERTIES** optional
cRanges: int32, # INT
pwcChars: WideCString, # LPCWSTR
pwLogClust: ptr uint16, # WORD*
pCharProps: ptr SCRIPT_CHARPROP, # SCRIPT_CHARPROP*
cChars: int32, # INT
pwGlyphs: ptr uint16, # WORD*
pGlyphProps: ptr SCRIPT_GLYPHPROP, # SCRIPT_GLYPHPROP*
cGlyphs: int32, # INT
piAdvance: ptr int32, # INT* out
pGoffset: ptr GOFFSET, # GOFFSET* out
pABC: ptr ABC # ABC* optional, out
): int32 {.importc: "ScriptPlaceOpenType", stdcall, dynlib: "USP10.dll".}pragma(lib, "usp10");
extern(Windows)
int ScriptPlaceOpenType(
void* hdc, // HDC optional
void** psc, // void** in/out
SCRIPT_ANALYSIS* psa, // SCRIPT_ANALYSIS* in/out
uint tagScript, // DWORD
uint tagLangSys, // DWORD
int* rcRangeChars, // INT* optional
TEXTRANGE_PROPERTIES** rpRangeProperties, // TEXTRANGE_PROPERTIES** optional
int cRanges, // INT
const(wchar)* pwcChars, // LPCWSTR
ushort* pwLogClust, // WORD*
SCRIPT_CHARPROP* pCharProps, // SCRIPT_CHARPROP*
int cChars, // INT
ushort* pwGlyphs, // WORD*
SCRIPT_GLYPHPROP* pGlyphProps, // SCRIPT_GLYPHPROP*
int cGlyphs, // INT
int* piAdvance, // INT* out
GOFFSET* pGoffset, // GOFFSET* out
ABC* pABC // ABC* optional, out
);ccall((:ScriptPlaceOpenType, "USP10.dll"), stdcall, Int32,
(Ptr{Cvoid}, Ptr{Cvoid}, Ptr{SCRIPT_ANALYSIS}, UInt32, UInt32, Ptr{Int32}, Ptr{TEXTRANGE_PROPERTIES}, Int32, Cwstring, Ptr{UInt16}, Ptr{SCRIPT_CHARPROP}, Int32, Ptr{UInt16}, Ptr{SCRIPT_GLYPHPROP}, Int32, Ptr{Int32}, Ptr{GOFFSET}, Ptr{ABC}),
hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, pwLogClust, pCharProps, cChars, pwGlyphs, pGlyphProps, cGlyphs, piAdvance, pGoffset, pABC)
# hdc : HDC optional -> Ptr{Cvoid}
# psc : void** in/out -> Ptr{Cvoid}
# psa : SCRIPT_ANALYSIS* in/out -> Ptr{SCRIPT_ANALYSIS}
# tagScript : DWORD -> UInt32
# tagLangSys : DWORD -> UInt32
# rcRangeChars : INT* optional -> Ptr{Int32}
# rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> Ptr{TEXTRANGE_PROPERTIES}
# cRanges : INT -> Int32
# pwcChars : LPCWSTR -> Cwstring
# pwLogClust : WORD* -> Ptr{UInt16}
# pCharProps : SCRIPT_CHARPROP* -> Ptr{SCRIPT_CHARPROP}
# cChars : INT -> Int32
# pwGlyphs : WORD* -> Ptr{UInt16}
# pGlyphProps : SCRIPT_GLYPHPROP* -> Ptr{SCRIPT_GLYPHPROP}
# cGlyphs : INT -> Int32
# piAdvance : INT* out -> Ptr{Int32}
# pGoffset : GOFFSET* out -> Ptr{GOFFSET}
# pABC : ABC* optional, out -> Ptr{ABC}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t ScriptPlaceOpenType(
void* hdc,
void** psc,
void* psa,
uint32_t tagScript,
uint32_t tagLangSys,
int32_t* rcRangeChars,
void* rpRangeProperties,
int32_t cRanges,
const uint16_t* pwcChars,
uint16_t* pwLogClust,
void* pCharProps,
int32_t cChars,
uint16_t* pwGlyphs,
void* pGlyphProps,
int32_t cGlyphs,
int32_t* piAdvance,
void* pGoffset,
void* pABC);
]]
local usp10 = ffi.load("usp10")
-- usp10.ScriptPlaceOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, pwLogClust, pCharProps, cChars, pwGlyphs, pGlyphProps, cGlyphs, piAdvance, pGoffset, pABC)
-- hdc : HDC optional
-- psc : void** in/out
-- psa : SCRIPT_ANALYSIS* in/out
-- tagScript : DWORD
-- tagLangSys : DWORD
-- rcRangeChars : INT* optional
-- rpRangeProperties : TEXTRANGE_PROPERTIES** optional
-- cRanges : INT
-- pwcChars : LPCWSTR
-- pwLogClust : WORD*
-- pCharProps : SCRIPT_CHARPROP*
-- cChars : INT
-- pwGlyphs : WORD*
-- pGlyphProps : SCRIPT_GLYPHPROP*
-- cGlyphs : INT
-- piAdvance : INT* out
-- pGoffset : GOFFSET* out
-- pABC : ABC* optional, out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('USP10.dll');
const ScriptPlaceOpenType = lib.func('__stdcall', 'ScriptPlaceOpenType', 'int32_t', ['void *', 'void *', 'void *', 'uint32_t', 'uint32_t', 'int32_t *', 'void *', 'int32_t', 'str16', 'uint16_t *', 'void *', 'int32_t', 'uint16_t *', 'void *', 'int32_t', 'int32_t *', 'void *', 'void *']);
// ScriptPlaceOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, pwLogClust, pCharProps, cChars, pwGlyphs, pGlyphProps, cGlyphs, piAdvance, pGoffset, pABC)
// hdc : HDC optional -> 'void *'
// psc : void** in/out -> 'void *'
// psa : SCRIPT_ANALYSIS* in/out -> 'void *'
// tagScript : DWORD -> 'uint32_t'
// tagLangSys : DWORD -> 'uint32_t'
// rcRangeChars : INT* optional -> 'int32_t *'
// rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> 'void *'
// cRanges : INT -> 'int32_t'
// pwcChars : LPCWSTR -> 'str16'
// pwLogClust : WORD* -> 'uint16_t *'
// pCharProps : SCRIPT_CHARPROP* -> 'void *'
// cChars : INT -> 'int32_t'
// pwGlyphs : WORD* -> 'uint16_t *'
// pGlyphProps : SCRIPT_GLYPHPROP* -> 'void *'
// cGlyphs : INT -> 'int32_t'
// piAdvance : INT* out -> 'int32_t *'
// pGoffset : GOFFSET* out -> 'void *'
// pABC : ABC* optional, out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("USP10.dll", {
ScriptPlaceOpenType: { parameters: ["pointer", "pointer", "pointer", "u32", "u32", "pointer", "pointer", "i32", "buffer", "pointer", "pointer", "i32", "pointer", "pointer", "i32", "pointer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.ScriptPlaceOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, pwLogClust, pCharProps, cChars, pwGlyphs, pGlyphProps, cGlyphs, piAdvance, pGoffset, pABC)
// hdc : HDC optional -> "pointer"
// psc : void** in/out -> "pointer"
// psa : SCRIPT_ANALYSIS* in/out -> "pointer"
// tagScript : DWORD -> "u32"
// tagLangSys : DWORD -> "u32"
// rcRangeChars : INT* optional -> "pointer"
// rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> "pointer"
// cRanges : INT -> "i32"
// pwcChars : LPCWSTR -> "buffer"
// pwLogClust : WORD* -> "pointer"
// pCharProps : SCRIPT_CHARPROP* -> "pointer"
// cChars : INT -> "i32"
// pwGlyphs : WORD* -> "pointer"
// pGlyphProps : SCRIPT_GLYPHPROP* -> "pointer"
// cGlyphs : INT -> "i32"
// piAdvance : INT* out -> "pointer"
// pGoffset : GOFFSET* out -> "pointer"
// pABC : ABC* optional, out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t ScriptPlaceOpenType(
void* hdc,
void** psc,
void* psa,
uint32_t tagScript,
uint32_t tagLangSys,
int32_t* rcRangeChars,
void* rpRangeProperties,
int32_t cRanges,
const uint16_t* pwcChars,
uint16_t* pwLogClust,
void* pCharProps,
int32_t cChars,
uint16_t* pwGlyphs,
void* pGlyphProps,
int32_t cGlyphs,
int32_t* piAdvance,
void* pGoffset,
void* pABC);
C, "USP10.dll");
// $ffi->ScriptPlaceOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, pwLogClust, pCharProps, cChars, pwGlyphs, pGlyphProps, cGlyphs, piAdvance, pGoffset, pABC);
// hdc : HDC optional
// psc : void** in/out
// psa : SCRIPT_ANALYSIS* in/out
// tagScript : DWORD
// tagLangSys : DWORD
// rcRangeChars : INT* optional
// rpRangeProperties : TEXTRANGE_PROPERTIES** optional
// cRanges : INT
// pwcChars : LPCWSTR
// pwLogClust : WORD*
// pCharProps : SCRIPT_CHARPROP*
// cChars : INT
// pwGlyphs : WORD*
// pGlyphProps : SCRIPT_GLYPHPROP*
// cGlyphs : INT
// piAdvance : INT* out
// pGoffset : GOFFSET* out
// pABC : ABC* optional, out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Usp10 extends StdCallLibrary {
Usp10 INSTANCE = Native.load("usp10", Usp10.class);
int ScriptPlaceOpenType(
Pointer hdc, // HDC optional
Pointer psc, // void** in/out
Pointer psa, // SCRIPT_ANALYSIS* in/out
int tagScript, // DWORD
int tagLangSys, // DWORD
IntByReference rcRangeChars, // INT* optional
Pointer rpRangeProperties, // TEXTRANGE_PROPERTIES** optional
int cRanges, // INT
WString pwcChars, // LPCWSTR
ShortByReference pwLogClust, // WORD*
Pointer pCharProps, // SCRIPT_CHARPROP*
int cChars, // INT
ShortByReference pwGlyphs, // WORD*
Pointer pGlyphProps, // SCRIPT_GLYPHPROP*
int cGlyphs, // INT
IntByReference piAdvance, // INT* out
Pointer pGoffset, // GOFFSET* out
Pointer pABC // ABC* optional, out
);
}@[Link("usp10")]
lib LibUSP10
fun ScriptPlaceOpenType = ScriptPlaceOpenType(
hdc : Void*, # HDC optional
psc : Void**, # void** in/out
psa : SCRIPT_ANALYSIS*, # SCRIPT_ANALYSIS* in/out
tagScript : UInt32, # DWORD
tagLangSys : UInt32, # DWORD
rcRangeChars : Int32*, # INT* optional
rpRangeProperties : TEXTRANGE_PROPERTIES**, # TEXTRANGE_PROPERTIES** optional
cRanges : Int32, # INT
pwcChars : UInt16*, # LPCWSTR
pwLogClust : UInt16*, # WORD*
pCharProps : SCRIPT_CHARPROP*, # SCRIPT_CHARPROP*
cChars : Int32, # INT
pwGlyphs : UInt16*, # WORD*
pGlyphProps : SCRIPT_GLYPHPROP*, # SCRIPT_GLYPHPROP*
cGlyphs : Int32, # INT
piAdvance : Int32*, # INT* out
pGoffset : GOFFSET*, # GOFFSET* out
pABC : ABC* # ABC* optional, out
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef ScriptPlaceOpenTypeNative = Int32 Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Uint32, Uint32, Pointer<Int32>, Pointer<Void>, Int32, Pointer<Utf16>, Pointer<Uint16>, Pointer<Void>, Int32, Pointer<Uint16>, Pointer<Void>, Int32, Pointer<Int32>, Pointer<Void>, Pointer<Void>);
typedef ScriptPlaceOpenTypeDart = int Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, int, int, Pointer<Int32>, Pointer<Void>, int, Pointer<Utf16>, Pointer<Uint16>, Pointer<Void>, int, Pointer<Uint16>, Pointer<Void>, int, Pointer<Int32>, Pointer<Void>, Pointer<Void>);
final ScriptPlaceOpenType = DynamicLibrary.open('USP10.dll')
.lookupFunction<ScriptPlaceOpenTypeNative, ScriptPlaceOpenTypeDart>('ScriptPlaceOpenType');
// hdc : HDC optional -> Pointer<Void>
// psc : void** in/out -> Pointer<Void>
// psa : SCRIPT_ANALYSIS* in/out -> Pointer<Void>
// tagScript : DWORD -> Uint32
// tagLangSys : DWORD -> Uint32
// rcRangeChars : INT* optional -> Pointer<Int32>
// rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> Pointer<Void>
// cRanges : INT -> Int32
// pwcChars : LPCWSTR -> Pointer<Utf16>
// pwLogClust : WORD* -> Pointer<Uint16>
// pCharProps : SCRIPT_CHARPROP* -> Pointer<Void>
// cChars : INT -> Int32
// pwGlyphs : WORD* -> Pointer<Uint16>
// pGlyphProps : SCRIPT_GLYPHPROP* -> Pointer<Void>
// cGlyphs : INT -> Int32
// piAdvance : INT* out -> Pointer<Int32>
// pGoffset : GOFFSET* out -> Pointer<Void>
// pABC : ABC* optional, out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function ScriptPlaceOpenType(
hdc: THandle; // HDC optional
psc: Pointer; // void** in/out
psa: Pointer; // SCRIPT_ANALYSIS* in/out
tagScript: DWORD; // DWORD
tagLangSys: DWORD; // DWORD
rcRangeChars: Pointer; // INT* optional
rpRangeProperties: Pointer; // TEXTRANGE_PROPERTIES** optional
cRanges: Integer; // INT
pwcChars: PWideChar; // LPCWSTR
pwLogClust: Pointer; // WORD*
pCharProps: Pointer; // SCRIPT_CHARPROP*
cChars: Integer; // INT
pwGlyphs: Pointer; // WORD*
pGlyphProps: Pointer; // SCRIPT_GLYPHPROP*
cGlyphs: Integer; // INT
piAdvance: Pointer; // INT* out
pGoffset: Pointer; // GOFFSET* out
pABC: Pointer // ABC* optional, out
): Integer; stdcall;
external 'USP10.dll' name 'ScriptPlaceOpenType';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "ScriptPlaceOpenType"
c_ScriptPlaceOpenType :: Ptr () -> Ptr () -> Ptr () -> Word32 -> Word32 -> Ptr Int32 -> Ptr () -> Int32 -> CWString -> Ptr Word16 -> Ptr () -> Int32 -> Ptr Word16 -> Ptr () -> Int32 -> Ptr Int32 -> Ptr () -> Ptr () -> IO Int32
-- hdc : HDC optional -> Ptr ()
-- psc : void** in/out -> Ptr ()
-- psa : SCRIPT_ANALYSIS* in/out -> Ptr ()
-- tagScript : DWORD -> Word32
-- tagLangSys : DWORD -> Word32
-- rcRangeChars : INT* optional -> Ptr Int32
-- rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> Ptr ()
-- cRanges : INT -> Int32
-- pwcChars : LPCWSTR -> CWString
-- pwLogClust : WORD* -> Ptr Word16
-- pCharProps : SCRIPT_CHARPROP* -> Ptr ()
-- cChars : INT -> Int32
-- pwGlyphs : WORD* -> Ptr Word16
-- pGlyphProps : SCRIPT_GLYPHPROP* -> Ptr ()
-- cGlyphs : INT -> Int32
-- piAdvance : INT* out -> Ptr Int32
-- pGoffset : GOFFSET* out -> Ptr ()
-- pABC : ABC* optional, out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let scriptplaceopentype =
foreign "ScriptPlaceOpenType"
((ptr void) @-> (ptr void) @-> (ptr void) @-> uint32_t @-> uint32_t @-> (ptr int32_t) @-> (ptr void) @-> int32_t @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr void) @-> int32_t @-> (ptr uint16_t) @-> (ptr void) @-> int32_t @-> (ptr int32_t) @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* hdc : HDC optional -> (ptr void) *)
(* psc : void** in/out -> (ptr void) *)
(* psa : SCRIPT_ANALYSIS* in/out -> (ptr void) *)
(* tagScript : DWORD -> uint32_t *)
(* tagLangSys : DWORD -> uint32_t *)
(* rcRangeChars : INT* optional -> (ptr int32_t) *)
(* rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> (ptr void) *)
(* cRanges : INT -> int32_t *)
(* pwcChars : LPCWSTR -> (ptr uint16_t) *)
(* pwLogClust : WORD* -> (ptr uint16_t) *)
(* pCharProps : SCRIPT_CHARPROP* -> (ptr void) *)
(* cChars : INT -> int32_t *)
(* pwGlyphs : WORD* -> (ptr uint16_t) *)
(* pGlyphProps : SCRIPT_GLYPHPROP* -> (ptr void) *)
(* cGlyphs : INT -> int32_t *)
(* piAdvance : INT* out -> (ptr int32_t) *)
(* pGoffset : GOFFSET* out -> (ptr void) *)
(* pABC : ABC* optional, out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library usp10 (t "USP10.dll"))
(cffi:use-foreign-library usp10)
(cffi:defcfun ("ScriptPlaceOpenType" script-place-open-type :convention :stdcall) :int32
(hdc :pointer) ; HDC optional
(psc :pointer) ; void** in/out
(psa :pointer) ; SCRIPT_ANALYSIS* in/out
(tag-script :uint32) ; DWORD
(tag-lang-sys :uint32) ; DWORD
(rc-range-chars :pointer) ; INT* optional
(rp-range-properties :pointer) ; TEXTRANGE_PROPERTIES** optional
(c-ranges :int32) ; INT
(pwc-chars (:string :encoding :utf-16le)) ; LPCWSTR
(pw-log-clust :pointer) ; WORD*
(p-char-props :pointer) ; SCRIPT_CHARPROP*
(c-chars :int32) ; INT
(pw-glyphs :pointer) ; WORD*
(p-glyph-props :pointer) ; SCRIPT_GLYPHPROP*
(c-glyphs :int32) ; INT
(pi-advance :pointer) ; INT* out
(p-goffset :pointer) ; GOFFSET* out
(p-abc :pointer)) ; ABC* optional, out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $ScriptPlaceOpenType = Win32::API::More->new('USP10',
'int ScriptPlaceOpenType(HANDLE hdc, LPVOID psc, LPVOID psa, DWORD tagScript, DWORD tagLangSys, LPVOID rcRangeChars, LPVOID rpRangeProperties, int cRanges, LPCWSTR pwcChars, LPVOID pwLogClust, LPVOID pCharProps, int cChars, LPVOID pwGlyphs, LPVOID pGlyphProps, int cGlyphs, LPVOID piAdvance, LPVOID pGoffset, LPVOID pABC)');
# my $ret = $ScriptPlaceOpenType->Call($hdc, $psc, $psa, $tagScript, $tagLangSys, $rcRangeChars, $rpRangeProperties, $cRanges, $pwcChars, $pwLogClust, $pCharProps, $cChars, $pwGlyphs, $pGlyphProps, $cGlyphs, $piAdvance, $pGoffset, $pABC);
# hdc : HDC optional -> HANDLE
# psc : void** in/out -> LPVOID
# psa : SCRIPT_ANALYSIS* in/out -> LPVOID
# tagScript : DWORD -> DWORD
# tagLangSys : DWORD -> DWORD
# rcRangeChars : INT* optional -> LPVOID
# rpRangeProperties : TEXTRANGE_PROPERTIES** optional -> LPVOID
# cRanges : INT -> int
# pwcChars : LPCWSTR -> LPCWSTR
# pwLogClust : WORD* -> LPVOID
# pCharProps : SCRIPT_CHARPROP* -> LPVOID
# cChars : INT -> int
# pwGlyphs : WORD* -> LPVOID
# pGlyphProps : SCRIPT_GLYPHPROP* -> LPVOID
# cGlyphs : INT -> int
# piAdvance : INT* out -> LPVOID
# pGoffset : GOFFSET* out -> LPVOID
# pABC : ABC* optional, out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f ScriptItemizeOpenType — 文字列をスクリプトタグ付きでアイテム分割する。
- f ScriptPlace — グリフ列の送り幅とオフセットを算出する。
- f ScriptShapeOpenType — OpenType機能を用いて文字列をグリフ列に整形する。