Verwalten von Caret Placement und Treffertests

Komplexe Skriptsprachen werden von ScriptShape in Cluster unterteilt. Die Neuanordnung von Zeichen erfolgt immer innerhalb der Clustergrenzen. Die Cluster selbst werden garantiert in Richtung der Lesereihenfolge voranschreiten.

Clusterinformationen im logischen Clusterarray werden verwendet, um die Breite eines Clusters von Glyphen gleichermaßen mit den logischen Zeichen zu teilen, die sie darstellen. Die Lam alef-Glyphe ist beispielsweise in vier Bereiche unterteilt:

  • Die führende Hälfte der Lam.
  • Die nachgestellte Hälfte der Lam.
  • Die führende Hälfte der Alef.
  • Die nachfolgende Hälfte der Alef.

Konventionen für die Caretplatzierung in Clustern hängen vom Skript ab. Wenn bei der arabischen Schrift die Caretposition zwischen einem Basiszeichen und dem zugehörigen Kombinationszeichen festgelegt ist, wird das Caretzeichen in der Mitte des Basiszeichens angezeigt. Für das thailändische Skript kann das Caret nicht innerhalb eines Clusters positioniert werden. Wenn der Benutzer also das Caret fortschreitet, muss die Anwendung alle Glyphen übersteigen, aus denen der Cluster besteht.

Die Funktionen ScriptXtoCP und ScriptCPtoX übersetzen zwischen Caretpositionen (in Codepunktoffsets) und x-Positionen (in Pixel). Die ScriptXtoCP-Funktion kennt die Caretpositionskonventionen der einzelnen Skripts:

  • Für Indisch und Thai sind Caretpositionen an Clustergrenzen angedockt.
  • Für Arabisch werden Caretpositionen mit Clustern interpoliert.
  • Für Hebräisch werden in Versionen vor Usp10.dll Version 1.420 Caretpositionen mit Clustern interpoliert. Ab Usp10.dll Version 1.420 werden Caretpositionen an Clustergrenzen angedockt.

Sowohl ScriptXtoCP als auch ScriptCPtoX werden nur innerhalb von Ausführungen ausgeführt. Die Funktionen erfordern, dass bestimmte Parameter aus früheren Uniscribe-Aufrufen stammen, wie in der folgenden Tabelle gezeigt.

Parameter `Source`
Psa Wie von ScriptItemize zurückgegeben.
cGlyphspwLogClust
psva
Wie von ScriptShape zurückgegeben.
piAdvance Wie von ScriptPlace zurückgegeben.

 

Die Anwendung muss die Ausführung einrichten, in der sich ein gegebener Caretoffset oder eine x-Position befindet, bevor die Informationen an ScriptCPtoX oder ScriptXtoCP übergeben werden. Wenn die Anwendung die Breiteninformationen nicht speichert, kann sie nach der Anzeige der einzelnen Ausführung Treffertests und Caretplatzierung durchführen. Alternativ kann die Anwendung genügend Informationen zwischenspeichern, um Treffertests und Caretplatzierung in der aktuellen Zeile durchzuführen, ohne dass der Absatz erneut verarbeitet werden muss.

ScriptXtoCP gibt einen nachgestellten Edgewert zurück, damit die Anwendung die Seite des Zeichens oder Clusters kennt, auf die der Benutzer geklickt hat. Der Wert ist entweder 0 oder die Breite des Zeichens oder Clusters in Codepunkten. Die zurückgegebene Zeichenposition ist die Position des Zeichens, auf das der Benutzer geklickt hat. Weitere Informationen finden Sie unter Anzeigen des Carets in bidirektionalen Zeichenfolgen.

Für Sprachen wie Thai, für die der Benutzer das Caretzeichen normalerweise nicht in einem Cluster platzieren möchte, legt ScriptXtoCP das nachgestellte Seitenflag auf 0 oder auf die Clusterbreite fest. Für Sprachen wie Arabisch, für die der Benutzer erwartet, dass sie innerhalb eines Clusters bearbeiten können, legt ScriptXtoCP das nachgestellte Flag auf 0 oder auf 1 fest.

Uniscribe stellt Informationen zu gültigen Caretpositionen im fCharStop-Element in den logischen Attributen bereit, die von ScriptBreak zurückgegeben werden, um die Anwendung bei der Behandlung der Pfeiltasten zu unterstützen. TRUE wird für die meisten Zeichen und FALSE für Interclusterzeichen in Skripts wie Thai zurückgegeben. Die Anwendung sollte den fNeedsCaretInfo-Wert in der SCRIPT_PROPERTIES-Struktur auf ein Element überprüfen, um festzustellen, ob ScriptBreak aufgerufen werden muss, um nach gültigen Caretpositionen zu suchen. Wenn der fNeedsCaretInfo-WertFALSE ist, sind alle Codepunkte gültige Caretpositionen.

Verwenden von Uniscribe