IDWriteTextAnalyzer1
COM公式ドキュメント
複雑なスクリプト処理のために、さまざまなテキストプロパティを解析します。(IDWriteTextAnalyzer1)
メソッド 9
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
文字間のスペーシングを適用し、グリフクラスターと発音区別符号(ダイアクリティカルマーク)を適切に調整します。
| leadingSpacing | FLOAT | in | 読み順における各文字の前のスペーシング。 |
| trailingSpacing | FLOAT | in | 読み順における各文字の後のスペーシング。 |
| minimumAdvanceWidth | FLOAT | in | 各文字の最小アドバンス。文字が細くなりすぎたり、幅がゼロになったりするのを防ぎます。これはゼロ以上でなければなりません。 |
| textLength | DWORD | in | クラスターマップおよび元テキストの長さ。 |
| glyphCount | DWORD | in | グリフの数。 |
| clusterMap | WORD* | in | 文字範囲からグリフ範囲へのマッピング。 |
| glyphAdvances | FLOAT* | in | 各グリフのアドバンス幅。 |
| glyphOffsets | DWRITE_GLYPH_OFFSET* | in | 各グリフの原点のオフセット。 |
| glyphProperties | DWRITE_SHAPING_GLYPH_PROPERTIES* | in | GetGlyphs から得られる各グリフのプロパティ。 |
| modifiedGlyphAdvances | FLOAT* | out | 各グリフの新しいアドバンス幅。 |
| modifiedGlyphOffsets | DWRITE_GLYPH_OFFSET* | out | 各グリフの原点の新しいオフセット。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
入力と出力のアドバンス/オフセットは、同じ配列をエイリアスとして指定できます。
指定されたベースラインをフォントから取得します。
| fontFace | IDWriteFontFace* | in | 読み取るフォントフェイス。 |
| baseline | DWRITE_BASELINE | in | 対象となるベースラインを指定する DWRITE_BASELINE 型の値。 |
| isVertical | BOOL | in | ベースラインが縦書きか横書きか。 |
| isSimulationAllowed | BOOL | in | フォントにベースラインが存在しない場合にシミュレートするかどうか。 |
| scriptAnalysis | DWRITE_SCRIPT_ANALYSIS | in | AnalyzeScript から得られるスクリプト解析結果。 Note
DWRITE_SCRIPT_ANALYSIS scriptAnalysis = {}; のように空のスクリプト解析構造体を渡すことができ、その場合このメソッドはデフォルトのベースラインを返します。 |
| localeName | LPWSTR | inoptional | ランの言語。 |
| baselineCoordinate | INT* | out | デザイン単位でのベースライン座標値。 |
| exists | BOOL* | out | 返されたベースラインがフォントに存在するかどうか。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
フォントにベースラインが存在しない場合でもエラーとはみなされず、関数は exists = false を返します。その場合、ヒューリスティックを用いて欠落しているベースラインを計算するか、simulationAllowed フラグが true であれば、関数が妥当な近似値を計算します。
テキスト範囲のスクリプトの向きを解析し、ソースからテキストと属性を読み取って、結果をシンクコールバック SetGlyphOrientation に報告します。
| analysisSource | IDWriteTextAnalysisSource1* | in | 解析するソースオブジェクト。 |
| textPosition | DWORD | in | ソースオブジェクト内の開始位置。 |
| textLength | DWORD | in | 解析する長さ。 |
| analysisSink | IDWriteTextAnalysisSink1* | in | 解析する長さ。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
グリフランを描画するための、それぞれの角度に対応する 2x3 変換行列を返します。(IDWriteTextAnalyzer1.GetGlyphOrientationTransform)
| glyphOrientationAngle | DWRITE_GLYPH_ORIENTATION_ANGLE | in | IDWriteTextAnalysisSink1::SetGlyphOrientation に報告された角度を指定する DWRITE_GLYPH_ORIENTATION_ANGLE 型の値。 |
| isSideways | BOOL | in | ランのグリフが横倒し(sideways)かどうか。 |
| transform | DWRITE_MATRIX* | out | 返される変換。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
返される変換の平行移動成分はゼロです。
指定されたスクリプトのプロパティを取得します。
| scriptAnalysis | DWRITE_SCRIPT_ANALYSIS | in | IDWriteTextAnalyzer::AnalyzeScript から返される、テキストのランのスクリプト。 |
| scriptProperties | DWRITE_SCRIPT_PROPERTIES* | out | スクリプトの情報を記述する DWRITE_SCRIPT_PROPERTIES 構造体へのポインター。 |
戻り値
Type: HRESULT
指定されたスクリプトのプロパティを返します。スクリプトが無効な場合は、不明なスクリプトの汎用プロパティと E_INVALIDARG を返します。
テキストの複雑さと、完全なスクリプトシェイピングのために IDWriteTextAnalyzer::GetGlyphs を呼び出す必要があるかどうかを判定します。
| textString | LPWSTR | in | 複雑さをチェックするテキスト。この文字列は UTF-16 の場合がありますが、追加面(supplementary)の文字はすべて複雑とみなされます。 |
| textLength | DWORD | in | チェックするテキストの長さ。 |
| fontFace | IDWriteFontFace* | in | 読み取るフォントフェイス。 |
| isTextSimple | BOOL* | out | true の場合、テキストは単純であり、glyphIndices 配列には既に名目上のグリフが格納されています。それ以外の場合は、複雑なスクリプトや OpenType 機能を適切にシェイピングするために IDWriteTextAnalyzer::GetGlyphs を呼び出す必要があります。 |
| textLengthRead | DWORD* | inout | 同じ複雑さ(単純または複雑)を持つテキストランについて読み取られた長さ。その位置以降について再度呼び出すことができます。 |
| glyphIndices | WORD* | outoptional | テキストのオプションのグリフインデックス。関数がテキストは単純であると返した場合、必要なグリフは既に得られています。それ以外の場合、グリフインデックスは意味を持たず、代わりにシェイピングのために IDWriteTextAnalyzer::GetGlyphs を呼び出す必要があります。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
文字が、複雑なシェイピング要件を持つスクリプトの一部である場合、bidi(双方向)解析を必要とする場合、他の文字と結合する場合、追加面(supplementary planes)に存在する場合、または標準の OpenType 機能に関与するグリフを持つ場合、テキストは単純ではありません。返される長さは、結合マークをその基底文字から分割しません。
テキストとシェイピンググリフのプロパティが与えられたとき、各グリフの均等割り付け(justification)機会の情報を取得します。
| fontFace | IDWriteFontFace* | inoptional | シェイピングに使用されたフォントフェイス。これは主にカシダ(kashida)幅の正しい結果を返すために重要です。 NULL でもかまいません。 |
| fontEmSize | FLOAT | in | グリフランに使用されるフォントの em サイズ。 |
| scriptAnalysis | DWRITE_SCRIPT_ANALYSIS | in | アイテマイザー(itemizer)から得られるテキストのスクリプト。 |
| textLength | DWORD | in | テキストの長さ。 |
| glyphCount | DWORD | in | グリフの数。 |
| textString | LPWSTR | in | グリフの生成に使用された文字。 |
| clusterMap | WORD* | in | シェイピングから生成されたクラスターマップ。 |
| glyphProperties | DWRITE_SHAPING_GLYPH_PROPERTIES* | in | シェイピングから生成されたグリフプロパティ。 |
| justificationOpportunities | DWRITE_JUSTIFICATION_OPPORTUNITY* | out | 各グリフに対して許可される均等割り付けの伸長/圧縮に関する情報を受け取る DWRITE_JUSTIFICATION_OPPORTUNITY 構造体へのポインター。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
この関数は、IDWriteTextAnalyzer::GetGlyphs メソッドによるシェイピングが完了した後、ランごとに呼び出されます。
グリフアドバンスの配列を、行の幅に合わせて均等割り付けします。
| lineWidth | FLOAT | in | 行の幅。 |
| glyphCount | DWORD | in | グリフ数。 |
| justificationOpportunities | DWRITE_JUSTIFICATION_OPPORTUNITY* | in | 各グリフに対して許可される均等割り付けの伸長/圧縮に関する情報を含む DWRITE_JUSTIFICATION_OPPORTUNITY 構造体へのポインター。この情報は IDWriteTextAnalyzer1::GetJustificationOpportunities から取得します。 |
| glyphAdvances | FLOAT* | in | グリフアドバンスの配列。 |
| glyphOffsets | DWRITE_GLYPH_OFFSET* | in | グリフオフセットの配列。 |
| justifiedGlyphAdvances | FLOAT* | out | 均等割り付けされたグリフアドバンスの返却配列。 |
| justifiedGlyphOffsets | DWRITE_GLYPH_OFFSET* | outoptional | 均等割り付けされたグリフオフセットの返却配列。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
JustifyGlyphAdvances は、IDWriteTextAnalyzer1::GetJustificationOpportunities を呼び出してすべての機会を収集した後に呼び出します。JustifyGlyphAdvances は行全体にわたって処理を行います。入力と出力の配列は互いにエイリアスとして指定でき、インプレースでの更新が可能です。
カシダを伴うアラビア語など、均等割り付けによってグリフのアドバンスが増加した複雑なスクリプトに対して、新しいグリフを補充します。
| fontFace | IDWriteFontFace* | inoptional | シェイピングに使用されたフォントフェイス。 NULL でもかまいません。 |
| fontEmSize | FLOAT | in | グリフランに使用されるフォントの em サイズ。 |
| scriptAnalysis | DWRITE_SCRIPT_ANALYSIS | in | アイテマイザー(itemizer)から得られるテキストのスクリプト。 |
| textLength | DWORD | in | テキストの長さ。 |
| glyphCount | DWORD | in | グリフの数。 |
| maxGlyphCount | DWORD | in | 呼び出し側によって割り当てられた出力グリフの最大数。 |
| clusterMap | WORD* | inoptional | シェイピングから生成されたクラスターマップ。 |
| glyphIndices | WORD* | in | シェイピングから生成された元のグリフ。 |
| glyphAdvances | FLOAT* | in | シェイピングから生成された元のグリフアドバンス。 |
| justifiedGlyphAdvances | FLOAT* | in | IDWriteTextAnalyzer1::JustifyGlyphAdvances から得られる、均等割り付けされたグリフアドバンス。 |
| justifiedGlyphOffsets | DWRITE_GLYPH_OFFSET* | in | IDWriteTextAnalyzer1::JustifyGlyphAdvances から得られる、均等割り付けされたグリフオフセット。 |
| glyphProperties | DWRITE_SHAPING_GLYPH_PROPERTIES* | in | IDWriteTextAnalyzer::GetGlyphs から得られる各グリフのプロパティ。 |
| actualGlyphCount | DWORD* | inout | 変更された配列に書き込まれた新しいグリフ数。サイズが十分でない場合は、必要なグリフ数。 |
| modifiedClusterMap | WORD* | outoptional | 更新されたクラスターマップ。 |
| modifiedGlyphIndices | WORD* | out | 必要な箇所に新しいグリフが挿入された、更新後のグリフ。 |
| modifiedGlyphAdvances | FLOAT* | out | 更新されたグリフアドバンス。 |
| modifiedGlyphOffsets | DWRITE_GLYPH_OFFSET* | out | 更新されたグリフオフセット。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
GetJustifiedGlyphs は行の均等割り付けが完了した後に呼び出し、ランごとに処理します。
IDWriteTextAnalyzer1::GetScriptProperties がそのスクリプトに対して非 null の DWRITE_SCRIPT_PROPERTIES.justificationCharacter を返す場合は、GetJustifiedGlyphs を呼び出す必要があります。
GetJustifiedGlyphs は主にアラビア語のような筆記体(cursive)スクリプトに使用します。maxGlyphCount が十分でない場合、GetJustifiedGlyphs はエラー E_NOT_SUFFICIENT_BUFFER を返し、actualGlyphCount が指す変数に必要なグリフ数を格納します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDWriteTextAnalyzer1 "{80DAD800-E21F-4E83-96CE-BFCCE500DB7C}" #usecom global IDWriteTextAnalyzer1 IID_IDWriteTextAnalyzer1 "{}" #comfunc global IDWriteTextAnalyzer1_ApplyCharacterSpacing 10 float,float,float,int,int,var,var,var,var,var,var #comfunc global IDWriteTextAnalyzer1_GetBaseline 11 sptr,int,int,int,int,wstr,var,var #comfunc global IDWriteTextAnalyzer1_AnalyzeVerticalGlyphOrientation 12 sptr,int,int,sptr #comfunc global IDWriteTextAnalyzer1_GetGlyphOrientationTransform 13 int,int,var #comfunc global IDWriteTextAnalyzer1_GetScriptProperties 14 int,var #comfunc global IDWriteTextAnalyzer1_GetTextComplexity 15 wstr,int,sptr,var,var,var #comfunc global IDWriteTextAnalyzer1_GetJustificationOpportunities 16 sptr,float,int,int,int,wstr,var,var,var #comfunc global IDWriteTextAnalyzer1_JustifyGlyphAdvances 17 float,int,var,var,var,var,var #comfunc global IDWriteTextAnalyzer1_GetJustifiedGlyphs 18 sptr,float,int,int,int,int,var,var,var,var,var,var,var,var,var,var,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDWriteTextAnalyzer1 "{80DAD800-E21F-4E83-96CE-BFCCE500DB7C}" #usecom global IDWriteTextAnalyzer1 IID_IDWriteTextAnalyzer1 "{}" #comfunc global IDWriteTextAnalyzer1_ApplyCharacterSpacing 10 float,float,float,int,int,sptr,sptr,sptr,sptr,sptr,sptr #comfunc global IDWriteTextAnalyzer1_GetBaseline 11 sptr,int,int,int,int,wstr,sptr,sptr #comfunc global IDWriteTextAnalyzer1_AnalyzeVerticalGlyphOrientation 12 sptr,int,int,sptr #comfunc global IDWriteTextAnalyzer1_GetGlyphOrientationTransform 13 int,int,sptr #comfunc global IDWriteTextAnalyzer1_GetScriptProperties 14 int,sptr #comfunc global IDWriteTextAnalyzer1_GetTextComplexity 15 wstr,int,sptr,sptr,sptr,sptr #comfunc global IDWriteTextAnalyzer1_GetJustificationOpportunities 16 sptr,float,int,int,int,wstr,sptr,sptr,sptr #comfunc global IDWriteTextAnalyzer1_JustifyGlyphAdvances 17 float,int,sptr,sptr,sptr,sptr,sptr #comfunc global IDWriteTextAnalyzer1_GetJustifiedGlyphs 18 sptr,float,int,int,int,int,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。