キャレット配置とヒット テストの管理

複雑なスクリプト言語は、ScriptShape によってクラスターに分割されます。 文字の並べ替えは、常にクラスターの境界内で行われます。 クラスター自体は、読み取り順序の方向に進むことを保証されます。

論理クラスター配列内のクラスター情報は、グリフのクラスターの幅を、それらが表す論理文字間で均等に共有するために使用されます。 たとえば、lam alef グリフは次の 4 つの領域に分割されます。

  • ラムの前半分。
  • ラムの末尾の半分。
  • alef の前半分。
  • alef の末尾の半分。

クラスター内でのキャレット配置の規則は、スクリプトによって異なります。 アラビア語のスクリプトでは、キャレットの位置がベース文字とその結合マークの間に設定されている場合、キャレットは基本文字の途中に表示されます。 タイ語スクリプトの場合、キャレットはクラスター内に配置できません。 したがって、ユーザーがキャレットを進めるとき、アプリケーションはクラスターを構成するすべてのグリフを超えて進める必要があります。

ScriptXtoCP 関数と ScriptCPtoX 関数は、キャレット位置 (コード ポイント オフセット) と x 位置 (ピクセル単位) の間で変換されます。 ScriptXtoCP 関数には、各スクリプトのキャレット位置規則に関する知識があります。

  • インドとタイの場合、キャレット位置はクラスター境界にスナップされます。
  • アラビア語の場合、キャレット位置はクラスターで補間されます。
  • ヘブライ語の場合、Usp10.dllバージョン 1.420 より前のバージョンでは、キャレット位置はクラスターで補間されます。 Usp10.dll バージョン 1.420 以降では、キャレット位置はクラスター境界にスナップされます。

ScriptXtoCPScriptCPtoX はどちらも、実行内でのみ動作します。 関数では、次の表に示すように、特定のパラメーターが以前の Uniscribe 呼び出しから取得されている必要があります。

パラメーター source
Psa ScriptItemize によって返されるとおり。
cGlyphspwLogClust
psva
ScriptShape によって返されるとおり。
piAdvance ScriptPlace によって返されます。

 

アプリケーションは、 ScriptCPtoX または ScriptXtoCP に情報を渡す前に、指定されたキャレット オフセットまたは x 位置がである実行を確立する必要があります。 アプリケーションが幅情報を保存しない場合は、各実行を表示した後にヒット テストとキャレット配置を実行できます。 別の方法として、アプリケーションは、段落の再処理を必要とせずに、ヒット テストを行い、現在の行にキャレット配置を行うのに十分な情報をキャッシュできます。

ScriptXtoCP は、ユーザーがクリックした文字またはクラスターの側をアプリケーションが認識できるように、末尾のエッジ値を返します。 値は 0 か、コード ポイント内の文字またはクラスターの幅です。 返される文字位置は、ユーザーがクリックした文字の位置です。 詳細については、「 双方向文字列でのキャレットの表示」を参照してください。

ユーザーが従来、キャレットをクラスターに配置したくないタイ語などの言語の場合、 ScriptXtoCP は 末尾のサイド フラグを 0 またはクラスターの幅に設定します。 ユーザーがクラスター内で編集できると予想されるアラビア語などの言語の場合、 ScriptXtoCP は 末尾のサイド フラグを 0 または 1 に設定します。

方向キーを処理するときに、アプリケーションがキャレットの有効な場所を確立できるように、Uniscribe は ScriptBreak によって返される論理属性の fCharStop メンバー内の有効なキャレット位置に関する情報を提供します。 ほとんどの 文字に対して TRUE が返され、タイ語などのスクリプト内のクラスター間文字の 場合は FALSE が返されます。 アプリケーションは、有効なキャレット位置をチェックするために ScriptBreak を呼び出す必要があるかどうかを確認するために、アイテムのSCRIPT_PROPERTIES構造体の fNeedsCaretInfo 値をチェックする必要があります。 fNeedsCaretInfo 値が FALSE の場合、すべてのコード ポイントが有効なキャレット位置になります。

Uniscribe の使用