ScriptShapeOpenType
関数シグネチャ
// USP10.dll
#include <windows.h>
HRESULT ScriptShapeOpenType(
HDC hdc, // optional
void** psc,
SCRIPT_ANALYSIS* psa,
DWORD tagScript,
DWORD tagLangSys,
INT* rcRangeChars, // optional
TEXTRANGE_PROPERTIES** rpRangeProperties, // optional
INT cRanges,
LPCWSTR pwcChars,
INT cChars,
INT cMaxGlyphs,
WORD* pwLogClust,
SCRIPT_CHARPROP* pCharProps,
WORD* pwOutGlyphs,
SCRIPT_GLYPHPROP* pOutGlyphProps,
INT* pcGlyphs
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| hdc | HDC | inoptional | デバイスコンテキストへのハンドル。詳細については、Caching を参照してください。 |
| psc | void** | inout | スクリプトキャッシュを識別する SCRIPT_CACHE 構造体へのポインター。 |
| psa | SCRIPT_ANALYSIS* | inout | 以前の ScriptItemizeOpenType の呼び出しで取得した SCRIPT_ANALYSIS 構造体へのポインター。この構造体はシェーピングエンジンを識別し、グリフを正しく形成できるようにします。 あるいは、フィルタリングされていない結果を受け取るために、このパラメーターに NULL を設定することもできます。 |
| tagScript | DWORD | in | 表記体系の OpenType スクリプトタグを定義する OPENTYPE_TAG 構造体。 |
| tagLangSys | DWORD | in | 表記体系の OpenType 言語タグを含む OPENTYPE_TAG 構造体。 |
| rcRangeChars | INT* | inoptional | 各範囲 (range) 内の文字数の配列。配列要素の数は cRanges で示されます。この配列の要素の値の合計は cChars の値に等しくなります。 |
| rpRangeProperties | TEXTRANGE_PROPERTIES** | inoptional | TEXTRANGE_PROPERTIES 構造体の配列で、各構造体は 1 つの OpenType 機能範囲を表します。構造体の数は cRanges パラメーターで示されます。rpRangeProperties の詳細については、「解説」セクションを参照してください。 |
| cRanges | INT | in | OpenType 機能範囲の数。 |
| pwcChars | LPCWSTR | in | ランを構成する Unicode 文字の配列へのポインター。 |
| cChars | INT | in | Unicode ラン内の文字数。 |
| cMaxGlyphs | INT | in | 生成するグリフの最大数。 |
| pwLogClust | WORD* | out | この関数が論理クラスター (cluster) 情報の配列を取得するバッファーへのポインター。各配列要素は Unicode 文字配列内の 1 文字に対応します。各要素の値は、ラン内の先頭グリフから、対応する文字を含むクラスターの先頭グリフまでのオフセットです。SCRIPT_ANALYSIS 構造体の fRTL メンバーが TRUE の場合、配列を読み進めるにつれて要素の値は減少することに注意してください。 |
| pCharProps | SCRIPT_CHARPROP* | out | この関数が文字プロパティ値の配列を取得するバッファーへのポインター。長さは cChars で示されます。 |
| pwOutGlyphs | WORD* | out | この関数がグリフの配列を取得するバッファーへのポインター。 |
| pOutGlyphProps | SCRIPT_GLYPHPROP* | out | この関数が、取得した各グリフの属性の配列を取得するバッファーへのポインター。値の長さは pcGlyphs の値に等しくなります。グリフ 1 つにつき 1 つのグリフプロパティが示されるため、このパラメーターの値は cMaxGlyphs で指定される要素数を示します。 |
| pcGlyphs | INT* | out | この関数が、pwOutGlyphs に示されるグリフ数を取得する場所へのポインター。 |
戻り値の型: HRESULT
公式ドキュメント
OpenType 情報を用いて、Unicode ランに対するグリフと表示属性を生成します。各ランは、この関数の 1 回の呼び出しで構成されます。
戻り値
成功した場合は 0 を返します。成功しなかった場合、関数は 0 以外の HRESULT 値を返します。すべてのエラーの場合、すべての出力配列値の内容は未定義です。
エラーの戻り値には次のものが含まれます。
- E_OUTOFMEMORY。cMaxGlyphs で示される出力バッファーの長さが不足しています。
- E_PENDING。psc パラメーターで指定されたスクリプトキャッシュには文字列をシェーピングするのに十分な情報が含まれておらず、デバイスコンテキストが NULL として渡されているため、関数はシェーピング処理を完了できません。アプリケーションは、そのランに対応する正しいデバイスコンテキストを設定し、hdc に適切なコンテキスト値を指定し、その他のパラメーターはすべて同じにして、この関数を再度呼び出してください。
- USP_E_SCRIPT_NOT_IN_FONT。デバイスコンテキストに対応するフォントが、必要なスクリプトをサポートしていません。アプリケーションは、ScriptGetCMap またはその他の方法を使用して、別のフォントを選択してください。
解説(Remarks)
ScriptShapeOpenType は、より古い ScriptShape 関数よりも推奨されます。ScriptShapeOpenType には次のような利点があります。
- パラメーターがフォントレイアウトテーブル内の OpenType タグに直接対応します。
- パラメーターが各文字に適用される機能を定義します。
- 入力がランに分割されます。各ランは OpenType プロパティを持ち、ScriptShapeOpenType の 1 回の呼び出しで構成されます。
フォントまたはオペレーティングシステムがグリフインデックスをサポートできない場合、この関数は SCRIPT_ANALYSIS 構造体の fNoGlyphIndex メンバーを設定することがあります。
アプリケーションは、フォントが特定の文字列内の文字をサポートしているかどうかを判定するために ScriptShapeOpenType を呼び出すことができます。関数が S_OK を返した場合、アプリケーションは出力に欠落グリフがないか確認してください。SCRIPT_ANALYSIS 構造体で fLogicalOrder が TRUE に設定されている場合、関数は常に元の Unicode 文字と同じ順序でグリフを生成します。fLogicalOrder が FALSE に設定されている場合、ScriptTextOut が ExtTextOut を呼び出す前にグリフを反転させる必要がないように、関数は右から左へのアイテムを逆順で生成します。
SCRIPT_ANALYSIS の eScript メンバーが SCRIPT_UNDEFINED に設定されている場合、シェーピングは無効になります。この場合、ScriptShapeOpenType はフォントの cmap テーブルにあるグリフを表示します。テーブルにグリフがない場合、関数はグリフが欠落していることを示します。
ScriptShapeOpenType は、ラン内でクラスターを一様に順序付けし、クラスター内でグリフを一様に順序付けします。順序付けが左から右か右から左かを識別するために、ScriptItemizeOpenType から得られる SCRIPT_ANALYSIS の fRTL メンバーの値を使用します。
rpRangeProperties パラメーターについて、TEXTRANGE_PROPERTIES 構造体は OPENTYPE_FEATURE_RECORD 構造体の配列を指します。この配列は次のように使用されます。
- rpRangeProperties に示される配列の各要素は、1 つの範囲を表します。
- 特定のプロパティを共有するテキストのスパンは「入れ子」になる傾向があり、入れ子になったスパンは OPENTYPE_FEATURE_RECORD 情報を共有できます。たとえば、次の図では次のようになります。
- 上部の数字の行は、それぞれ範囲、アイテム、ランを表します。
- ここで文字でラベル付けされた各スパンは、1 つの OpenType 機能を表します。各範囲に該当する機能は、その範囲の OPENTYPE_FEATURE_RECORD 配列に格納されます。
- 各範囲について、OPENTYPE_FEATURE_RECORD 構造体の配列は、その範囲を含むスパンの文字に対応します。
- この図では、範囲 2 はスパン A、B、C の OPENTYPE_FEATURE_RECORD 構造体に間接的に関連付けられています。範囲 4 はスパン A と D の構造体のみに関連付けられています。
例
次の例は、ScriptShapeOpenType が文字配列 (pwcChars) とグリフ配列 (pwOutGlyphs) から論理クラスター配列 (pwLogClust) をどのように生成するかを示しています。このランには 4 つのクラスターがあります。
- 第 1 クラスター: 1 つのグリフで表される 1 文字
- 第 2 クラスター: 3 つのグリフで表される 1 文字
- 第 3 クラスター: 1 つのグリフで表される 3 文字
- 第 4 クラスター: 3 つのグリフで表される 2 文字
文字配列:
- | c1u1 | c2u1 | c3u1 c3u2 c3u3 | c4u1 c4u2 |
- | c1g1 | c2g1 c2g2 c2g3 | c3g1 | c4g1 c4g2 c4g3 |
- c<n> はクラスター n を意味します。
- g<m> はグリフ m を意味します。
- u<p> は Unicode コードポイント p を意味します。
- | 0 | 1 | 4 4 4 | 5 5 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// USP10.dll
#include <windows.h>
HRESULT ScriptShapeOpenType(
HDC hdc, // optional
void** psc,
SCRIPT_ANALYSIS* psa,
DWORD tagScript,
DWORD tagLangSys,
INT* rcRangeChars, // optional
TEXTRANGE_PROPERTIES** rpRangeProperties, // optional
INT cRanges,
LPCWSTR pwcChars,
INT cChars,
INT cMaxGlyphs,
WORD* pwLogClust,
SCRIPT_CHARPROP* pCharProps,
WORD* pwOutGlyphs,
SCRIPT_GLYPHPROP* pOutGlyphProps,
INT* pcGlyphs
);[DllImport("USP10.dll", ExactSpelling = true)]
static extern int ScriptShapeOpenType(
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
int cChars, // INT
int cMaxGlyphs, // INT
out ushort pwLogClust, // WORD* out
IntPtr pCharProps, // SCRIPT_CHARPROP* out
out ushort pwOutGlyphs, // WORD* out
IntPtr pOutGlyphProps, // SCRIPT_GLYPHPROP* out
out int pcGlyphs // INT* out
);<DllImport("USP10.dll", ExactSpelling:=True)>
Public Shared Function ScriptShapeOpenType(
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
cChars As Integer, ' INT
cMaxGlyphs As Integer, ' INT
<Out> ByRef pwLogClust As UShort, ' WORD* out
pCharProps As IntPtr, ' SCRIPT_CHARPROP* out
<Out> ByRef pwOutGlyphs As UShort, ' WORD* out
pOutGlyphProps As IntPtr, ' SCRIPT_GLYPHPROP* out
<Out> ByRef pcGlyphs As Integer ' INT* 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
' cChars : INT
' cMaxGlyphs : INT
' pwLogClust : WORD* out
' pCharProps : SCRIPT_CHARPROP* out
' pwOutGlyphs : WORD* out
' pOutGlyphProps : SCRIPT_GLYPHPROP* out
' pcGlyphs : INT* out
Declare PtrSafe Function ScriptShapeOpenType 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, _
ByVal cChars As Long, _
ByVal cMaxGlyphs As Long, _
ByRef pwLogClust As Integer, _
ByVal pCharProps As LongPtr, _
ByRef pwOutGlyphs As Integer, _
ByVal pOutGlyphProps As LongPtr, _
ByRef pcGlyphs As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
ScriptShapeOpenType = ctypes.windll.usp10.ScriptShapeOpenType
ScriptShapeOpenType.restype = ctypes.c_int
ScriptShapeOpenType.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.c_int, # cChars : INT
ctypes.c_int, # cMaxGlyphs : INT
ctypes.POINTER(ctypes.c_ushort), # pwLogClust : WORD* out
ctypes.c_void_p, # pCharProps : SCRIPT_CHARPROP* out
ctypes.POINTER(ctypes.c_ushort), # pwOutGlyphs : WORD* out
ctypes.c_void_p, # pOutGlyphProps : SCRIPT_GLYPHPROP* out
ctypes.POINTER(ctypes.c_int), # pcGlyphs : INT* out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('USP10.dll')
ScriptShapeOpenType = Fiddle::Function.new(
lib['ScriptShapeOpenType'],
[
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_INT, # cChars : INT
Fiddle::TYPE_INT, # cMaxGlyphs : INT
Fiddle::TYPE_VOIDP, # pwLogClust : WORD* out
Fiddle::TYPE_VOIDP, # pCharProps : SCRIPT_CHARPROP* out
Fiddle::TYPE_VOIDP, # pwOutGlyphs : WORD* out
Fiddle::TYPE_VOIDP, # pOutGlyphProps : SCRIPT_GLYPHPROP* out
Fiddle::TYPE_VOIDP, # pcGlyphs : INT* out
],
Fiddle::TYPE_INT)#[link(name = "usp10")]
extern "system" {
fn ScriptShapeOpenType(
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
cChars: i32, // INT
cMaxGlyphs: i32, // INT
pwLogClust: *mut u16, // WORD* out
pCharProps: *mut SCRIPT_CHARPROP, // SCRIPT_CHARPROP* out
pwOutGlyphs: *mut u16, // WORD* out
pOutGlyphProps: *mut SCRIPT_GLYPHPROP, // SCRIPT_GLYPHPROP* out
pcGlyphs: *mut i32 // INT* out
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("USP10.dll")]
public static extern int ScriptShapeOpenType(IntPtr hdc, IntPtr psc, IntPtr psa, uint tagScript, uint tagLangSys, IntPtr rcRangeChars, IntPtr rpRangeProperties, int cRanges, [MarshalAs(UnmanagedType.LPWStr)] string pwcChars, int cChars, int cMaxGlyphs, out ushort pwLogClust, IntPtr pCharProps, out ushort pwOutGlyphs, IntPtr pOutGlyphProps, out int pcGlyphs);
"@
$api = Add-Type -MemberDefinition $sig -Name 'USP10_ScriptShapeOpenType' -Namespace Win32 -PassThru
# $api::ScriptShapeOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, cChars, cMaxGlyphs, pwLogClust, pCharProps, pwOutGlyphs, pOutGlyphProps, pcGlyphs)#uselib "USP10.dll"
#func global ScriptShapeOpenType "ScriptShapeOpenType" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; ScriptShapeOpenType hdc, psc, varptr(psa), tagScript, tagLangSys, varptr(rcRangeChars), varptr(rpRangeProperties), cRanges, pwcChars, cChars, cMaxGlyphs, varptr(pwLogClust), varptr(pCharProps), varptr(pwOutGlyphs), varptr(pOutGlyphProps), varptr(pcGlyphs) ; 戻り値は 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"
; cChars : INT -> "sptr"
; cMaxGlyphs : INT -> "sptr"
; pwLogClust : WORD* out -> "sptr"
; pCharProps : SCRIPT_CHARPROP* out -> "sptr"
; pwOutGlyphs : WORD* out -> "sptr"
; pOutGlyphProps : SCRIPT_GLYPHPROP* out -> "sptr"
; pcGlyphs : INT* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "USP10.dll" #cfunc global ScriptShapeOpenType "ScriptShapeOpenType" sptr, sptr, var, int, int, var, var, int, wstr, int, int, var, var, var, var, var ; res = ScriptShapeOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, cChars, cMaxGlyphs, pwLogClust, pCharProps, pwOutGlyphs, pOutGlyphProps, pcGlyphs) ; 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" ; cChars : INT -> "int" ; cMaxGlyphs : INT -> "int" ; pwLogClust : WORD* out -> "var" ; pCharProps : SCRIPT_CHARPROP* out -> "var" ; pwOutGlyphs : WORD* out -> "var" ; pOutGlyphProps : SCRIPT_GLYPHPROP* out -> "var" ; pcGlyphs : INT* out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "USP10.dll" #cfunc global ScriptShapeOpenType "ScriptShapeOpenType" sptr, sptr, sptr, int, int, sptr, sptr, int, wstr, int, int, sptr, sptr, sptr, sptr, sptr ; res = ScriptShapeOpenType(hdc, psc, varptr(psa), tagScript, tagLangSys, varptr(rcRangeChars), varptr(rpRangeProperties), cRanges, pwcChars, cChars, cMaxGlyphs, varptr(pwLogClust), varptr(pCharProps), varptr(pwOutGlyphs), varptr(pOutGlyphProps), varptr(pcGlyphs)) ; 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" ; cChars : INT -> "int" ; cMaxGlyphs : INT -> "int" ; pwLogClust : WORD* out -> "sptr" ; pCharProps : SCRIPT_CHARPROP* out -> "sptr" ; pwOutGlyphs : WORD* out -> "sptr" ; pOutGlyphProps : SCRIPT_GLYPHPROP* out -> "sptr" ; pcGlyphs : INT* out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; HRESULT ScriptShapeOpenType(HDC hdc, void** psc, SCRIPT_ANALYSIS* psa, DWORD tagScript, DWORD tagLangSys, INT* rcRangeChars, TEXTRANGE_PROPERTIES** rpRangeProperties, INT cRanges, LPCWSTR pwcChars, INT cChars, INT cMaxGlyphs, WORD* pwLogClust, SCRIPT_CHARPROP* pCharProps, WORD* pwOutGlyphs, SCRIPT_GLYPHPROP* pOutGlyphProps, INT* pcGlyphs) #uselib "USP10.dll" #cfunc global ScriptShapeOpenType "ScriptShapeOpenType" intptr, intptr, var, int, int, var, var, int, wstr, int, int, var, var, var, var, var ; res = ScriptShapeOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, cChars, cMaxGlyphs, pwLogClust, pCharProps, pwOutGlyphs, pOutGlyphProps, pcGlyphs) ; 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" ; cChars : INT -> "int" ; cMaxGlyphs : INT -> "int" ; pwLogClust : WORD* out -> "var" ; pCharProps : SCRIPT_CHARPROP* out -> "var" ; pwOutGlyphs : WORD* out -> "var" ; pOutGlyphProps : SCRIPT_GLYPHPROP* out -> "var" ; pcGlyphs : INT* out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; HRESULT ScriptShapeOpenType(HDC hdc, void** psc, SCRIPT_ANALYSIS* psa, DWORD tagScript, DWORD tagLangSys, INT* rcRangeChars, TEXTRANGE_PROPERTIES** rpRangeProperties, INT cRanges, LPCWSTR pwcChars, INT cChars, INT cMaxGlyphs, WORD* pwLogClust, SCRIPT_CHARPROP* pCharProps, WORD* pwOutGlyphs, SCRIPT_GLYPHPROP* pOutGlyphProps, INT* pcGlyphs) #uselib "USP10.dll" #cfunc global ScriptShapeOpenType "ScriptShapeOpenType" intptr, intptr, intptr, int, int, intptr, intptr, int, wstr, int, int, intptr, intptr, intptr, intptr, intptr ; res = ScriptShapeOpenType(hdc, psc, varptr(psa), tagScript, tagLangSys, varptr(rcRangeChars), varptr(rpRangeProperties), cRanges, pwcChars, cChars, cMaxGlyphs, varptr(pwLogClust), varptr(pCharProps), varptr(pwOutGlyphs), varptr(pOutGlyphProps), varptr(pcGlyphs)) ; 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" ; cChars : INT -> "int" ; cMaxGlyphs : INT -> "int" ; pwLogClust : WORD* out -> "intptr" ; pCharProps : SCRIPT_CHARPROP* out -> "intptr" ; pwOutGlyphs : WORD* out -> "intptr" ; pOutGlyphProps : SCRIPT_GLYPHPROP* out -> "intptr" ; pcGlyphs : INT* out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
usp10 = windows.NewLazySystemDLL("USP10.dll")
procScriptShapeOpenType = usp10.NewProc("ScriptShapeOpenType")
)
// 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), cChars (INT), cMaxGlyphs (INT), pwLogClust (WORD* out), pCharProps (SCRIPT_CHARPROP* out), pwOutGlyphs (WORD* out), pOutGlyphProps (SCRIPT_GLYPHPROP* out), pcGlyphs (INT* out)
r1, _, err := procScriptShapeOpenType.Call(
uintptr(hdc),
uintptr(psc),
uintptr(psa),
uintptr(tagScript),
uintptr(tagLangSys),
uintptr(rcRangeChars),
uintptr(rpRangeProperties),
uintptr(cRanges),
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwcChars))),
uintptr(cChars),
uintptr(cMaxGlyphs),
uintptr(pwLogClust),
uintptr(pCharProps),
uintptr(pwOutGlyphs),
uintptr(pOutGlyphProps),
uintptr(pcGlyphs),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // HRESULTfunction ScriptShapeOpenType(
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
cChars: Integer; // INT
cMaxGlyphs: Integer; // INT
pwLogClust: Pointer; // WORD* out
pCharProps: Pointer; // SCRIPT_CHARPROP* out
pwOutGlyphs: Pointer; // WORD* out
pOutGlyphProps: Pointer; // SCRIPT_GLYPHPROP* out
pcGlyphs: Pointer // INT* out
): Integer; stdcall;
external 'USP10.dll' name 'ScriptShapeOpenType';result := DllCall("USP10\ScriptShapeOpenType"
, "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
, "Int", cChars ; INT
, "Int", cMaxGlyphs ; INT
, "Ptr", pwLogClust ; WORD* out
, "Ptr", pCharProps ; SCRIPT_CHARPROP* out
, "Ptr", pwOutGlyphs ; WORD* out
, "Ptr", pOutGlyphProps ; SCRIPT_GLYPHPROP* out
, "Ptr", pcGlyphs ; INT* out
, "Int") ; return: HRESULT●ScriptShapeOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, cChars, cMaxGlyphs, pwLogClust, pCharProps, pwOutGlyphs, pOutGlyphProps, pcGlyphs) = DLL("USP10.dll", "int ScriptShapeOpenType(void*, void*, void*, dword, dword, void*, void*, int, char*, int, int, void*, void*, void*, void*, void*)")
# 呼び出し: ScriptShapeOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, cChars, cMaxGlyphs, pwLogClust, pCharProps, pwOutGlyphs, pOutGlyphProps, pcGlyphs)
# 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*"
# cChars : INT -> "int"
# cMaxGlyphs : INT -> "int"
# pwLogClust : WORD* out -> "void*"
# pCharProps : SCRIPT_CHARPROP* out -> "void*"
# pwOutGlyphs : WORD* out -> "void*"
# pOutGlyphProps : SCRIPT_GLYPHPROP* out -> "void*"
# pcGlyphs : INT* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "usp10" fn ScriptShapeOpenType(
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
cChars: i32, // INT
cMaxGlyphs: i32, // INT
pwLogClust: [*c]u16, // WORD* out
pCharProps: [*c]SCRIPT_CHARPROP, // SCRIPT_CHARPROP* out
pwOutGlyphs: [*c]u16, // WORD* out
pOutGlyphProps: [*c]SCRIPT_GLYPHPROP, // SCRIPT_GLYPHPROP* out
pcGlyphs: [*c]i32 // INT* out
) callconv(std.os.windows.WINAPI) i32;proc ScriptShapeOpenType(
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
cChars: int32, # INT
cMaxGlyphs: int32, # INT
pwLogClust: ptr uint16, # WORD* out
pCharProps: ptr SCRIPT_CHARPROP, # SCRIPT_CHARPROP* out
pwOutGlyphs: ptr uint16, # WORD* out
pOutGlyphProps: ptr SCRIPT_GLYPHPROP, # SCRIPT_GLYPHPROP* out
pcGlyphs: ptr int32 # INT* out
): int32 {.importc: "ScriptShapeOpenType", stdcall, dynlib: "USP10.dll".}pragma(lib, "usp10");
extern(Windows)
int ScriptShapeOpenType(
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
int cChars, // INT
int cMaxGlyphs, // INT
ushort* pwLogClust, // WORD* out
SCRIPT_CHARPROP* pCharProps, // SCRIPT_CHARPROP* out
ushort* pwOutGlyphs, // WORD* out
SCRIPT_GLYPHPROP* pOutGlyphProps, // SCRIPT_GLYPHPROP* out
int* pcGlyphs // INT* out
);ccall((:ScriptShapeOpenType, "USP10.dll"), stdcall, Int32,
(Ptr{Cvoid}, Ptr{Cvoid}, Ptr{SCRIPT_ANALYSIS}, UInt32, UInt32, Ptr{Int32}, Ptr{TEXTRANGE_PROPERTIES}, Int32, Cwstring, Int32, Int32, Ptr{UInt16}, Ptr{SCRIPT_CHARPROP}, Ptr{UInt16}, Ptr{SCRIPT_GLYPHPROP}, Ptr{Int32}),
hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, cChars, cMaxGlyphs, pwLogClust, pCharProps, pwOutGlyphs, pOutGlyphProps, pcGlyphs)
# 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
# cChars : INT -> Int32
# cMaxGlyphs : INT -> Int32
# pwLogClust : WORD* out -> Ptr{UInt16}
# pCharProps : SCRIPT_CHARPROP* out -> Ptr{SCRIPT_CHARPROP}
# pwOutGlyphs : WORD* out -> Ptr{UInt16}
# pOutGlyphProps : SCRIPT_GLYPHPROP* out -> Ptr{SCRIPT_GLYPHPROP}
# pcGlyphs : INT* out -> Ptr{Int32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t ScriptShapeOpenType(
void* hdc,
void** psc,
void* psa,
uint32_t tagScript,
uint32_t tagLangSys,
int32_t* rcRangeChars,
void* rpRangeProperties,
int32_t cRanges,
const uint16_t* pwcChars,
int32_t cChars,
int32_t cMaxGlyphs,
uint16_t* pwLogClust,
void* pCharProps,
uint16_t* pwOutGlyphs,
void* pOutGlyphProps,
int32_t* pcGlyphs);
]]
local usp10 = ffi.load("usp10")
-- usp10.ScriptShapeOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, cChars, cMaxGlyphs, pwLogClust, pCharProps, pwOutGlyphs, pOutGlyphProps, pcGlyphs)
-- 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
-- cChars : INT
-- cMaxGlyphs : INT
-- pwLogClust : WORD* out
-- pCharProps : SCRIPT_CHARPROP* out
-- pwOutGlyphs : WORD* out
-- pOutGlyphProps : SCRIPT_GLYPHPROP* out
-- pcGlyphs : INT* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('USP10.dll');
const ScriptShapeOpenType = lib.func('__stdcall', 'ScriptShapeOpenType', 'int32_t', ['void *', 'void *', 'void *', 'uint32_t', 'uint32_t', 'int32_t *', 'void *', 'int32_t', 'str16', 'int32_t', 'int32_t', 'uint16_t *', 'void *', 'uint16_t *', 'void *', 'int32_t *']);
// ScriptShapeOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, cChars, cMaxGlyphs, pwLogClust, pCharProps, pwOutGlyphs, pOutGlyphProps, pcGlyphs)
// 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'
// cChars : INT -> 'int32_t'
// cMaxGlyphs : INT -> 'int32_t'
// pwLogClust : WORD* out -> 'uint16_t *'
// pCharProps : SCRIPT_CHARPROP* out -> 'void *'
// pwOutGlyphs : WORD* out -> 'uint16_t *'
// pOutGlyphProps : SCRIPT_GLYPHPROP* out -> 'void *'
// pcGlyphs : INT* out -> 'int32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("USP10.dll", {
ScriptShapeOpenType: { parameters: ["pointer", "pointer", "pointer", "u32", "u32", "pointer", "pointer", "i32", "buffer", "i32", "i32", "pointer", "pointer", "pointer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.ScriptShapeOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, cChars, cMaxGlyphs, pwLogClust, pCharProps, pwOutGlyphs, pOutGlyphProps, pcGlyphs)
// 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"
// cChars : INT -> "i32"
// cMaxGlyphs : INT -> "i32"
// pwLogClust : WORD* out -> "pointer"
// pCharProps : SCRIPT_CHARPROP* out -> "pointer"
// pwOutGlyphs : WORD* out -> "pointer"
// pOutGlyphProps : SCRIPT_GLYPHPROP* out -> "pointer"
// pcGlyphs : INT* out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t ScriptShapeOpenType(
void* hdc,
void** psc,
void* psa,
uint32_t tagScript,
uint32_t tagLangSys,
int32_t* rcRangeChars,
void* rpRangeProperties,
int32_t cRanges,
const uint16_t* pwcChars,
int32_t cChars,
int32_t cMaxGlyphs,
uint16_t* pwLogClust,
void* pCharProps,
uint16_t* pwOutGlyphs,
void* pOutGlyphProps,
int32_t* pcGlyphs);
C, "USP10.dll");
// $ffi->ScriptShapeOpenType(hdc, psc, psa, tagScript, tagLangSys, rcRangeChars, rpRangeProperties, cRanges, pwcChars, cChars, cMaxGlyphs, pwLogClust, pCharProps, pwOutGlyphs, pOutGlyphProps, pcGlyphs);
// 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
// cChars : INT
// cMaxGlyphs : INT
// pwLogClust : WORD* out
// pCharProps : SCRIPT_CHARPROP* out
// pwOutGlyphs : WORD* out
// pOutGlyphProps : SCRIPT_GLYPHPROP* out
// pcGlyphs : INT* 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 ScriptShapeOpenType(
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
int cChars, // INT
int cMaxGlyphs, // INT
ShortByReference pwLogClust, // WORD* out
Pointer pCharProps, // SCRIPT_CHARPROP* out
ShortByReference pwOutGlyphs, // WORD* out
Pointer pOutGlyphProps, // SCRIPT_GLYPHPROP* out
IntByReference pcGlyphs // INT* out
);
}@[Link("usp10")]
lib LibUSP10
fun ScriptShapeOpenType = ScriptShapeOpenType(
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
cChars : Int32, # INT
cMaxGlyphs : Int32, # INT
pwLogClust : UInt16*, # WORD* out
pCharProps : SCRIPT_CHARPROP*, # SCRIPT_CHARPROP* out
pwOutGlyphs : UInt16*, # WORD* out
pOutGlyphProps : SCRIPT_GLYPHPROP*, # SCRIPT_GLYPHPROP* out
pcGlyphs : Int32* # INT* out
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef ScriptShapeOpenTypeNative = Int32 Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Uint32, Uint32, Pointer<Int32>, Pointer<Void>, Int32, Pointer<Utf16>, Int32, Int32, Pointer<Uint16>, Pointer<Void>, Pointer<Uint16>, Pointer<Void>, Pointer<Int32>);
typedef ScriptShapeOpenTypeDart = int Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, int, int, Pointer<Int32>, Pointer<Void>, int, Pointer<Utf16>, int, int, Pointer<Uint16>, Pointer<Void>, Pointer<Uint16>, Pointer<Void>, Pointer<Int32>);
final ScriptShapeOpenType = DynamicLibrary.open('USP10.dll')
.lookupFunction<ScriptShapeOpenTypeNative, ScriptShapeOpenTypeDart>('ScriptShapeOpenType');
// 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>
// cChars : INT -> Int32
// cMaxGlyphs : INT -> Int32
// pwLogClust : WORD* out -> Pointer<Uint16>
// pCharProps : SCRIPT_CHARPROP* out -> Pointer<Void>
// pwOutGlyphs : WORD* out -> Pointer<Uint16>
// pOutGlyphProps : SCRIPT_GLYPHPROP* out -> Pointer<Void>
// pcGlyphs : INT* out -> Pointer<Int32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function ScriptShapeOpenType(
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
cChars: Integer; // INT
cMaxGlyphs: Integer; // INT
pwLogClust: Pointer; // WORD* out
pCharProps: Pointer; // SCRIPT_CHARPROP* out
pwOutGlyphs: Pointer; // WORD* out
pOutGlyphProps: Pointer; // SCRIPT_GLYPHPROP* out
pcGlyphs: Pointer // INT* out
): Integer; stdcall;
external 'USP10.dll' name 'ScriptShapeOpenType';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "ScriptShapeOpenType"
c_ScriptShapeOpenType :: Ptr () -> Ptr () -> Ptr () -> Word32 -> Word32 -> Ptr Int32 -> Ptr () -> Int32 -> CWString -> Int32 -> Int32 -> Ptr Word16 -> Ptr () -> Ptr Word16 -> Ptr () -> Ptr Int32 -> 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
-- cChars : INT -> Int32
-- cMaxGlyphs : INT -> Int32
-- pwLogClust : WORD* out -> Ptr Word16
-- pCharProps : SCRIPT_CHARPROP* out -> Ptr ()
-- pwOutGlyphs : WORD* out -> Ptr Word16
-- pOutGlyphProps : SCRIPT_GLYPHPROP* out -> Ptr ()
-- pcGlyphs : INT* out -> Ptr Int32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let scriptshapeopentype =
foreign "ScriptShapeOpenType"
((ptr void) @-> (ptr void) @-> (ptr void) @-> uint32_t @-> uint32_t @-> (ptr int32_t) @-> (ptr void) @-> int32_t @-> (ptr uint16_t) @-> int32_t @-> int32_t @-> (ptr uint16_t) @-> (ptr void) @-> (ptr uint16_t) @-> (ptr void) @-> (ptr int32_t) @-> 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) *)
(* cChars : INT -> int32_t *)
(* cMaxGlyphs : INT -> int32_t *)
(* pwLogClust : WORD* out -> (ptr uint16_t) *)
(* pCharProps : SCRIPT_CHARPROP* out -> (ptr void) *)
(* pwOutGlyphs : WORD* out -> (ptr uint16_t) *)
(* pOutGlyphProps : SCRIPT_GLYPHPROP* out -> (ptr void) *)
(* pcGlyphs : INT* out -> (ptr int32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library usp10 (t "USP10.dll"))
(cffi:use-foreign-library usp10)
(cffi:defcfun ("ScriptShapeOpenType" script-shape-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
(c-chars :int32) ; INT
(c-max-glyphs :int32) ; INT
(pw-log-clust :pointer) ; WORD* out
(p-char-props :pointer) ; SCRIPT_CHARPROP* out
(pw-out-glyphs :pointer) ; WORD* out
(p-out-glyph-props :pointer) ; SCRIPT_GLYPHPROP* out
(pc-glyphs :pointer)) ; INT* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $ScriptShapeOpenType = Win32::API::More->new('USP10',
'int ScriptShapeOpenType(HANDLE hdc, LPVOID psc, LPVOID psa, DWORD tagScript, DWORD tagLangSys, LPVOID rcRangeChars, LPVOID rpRangeProperties, int cRanges, LPCWSTR pwcChars, int cChars, int cMaxGlyphs, LPVOID pwLogClust, LPVOID pCharProps, LPVOID pwOutGlyphs, LPVOID pOutGlyphProps, LPVOID pcGlyphs)');
# my $ret = $ScriptShapeOpenType->Call($hdc, $psc, $psa, $tagScript, $tagLangSys, $rcRangeChars, $rpRangeProperties, $cRanges, $pwcChars, $cChars, $cMaxGlyphs, $pwLogClust, $pCharProps, $pwOutGlyphs, $pOutGlyphProps, $pcGlyphs);
# 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
# cChars : INT -> int
# cMaxGlyphs : INT -> int
# pwLogClust : WORD* out -> LPVOID
# pCharProps : SCRIPT_CHARPROP* out -> LPVOID
# pwOutGlyphs : WORD* out -> LPVOID
# pOutGlyphProps : SCRIPT_GLYPHPROP* out -> LPVOID
# pcGlyphs : INT* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- s OPENTYPE_FEATURE_RECORD
- f ScriptItemizeOpenType — 文字列をスクリプトタグ付きでアイテム分割する。
- f ScriptPlaceOpenType — OpenType機能を用いてグリフの位置と幅を算出する。
- f ScriptShape — 文字列をグリフ列に整形(シェイピング)する。
- f ScriptTextOut — 整形済みグリフ列をデバイスコンテキストに描画する。